From 3033d6e08eb01ec0852569103bd76d5243636ed7 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:25:33 -0500 Subject: [PATCH 01/70] holy shiiiiiiiiiitttt RBMK optimization update --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 339 +++++++++++++++++ .../java/com/hbm/main/ModEventHandler.java | 6 + .../hbm/render/tileentity/RenderRBMKLid.java | 2 +- .../machine/rbmk/IRBMKFluxReceiver.java | 4 +- .../tileentity/machine/rbmk/RBMKDials.java | 12 + .../machine/rbmk/TileEntityCraneConsole.java | 1 + .../machine/rbmk/TileEntityRBMKAbsorber.java | 8 +- .../machine/rbmk/TileEntityRBMKBase.java | 50 ++- .../machine/rbmk/TileEntityRBMKBlank.java | 6 + .../machine/rbmk/TileEntityRBMKBoiler.java | 21 + .../machine/rbmk/TileEntityRBMKConsole.java | 6 +- .../machine/rbmk/TileEntityRBMKControl.java | 21 + .../rbmk/TileEntityRBMKControlAuto.java | 19 + .../rbmk/TileEntityRBMKControlManual.java | 21 +- .../machine/rbmk/TileEntityRBMKCooler.java | 22 ++ .../machine/rbmk/TileEntityRBMKHeater.java | 27 +- .../machine/rbmk/TileEntityRBMKInlet.java | 12 +- .../machine/rbmk/TileEntityRBMKModerator.java | 8 +- .../machine/rbmk/TileEntityRBMKOutgasser.java | 32 +- .../machine/rbmk/TileEntityRBMKOutlet.java | 14 +- .../machine/rbmk/TileEntityRBMKReflector.java | 6 + .../machine/rbmk/TileEntityRBMKRod.java | 358 +++++++----------- .../machine/rbmk/TileEntityRBMKRodReaSim.java | 41 +- .../machine/rbmk/TileEntityRBMKStorage.java | 6 + 24 files changed, 772 insertions(+), 270 deletions(-) create mode 100644 src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java new file mode 100644 index 000000000..03d369ae6 --- /dev/null +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -0,0 +1,339 @@ +package com.hbm.handler.rbmkmk2; + +import com.hbm.blocks.machine.rbmk.RBMKBase; +import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.tileentity.machine.rbmk.*; +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.block.Block; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +import java.util.*; + +public class RBMKHandler { + + static double moderatorEfficiency; + static double reflectorEfficiency; + static double absorberEfficiency; + static int columnHeight; + static int fluxRange; + + public enum RBMKType { + ROD, + MODERATOR, + CONTROL_ROD, + REFLECTOR, + ABSORBER, + OUTGASSER, + OTHER // why do neutron calculations on them if they won't change anything? + } + + public static class RBMKNode { + + protected RBMKType type; + protected TileEntityRBMKBase tile; + protected boolean hasLid; + + public RBMKNode(TileEntityRBMKBase tile, RBMKType type) { + this.type = type; + this.tile = tile; + this.hasLid = tile.hasLid(); + addNode(this); + } + } + + private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { + return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + } + + public static RBMKNode makeNode(TileEntityRBMKBase tile) { + return new RBMKNode(tile, tile.getRBMKType()); + } + + public static class NeutronStream { + + public RBMKNode origin; + + // doubles!! + public double fluxQuantity; + // Hey, new implementation! Basically a ratio for slow flux to fast flux + // 0 = all slow flux + // 1 = all fast flux + public double fluxRatio; + + // Vector for direction of neutron flow. + public Vec3 vector; + + public NeutronStream(RBMKNode origin, Vec3 vector, double flux, double ratio) { + this.origin = origin; + this.vector = vector; + this.fluxQuantity = flux; + this.fluxRatio = ratio; + streams.put(this, origin.tile.getWorldObj()); + } + + public List getBlocks() { + List positions = new ArrayList<>(); + + for (int i = 1; i <= fluxRange; i++) { + int x = (int) Math.floor(0.5 + vector.xCoord * i); + int z = (int) Math.floor(0.5 + vector.zCoord * i); + + BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); + positions.add(pos); + } + return positions; + } + + // This, however, is used for actual RBMK flux calculations. + // Does NOT include the origin node + // USES THE CACHE!!! + public List getNodes() { + List positions = new ArrayList<>(); + + for (int i = 1; i <= fluxRange; i++) { + int x = (int) Math.floor(0.5 + vector.xCoord * i); + int z = (int) Math.floor(0.5 + vector.zCoord * i); + + BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); + + if (nodeCache.containsKey(pos)) { + positions.add(nodeCache.get(pos)); + continue; + } + + // If it isn't an RBMK block then don't do anything with it + if(!(origin.tile.getBlockType() instanceof RBMKBase)) + continue; + + TileEntity te = blockPosToTE(origin.tile.getWorldObj(), pos); + + if (te instanceof TileEntityRBMKBase) { + TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase) te; + RBMKType type = rbmkBase.getRBMKType(); + // they should ALL be RBMKBase TEs + RBMKNode node = new RBMKNode(rbmkBase, type); + positions.add(node); + addNode(node); + } + } + return positions; + } + + // The... small one? whatever it's still pretty big, runs the interaction for the stream. + public void runStreamInteraction(World worldObj) { + + // do nothing if there's nothing to do lmao + if(fluxQuantity == 0D) + return; + + BlockPos pos = new BlockPos(origin.tile); + + TileEntityRBMKBase originTE; + + if (nodeCache.containsKey(pos)) + originTE = nodeCache.get(pos).tile; + else { + originTE = (TileEntityRBMKBase) blockPosToTE(worldObj, pos); + if(originTE == null) + return; // Doesn't exist anymore! + addNode(new RBMKNode(originTE, originTE.getRBMKType())); + } + + int moderatedCount = 0; + + for(BlockPos nodePos : getBlocks()) { + + if(fluxQuantity == 0D) // Whoops, used it all up! + return; + + RBMKNode node = nodeCache.get(nodePos); + + if(node == null) { + TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow? + if (te instanceof TileEntityRBMKBase) { + node = makeNode((TileEntityRBMKBase) te); + addNode(node); // whoops! + } else + return; // TE no longer exists, die!! + } + + if(node.type == RBMKType.OTHER) // pass right on by! + continue; + + Block block = node.tile.getBlockType(); + + if (!(block instanceof RBMKBase)) { + int hits = getHits(nodePos); // Get the amount of hits on blocks. + if (hits == columnHeight) // If stream is fully blocked. + return; + else if (hits > 0) { // If stream is partially blocked. + irradiateFromFlux(pos, hits); + fluxQuantity *= 1 - ((double) hits / columnHeight); // Inverse to get partial blocking by blocks. + continue; + } else { // Nothing hit! + irradiateFromFlux(pos, 0); + continue; + } + } + + // we established earlier during `getNodes()` that they should all be RBMKBase TEs + // no issue with casting here! + TileEntityRBMKBase nodeTE = node.tile; + + if(!node.hasLid) + ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); + + if(node.type == RBMKType.MODERATOR) { + moderatedCount += 1; + moderateStream(); + } + + if(node.tile instanceof IRBMKFluxReceiver) { + IRBMKFluxReceiver column = ((IRBMKFluxReceiver) nodeTE); + if(node.type == RBMKType.ROD) { + TileEntityRBMKRod rod = ((TileEntityRBMKRod) column); + if(rod.hasRod) { + if(rod.isModerated()) + moderateStream(); + rod.receiveFlux(this); + return; + } + } else if(node.type == RBMKType.OUTGASSER) { + TileEntityRBMKOutgasser outgasser = ((TileEntityRBMKOutgasser) column); + if(outgasser.canProcess()) { + column.receiveFlux(this); + return; + } + } + } + + else if(node.type == RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = ((TileEntityRBMKControl) nodeTE); + if (rod.level > 0D) + fluxQuantity *= ((TileEntityRBMKControl) nodeTE).getMult(); + else + return; + } + + else if(node.type == RBMKType.REFLECTOR) { + if((origin.tile).isModerated()) + moderatedCount += 1; + if (fluxRatio > 0D && moderatedCount > 0) { + for (int i = 0; i < moderatedCount; i++) { + moderateStream(); // Moderate streams on the way back! + } + } + if(reflectorEfficiency != 1) { + fluxQuantity *= reflectorEfficiency; + } else { + ((TileEntityRBMKRod) originTE).receiveFlux(this); + // this one missing return line was baffling me for half an hour + // "why is this rod jumping to double the flux randomly????" + // because you aren't fucking returning from the function, and it's hitting the reflector after it, you idiot + return; + } + } + + else if(node.type == RBMKType.ABSORBER) { + if (absorberEfficiency == 1) + return; // Instantly stop stream processing. + else + fluxQuantity *= absorberEfficiency; + } + } + + // Called *after* most streams have returned. + List nodes = getNodes(); + + if(nodes.isEmpty()) // how tf did we get here if its empty + return; + + // Get the last node in the stream. + RBMKNode lastNode = nodes.get(nodes.size() - 1); + + // Block hits don't have to be considered here, since if it's fully blocked it'll return the function before getting here. + if(lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) { + // Neutrons must not have been caught then! + irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); + } + + // but oh wait, control rods exist + if(lastNode.type == RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = ((TileEntityRBMKControl) lastNode.tile); + // just get level and irradiate based on that + if(rod.getMult() > 0D) { + fluxQuantity = fluxQuantity * rod.getMult(); + irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); + } + + } + } + + public int getHits(BlockPos pos) { + int hits = 0; + + for(int h = 0; h < columnHeight; h++) { + // holy fucking shit + // I have had this one line cause me like tens of problems + // I FUCKING HATE THIS + // total count of bugs fixed attributed to this function: 6 + if (!origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) + hits += 1; + } + + return hits; + } + + public void irradiateFromFlux(BlockPos pos) { + ChunkRadiationManager.proxy.incrementRad(origin.tile.getWorldObj(), pos.getX(), pos.getY(), pos.getZ(), (float) (fluxQuantity * 0.05F * (1 - (double) getHits(pos) / columnHeight))); + } + + public void irradiateFromFlux(BlockPos pos, int hits) { + ChunkRadiationManager.proxy.incrementRad(origin.tile.getWorldObj(), pos.getX(), pos.getY(), pos.getZ(), (float) (fluxQuantity * 0.05F * (1 - (double) hits / columnHeight))); + } + + public void moderateStream() { + fluxRatio = fluxRatio * (1 - moderatorEfficiency); + } + } + + // HashMap of all RBMK nodes and their positions. + protected static HashMap nodeCache = new HashMap<>(); + + // List of all active neutron streams. + public static HashMap streams = new HashMap<>(); + + public static void addNode(RBMKNode node) { + nodeCache.put(new BlockPos(node.tile), node); + } + + public static void removeNode(BlockPos position) { + nodeCache.remove(position); + } + + // The big one!! Runs all interactions for neutrons. + public static void runAllInteractions() { + + for (World worldObj : MinecraftServer.getServer().worldServers) { + // Gamerule caching because this apparently is kinda slow? + // meh, good enough + reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(); + absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(); + moderatorEfficiency = RBMKDials.getModeratorEfficiency(worldObj); + // I hate this. + // this broke everything because it was ONE OFF + // IT'S NOT THE TOTAL HEIGHT IT'S THE AMOUNT OF BLOCKS ABOVE AAAAAAAAAAAAA + columnHeight = RBMKDials.getColumnHeight(worldObj) + 1; + fluxRange = RBMKDials.getFluxRange(worldObj); + streams.forEach((stream, world) -> { + if (world == worldObj) + // WOO!! + stream.runStreamInteraction(world); + }); + } + streams.clear(); + } +} diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 4f0d2f55b..bf1e44abb 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -9,6 +9,8 @@ import java.util.Map; import java.util.Random; import java.util.UUID; +import com.hbm.handler.rbmkmk2.RBMKHandler; +import net.minecraft.server.MinecraftServer; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; @@ -1143,6 +1145,10 @@ public class ModEventHandler { RequestNetwork.updateEntries(); TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); + // RBMK!!!! + MinecraftServer.getServer().theProfiler.startSection("rbmkHandler_flux_interaction"); + RBMKHandler.runAllInteractions(); + MinecraftServer.getServer().theProfiler.endSection(); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java index 2783e8508..47fd69ef9 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java @@ -35,7 +35,7 @@ public class RenderRBMKLid extends TileEntitySpecialRenderer { if(rod.hasRod) hasRod = true; - if(rod.fluxFast + rod.fluxSlow > 5) + if(rod.fluxQuantity > 5) cherenkov = true; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java index 91824df0a..655c234ae 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java @@ -1,5 +1,7 @@ package com.hbm.tileentity.machine.rbmk; +import com.hbm.handler.rbmkmk2.RBMKHandler; + public interface IRBMKFluxReceiver { public enum NType { @@ -14,5 +16,5 @@ public interface IRBMKFluxReceiver { } } - public void receiveFlux(NType type, double flux); + public void receiveFlux(RBMKHandler.NeutronStream stream); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index a93498b6f..e8f2867bb 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -30,6 +30,8 @@ public class RBMKDials { public static final String KEY_REASIM_BOILER_SPEED = "dialReasimBoilerSpeed"; public static final String KEY_DISABLE_MELTDOWNS = "dialDisableMeltdowns"; public static final String KEY_ENABLE_MELTDOWN_OVERPRESSURE = "dialEnableMeltdownOverpressure"; + + public static final String KEY_MODERATOR_EFFICIENCY = "dialModeratorEfficiency"; public static void createDials(World world) { GameRules rules = world.getGameRules(); @@ -55,6 +57,7 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_REASIM_BOILER_SPEED, "0.05"); rules.setOrCreateGameRule(KEY_DISABLE_MELTDOWNS, "false"); rules.setOrCreateGameRule(KEY_ENABLE_MELTDOWN_OVERPRESSURE, "false"); + rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1"); } } @@ -229,4 +232,13 @@ public class RBMKDials { public static boolean getOverpressure(World world) { return world.getGameRules().getGameRuleBooleanValue(KEY_ENABLE_MELTDOWN_OVERPRESSURE); } + + /** + * The percentage of neutron to moderate from fast to slow when they pass through a moderator. + * @param world + * @return + */ + public static double getModeratorEfficiency(World world) { + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 57bc990bc..befccb90d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -8,6 +8,7 @@ import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.items.machine.ItemRBMKRod; import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.INBTPacketReceiver; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java index 20512c206..abbb5ceb1 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { - + @Override public void onMelt(int reduce) { @@ -17,6 +18,11 @@ public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.ABSORBER; + } + @Override public ColumnType getConsoleType() { return ColumnType.ABSORBER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 44703c013..79cefa3b7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -8,20 +8,26 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.entity.effect.EntitySpear; import com.hbm.entity.projectile.EntityRBMKDebris; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler.RBMKType; import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.BufPacket; import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.saveddata.TomSaveData; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.Compat; import com.hbm.util.I18nUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; @@ -45,7 +51,7 @@ import java.util.*; * @author hbm * */ -public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements INBTPacketReceiver { +public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements INBTPacketReceiver, IBufPacketReceiver { public double heat; @@ -111,7 +117,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements NBTTagCompound data = new NBTTagCompound(); this.writeToNBT(data); - this.networkPack(data, trackingRange()); + this.networkPackNT(trackingRange()); } } @@ -211,6 +217,13 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements this.markDirty(); } } + + @Override + public void invalidate() { + super.invalidate(); + + RBMKHandler.removeNode(new BlockPos(this)); // woo-fucking-hoo!!! + } @Override public void markDirty() { @@ -234,6 +247,8 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements if(heat < 20) heat = 20D; } + + public abstract RBMKType getRBMKType(); protected static boolean diag = false; @@ -260,25 +275,46 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements nbt.setInteger("water", this.water); nbt.setInteger("steam", this.steam); } - - public void networkPack(NBTTagCompound nbt, int range) { + @Deprecated + public void networkPack(NBTTagCompound nbt, int range) { diag = true; if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); diag = false; } - + + @Deprecated public void networkUnpack(NBTTagCompound nbt) { - + diag = true; this.readFromNBT(nbt); diag = false; } + + public void networkPackNT(int range) { + if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.muffled); + buf.writeDouble(this.heat); + buf.writeInt(this.water); + buf.writeInt(this.steam); + } + + @Override + public void deserialize(ByteBuf buf) { + this.muffled = buf.readBoolean(); + this.heat = buf.readDouble(); + this.water = buf.readInt(); + this.steam = buf.readInt(); + } public void getDiagData(NBTTagCompound nbt) { diag = true; - this.writeToNBT(nbt); + this.readFromNBT(nbt); diag = false; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java index 82a7137a9..08611e1b1 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKBlank extends TileEntityRBMKBase { @@ -17,6 +18,11 @@ public class TileEntityRBMKBlank extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.BLANK; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 7a1a6ec0b..2a1ea6801 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -8,6 +8,7 @@ import api.hbm.tile.IInfoProviderEC; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerRBMKGeneric; import com.hbm.inventory.fluid.FluidType; @@ -21,6 +22,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -163,6 +165,20 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I steam.writeToNBT(nbt, "steam"); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + steam.serialize(buf); + feed.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.steam.deserialize(buf); + this.feed.deserialize(buf); + } + @Override public boolean hasPermission(EntityPlayer player) { return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 20; @@ -208,6 +224,11 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.BOILER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index ffbaea36f..02b224c7a 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -103,7 +103,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod) { TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; - flux += fuel.fluxFast + fuel.fluxSlow; + flux += fuel.fluxQuantity; } } else { @@ -556,8 +556,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod){ TileEntityRBMKRod fuelChannel = (TileEntityRBMKRod)te; - data_table.put("fluxSlow", fuelChannel.fluxSlow); - data_table.put("fluxFast", fuelChannel.fluxFast); + data_table.put("fluxQuantity", fuelChannel.fluxQuantity); + data_table.put("fluxRatio", fuelChannel.fluxRatio); } if(te instanceof TileEntityRBMKBoiler){ diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java index 4b3f79c15..edb73195c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java @@ -2,9 +2,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -87,6 +89,20 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im nbt.setDouble("level", this.level); nbt.setDouble("targetLevel", this.targetLevel); } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.level); + buf.writeDouble(this.targetLevel); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.level = buf.readDouble(); + this.targetLevel = buf.readDouble(); + } @Override @SideOnly(Side.CLIENT) @@ -115,6 +131,11 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im this.standardMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.CONTROL_ROD; + } + @Override public NBTTagCompound getNBTForConsole() { NBTTagCompound data = new NBTTagCompound(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java index dc4159964..158c85083 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java @@ -8,6 +8,7 @@ import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -105,6 +106,24 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements nbt.setInteger("function", function.ordinal()); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.levelLower); + buf.writeDouble(this.levelUpper); + buf.writeDouble(this.heatLower); + buf.writeDouble(this.heatUpper); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.levelLower = buf.readDouble(); + this.levelUpper = buf.readDouble(); + this.heatLower = buf.readDouble(); + this.heatUpper = buf.readDouble(); + } + @Override public void receiveControl(NBTTagCompound data) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java index 92ec4377e..d01438c7e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java @@ -9,6 +9,7 @@ import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -91,7 +92,7 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement if(nbt.hasKey("startingLevel")) this.startingLevel = nbt.getDouble("startingLevel"); - + if(nbt.hasKey("color")) this.color = RBMKColor.values()[nbt.getInteger("color")]; else @@ -108,6 +109,24 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement if(color != null) nbt.setInteger("color", color.ordinal()); } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.startingLevel); + if(this.color != null) + buf.writeInt(this.color.ordinal()); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.startingLevel = buf.readDouble(); + if(buf.isReadable(1)) { + int color = buf.readInt(); + this.color = RBMKColor.values()[MathHelper.clamp_int(color, 0, RBMKColor.values().length)]; + } + } public static enum RBMKColor { RED, diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java index bd7250cf7..e4134ab0c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java @@ -2,11 +2,13 @@ package com.hbm.tileentity.machine.rbmk; import api.hbm.fluid.IFluidStandardReceiver; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import cpw.mods.fml.common.Optional; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -15,6 +17,7 @@ import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; import java.util.List; @@ -101,6 +104,25 @@ public class TileEntityRBMKCooler extends TileEntityRBMKBase implements IFluidSt nbt.setInteger("cooled", this.lastCooled); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.tank.serialize(buf); + buf.writeInt(this.lastCooled); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.tank.deserialize(buf); + this.lastCooled = buf.readInt(); + } + + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.COOLER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java index 941fb9637..e54a5acbd 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java @@ -4,6 +4,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.container.ContainerRBMKHeater; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -17,6 +18,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -50,7 +52,7 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I if(!worldObj.isRemote) { feed.setType(0, slots); - + if(feed.getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = feed.getTankType().getTrait(FT_Heatable.class); HeatingStep step = trait.getFirstStep(); @@ -82,7 +84,7 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I super.updateEntity(); } - + protected DirPos[] getOutputPos() { if(worldObj.getBlock(xCoord, yCoord - 1, zCoord) == ModBlocks.rbmk_loader) { @@ -125,7 +127,21 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I feed.writeToNBT(nbt, "feed"); steam.writeToNBT(nbt, "steam"); } - + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.feed.serialize(buf); + this.steam.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.feed.deserialize(buf); + this.steam.deserialize(buf); + } + @Override public void onMelt(int reduce) { @@ -138,6 +154,11 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.HEATEX; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java index be66e767d..301f5bb1c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java @@ -4,14 +4,16 @@ import api.hbm.fluid.IFluidStandardReceiver; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidStandardReceiver { +public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidStandardReceiver, IBufPacketReceiver { public FluidTank water; @@ -61,6 +63,14 @@ public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidS this.water.writeToNBT(nbt, "tank"); } + public void serialize(ByteBuf buf) { + this.water.serialize(buf); + } + + public void deserialize(ByteBuf buf) { + this.water.deserialize(buf); + } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {water}; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java index 7abb95b12..7ce7c1e67 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKModerator extends TileEntityRBMKBase { - + @Override public void onMelt(int reduce) { @@ -17,6 +18,11 @@ public class TileEntityRBMKModerator extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.MODERATOR; + } + @Override public ColumnType getConsoleType() { return ColumnType.MODERATOR; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 81c74e75d..95a851736 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -4,6 +4,7 @@ import api.hbm.fluid.IFluidStandardSender; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.FluidStack; import com.hbm.inventory.container.ContainerRBMKOutgasser; import com.hbm.inventory.fluid.Fluids; @@ -17,6 +18,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -90,14 +92,13 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement } @Override - public void receiveFlux(NType type, double flux) { + public void receiveFlux(RBMKHandler.NeutronStream stream) { if(canProcess()) { - - if(type == NType.FAST) - flux *= 0.2D; - - progress += flux * RBMKDials.getOutgasserMod(worldObj); + + double efficiency = Math.min((1 - stream.fluxRatio) * 0.8, 1); + + progress += stream.fluxQuantity * efficiency * RBMKDials.getOutgasserMod(worldObj); if(progress > duration) { process(); @@ -165,6 +166,11 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OUTGASSER; + } + @Override public ColumnType getConsoleType() { return ColumnType.OUTGASSER; @@ -196,6 +202,20 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement this.gas.writeToNBT(nbt, "gas"); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.gas.serialize(buf); + buf.writeDouble(this.progress); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.gas.deserialize(buf); + this.progress = buf.readDouble(); + } + @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { return OutgasserRecipes.getOutput(itemStack) != null && i == 0; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java index 259ac0b4c..0dc4cd89b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java @@ -4,14 +4,16 @@ import api.hbm.fluid.IFluidStandardSender; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluidStandardSender { +public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluidStandardSender, IBufPacketReceiver { public FluidTank steam; @@ -61,6 +63,16 @@ public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluid this.steam.writeToNBT(nbt, "tank"); } + @Override + public void serialize(ByteBuf buf) { + this.steam.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + this.steam.deserialize(buf); + } + public void fillFluidInit() { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.sendFluid(steam, worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java index ed5b1afc0..79e40867b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKReflector extends TileEntityRBMKBase { @@ -17,6 +18,11 @@ public class TileEntityRBMKReflector extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.REFLECTOR; + } + @Override public ColumnType getConsoleType() { return ColumnType.REFLECTOR; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index f67843023..ad88de20b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -6,12 +6,13 @@ import com.hbm.blocks.machine.rbmk.RBMKRod; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler.NeutronStream; import com.hbm.inventory.container.ContainerRBMKRod; import com.hbm.inventory.gui.GUIRBMKRod; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRBMKRod; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; -import com.hbm.util.Compat; import com.hbm.util.CompatEnergyControl; import com.hbm.util.ParticleUtil; @@ -19,6 +20,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -28,17 +30,22 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBMKFluxReceiver, IRBMKLoadable, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent { - - //amount of "neutron energy" buffered for the next tick to use for the reaction - public double fluxFast; - public double fluxSlow; + + // New system!! + // Used for receiving flux (calculating outbound flux/burning rods) + public double fluxRatio; + public double fluxQuantity; + public boolean hasRod; public TileEntityRBMKRod() { @@ -49,243 +56,167 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public String getName() { return "container.rbmkRod"; } - + @Override public boolean isModerated() { return ((RBMKRod)this.getBlockType()).moderated; } - + @Override public int trackingRange() { return 25; } - @SuppressWarnings("incomplete-switch") //shut the fuck up @Override - public void receiveFlux(NType type, double flux) { - - switch(type) { - case FAST: this.fluxFast += flux; break; - case SLOW: this.fluxSlow += flux; break; - } + public void receiveFlux(NeutronStream stream) { + double fastFlux = this.fluxQuantity * this.fluxRatio; + double fastFluxIn = stream.fluxQuantity * stream.fluxRatio; + + this.fluxQuantity += stream.fluxQuantity; + fluxRatio = (fastFlux + fastFluxIn) / fluxQuantity; } - + @Override public void updateEntity() { if(!worldObj.isRemote) { - + if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { - + ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); - + double fluxIn = fluxFromType(rod.nType); - double fluxOut = rod.burn(worldObj, slots[0], fluxIn); + double fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); + double fluxRatioOut; NType rType = rod.rType; - + if(rType == NType.SLOW) + fluxRatioOut = 0; + else + fluxRatioOut = 1; + rod.updateHeat(worldObj, slots[0], 1.0D); this.heat += rod.provideHeat(worldObj, slots[0], heat, 1.0D); - + if(!this.hasLid()) { - ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) ((this.fluxFast + this.fluxSlow) * 0.05F)); + ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) (this.fluxQuantity * 0.05F)); } - + super.updateEntity(); - + if(this.heat > this.maxHeat()) { - + if(RBMKDials.getMeltdownsDisabled(worldObj)) { ParticleUtil.spawnGasFlame(worldObj, xCoord + 0.5, yCoord + RBMKDials.getColumnHeight(worldObj) + 0.5, zCoord + 0.5, 0, 0.2, 0); } else { this.meltdown(); } - this.fluxFast = 0; - this.fluxSlow = 0; + this.fluxQuantity = 0; return; } - - if(this.heat > 10_000) this.heat = 10_000; - - //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back - this.fluxFast = 0; - this.fluxSlow = 0; - this.worldObj.theProfiler.startSection("rbmkRod_flux_spread"); - spreadFlux(rType, fluxOut); - this.worldObj.theProfiler.endSection(); - + if(this.heat > 10_000) this.heat = 10_000; + + //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back + this.fluxQuantity = 0; + spreadFlux(fluxQuantityOut, fluxRatioOut); + hasRod = true; - + } else { - this.fluxFast = 0; - this.fluxSlow = 0; - + this.fluxQuantity = 0; + this.fluxRatio = 0; + hasRod = false; - + super.updateEntity(); } } } - - /** - * SLOW: full efficiency for slow neutrons, fast neutrons have half efficiency - * FAST: fast neutrons have 100% efficiency, slow only 30% - * ANY: just add together whatever we have because who cares - * @param type - * @return - */ - + private double fluxFromType(NType type) { - + + switch(type) { - case SLOW: return this.fluxFast * 0.5D + this.fluxSlow; - case FAST: return this.fluxFast + this.fluxSlow * 0.3D; - case ANY: return this.fluxFast + this.fluxSlow; + case SLOW: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.5, 1)); + case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min((1 - this.fluxRatio) * 0.3, 1)); + case ANY: return this.fluxQuantity; } - + return 0.0D; } - + public static final ForgeDirection[] fluxDirs = new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.EAST, ForgeDirection.SOUTH, ForgeDirection.WEST }; - - protected static NType stream; - - protected void spreadFlux(NType type, double fluxOut) { - - int range = RBMKDials.getFluxRange(worldObj); - - for(ForgeDirection dir : fluxDirs) { - - stream = type; - double flux = fluxOut; - - for(int i = 1; i <= range; i++) { - - flux = runInteraction(xCoord + dir.offsetX * i, yCoord, zCoord + dir.offsetZ * i, flux); - - if(flux <= 0) - break; - } - } - } - - protected double runInteraction(int x, int y, int z, double flux) { - - TileEntity te = Compat.getTileStandard(worldObj, x, y, z); - - if(te instanceof TileEntityRBMKBase) { - TileEntityRBMKBase base = (TileEntityRBMKBase) te; - - if(!base.hasLid()) - ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) (flux * 0.05F)); - - if(base.isModerated()) { - this.stream = NType.SLOW; - } - } - //burn baby burn - if(te instanceof TileEntityRBMKRod) { - TileEntityRBMKRod rod = (TileEntityRBMKRod)te; - - if(rod.getStackInSlot(0) != null && rod.getStackInSlot(0).getItem() instanceof ItemRBMKRod) { - rod.receiveFlux(stream, flux); - return 0; - } else { - return flux; - } + protected static NType stream; + + public void spreadFlux(double flux, double ratio) { + + for(ForgeDirection dir : fluxDirs) { + + Vec3 neutronVector = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); + + new NeutronStream(RBMKHandler.makeNode(this), neutronVector, flux, ratio); + // Create new neutron streams } - - if(te instanceof TileEntityRBMKOutgasser) { - TileEntityRBMKOutgasser rod = (TileEntityRBMKOutgasser)te; - - if(!rod.canProcess()) { - return flux; - } - } - - if(te instanceof IRBMKFluxReceiver) { - IRBMKFluxReceiver rod = (IRBMKFluxReceiver)te; - rod.receiveFlux(stream, flux); - return 0; - } - - //multiply neutron count with rod setting - if(te instanceof TileEntityRBMKControl) { - TileEntityRBMKControl control = (TileEntityRBMKControl)te; - - if(control.getMult() == 0.0D) - return 0; - - flux *= control.getMult(); - - return flux; - } - - //set neutrons to slow - if(te instanceof TileEntityRBMKModerator) { - stream = NType.SLOW; - return flux; - } - - //return the neutrons back to this with no further action required - if(te instanceof TileEntityRBMKReflector) { - this.receiveFlux(this.isModerated() ? NType.SLOW : stream, flux); - return 0; - } - - //break the neutron flow and nothign else - if(te instanceof TileEntityRBMKAbsorber) { - return 0; - } - - if(te instanceof TileEntityRBMKBase) { - return flux; - } - - int limit = RBMKDials.getColumnHeight(worldObj); - int hits = 0; - for(int h = 0; h <= limit; h++) { - - if(!worldObj.getBlock(x, y + h, z).isOpaqueCube()) - hits++; - } - - if(hits > 0) - ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) (flux * 0.05F * hits / (float)limit)); - - return 0; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - this.fluxFast = nbt.getDouble("fluxFast"); - this.fluxSlow = nbt.getDouble("fluxSlow"); + if(nbt.hasKey("fluxFast") || nbt.hasKey("fluxSlow")) { + // recalculate new values to keep stable operations + this.fluxQuantity = nbt.getDouble("fluxFast") + nbt.getDouble("fluxSlow"); + if(this.fluxQuantity > 0) + this.fluxRatio = nbt.getDouble("fluxFast") / fluxQuantity; + else + this.fluxRatio = 0; + nbt.removeTag("fluxSlow"); + nbt.removeTag("fluxFast"); + writeToNBT(nbt); + } else { + this.fluxQuantity = nbt.getDouble("fluxQuantity"); + this.fluxRatio = nbt.getDouble("fluxRatio"); + } this.hasRod = nbt.getBoolean("hasRod"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxFast", this.fluxFast); - nbt.setDouble("fluxSlow", this.fluxSlow); + nbt.setDouble("fluxQuantity", this.fluxQuantity); + nbt.setDouble("fluxRatio", this.fluxRatio); nbt.setBoolean("hasRod", this.hasRod); } - + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.fluxQuantity); + buf.writeDouble(this.fluxRatio); + buf.writeBoolean(this.hasRod); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.fluxQuantity = buf.readDouble(); + this.fluxRatio = buf.readDouble(); + this.hasRod = buf.readBoolean(); + } + public void getDiagData(NBTTagCompound nbt) { this.writeToNBT(nbt); - + if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { - + ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); nbt.setString("f_yield", rod.getYield(slots[0]) + " / " + rod.yield + " (" + (rod.getEnrichment(slots[0]) * 100) + "%)"); @@ -293,55 +224,60 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM nbt.setString("f_heat", rod.getCoreHeat(slots[0]) + " / " + rod.getHullHeat(slots[0]) + " / " + rod.meltingPoint); } } - + @Override public void onMelt(int reduce) { boolean moderated = this.isModerated(); int h = RBMKDials.getColumnHeight(worldObj); reduce = MathHelper.clamp_int(reduce, 1, h); - + if(worldObj.rand.nextInt(3) == 0) reduce++; - + boolean corium = slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod; - - if(corium && slots[0].getItem() == ModItems.rbmk_fuel_drx) + + if(corium && slots[0].getItem() == ModItems.rbmk_fuel_drx) RBMKBase.digamma = true; - + slots[0] = null; if(corium) { - + for(int i = h; i >= 0; i--) { worldObj.setBlock(xCoord, yCoord + i, zCoord, ModBlocks.corium_block, 5, 3); worldObj.markBlockForUpdate(xCoord, yCoord + i, zCoord); } - + int count = 1 + worldObj.rand.nextInt(RBMKDials.getColumnHeight(worldObj)); - + for(int i = 0; i < count; i++) { spawnDebris(DebrisType.FUEL); } } else { this.standardMelt(reduce); } - + if(moderated) { - + int count = 2 + worldObj.rand.nextInt(2); - + for(int i = 0; i < count; i++) { spawnDebris(DebrisType.GRAPHITE); } } - + spawnDebris(DebrisType.ELEMENT); - + if(this.getBlockMetadata() == RBMKBase.DIR_NORMAL_LID.ordinal() + RBMKBase.offset) spawnDebris(DebrisType.LID); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.ROD; + } + @Override public ColumnType getConsoleType() { return ColumnType.FUEL; @@ -350,9 +286,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM @Override public NBTTagCompound getNBTForConsole() { NBTTagCompound data = new NBTTagCompound(); - + if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { - + ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); data.setDouble("enrichment", rod.getEnrichment(slots[0])); data.setDouble("xenon", rod.getPoison(slots[0])); @@ -360,7 +296,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM data.setDouble("c_coreHeat", rod.getCoreHeat(slots[0])); data.setDouble("c_maxHeat", rod.meltingPoint); } - + return data; } @@ -390,7 +326,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM slots[0] = null; this.markDirty(); } - + // do some opencomputer stuff @Override @Optional.Method(modid = "OpenComputers") @@ -406,16 +342,16 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM @Callback(direct = true) @Optional.Method(modid = "OpenComputers") - public Object[] getFluxSlow(Context context, Arguments args) { - return new Object[] {fluxSlow}; + public Object[] getFluxQuantity(Context context, Arguments args) { + return new Object[] {fluxQuantity}; } @Callback(direct = true) @Optional.Method(modid = "OpenComputers") - public Object[] getFluxFast(Context context, Arguments args) { - return new Object[] {fluxFast}; + public Object[] getFluxRatio(Context context, Arguments args) { + return new Object[] {fluxRatio}; } - + @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getDepletion(Context context, Arguments args) { @@ -464,25 +400,21 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getInfo(Context context, Arguments args) { - Object OC_enrich_buf; - Object OC_poison_buf; - Object OC_hull_buf; - Object OC_core_buf; - String OC_type; + List returnValues = new ArrayList<>(); if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { - OC_enrich_buf = ItemRBMKRod.getEnrichment(slots[0]); - OC_poison_buf = ItemRBMKRod.getPoison(slots[0]); - OC_hull_buf = ItemRBMKRod.getHullHeat(slots[0]); - OC_core_buf = ItemRBMKRod.getCoreHeat(slots[0]); - OC_type = slots[0].getItem().getUnlocalizedName(); - } else { - OC_enrich_buf = "N/A"; - OC_poison_buf = "N/A"; - OC_hull_buf = "N/A"; - OC_core_buf = "N/A"; - OC_type = "N/A"; - } - return new Object[] {heat, OC_hull_buf, OC_core_buf, fluxSlow, fluxFast, OC_enrich_buf, OC_poison_buf, OC_type, ((RBMKRod)this.getBlockType()).moderated, xCoord, yCoord, zCoord}; + returnValues.add(ItemRBMKRod.getHullHeat(slots[0])); + returnValues.add(ItemRBMKRod.getCoreHeat(slots[0])); + returnValues.add(ItemRBMKRod.getEnrichment(slots[0])); + returnValues.add(ItemRBMKRod.getPoison(slots[0])); + returnValues.add(slots[0].getItem().getUnlocalizedName()); + } else + for (int i = 0; i < 5; i++) + returnValues.add("N/A"); + + return new Object[] { + heat, returnValues.get(0), returnValues.get(1), + fluxQuantity, fluxRatio, returnValues.get(2), returnValues.get(3), returnValues.get(4), + ((RBMKRod)this.getBlockType()).moderated, xCoord, yCoord, zCoord}; } @Callback(direct = true) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index e8e284a07..7114db0c7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -1,7 +1,9 @@ package com.hbm.tileentity.machine.rbmk; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.util.Vec3; public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { @@ -16,40 +18,17 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { } @Override - protected void spreadFlux(NType type, double fluxOut) { + public void spreadFlux(double flux, double ratio) { - int range = RBMKDials.getReaSimRange(worldObj); int count = RBMKDials.getReaSimCount(worldObj); - - Vec3 dir = Vec3.createVectorHelper(1, 0, 0); - - for(int i = 0; i < count; i++) { - - stream = type; - double flux = fluxOut * RBMKDials.getReaSimOutputMod(worldObj); - - dir.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - - for(int j = 1; j <= range; j++) { - int x = (int)Math.floor(0.5 + dir.xCoord * j); - int z = (int)Math.floor(0.5 + dir.zCoord * j); - int lastX = (int)Math.floor(0.5 + dir.xCoord * (j - 1)); - int lastZ = (int)Math.floor(0.5 + dir.zCoord * (j - 1)); - - //skip if the position is on the rod itself - if(x == 0 && z == 0) - continue; - - //skip if the current position is equal to the last position - if(x == lastX && z == lastZ) - continue; - - flux = runInteraction(xCoord + x, yCoord, zCoord + z, flux); - - if(flux <= 0) - break; - } + for (int i = 0; i < count; i++) { + Vec3 neutronVector = Vec3.createVectorHelper(1, 0, 0); + + neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + + new RBMKHandler.NeutronStream(RBMKHandler.makeNode(this), neutronVector, flux, ratio); + // Create new neutron streams } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java index a670b6c09..ac8621882 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine.rbmk; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.container.ContainerRBMKStorage; import com.hbm.inventory.gui.GUIRBMKStorage; import com.hbm.items.machine.ItemRBMKRod; @@ -40,6 +41,11 @@ public class TileEntityRBMKStorage extends TileEntityRBMKSlottedBase implements super.updateEntity(); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.STORAGE; From 18bb7f63c45931a1c23f6583e9596e85555fc32f Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:30:34 -0500 Subject: [PATCH 02/70] fuck! --- src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java | 2 +- .../com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index e8f2867bb..7f4874c50 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -57,7 +57,7 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_REASIM_BOILER_SPEED, "0.05"); rules.setOrCreateGameRule(KEY_DISABLE_MELTDOWNS, "false"); rules.setOrCreateGameRule(KEY_ENABLE_MELTDOWN_OVERPRESSURE, "false"); - rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1"); + rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1.0"); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 79cefa3b7..f83fa95c2 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -314,7 +314,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements public void getDiagData(NBTTagCompound nbt) { diag = true; - this.readFromNBT(nbt); + this.writeToNBT(nbt); diag = false; } From fce0b080565dad81950142018ac6ac01bf0dcf12 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 19 Aug 2024 19:11:54 -0500 Subject: [PATCH 03/70] this is fucking insane dude RBMK optimization update soon!!!!!!! --- .../java/api/hbm/energymk2/Nodespace.java | 1 + .../com/hbm/blocks/machine/rbmk/RBMKBase.java | 8 + .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 316 +++++++++++------- .../com/hbm/items/machine/ItemRBMKLid.java | 10 +- .../java/com/hbm/main/ModEventHandler.java | 8 +- .../machine/rbmk/TileEntityRBMKBase.java | 19 +- .../machine/rbmk/TileEntityRBMKOutgasser.java | 2 +- .../machine/rbmk/TileEntityRBMKRod.java | 22 +- .../rbmk/TileEntityRBMKSlottedBase.java | 4 - 9 files changed, 239 insertions(+), 151 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index cdc618f51..07a5b94b2 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -8,6 +8,7 @@ import java.util.Set; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import cpw.mods.fml.common.gameevent.TickEvent; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java index 1293874a8..55975c521 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java @@ -3,6 +3,7 @@ package com.hbm.blocks.machine.rbmk; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.handler.MultiblockHandlerXR; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRBMKLid; import com.hbm.lib.RefStrings; @@ -11,6 +12,7 @@ import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; import api.hbm.block.IToolable; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -27,6 +29,8 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; + public abstract class RBMKBase extends BlockDummyable implements IToolable, ILookOverlay { public static boolean dropLids = true; @@ -170,6 +174,10 @@ public abstract class RBMKBase extends BlockDummyable implements IToolable, ILoo int i = rbmk.getBlockMetadata(); if(rbmk.hasLid() && rbmk.isLidRemovable()) { + + RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + if (node != null) + node.removeLid(); if(!world.isRemote) { if(i == DIR_NORMAL_LID.ordinal() + offset) { diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 03d369ae6..1b92d92a6 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -4,13 +4,16 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.util.fauxpointtwelve.BlockPos; -import net.minecraft.block.Block; -import net.minecraft.server.MinecraftServer; + +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraft.world.World; - -import java.util.*; +import net.minecraftforge.common.util.ForgeDirection; public class RBMKHandler { @@ -30,6 +33,10 @@ public class RBMKHandler { OTHER // why do neutron calculations on them if they won't change anything? } + private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { + return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + } + public static class RBMKNode { protected RBMKType type; @@ -40,16 +47,66 @@ public class RBMKHandler { this.type = type; this.tile = tile; this.hasLid = tile.hasLid(); - addNode(this); + } + + public void addLid() { + this.hasLid = true; + } + + public void removeLid() { + this.hasLid = false; + } + + public void checkNode(BlockPos pos) { + + if (tile == null) + removeNode(pos); // what the fuck??? + + if (tile.isInvalid()) + removeNode(pos); + + if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; + if (!rod.hasRod) { + + // Simulate streams coming out of the RBMK rod find nodes to uncache. + + for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { + NeutronStream stream = new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ)); + + List nodes = stream.getNodes(false); + for (RBMKNode nodeToRemove : nodes) + removeNode(new BlockPos(nodeToRemove.tile)); + } + } + } + + // TODO: Implement `hasRodInRange` for non-rod tile uncaching. } } - private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { - return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + public static RBMKNode makeNode(TileEntityRBMKBase tile) { + BlockPos pos = new BlockPos(tile); + if (nodeCache.containsKey(pos)) + return getNode(pos); + return new RBMKNode(tile, tile.getRBMKType()); } - public static RBMKNode makeNode(TileEntityRBMKBase tile) { - return new RBMKNode(tile, tile.getRBMKType()); + public static class StreamWorld { + + List streams; + + public StreamWorld() { + streams = new ArrayList<>(); + } + + public void addStream(NeutronStream stream) { + this.streams.add(stream); + } + + public void removeAllStreams() { + this.streams.clear(); + } } public static class NeutronStream { @@ -66,12 +123,25 @@ public class RBMKHandler { // Vector for direction of neutron flow. public Vec3 vector; + // Primarily used as a "dummy stream", not to be added to the streams list. + public NeutronStream(RBMKNode origin, Vec3 vector) { + this.origin = origin; + this.vector = vector; + } + public NeutronStream(RBMKNode origin, Vec3 vector, double flux, double ratio) { this.origin = origin; this.vector = vector; this.fluxQuantity = flux; this.fluxRatio = ratio; - streams.put(this, origin.tile.getWorldObj()); + World worldObj = origin.tile.getWorldObj(); + if (streamWorlds.get(worldObj) != null) + streamWorlds.get(worldObj).addStream(this); + else { + StreamWorld world = new StreamWorld(); + world.addStream(this); + streamWorlds.put(worldObj, world); + } } public List getBlocks() { @@ -90,7 +160,7 @@ public class RBMKHandler { // This, however, is used for actual RBMK flux calculations. // Does NOT include the origin node // USES THE CACHE!!! - public List getNodes() { + public List getNodes(boolean cache) { List positions = new ArrayList<>(); for (int i = 1; i <= fluxRange; i++) { @@ -99,24 +169,18 @@ public class RBMKHandler { BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - if (nodeCache.containsKey(pos)) { - positions.add(nodeCache.get(pos)); - continue; - } + if (nodeCache.containsKey(pos) && cache) + positions.add(getNode(pos)); - // If it isn't an RBMK block then don't do anything with it - if(!(origin.tile.getBlockType() instanceof RBMKBase)) - continue; - - TileEntity te = blockPosToTE(origin.tile.getWorldObj(), pos); - - if (te instanceof TileEntityRBMKBase) { - TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase) te; - RBMKType type = rbmkBase.getRBMKType(); - // they should ALL be RBMKBase TEs - RBMKNode node = new RBMKNode(rbmkBase, type); - positions.add(node); - addNode(node); + else if (this.origin.tile.getBlockType() instanceof RBMKBase) { + TileEntity te = blockPosToTE(this.origin.tile.getWorldObj(), pos); + if (te instanceof TileEntityRBMKBase) { + TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase)te; + RBMKNode node = makeNode(rbmkBase); + positions.add(node); + if (cache) + addNode(node); + } } } return positions; @@ -143,6 +207,7 @@ public class RBMKHandler { } int moderatedCount = 0; + double totalFluxMod = 1; for(BlockPos nodePos : getBlocks()) { @@ -152,33 +217,28 @@ public class RBMKHandler { RBMKNode node = nodeCache.get(nodePos); if(node == null) { - TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow? + TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow?? if (te instanceof TileEntityRBMKBase) { node = makeNode((TileEntityRBMKBase) te); addNode(node); // whoops! - } else - return; // TE no longer exists, die!! + } else { + int hits = getHits(nodePos); // Get the amount of hits on blocks. + if (hits == columnHeight) // If stream is fully blocked. + return; + else if (hits > 0) { // If stream is partially blocked. + irradiateFromFlux(pos, hits); + fluxQuantity *= 1 - ((double) hits / columnHeight); // Inverse to get partial blocking by blocks. + continue; + } else { // Nothing hit! + irradiateFromFlux(pos, 0); + continue; + } + } } if(node.type == RBMKType.OTHER) // pass right on by! continue; - Block block = node.tile.getBlockType(); - - if (!(block instanceof RBMKBase)) { - int hits = getHits(nodePos); // Get the amount of hits on blocks. - if (hits == columnHeight) // If stream is fully blocked. - return; - else if (hits > 0) { // If stream is partially blocked. - irradiateFromFlux(pos, hits); - fluxQuantity *= 1 - ((double) hits / columnHeight); // Inverse to get partial blocking by blocks. - continue; - } else { // Nothing hit! - irradiateFromFlux(pos, 0); - continue; - } - } - // we established earlier during `getNodes()` that they should all be RBMKBase TEs // no issue with casting here! TileEntityRBMKBase nodeTE = node.tile; @@ -186,17 +246,17 @@ public class RBMKHandler { if(!node.hasLid) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if(node.type == RBMKType.MODERATOR) { - moderatedCount += 1; + if (node.type == RBMKHandler.RBMKType.MODERATOR) { + moderatedCount++; moderateStream(); } - if(node.tile instanceof IRBMKFluxReceiver) { - IRBMKFluxReceiver column = ((IRBMKFluxReceiver) nodeTE); - if(node.type == RBMKType.ROD) { - TileEntityRBMKRod rod = ((TileEntityRBMKRod) column); - if(rod.hasRod) { - if(rod.isModerated()) + if (nodeTE instanceof IRBMKFluxReceiver) { + IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; + if (node.type == RBMKHandler.RBMKType.ROD) { + TileEntityRBMKRod rod = (TileEntityRBMKRod)column; + if (rod.hasRod) { + if (rod.isModerated()) moderateStream(); rod.receiveFlux(this); return; @@ -208,67 +268,54 @@ public class RBMKHandler { return; } } - } - else if(node.type == RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = ((TileEntityRBMKControl) nodeTE); - if (rod.level > 0D) - fluxQuantity *= ((TileEntityRBMKControl) nodeTE).getMult(); - else - return; - } - - else if(node.type == RBMKType.REFLECTOR) { - if((origin.tile).isModerated()) - moderatedCount += 1; - if (fluxRatio > 0D && moderatedCount > 0) { - for (int i = 0; i < moderatedCount; i++) { - moderateStream(); // Moderate streams on the way back! - } - } - if(reflectorEfficiency != 1) { - fluxQuantity *= reflectorEfficiency; - } else { - ((TileEntityRBMKRod) originTE).receiveFlux(this); - // this one missing return line was baffling me for half an hour - // "why is this rod jumping to double the flux randomly????" - // because you aren't fucking returning from the function, and it's hitting the reflector after it, you idiot - return; + } else if (node.type == RBMKHandler.RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = (TileEntityRBMKControl)nodeTE; + if (rod.level > 0.0D) { + this.fluxQuantity *= rod.getMult(); + totalFluxMod *= rod.getMult(); + continue; } + return; } - else if(node.type == RBMKType.ABSORBER) { - if (absorberEfficiency == 1) - return; // Instantly stop stream processing. - else - fluxQuantity *= absorberEfficiency; + if (node.type == RBMKHandler.RBMKType.REFLECTOR) { + if (this.origin.tile.isModerated()) + moderatedCount++; + if (this.fluxRatio > 0 && moderatedCount > 0) + for (int i = 0; i < moderatedCount; i++) + moderateStream(); + if (totalFluxMod < 1) + this.fluxQuantity *= totalFluxMod; + if (RBMKHandler.reflectorEfficiency != 1.0D) { + this.fluxQuantity *= RBMKHandler.reflectorEfficiency; + continue; + } + ((TileEntityRBMKRod)originTE).receiveFlux(this); + return; + } + if (node.type == RBMKHandler.RBMKType.ABSORBER) { + if (RBMKHandler.absorberEfficiency == 1) + return; + this.fluxQuantity *= RBMKHandler.absorberEfficiency; } } - // Called *after* most streams have returned. - List nodes = getNodes(); - - if(nodes.isEmpty()) // how tf did we get here if its empty + List nodes = getNodes(true); + if (nodes.isEmpty()) return; - // Get the last node in the stream. - RBMKNode lastNode = nodes.get(nodes.size() - 1); + RBMKHandler.RBMKNode lastNode = nodes.get(nodes.size() - 1); - // Block hits don't have to be considered here, since if it's fully blocked it'll return the function before getting here. - if(lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) { - // Neutrons must not have been caught then! - irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); - } + if (lastNode.type != RBMKHandler.RBMKType.REFLECTOR && lastNode.type != RBMKHandler.RBMKType.ABSORBER && lastNode.type != RBMKHandler.RBMKType.CONTROL_ROD) + irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); - // but oh wait, control rods exist - if(lastNode.type == RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = ((TileEntityRBMKControl) lastNode.tile); - // just get level and irradiate based on that - if(rod.getMult() > 0D) { - fluxQuantity = fluxQuantity * rod.getMult(); - irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); + if (lastNode.type == RBMKHandler.RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = (TileEntityRBMKControl)lastNode.tile; + if (rod.getMult() > 0.0D) { + this.fluxQuantity *= rod.getMult(); + irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); } - } } @@ -279,8 +326,8 @@ public class RBMKHandler { // holy fucking shit // I have had this one line cause me like tens of problems // I FUCKING HATE THIS - // total count of bugs fixed attributed to this function: 6 - if (!origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) + // total count of bugs fixed attributed to this function: 10 + if (origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) hits += 1; } @@ -296,16 +343,20 @@ public class RBMKHandler { } public void moderateStream() { - fluxRatio = fluxRatio * (1 - moderatorEfficiency); + fluxRatio *= (1 - moderatorEfficiency); } } + // List of all stream worlds. + public static HashMap streamWorlds = new HashMap<>(); + + public static void removeAllWorlds() { + streamWorlds.clear(); + } + // HashMap of all RBMK nodes and their positions. protected static HashMap nodeCache = new HashMap<>(); - // List of all active neutron streams. - public static HashMap streams = new HashMap<>(); - public static void addNode(RBMKNode node) { nodeCache.put(new BlockPos(node.tile), node); } @@ -314,26 +365,47 @@ public class RBMKHandler { nodeCache.remove(position); } + public static RBMKNode getNode(BlockPos position) { + return nodeCache.get(position); + } + + public static void removeAllNodes() { + nodeCache.clear(); + } + + static int cacheTime = 40; + static int ticks = 0; + // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { - for (World worldObj : MinecraftServer.getServer().worldServers) { + for (Entry world : streamWorlds.entrySet()) { + // Gamerule caching because this apparently is kinda slow? // meh, good enough - reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(); - absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(); - moderatorEfficiency = RBMKDials.getModeratorEfficiency(worldObj); + reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(world.worldObj); + absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(world.worldObj); + moderatorEfficiency = RBMKDials.getModeratorEfficiency(world.getKey()); + // I hate this. // this broke everything because it was ONE OFF // IT'S NOT THE TOTAL HEIGHT IT'S THE AMOUNT OF BLOCKS ABOVE AAAAAAAAAAAAA - columnHeight = RBMKDials.getColumnHeight(worldObj) + 1; - fluxRange = RBMKDials.getFluxRange(worldObj); - streams.forEach((stream, world) -> { - if (world == worldObj) - // WOO!! - stream.runStreamInteraction(world); - }); + columnHeight = RBMKDials.getColumnHeight(world.getKey()) + 1; + fluxRange = RBMKDials.getFluxRange(world.getKey()); + + for (NeutronStream stream : world.getValue().streams) { + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreams(); } - streams.clear(); + + // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage. + if (ticks >= cacheTime) { + ticks = 0; + for(Entry cachedNode : nodeCache.entrySet()) { + cachedNode.getValue().checkNode(cachedNode.getKey()); + } + } + ticks++; } } diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java index 1c1490798..c2e215307 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java @@ -2,9 +2,11 @@ package com.hbm.items.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.rbmk.RBMKBase; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.items.ModItems; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -13,6 +15,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; + public class ItemRBMKLid extends Item { @Override @@ -37,7 +41,11 @@ public class ItemRBMKLid extends Item { if(tile.hasLid()) return false; - + + RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + if (node != null) + node.addLid(); + int meta = RBMKBase.DIR_NORMAL_LID.ordinal(); if(this == ModItems.rbmk_lid_glass) { diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index bf1e44abb..f6b34c1b8 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -535,6 +535,12 @@ public class ModEventHandler { public void onLoad(WorldEvent.Load event) { BobmazonOfferFactory.init(); } + + @SubscribeEvent + public void onUnload(WorldEvent.Unload event) { + RBMKHandler.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. + RBMKHandler.removeAllNodes(); // Remove all nodes. + } public static boolean didSit = false; public static Field reference = null; @@ -1146,9 +1152,7 @@ public class ModEventHandler { TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); // RBMK!!!! - MinecraftServer.getServer().theProfiler.startSection("rbmkHandler_flux_interaction"); RBMKHandler.runAllInteractions(); - MinecraftServer.getServer().theProfiler.endSection(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index f83fa95c2..d53979773 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -22,6 +22,7 @@ import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.Compat; +import com.hbm.util.GameRuleHelper; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -51,7 +52,7 @@ import java.util.*; * @author hbm * */ -public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements INBTPacketReceiver, IBufPacketReceiver { +public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements IBufPacketReceiver { public double heat; @@ -276,22 +277,6 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements nbt.setInteger("steam", this.steam); } - @Deprecated - public void networkPack(NBTTagCompound nbt, int range) { - diag = true; - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - diag = false; - } - - @Deprecated - public void networkUnpack(NBTTagCompound nbt) { - - diag = true; - this.readFromNBT(nbt); - diag = false; - } - public void networkPackNT(int range) { if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 95a851736..3b701fc0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -96,7 +96,7 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement if(canProcess()) { - double efficiency = Math.min((1 - stream.fluxRatio) * 0.8, 1); + double efficiency = Math.min(1 - stream.fluxRatio * 0.8, 1); progress += stream.fluxQuantity * efficiency * RBMKDials.getOutgasserMod(worldObj); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index ad88de20b..05045ca37 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -17,6 +17,7 @@ import com.hbm.util.CompatEnergyControl; import com.hbm.util.ParticleUtil; import api.hbm.tile.IInfoProviderEC; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -38,6 +39,9 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; +import static com.hbm.handler.rbmkmk2.RBMKHandler.addNode; +import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBMKFluxReceiver, IRBMKLoadable, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent { @@ -116,6 +120,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM if(this.heat > 10_000) this.heat = 10_000; + this.markDirty(); + //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back this.fluxQuantity = 0; spreadFlux(fluxQuantityOut, fluxRatioOut); @@ -139,7 +145,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM switch(type) { case SLOW: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.5, 1)); - case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min((1 - this.fluxRatio) * 0.3, 1)); + case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min(1 - this.fluxRatio * 0.3, 1)); case ANY: return this.fluxQuantity; } @@ -153,16 +159,24 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM ForgeDirection.WEST }; - protected static NType stream; - public void spreadFlux(double flux, double ratio) { + BlockPos pos = new BlockPos(this); + + RBMKHandler.RBMKNode node; + + if(getNode(pos) == null) { + node = RBMKHandler.makeNode(this); + addNode(node); + } else + node = getNode(pos); + for(ForgeDirection dir : fluxDirs) { Vec3 neutronVector = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); - new NeutronStream(RBMKHandler.makeNode(this), neutronVector, flux, ratio); // Create new neutron streams + new NeutronStream(node, neutronVector, flux, ratio); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java index 7c6278c84..8fa2d7317 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java @@ -134,10 +134,6 @@ public abstract class TileEntityRBMKSlottedBase extends TileEntityRBMKActiveBase PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - } - public void handleButtonPacket(int value, int meta) { } From 05cc217bfe11df56261342efacc9dd708b219635 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:10:20 -0500 Subject: [PATCH 04/70] hooolyyyy shiiiiiiiit i finally fixed the bug!!!!!!!!!! --- .../handler/rbmkmk2/ItemRBMKRodFluxCurve.java | 55 +++++++++++++++++ .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 43 ++++++++++---- .../java/com/hbm/hazard/HazardRegistry.java | 1 + src/main/java/com/hbm/items/ModItems.java | 14 +++++ .../machine/rbmk/TileEntityRBMKRod.java | 59 +++++++++++++------ 5 files changed, 142 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java diff --git a/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java b/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java new file mode 100644 index 000000000..457638a76 --- /dev/null +++ b/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java @@ -0,0 +1,55 @@ +package com.hbm.handler.rbmkmk2; + +import com.hbm.items.machine.ItemRBMKPellet; +import com.hbm.items.machine.ItemRBMKRod; +import net.minecraft.util.MathHelper; + +import java.util.function.BiFunction; +import java.util.function.Function; + + +public class ItemRBMKRodFluxCurve extends ItemRBMKRod { + + /** Double 1: Flux ratio in. + * Double 2: Depletion value. + * Return double: Output flux ratio. + **/ + BiFunction ratioCurve; + + /** Double 1: Flux quantity in.
+ * Double 2: Flux ratio in.
+ * Return double: Output flux quantity. + **/ + BiFunction fluxCurve; + + public ItemRBMKRodFluxCurve(ItemRBMKPellet pellet) { + super(pellet); + } + + public ItemRBMKRodFluxCurve(String fullName) { + super(fullName); + } + + public ItemRBMKRodFluxCurve setOutputRatioCurve(Function func) { + this.ratioCurve = (fluxRatioIn, depletion) -> func.apply(fluxRatioIn) * 1.0D; + return this; + } + + public ItemRBMKRodFluxCurve setDepletionOutputRatioCurve(BiFunction func) { + this.ratioCurve = func; + return this; + } + + public ItemRBMKRodFluxCurve setOutputFluxCurve(BiFunction func) { + this.fluxCurve = func; + return this; + } + + public double fluxRatioOut(double fluxRatioIn, double depletion) { + return MathHelper.clamp_double(ratioCurve.apply(fluxRatioIn, depletion), 0, 1); + } + + public double fluxFromRatio(double quantity, double ratio) { + return fluxCurve.apply(quantity, ratio); + } +} diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 1b92d92a6..1661cb216 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -49,6 +49,12 @@ public class RBMKHandler { this.hasLid = tile.hasLid(); } + public RBMKNode(TileEntityRBMKBase tile, RBMKType type, boolean hasLid) { + this.type = type; + this.tile = tile; + this.hasLid = hasLid; + } + public void addLid() { this.hasLid = true; } @@ -57,13 +63,19 @@ public class RBMKHandler { this.hasLid = false; } - public void checkNode(BlockPos pos) { + public List checkNode(BlockPos pos) { - if (tile == null) - removeNode(pos); // what the fuck??? + List list = new ArrayList<>(); - if (tile.isInvalid()) - removeNode(pos); + if (tile == null) { + list.add(pos); // what the fuck??? + return list; + } + + if (tile.isInvalid()) { + list.add(pos); + return list; + } if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; @@ -76,11 +88,13 @@ public class RBMKHandler { List nodes = stream.getNodes(false); for (RBMKNode nodeToRemove : nodes) - removeNode(new BlockPos(nodeToRemove.tile)); + list.add(new BlockPos(nodeToRemove.tile)); } + return list; } } + return list; // TODO: Implement `hasRodInRange` for non-rod tile uncaching. } } @@ -89,6 +103,8 @@ public class RBMKHandler { BlockPos pos = new BlockPos(tile); if (nodeCache.containsKey(pos)) return getNode(pos); + if (!tile.hasWorldObj()) + return new RBMKNode(tile, tile.getRBMKType(), true); return new RBMKNode(tile, tile.getRBMKType()); } @@ -326,7 +342,7 @@ public class RBMKHandler { // holy fucking shit // I have had this one line cause me like tens of problems // I FUCKING HATE THIS - // total count of bugs fixed attributed to this function: 10 + // total count of bugs fixed attributed to this function: 11 if (origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) hits += 1; } @@ -373,8 +389,7 @@ public class RBMKHandler { nodeCache.clear(); } - static int cacheTime = 40; - static int ticks = 0; + private static int ticks = 0; // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { @@ -400,11 +415,15 @@ public class RBMKHandler { } // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage. + int cacheTime = 40; if (ticks >= cacheTime) { ticks = 0; - for(Entry cachedNode : nodeCache.entrySet()) { - cachedNode.getValue().checkNode(cachedNode.getKey()); - } + List toRemove = new ArrayList<>(); + for(Entry cachedNode : nodeCache.entrySet()) + toRemove.addAll(cachedNode.getValue().checkNode(cachedNode.getKey())); + + for(BlockPos pos : toRemove) + removeNode(pos); } ticks++; } diff --git a/src/main/java/com/hbm/hazard/HazardRegistry.java b/src/main/java/com/hbm/hazard/HazardRegistry.java index 0653efe8c..b8de08aa3 100644 --- a/src/main/java/com/hbm/hazard/HazardRegistry.java +++ b/src/main/java/com/hbm/hazard/HazardRegistry.java @@ -394,6 +394,7 @@ public class HazardRegistry { registerRBMKRod(rbmk_fuel_zfb_pu241, pu239 * rod_rbmk * 0.1F, wst * rod_rbmk * 7.5F); registerRBMKRod(rbmk_fuel_zfb_am_mix, pu241 * rod_rbmk * 0.1F, wst * rod_rbmk * 10F); registerRBMK(rbmk_fuel_drx, bf * rod_rbmk, bf * rod_rbmk * 100F, true, true, 0, 1F/3F); + registerRBMKRod(rbmk_fuel_curve, saf * rod_rbmk * np237 * rod_rbmk, wst * rod_rbmk * 35F); registerRBMKPellet(rbmk_pellet_ueu, u * billet, wst * billet * 20F); registerRBMKPellet(rbmk_pellet_meu, uf * billet, wst * billet * 21.5F); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f3309fb32..8494c6bd0 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -7,6 +7,7 @@ import com.hbm.handler.ToolAbility; import com.hbm.handler.ToolAbility.LuckAbility; import com.hbm.handler.WeaponAbility; import com.hbm.handler.guncfg.*; +import com.hbm.handler.rbmkmk2.ItemRBMKRodFluxCurve; import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -64,6 +65,8 @@ import net.minecraftforge.common.util.EnumHelper; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; +import java.util.function.BiFunction; + public class ModItems { public static void mainRegistry() @@ -1129,6 +1132,7 @@ public class ModItems { public static ItemRBMKRod rbmk_fuel_zfb_am_mix; public static ItemRBMKRod rbmk_fuel_drx; public static ItemRBMKRod rbmk_fuel_test; + public static ItemRBMKRodFluxCurve rbmk_fuel_curve; public static ItemRBMKPellet rbmk_pellet_ueu; public static ItemRBMKPellet rbmk_pellet_meu; public static ItemRBMKPellet rbmk_pellet_heu233; @@ -3753,6 +3757,15 @@ public class ModItems { .setHeat(1.0D) .setMeltingPoint(100000) .setUnlocalizedName("rbmk_fuel_test").setTextureName(RefStrings.MODID + ":rbmk_fuel_test"); + rbmk_fuel_curve = (ItemRBMKRodFluxCurve) new ItemRBMKRodFluxCurve("3D curve test") + .setOutputFluxCurve((fluxQuantity, fluxRatio) -> fluxQuantity * (1 - Math.pow(fluxRatio, 2))) + .setDepletionOutputRatioCurve((ratioIn, depletion) -> Math.pow(ratioIn, 2) * depletion) + .setYield(1000000D) + .setStats(100) + .setFunction(EnumBurnFunc.EXPERIMENTAL) + .setHeat(1.0D) + .setMeltingPoint(100000) + .setUnlocalizedName("rbmk_fuel_curve").setTextureName(RefStrings.MODID + ":rbmk_fuel_curve"); watz_pellet = new ItemWatzPellet().setUnlocalizedName("watz_pellet").setTextureName(RefStrings.MODID + ":watz_pellet"); watz_pellet_depleted = new ItemWatzPellet().setUnlocalizedName("watz_pellet_depleted").setTextureName(RefStrings.MODID + ":watz_pellet"); @@ -6594,6 +6607,7 @@ public class ModItems { GameRegistry.registerItem(rbmk_fuel_zfb_am_mix, rbmk_fuel_zfb_am_mix.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_drx, rbmk_fuel_drx.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_test, rbmk_fuel_test.getUnlocalizedName()); + GameRegistry.registerItem(rbmk_fuel_curve, rbmk_fuel_curve.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_ueu, rbmk_pellet_ueu.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_meu, rbmk_pellet_meu.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 05045ca37..901d0fa70 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -8,6 +8,7 @@ import com.hbm.handler.CompatHandler; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.handler.rbmkmk2.RBMKHandler.NeutronStream; +import com.hbm.handler.rbmkmk2.ItemRBMKRodFluxCurve; import com.hbm.inventory.container.ContainerRBMKRod; import com.hbm.inventory.gui.GUIRBMKRod; import com.hbm.items.ModItems; @@ -39,8 +40,7 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; -import static com.hbm.handler.rbmkmk2.RBMKHandler.addNode; -import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; +import static com.hbm.handler.rbmkmk2.RBMKHandler.*; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBMKFluxReceiver, IRBMKLoadable, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent { @@ -49,6 +49,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM // Used for receiving flux (calculating outbound flux/burning rods) public double fluxRatio; public double fluxQuantity; + public double lastFluxQuantity; public boolean hasRod; @@ -89,14 +90,29 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); - double fluxIn = fluxFromType(rod.nType); - double fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); double fluxRatioOut; - NType rType = rod.rType; - if(rType == NType.SLOW) - fluxRatioOut = 0; - else - fluxRatioOut = 1; + double fluxQuantityOut; + + if (rod instanceof ItemRBMKRodFluxCurve) { // Experimental flux ratio curve rods! + ItemRBMKRodFluxCurve rodCurve = (ItemRBMKRodFluxCurve) rod; + + fluxRatioOut = rodCurve.fluxRatioOut(this.fluxRatio, ItemRBMKRod.getEnrichment(slots[0])); + + double fluxIn; + + fluxIn = rodCurve.fluxFromRatio(this.fluxQuantity, this.fluxRatio); + + fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); + } else { + NType rType = rod.rType; + if (rType == NType.SLOW) + fluxRatioOut = 0; + else + fluxRatioOut = 1; + + double fluxIn = fluxFromType(rod.nType); + fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); + } rod.updateHeat(worldObj, slots[0], 1.0D); this.heat += rod.provideHeat(worldObj, slots[0], heat, 1.0D); @@ -114,15 +130,14 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } else { this.meltdown(); } + this.lastFluxQuantity = 0; this.fluxQuantity = 0; return; } if(this.heat > 10_000) this.heat = 10_000; - this.markDirty(); - - //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back + this.lastFluxQuantity = this.fluxQuantity; this.fluxQuantity = 0; spreadFlux(fluxQuantityOut, fluxRatioOut); @@ -130,6 +145,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } else { + this.lastFluxQuantity = 0; this.fluxQuantity = 0; this.fluxRatio = 0; @@ -142,10 +158,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM private double fluxFromType(NType type) { - switch(type) { case SLOW: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.5, 1)); - case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min(1 - this.fluxRatio * 0.3, 1)); + case FAST: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.3, 1)); case ANY: return this.fluxQuantity; } @@ -184,10 +199,10 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - if(nbt.hasKey("fluxFast") || nbt.hasKey("fluxSlow")) { + if (nbt.hasKey("fluxFast") || nbt.hasKey("fluxSlow")) { // recalculate new values to keep stable operations this.fluxQuantity = nbt.getDouble("fluxFast") + nbt.getDouble("fluxSlow"); - if(this.fluxQuantity > 0) + if (this.fluxQuantity > 0) this.fluxRatio = nbt.getDouble("fluxFast") / fluxQuantity; else this.fluxRatio = 0; @@ -201,10 +216,18 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.hasRod = nbt.getBoolean("hasRod"); } - @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + nbt.setDouble("fluxQuantity", this.lastFluxQuantity); + nbt.setDouble("fluxRatio", this.fluxRatio); + nbt.setBoolean("hasRod", this.hasRod); + } + + // aaaaaaa + public void writeToNBTDiag(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setDouble("fluxQuantity", this.fluxQuantity); nbt.setDouble("fluxRatio", this.fluxRatio); nbt.setBoolean("hasRod", this.hasRod); @@ -227,7 +250,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } public void getDiagData(NBTTagCompound nbt) { - this.writeToNBT(nbt); + this.writeToNBTDiag(nbt); if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { From 2e4bdf943f32e1ed9c0a3692ad53bbce71cc2435 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:19:04 -0500 Subject: [PATCH 05/70] 99.999% there just some more optimization! (node culling) --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 104 ++++++++++++------ .../tileentity/machine/rbmk/RBMKDials.java | 24 +++- .../machine/rbmk/TileEntityRBMKRod.java | 15 ++- .../machine/rbmk/TileEntityRBMKRodReaSim.java | 21 +++- 4 files changed, 123 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 1661cb216..a2bd18e5f 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.Map.Entry; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; @@ -63,39 +64,72 @@ public class RBMKHandler { this.hasLid = false; } + public List getReaSimNodes(TileEntityRBMKRodReaSim rod) { + List list = new ArrayList<>(); + for (int x = rod.xCoord - fluxRange; x <= rod.xCoord + fluxRange; x++) + for (int z = rod.zCoord - fluxRange; z <= rod.zCoord + fluxRange; z++) + if ((x - rod.xCoord) * (x - rod.xCoord) + (z - rod.zCoord) * (z - rod.zCoord) <= fluxRange * fluxRange) + list.add(new BlockPos(rod)); + return list; + } + public List checkNode(BlockPos pos) { List list = new ArrayList<>(); - if (tile == null) { - list.add(pos); // what the fuck??? - return list; - } - - if (tile.isInvalid()) { + // Check if the tile no longer exists/is invalid. + if (tile == null || tile.isInvalid()) { list.add(pos); return list; } + List streams = new ArrayList<>(); + + // Simulate streams coming out of the RBMK rod. + for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { + streams.add(new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ))); + } + + // Check if the rod should uncache nodes. if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; - if (!rod.hasRod) { + if (!rod.hasRod || rod.fluxQuantity == 0) { - // Simulate streams coming out of the RBMK rod find nodes to uncache. - - for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { - NeutronStream stream = new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ)); - - List nodes = stream.getNodes(false); - for (RBMKNode nodeToRemove : nodes) - list.add(new BlockPos(nodeToRemove.tile)); + for (NeutronStream stream : streams) { + stream.getNodes(false).forEach(node -> list.add(new BlockPos(node.tile))); } + return list; } } + if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk + TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; + if (!rod.hasRod || rod.fluxQuantity == 0) { + list.addAll(getReaSimNodes(rod)); + } + } + + // TODO: implement ReaSim node culling on the non-rod side. + + // Check if non-rod nodes should be uncached due to no rod in range. + for (NeutronStream stream : streams) { + + List nodes = stream.getNodes(false); + + for (RBMKNode node : nodes) { + if (node.tile instanceof TileEntityRBMKRod) + return list; + } + + // If we get here, then no rods were found along this stream's path! + // This, most of the time, means we can just uncache all off the nodes inside the stream's path. + // That other part of the time, streams will be crossing paths. + // This is fine though, we can just uncache them anyway and the streams later on (next tick) will recache them. + nodes.forEach(node -> list.add(new BlockPos(node.tile))); + } + return list; - // TODO: Implement `hasRodInRange` for non-rod tile uncaching. } } @@ -160,6 +194,7 @@ public class RBMKHandler { } } + // USES THE CACHE!!! public List getBlocks() { List positions = new ArrayList<>(); @@ -173,10 +208,9 @@ public class RBMKHandler { return positions; } - // This, however, is used for actual RBMK flux calculations. // Does NOT include the origin node // USES THE CACHE!!! - public List getNodes(boolean cache) { + public List getNodes(boolean addNode) { List positions = new ArrayList<>(); for (int i = 1; i <= fluxRange; i++) { @@ -185,7 +219,7 @@ public class RBMKHandler { BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - if (nodeCache.containsKey(pos) && cache) + if (nodeCache.containsKey(pos)) positions.add(getNode(pos)); else if (this.origin.tile.getBlockType() instanceof RBMKBase) { @@ -194,7 +228,7 @@ public class RBMKHandler { TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase)te; RBMKNode node = makeNode(rbmkBase); positions.add(node); - if (cache) + if (addNode) addNode(node); } } @@ -223,7 +257,6 @@ public class RBMKHandler { } int moderatedCount = 0; - double totalFluxMod = 1; for(BlockPos nodePos : getBlocks()) { @@ -262,23 +295,25 @@ public class RBMKHandler { if(!node.hasLid) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if (node.type == RBMKHandler.RBMKType.MODERATOR) { + if (node.type == RBMKHandler.RBMKType.MODERATOR || nodeTE.isModerated()) { moderatedCount++; moderateStream(); } if (nodeTE instanceof IRBMKFluxReceiver) { IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; + if (node.type == RBMKHandler.RBMKType.ROD) { TileEntityRBMKRod rod = (TileEntityRBMKRod)column; + if (rod.hasRod) { - if (rod.isModerated()) - moderateStream(); rod.receiveFlux(this); return; } + } else if(node.type == RBMKType.OUTGASSER) { TileEntityRBMKOutgasser outgasser = ((TileEntityRBMKOutgasser) column); + if(outgasser.canProcess()) { column.receiveFlux(this); return; @@ -286,33 +321,34 @@ public class RBMKHandler { } } else if (node.type == RBMKHandler.RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = (TileEntityRBMKControl)nodeTE; + TileEntityRBMKControl rod = (TileEntityRBMKControl) nodeTE; + if (rod.level > 0.0D) { + this.fluxQuantity *= rod.getMult(); - totalFluxMod *= rod.getMult(); continue; } return; - } + } else if (node.type == RBMKHandler.RBMKType.REFLECTOR) { - if (node.type == RBMKHandler.RBMKType.REFLECTOR) { if (this.origin.tile.isModerated()) moderatedCount++; + if (this.fluxRatio > 0 && moderatedCount > 0) for (int i = 0; i < moderatedCount; i++) moderateStream(); - if (totalFluxMod < 1) - this.fluxQuantity *= totalFluxMod; + if (RBMKHandler.reflectorEfficiency != 1.0D) { this.fluxQuantity *= RBMKHandler.reflectorEfficiency; continue; } + ((TileEntityRBMKRod)originTE).receiveFlux(this); return; - } - if (node.type == RBMKHandler.RBMKType.ABSORBER) { + } else if (node.type == RBMKHandler.RBMKType.ABSORBER) { if (RBMKHandler.absorberEfficiency == 1) return; + this.fluxQuantity *= RBMKHandler.absorberEfficiency; } } @@ -398,8 +434,8 @@ public class RBMKHandler { // Gamerule caching because this apparently is kinda slow? // meh, good enough - reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(world.worldObj); - absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(world.worldObj); + reflectorEfficiency = RBMKDials.getReflectorEfficiency(world.getKey()); + absorberEfficiency = RBMKDials.getAbsorberEfficiency(world.getKey()); moderatorEfficiency = RBMKDials.getModeratorEfficiency(world.getKey()); // I hate this. diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 7f4874c50..c52555c23 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -32,6 +32,8 @@ public class RBMKDials { public static final String KEY_ENABLE_MELTDOWN_OVERPRESSURE = "dialEnableMeltdownOverpressure"; public static final String KEY_MODERATOR_EFFICIENCY = "dialModeratorEfficiency"; + public static final String KEY_ABSORBER_EFFICIENCY = "dialAbsorberEfficiency"; + public static final String KEY_REFLECTOR_EFFICIENCY = "dialReflectorEfficiency"; public static void createDials(World world) { GameRules rules = world.getGameRules(); @@ -58,6 +60,8 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_DISABLE_MELTDOWNS, "false"); rules.setOrCreateGameRule(KEY_ENABLE_MELTDOWN_OVERPRESSURE, "false"); rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1.0"); + rules.setOrCreateGameRule(KEY_ABSORBER_EFFICIENCY, "1.0"); + rules.setOrCreateGameRule(KEY_REFLECTOR_EFFICIENCY, "1.0"); } } @@ -234,11 +238,29 @@ public class RBMKDials { } /** - * The percentage of neutron to moderate from fast to slow when they pass through a moderator. + * The percentage of neutrons to moderate from fast to slow when they pass through a moderator. * @param world * @return */ public static double getModeratorEfficiency(World world) { return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); } + + /** + * The percentage of neutrons to be absorbed when a stream hits an absorber column. + * @param world + * @return + */ + public static double getAbsorberEfficiency(World world) { + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + } + + /** + * The percentage of neutron to reflect when a stream hits a reflector column. + * @param world + * @return + */ + public static double getReflectorEfficiency(World world) { + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 901d0fa70..75b663f01 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -138,7 +138,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM if(this.heat > 10_000) this.heat = 10_000; this.lastFluxQuantity = this.fluxQuantity; + this.fluxQuantity = 0; + spreadFlux(fluxQuantityOut, fluxRatioOut); hasRod = true; @@ -178,13 +180,18 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM BlockPos pos = new BlockPos(this); - RBMKHandler.RBMKNode node; + if (flux == 0) { + // simple way to remove the node from the cache when no flux is going into it! + removeNode(pos); + return; + } - if(getNode(pos) == null) { + RBMKHandler.RBMKNode node = getNode(pos); + + if(node == null) { node = RBMKHandler.makeNode(this); addNode(node); - } else - node = getNode(pos); + } for(ForgeDirection dir : fluxDirs) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index 7114db0c7..74da00c39 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -1,11 +1,13 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler.RBMKNode; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.util.Vec3; +import static com.hbm.handler.rbmkmk2.RBMKHandler.*; + public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { public TileEntityRBMKRodReaSim() { @@ -20,6 +22,21 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { @Override public void spreadFlux(double flux, double ratio) { + BlockPos pos = new BlockPos(this); + + if (flux == 0) { + // simple way to remove the node from the cache when no flux is going into it! + removeNode(pos); + return; + } + + RBMKNode node = getNode(pos); + + if(node == null) { + node = makeNode(this); + addNode(node); + } + int count = RBMKDials.getReaSimCount(worldObj); for (int i = 0; i < count; i++) { @@ -27,7 +44,7 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - new RBMKHandler.NeutronStream(RBMKHandler.makeNode(this), neutronVector, flux, ratio); + new NeutronStream(makeNode(this), neutronVector, flux, ratio); // Create new neutron streams } } From db8df184cde7028c9485ed62f14e59e299307e47 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:19:49 -0500 Subject: [PATCH 06/70] oops --- src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index a2bd18e5f..0a1692a7e 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -107,6 +107,7 @@ public class RBMKHandler { TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; if (!rod.hasRod || rod.fluxQuantity == 0) { list.addAll(getReaSimNodes(rod)); + return list; } } From 07a63017742445dbe4f849032947d837dea4824e Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 28 Aug 2024 22:37:13 -0500 Subject: [PATCH 07/70] i am going to kms --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 50 +++++++++++++++---- .../machine/rbmk/TileEntityRBMKConsole.java | 2 +- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 0a1692a7e..9c17a3635 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -5,11 +5,8 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.util.fauxpointtwelve.BlockPos; -import java.util.HashMap; +import java.util.*; import java.util.Map.Entry; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; @@ -64,12 +61,12 @@ public class RBMKHandler { this.hasLid = false; } - public List getReaSimNodes(TileEntityRBMKRodReaSim rod) { + public List getReaSimNodes() { List list = new ArrayList<>(); - for (int x = rod.xCoord - fluxRange; x <= rod.xCoord + fluxRange; x++) - for (int z = rod.zCoord - fluxRange; z <= rod.zCoord + fluxRange; z++) - if ((x - rod.xCoord) * (x - rod.xCoord) + (z - rod.zCoord) * (z - rod.zCoord) <= fluxRange * fluxRange) - list.add(new BlockPos(rod)); + for (int x = this.tile.xCoord - fluxRange; x <= this.tile.xCoord + fluxRange; x++) + for (int z = this.tile.zCoord - fluxRange; z <= this.tile.zCoord + fluxRange; z++) + if ((x - this.tile.xCoord) * (x - this.tile.xCoord) + (z - this.tile.zCoord) * (z - this.tile.zCoord) <= fluxRange * fluxRange) + list.add(new BlockPos(this.tile).add(x, 0, z)); return list; } @@ -103,15 +100,46 @@ public class RBMKHandler { } } + List points = getReaSimNodes(); + + // Check if the ReaSim rod should be culled from the cache due to no rod or no flux. if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; if (!rod.hasRod || rod.fluxQuantity == 0) { - list.addAll(getReaSimNodes(rod)); + list.addAll(points); return list; } } - // TODO: implement ReaSim node culling on the non-rod side. + // Check if non-rod nodes should be uncached... but now with ReaSim! + { // Yeah, I don't want to contaminate the surrounding scope. + List nodes = new ArrayList<>(); + points.forEach(nodePos -> { + RBMKNode node = getNode(nodePos); + if (node != null) + nodes.add(node); + }); + + boolean hasRod = false; + + for (RBMKNode node : nodes) { + + if (node.tile instanceof TileEntityRBMKRod) { + + TileEntityRBMKRod rod = (TileEntityRBMKRod) node.tile; + + if (rod.hasRod && rod.fluxQuantity > 0) { + hasRod = true; + break; + } + } + } + + if (nodes.isEmpty() || !hasRod) { + list.add(pos); + return list; + } + } // Check if non-rod nodes should be uncached due to no rod in range. for (NeutronStream stream : streams) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index 02b224c7a..523ea09c6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -556,7 +556,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod){ TileEntityRBMKRod fuelChannel = (TileEntityRBMKRod)te; - data_table.put("fluxQuantity", fuelChannel.fluxQuantity); + data_table.put("fluxQuantity", fuelChannel.lastFluxQuantity); data_table.put("fluxRatio", fuelChannel.fluxRatio); } From a8051b8bd9a08b1a44c625ac808900296d744d4a Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:44:26 -0500 Subject: [PATCH 08/70] i fixed it i fixed it i fixed it i fixed it i fixed it i fixed it fucking FINALLY --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 63 +++++++++++-------- .../machine/rbmk/TileEntityRBMKConsole.java | 2 +- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 9c17a3635..d69e1f692 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -5,7 +5,9 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.util.fauxpointtwelve.BlockPos; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.HashMap; import java.util.Map.Entry; import net.minecraft.tileentity.TileEntity; @@ -63,22 +65,18 @@ public class RBMKHandler { public List getReaSimNodes() { List list = new ArrayList<>(); - for (int x = this.tile.xCoord - fluxRange; x <= this.tile.xCoord + fluxRange; x++) - for (int z = this.tile.zCoord - fluxRange; z <= this.tile.zCoord + fluxRange; z++) - if ((x - this.tile.xCoord) * (x - this.tile.xCoord) + (z - this.tile.zCoord) * (z - this.tile.zCoord) <= fluxRange * fluxRange) - list.add(new BlockPos(this.tile).add(x, 0, z)); + for (int x = -fluxRange; x <= fluxRange; x++) + for (int z = -fluxRange; z <= fluxRange; z++) + if (Math.pow(x, 2) + Math.pow(z, 2) <= fluxRange * fluxRange) + list.add(new BlockPos(tile).add(x, 0, z)); return list; } - public List checkNode(BlockPos pos) { + public List checkNode() { List list = new ArrayList<>(); - // Check if the tile no longer exists/is invalid. - if (tile == null || tile.isInvalid()) { - list.add(pos); - return list; - } + BlockPos pos = new BlockPos(this.tile); List streams = new ArrayList<>(); @@ -90,7 +88,7 @@ public class RBMKHandler { // Check if the rod should uncache nodes. if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; - if (!rod.hasRod || rod.fluxQuantity == 0) { + if (!rod.hasRod || rod.lastFluxQuantity == 0) { for (NeutronStream stream : streams) { stream.getNodes(false).forEach(node -> list.add(new BlockPos(node.tile))); @@ -105,7 +103,7 @@ public class RBMKHandler { // Check if the ReaSim rod should be culled from the cache due to no rod or no flux. if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; - if (!rod.hasRod || rod.fluxQuantity == 0) { + if (!rod.hasRod || rod.lastFluxQuantity == 0) { list.addAll(points); return list; } @@ -128,7 +126,7 @@ public class RBMKHandler { TileEntityRBMKRod rod = (TileEntityRBMKRod) node.tile; - if (rod.hasRod && rod.fluxQuantity > 0) { + if (rod.hasRod && rod.lastFluxQuantity > 0) { hasRod = true; break; } @@ -150,14 +148,15 @@ public class RBMKHandler { if (node.tile instanceof TileEntityRBMKRod) return list; } - - // If we get here, then no rods were found along this stream's path! - // This, most of the time, means we can just uncache all off the nodes inside the stream's path. - // That other part of the time, streams will be crossing paths. - // This is fine though, we can just uncache them anyway and the streams later on (next tick) will recache them. - nodes.forEach(node -> list.add(new BlockPos(node.tile))); } + // If we get here, then no rods were found along this stream's path! + // This, most of the time, means we can just uncache all the nodes inside the stream's path. + // That other part of the time, streams will be crossing paths. + // This is fine though, we can just uncache them anyway and the streams later on (next tick) will recache them. + // /\ idk what this guy was on about but this is just plain wrong. /\ + list.add(pos); + return list; } } @@ -214,13 +213,12 @@ public class RBMKHandler { this.fluxQuantity = flux; this.fluxRatio = ratio; World worldObj = origin.tile.getWorldObj(); - if (streamWorlds.get(worldObj) != null) - streamWorlds.get(worldObj).addStream(this); - else { + if (streamWorlds.get(worldObj) == null) { StreamWorld world = new StreamWorld(); world.addStream(this); streamWorlds.put(worldObj, world); - } + } else + streamWorlds.get(worldObj).addStream(this); } // USES THE CACHE!!! @@ -459,6 +457,19 @@ public class RBMKHandler { // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { + // Remove `StreamWorld` objects if they have no streams. + { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn + List toRemove = new ArrayList<>(); + streamWorlds.forEach((world, streamWorld) -> { + if (streamWorld.streams.isEmpty()) + toRemove.add(world); + }); + + for (World world : toRemove) { + streamWorlds.remove(world); + } + } + for (Entry world : streamWorlds.entrySet()) { // Gamerule caching because this apparently is kinda slow? @@ -484,8 +495,8 @@ public class RBMKHandler { if (ticks >= cacheTime) { ticks = 0; List toRemove = new ArrayList<>(); - for(Entry cachedNode : nodeCache.entrySet()) - toRemove.addAll(cachedNode.getValue().checkNode(cachedNode.getKey())); + for(RBMKNode cachedNode : nodeCache.values()) + toRemove.addAll(cachedNode.checkNode()); for(BlockPos pos : toRemove) removeNode(pos); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index 523ea09c6..78ea7a558 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -103,7 +103,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod) { TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; - flux += fuel.fluxQuantity; + flux += fuel.lastFluxQuantity; } } else { From 9226af071966abbc3c81829ffe2cc2c11bd70169 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:52:10 -0500 Subject: [PATCH 09/70] fix up some imports! --- src/main/java/com/hbm/main/ModEventHandler.java | 1 - .../com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index f6b34c1b8..ea4c568d9 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -10,7 +10,6 @@ import java.util.Random; import java.util.UUID; import com.hbm.handler.rbmkmk2.RBMKHandler; -import net.minecraft.server.MinecraftServer; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index d53979773..e84bd5328 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -13,16 +13,13 @@ import com.hbm.handler.rbmkmk2.RBMKHandler.RBMKType; import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.BufPacket; -import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.saveddata.TomSaveData; import com.hbm.tileentity.IBufPacketReceiver; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.Compat; -import com.hbm.util.GameRuleHelper; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; From e7419ef76b51140444abb933fc7ef82c887ac05f Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 1 Sep 2024 19:55:49 -0500 Subject: [PATCH 10/70] more shit --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 24 ++++++++++--------- .../machine/rbmk/TileEntityRBMKBase.java | 1 + .../machine/rbmk/TileEntityRBMKRod.java | 20 ++++------------ 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index d69e1f692..fa0d93f46 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.HashMap; import java.util.Map.Entry; +import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -322,7 +323,7 @@ public class RBMKHandler { if(!node.hasLid) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if (node.type == RBMKHandler.RBMKType.MODERATOR || nodeTE.isModerated()) { + if (node.type == RBMKType.MODERATOR || nodeTE.isModerated()) { moderatedCount++; moderateStream(); } @@ -330,7 +331,7 @@ public class RBMKHandler { if (nodeTE instanceof IRBMKFluxReceiver) { IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; - if (node.type == RBMKHandler.RBMKType.ROD) { + if (node.type == RBMKType.ROD) { TileEntityRBMKRod rod = (TileEntityRBMKRod)column; if (rod.hasRod) { @@ -347,7 +348,7 @@ public class RBMKHandler { } } - } else if (node.type == RBMKHandler.RBMKType.CONTROL_ROD) { + } else if (node.type == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl) nodeTE; if (rod.level > 0.0D) { @@ -356,7 +357,7 @@ public class RBMKHandler { continue; } return; - } else if (node.type == RBMKHandler.RBMKType.REFLECTOR) { + } else if (node.type == RBMKType.REFLECTOR) { if (this.origin.tile.isModerated()) moderatedCount++; @@ -372,7 +373,7 @@ public class RBMKHandler { ((TileEntityRBMKRod)originTE).receiveFlux(this); return; - } else if (node.type == RBMKHandler.RBMKType.ABSORBER) { + } else if (node.type == RBMKType.ABSORBER) { if (RBMKHandler.absorberEfficiency == 1) return; @@ -380,16 +381,16 @@ public class RBMKHandler { } } - List nodes = getNodes(true); + List nodes = getNodes(true); if (nodes.isEmpty()) return; - RBMKHandler.RBMKNode lastNode = nodes.get(nodes.size() - 1); + RBMKNode lastNode = nodes.get(nodes.size() - 1); - if (lastNode.type != RBMKHandler.RBMKType.REFLECTOR && lastNode.type != RBMKHandler.RBMKType.ABSORBER && lastNode.type != RBMKHandler.RBMKType.CONTROL_ROD) + if (lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); - if (lastNode.type == RBMKHandler.RBMKType.CONTROL_ROD) { + if (lastNode.type == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl)lastNode.tile; if (rod.getMult() > 0.0D) { this.fluxQuantity *= rod.getMult(); @@ -405,8 +406,9 @@ public class RBMKHandler { // holy fucking shit // I have had this one line cause me like tens of problems // I FUCKING HATE THIS - // total count of bugs fixed attributed to this function: 11 - if (origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) + // total count of bugs fixed attributed to this function: 13 + Block block = origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()); + if (block.isOpaqueCube()) hits += 1; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index e84bd5328..a211e990e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -328,6 +328,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements exceptions.add("z"); exceptions.add("items"); exceptions.add("id"); + exceptions.add("muffled"); String title = "Dump of Ordered Data Diagnostic (DODD)"; mc.fontRenderer.drawString(title, pX + 1, pZ - 19, 0x006000); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 75b663f01..838d418cd 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -213,9 +213,6 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.fluxRatio = nbt.getDouble("fluxFast") / fluxQuantity; else this.fluxRatio = 0; - nbt.removeTag("fluxSlow"); - nbt.removeTag("fluxFast"); - writeToNBT(nbt); } else { this.fluxQuantity = nbt.getDouble("fluxQuantity"); this.fluxRatio = nbt.getDouble("fluxRatio"); @@ -226,17 +223,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxQuantity", this.lastFluxQuantity); - nbt.setDouble("fluxRatio", this.fluxRatio); - nbt.setBoolean("hasRod", this.hasRod); - } - - // aaaaaaa - public void writeToNBTDiag(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setDouble("fluxQuantity", this.fluxQuantity); - nbt.setDouble("fluxRatio", this.fluxRatio); + nbt.setDouble("fluxSlow", this.lastFluxQuantity * (1 - fluxRatio)); + nbt.setDouble("fluxFast", this.lastFluxQuantity * fluxRatio); nbt.setBoolean("hasRod", this.hasRod); } @@ -257,7 +245,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } public void getDiagData(NBTTagCompound nbt) { - this.writeToNBTDiag(nbt); + diag = true; + this.writeToNBT(nbt); + diag = false; if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { From 5902ff5189e4f2334573436c867ca5d75ab9b2d4 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:17:07 -0500 Subject: [PATCH 11/70] i want to kill myself :heart: --- .../com/hbm/blocks/machine/rbmk/RBMKBase.java | 7 +- .../com/hbm/handler/neutron/NeutronNode.java | 20 ++ .../hbm/handler/neutron/NeutronNodeWorld.java | 62 +++++ .../hbm/handler/neutron/NeutronStream.java | 69 +++++ .../handler/neutron/PileNeutronHandler.java | 44 +++ .../RBMKNeutronHandler.java} | 254 ++++++------------ .../handler/rbmkmk2/ItemRBMKRodFluxCurve.java | 55 ---- .../java/com/hbm/hazard/HazardRegistry.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 16 +- .../com/hbm/items/machine/ItemRBMKLid.java | 7 +- .../com/hbm/items/machine/ItemRBMKRod.java | 55 +++- .../java/com/hbm/main/ModEventHandler.java | 12 +- .../machine/rbmk/IRBMKFluxReceiver.java | 4 +- .../machine/rbmk/TileEntityRBMKAbsorber.java | 6 +- .../machine/rbmk/TileEntityRBMKBase.java | 20 +- .../machine/rbmk/TileEntityRBMKBlank.java | 6 - .../machine/rbmk/TileEntityRBMKBoiler.java | 6 - .../machine/rbmk/TileEntityRBMKControl.java | 6 +- .../machine/rbmk/TileEntityRBMKCooler.java | 7 - .../machine/rbmk/TileEntityRBMKHeater.java | 6 - .../machine/rbmk/TileEntityRBMKModerator.java | 6 +- .../machine/rbmk/TileEntityRBMKOutgasser.java | 9 +- .../machine/rbmk/TileEntityRBMKReflector.java | 6 +- .../machine/rbmk/TileEntityRBMKRod.java | 49 ++-- .../machine/rbmk/TileEntityRBMKRodReaSim.java | 13 +- .../machine/rbmk/TileEntityRBMKStorage.java | 6 +- 26 files changed, 428 insertions(+), 325 deletions(-) create mode 100644 src/main/java/com/hbm/handler/neutron/NeutronNode.java create mode 100644 src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java create mode 100644 src/main/java/com/hbm/handler/neutron/NeutronStream.java create mode 100644 src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java rename src/main/java/com/hbm/handler/{rbmkmk2/RBMKHandler.java => neutron/RBMKNeutronHandler.java} (60%) delete mode 100644 src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java index 55975c521..234a2a4b9 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java @@ -3,7 +3,8 @@ package com.hbm.blocks.machine.rbmk; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.handler.MultiblockHandlerXR; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKNeutronNode; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRBMKLid; import com.hbm.lib.RefStrings; @@ -29,8 +30,6 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; - public abstract class RBMKBase extends BlockDummyable implements IToolable, ILookOverlay { public static boolean dropLids = true; @@ -175,7 +174,7 @@ public abstract class RBMKBase extends BlockDummyable implements IToolable, ILoo if(rbmk.hasLid() && rbmk.isLidRemovable()) { - RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(new BlockPos(te)); if (node != null) node.removeLid(); diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNode.java b/src/main/java/com/hbm/handler/neutron/NeutronNode.java new file mode 100644 index 000000000..43d250949 --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/NeutronNode.java @@ -0,0 +1,20 @@ +package com.hbm.handler.neutron; + +import com.hbm.handler.neutron.NeutronStream.NeutronType; +import net.minecraft.tileentity.TileEntity; + +import java.util.HashMap; +import java.util.Map; + +public abstract class NeutronNode { + + protected NeutronType type; + protected TileEntity tile; + // like NBT but less fucking CANCER + protected Map data = new HashMap<>(); + + public NeutronNode(TileEntity tile, NeutronType type) { + this.type = type; + this.tile = tile; + } +} diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java new file mode 100644 index 000000000..cf1da973e --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java @@ -0,0 +1,62 @@ +package com.hbm.handler.neutron; + +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class NeutronNodeWorld { + // HashMap of all RBMK nodes and their positions. + protected static HashMap nodeCache = new HashMap<>(); + + public static void addNode(NeutronNode node) { + nodeCache.put(new BlockPos(node.tile), node); + } + + public static void removeNode(BlockPos position) { + nodeCache.remove(position); + } + + public static NeutronNode getNode(BlockPos position) { + return nodeCache.get(position); + } + + public static void removeAllNodes() { + nodeCache.clear(); + } + + // List of all stream worlds. + public static HashMap streamWorlds = new HashMap<>(); + + public static class StreamWorld { + + List streams; + + public StreamWorld() { + streams = new ArrayList<>(); + } + + public void addStream(NeutronStream stream) { + this.streams.add(stream); + } + + public void removeAllStreams() { + this.streams.clear(); + } + + public void removeAllStreamsOfType(NeutronStream.NeutronType type) { + List toRemove = new ArrayList<>(); + for (NeutronStream stream : streams) { + if (stream.type == type) + toRemove.add(stream); + } + toRemove.forEach((stream) -> streams.remove(stream)); + } + + public static void removeAllWorlds() { + streamWorlds.clear(); + } + } +} diff --git a/src/main/java/com/hbm/handler/neutron/NeutronStream.java b/src/main/java/com/hbm/handler/neutron/NeutronStream.java new file mode 100644 index 000000000..69b1d8eeb --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/NeutronStream.java @@ -0,0 +1,69 @@ +package com.hbm.handler.neutron; + +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import com.hbm.handler.neutron.NeutronNodeWorld.StreamWorld; + +import java.util.ArrayList; +import java.util.List; + +public abstract class NeutronStream { + + public enum NeutronType { + DUMMY, // Dummy streams for testing + RBMK, // RBMK neutron streams + PILE // Chicago pile streams + } + + public NeutronNode origin; + + // doubles!! + public double fluxQuantity; + // Hey, new implementation! Basically a ratio for slow flux to fast flux + // 0 = all slow flux + // 1 = all fast flux + public double fluxRatio; + + public NeutronType type = NeutronType.DUMMY; + + // Vector for direction of neutron flow. + public Vec3 vector; + + // Primarily used as a "dummy stream", not to be added to the streams list. + public NeutronStream(NeutronNode origin, Vec3 vector) { + this.origin = origin; + this.vector = vector; + } + + public NeutronStream(NeutronNode origin, Vec3 vector, double flux, double ratio, NeutronType type) { + this.origin = origin; + this.vector = vector; + this.fluxQuantity = flux; + this.fluxRatio = ratio; + this.type = type; + World worldObj = origin.tile.getWorldObj(); + if (NeutronNodeWorld.streamWorlds.get(worldObj) == null) { + StreamWorld world = new StreamWorld(); + world.addStream(this); + NeutronNodeWorld.streamWorlds.put(worldObj, world); + } else + NeutronNodeWorld.streamWorlds.get(worldObj).addStream(this); + } + + // USES THE CACHE!!! + public List getBlocks(int range) { + List positions = new ArrayList<>(); + + for (int i = 1; i <= range; i++) { + int x = (int) Math.floor(0.5 + vector.xCoord * i); + int z = (int) Math.floor(0.5 + vector.zCoord * i); + + BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); + positions.add(pos); + } + return positions; + } + + public abstract void runStreamInteraction(World worldObj); +} \ No newline at end of file diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java new file mode 100644 index 000000000..9d9d88558 --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -0,0 +1,44 @@ +package com.hbm.handler.neutron; + +import com.hbm.tileentity.machine.pile.TileEntityPileBase; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PileNeutronHandler { + + public static class PileNeutronNode extends NeutronNode { + + public PileNeutronNode(TileEntityPileBase tile) { + super(tile, NeutronStream.NeutronType.RBMK); + } + + } + + // The big one!! Runs all interactions for neutrons. + public static void runAllInteractions() { + + // Remove `StreamWorld` objects if they have no streams. + { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn + List toRemove = new ArrayList<>(); + NeutronNodeWorld.streamWorlds.forEach((world, streamWorld) -> { + if (streamWorld.streams.isEmpty()) + toRemove.add(world); + }); + + for (World world : toRemove) { + NeutronNodeWorld.streamWorlds.remove(world); + } + } + + for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { + + for (NeutronStream stream : world.getValue().streams) { + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreams(); + } + } +} diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java similarity index 60% rename from src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java rename to src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index fa0d93f46..88fab103a 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -1,4 +1,4 @@ -package com.hbm.handler.rbmkmk2; +package com.hbm.handler.neutron; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.handler.radiation.ChunkRadiationManager; @@ -7,7 +7,6 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import java.util.ArrayList; import java.util.List; -import java.util.HashMap; import java.util.Map.Entry; import net.minecraft.block.Block; @@ -16,7 +15,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class RBMKHandler { +public class RBMKNeutronHandler { static double moderatorEfficiency; static double reflectorEfficiency; @@ -38,30 +37,27 @@ public class RBMKHandler { return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); } - public static class RBMKNode { + public static RBMKNeutronNode makeNode(TileEntityRBMKBase tile) { + BlockPos pos = new BlockPos(tile); + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + return (RBMKNeutronNode) NeutronNodeWorld.getNode(pos); + return new RBMKNeutronNode(tile, tile.getRBMKType(), tile.hasLid()); + } - protected RBMKType type; - protected TileEntityRBMKBase tile; - protected boolean hasLid; + public static class RBMKNeutronNode extends NeutronNode { - public RBMKNode(TileEntityRBMKBase tile, RBMKType type) { - this.type = type; - this.tile = tile; - this.hasLid = tile.hasLid(); - } - - public RBMKNode(TileEntityRBMKBase tile, RBMKType type, boolean hasLid) { - this.type = type; - this.tile = tile; - this.hasLid = hasLid; + public RBMKNeutronNode(TileEntityRBMKBase tile, RBMKType type, boolean hasLid) { + super(tile, NeutronStream.NeutronType.RBMK); + this.data.put("hasLid", hasLid); + this.data.put("type", type); } public void addLid() { - this.hasLid = true; + this.data.replace("hasLid", true); } public void removeLid() { - this.hasLid = false; + this.data.replace("hasLid", false); } public List getReaSimNodes() { @@ -74,16 +70,15 @@ public class RBMKHandler { } public List checkNode() { - List list = new ArrayList<>(); BlockPos pos = new BlockPos(this.tile); - List streams = new ArrayList<>(); + List streams = new ArrayList<>(); // Simulate streams coming out of the RBMK rod. for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { - streams.add(new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ))); + streams.add(new RBMKNeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ))); } // Check if the rod should uncache nodes. @@ -91,7 +86,7 @@ public class RBMKHandler { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; if (!rod.hasRod || rod.lastFluxQuantity == 0) { - for (NeutronStream stream : streams) { + for (RBMKNeutronStream stream : streams) { stream.getNodes(false).forEach(node -> list.add(new BlockPos(node.tile))); } @@ -112,16 +107,16 @@ public class RBMKHandler { // Check if non-rod nodes should be uncached... but now with ReaSim! { // Yeah, I don't want to contaminate the surrounding scope. - List nodes = new ArrayList<>(); + List nodes = new ArrayList<>(); points.forEach(nodePos -> { - RBMKNode node = getNode(nodePos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(nodePos); if (node != null) nodes.add(node); }); boolean hasRod = false; - for (RBMKNode node : nodes) { + for (RBMKNeutronNode node : nodes) { if (node.tile instanceof TileEntityRBMKRod) { @@ -141,11 +136,11 @@ public class RBMKHandler { } // Check if non-rod nodes should be uncached due to no rod in range. - for (NeutronStream stream : streams) { + for (RBMKNeutronStream stream : streams) { - List nodes = stream.getNodes(false); + List nodes = stream.getNodes(false); - for (RBMKNode node : nodes) { + for (RBMKNeutronNode node : nodes) { if (node.tile instanceof TileEntityRBMKRod) return list; } @@ -162,84 +157,21 @@ public class RBMKHandler { } } - public static RBMKNode makeNode(TileEntityRBMKBase tile) { - BlockPos pos = new BlockPos(tile); - if (nodeCache.containsKey(pos)) - return getNode(pos); - if (!tile.hasWorldObj()) - return new RBMKNode(tile, tile.getRBMKType(), true); - return new RBMKNode(tile, tile.getRBMKType()); - } - public static class StreamWorld { + public static class RBMKNeutronStream extends NeutronStream { - List streams; - - public StreamWorld() { - streams = new ArrayList<>(); + public RBMKNeutronStream(NeutronNode origin, Vec3 vector) { + super(origin, vector); } - public void addStream(NeutronStream stream) { - this.streams.add(stream); - } - - public void removeAllStreams() { - this.streams.clear(); - } - } - - public static class NeutronStream { - - public RBMKNode origin; - - // doubles!! - public double fluxQuantity; - // Hey, new implementation! Basically a ratio for slow flux to fast flux - // 0 = all slow flux - // 1 = all fast flux - public double fluxRatio; - - // Vector for direction of neutron flow. - public Vec3 vector; - - // Primarily used as a "dummy stream", not to be added to the streams list. - public NeutronStream(RBMKNode origin, Vec3 vector) { - this.origin = origin; - this.vector = vector; - } - - public NeutronStream(RBMKNode origin, Vec3 vector, double flux, double ratio) { - this.origin = origin; - this.vector = vector; - this.fluxQuantity = flux; - this.fluxRatio = ratio; - World worldObj = origin.tile.getWorldObj(); - if (streamWorlds.get(worldObj) == null) { - StreamWorld world = new StreamWorld(); - world.addStream(this); - streamWorlds.put(worldObj, world); - } else - streamWorlds.get(worldObj).addStream(this); - } - - // USES THE CACHE!!! - public List getBlocks() { - List positions = new ArrayList<>(); - - for (int i = 1; i <= fluxRange; i++) { - int x = (int) Math.floor(0.5 + vector.xCoord * i); - int z = (int) Math.floor(0.5 + vector.zCoord * i); - - BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - positions.add(pos); - } - return positions; + public RBMKNeutronStream(NeutronNode origin, Vec3 vector, double flux, double ratio) { + super(origin, vector, flux, ratio, NeutronType.RBMK); } // Does NOT include the origin node // USES THE CACHE!!! - public List getNodes(boolean addNode) { - List positions = new ArrayList<>(); + public List getNodes(boolean addNode) { + List positions = new ArrayList<>(); for (int i = 1; i <= fluxRange; i++) { int x = (int) Math.floor(0.5 + vector.xCoord * i); @@ -247,17 +179,17 @@ public class RBMKHandler { BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - if (nodeCache.containsKey(pos)) - positions.add(getNode(pos)); + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + positions.add((RBMKNeutronNode) NeutronNodeWorld.getNode(pos)); else if (this.origin.tile.getBlockType() instanceof RBMKBase) { TileEntity te = blockPosToTE(this.origin.tile.getWorldObj(), pos); if (te instanceof TileEntityRBMKBase) { - TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase)te; - RBMKNode node = makeNode(rbmkBase); + TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase) te; + RBMKNeutronNode node = makeNode(rbmkBase); positions.add(node); if (addNode) - addNode(node); + NeutronNodeWorld.addNode(node); } } } @@ -268,36 +200,36 @@ public class RBMKHandler { public void runStreamInteraction(World worldObj) { // do nothing if there's nothing to do lmao - if(fluxQuantity == 0D) + if (fluxQuantity == 0D) return; BlockPos pos = new BlockPos(origin.tile); TileEntityRBMKBase originTE; - if (nodeCache.containsKey(pos)) - originTE = nodeCache.get(pos).tile; + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + originTE = (TileEntityRBMKBase) NeutronNodeWorld.nodeCache.get(pos).tile; else { originTE = (TileEntityRBMKBase) blockPosToTE(worldObj, pos); - if(originTE == null) + if (originTE == null) return; // Doesn't exist anymore! - addNode(new RBMKNode(originTE, originTE.getRBMKType())); + NeutronNodeWorld.addNode(new RBMKNeutronNode(originTE, originTE.getRBMKType(), originTE.hasLid())); } int moderatedCount = 0; - for(BlockPos nodePos : getBlocks()) { + for (BlockPos nodePos : getBlocks(fluxRange)) { - if(fluxQuantity == 0D) // Whoops, used it all up! + if (fluxQuantity == 0D) // Whoops, used it all up! return; - RBMKNode node = nodeCache.get(nodePos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.nodeCache.get(nodePos); - if(node == null) { + if (node == null) { TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow?? if (te instanceof TileEntityRBMKBase) { node = makeNode((TileEntityRBMKBase) te); - addNode(node); // whoops! + NeutronNodeWorld.addNode(node); // whoops! } else { int hits = getHits(nodePos); // Get the amount of hits on blocks. if (hits == columnHeight) // If stream is fully blocked. @@ -313,42 +245,44 @@ public class RBMKHandler { } } - if(node.type == RBMKType.OTHER) // pass right on by! + RBMKType type = (RBMKType) node.data.get("type"); + + if (type == RBMKType.OTHER) // pass right on by! continue; // we established earlier during `getNodes()` that they should all be RBMKBase TEs // no issue with casting here! - TileEntityRBMKBase nodeTE = node.tile; + TileEntityRBMKBase nodeTE = (TileEntityRBMKBase) node.tile; - if(!node.hasLid) + if (!(boolean) node.data.get("hasLid")) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if (node.type == RBMKType.MODERATOR || nodeTE.isModerated()) { + if (type == RBMKType.MODERATOR || nodeTE.isModerated()) { moderatedCount++; moderateStream(); } if (nodeTE instanceof IRBMKFluxReceiver) { - IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; + IRBMKFluxReceiver column = (IRBMKFluxReceiver) nodeTE; - if (node.type == RBMKType.ROD) { - TileEntityRBMKRod rod = (TileEntityRBMKRod)column; + if (type == RBMKType.ROD) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) column; if (rod.hasRod) { rod.receiveFlux(this); return; } - } else if(node.type == RBMKType.OUTGASSER) { + } else if (type == RBMKType.OUTGASSER) { TileEntityRBMKOutgasser outgasser = ((TileEntityRBMKOutgasser) column); - if(outgasser.canProcess()) { + if (outgasser.canProcess()) { column.receiveFlux(this); return; } } - } else if (node.type == RBMKType.CONTROL_ROD) { + } else if (type == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl) nodeTE; if (rod.level > 0.0D) { @@ -357,41 +291,43 @@ public class RBMKHandler { continue; } return; - } else if (node.type == RBMKType.REFLECTOR) { + } else if (type == RBMKType.REFLECTOR) { - if (this.origin.tile.isModerated()) + if (((TileEntityRBMKBase) this.origin.tile).isModerated()) moderatedCount++; if (this.fluxRatio > 0 && moderatedCount > 0) for (int i = 0; i < moderatedCount; i++) moderateStream(); - if (RBMKHandler.reflectorEfficiency != 1.0D) { - this.fluxQuantity *= RBMKHandler.reflectorEfficiency; + if (reflectorEfficiency != 1.0D) { + this.fluxQuantity *= reflectorEfficiency; continue; } - ((TileEntityRBMKRod)originTE).receiveFlux(this); + ((TileEntityRBMKRod) originTE).receiveFlux(this); return; - } else if (node.type == RBMKType.ABSORBER) { - if (RBMKHandler.absorberEfficiency == 1) + } else if (type == RBMKType.ABSORBER) { + if (absorberEfficiency == 1) return; - this.fluxQuantity *= RBMKHandler.absorberEfficiency; + this.fluxQuantity *= absorberEfficiency; } } - List nodes = getNodes(true); + List nodes = getNodes(true); if (nodes.isEmpty()) return; - RBMKNode lastNode = nodes.get(nodes.size() - 1); + RBMKNeutronNode lastNode = nodes.get(nodes.size() - 1); - if (lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) + RBMKType lastNodeType = (RBMKType) lastNode.data.get("type"); + + if (lastNodeType != RBMKType.REFLECTOR && lastNodeType != RBMKType.ABSORBER && lastNodeType != RBMKType.CONTROL_ROD) irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); - if (lastNode.type == RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = (TileEntityRBMKControl)lastNode.tile; + if (lastNodeType == RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = (TileEntityRBMKControl) lastNode.tile; if (rod.getMult() > 0.0D) { this.fluxQuantity *= rod.getMult(); irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); @@ -426,32 +362,7 @@ public class RBMKHandler { public void moderateStream() { fluxRatio *= (1 - moderatorEfficiency); } - } - // List of all stream worlds. - public static HashMap streamWorlds = new HashMap<>(); - - public static void removeAllWorlds() { - streamWorlds.clear(); - } - - // HashMap of all RBMK nodes and their positions. - protected static HashMap nodeCache = new HashMap<>(); - - public static void addNode(RBMKNode node) { - nodeCache.put(new BlockPos(node.tile), node); - } - - public static void removeNode(BlockPos position) { - nodeCache.remove(position); - } - - public static RBMKNode getNode(BlockPos position) { - return nodeCache.get(position); - } - - public static void removeAllNodes() { - nodeCache.clear(); } private static int ticks = 0; @@ -462,17 +373,17 @@ public class RBMKHandler { // Remove `StreamWorld` objects if they have no streams. { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn List toRemove = new ArrayList<>(); - streamWorlds.forEach((world, streamWorld) -> { + NeutronNodeWorld.streamWorlds.forEach((world, streamWorld) -> { if (streamWorld.streams.isEmpty()) toRemove.add(world); }); for (World world : toRemove) { - streamWorlds.remove(world); + NeutronNodeWorld.streamWorlds.remove(world); } } - for (Entry world : streamWorlds.entrySet()) { + for (Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { // Gamerule caching because this apparently is kinda slow? // meh, good enough @@ -487,9 +398,10 @@ public class RBMKHandler { fluxRange = RBMKDials.getFluxRange(world.getKey()); for (NeutronStream stream : world.getValue().streams) { - stream.runStreamInteraction(world.getKey()); + if (stream.type == NeutronStream.NeutronType.RBMK) + stream.runStreamInteraction(world.getKey()); } - world.getValue().removeAllStreams(); + world.getValue().removeAllStreamsOfType(NeutronStream.NeutronType.RBMK); } // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage. @@ -497,11 +409,13 @@ public class RBMKHandler { if (ticks >= cacheTime) { ticks = 0; List toRemove = new ArrayList<>(); - for(RBMKNode cachedNode : nodeCache.values()) - toRemove.addAll(cachedNode.checkNode()); + for(NeutronNode cachedNode : NeutronNodeWorld.nodeCache.values()) { + RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; + toRemove.addAll(node.checkNode()); + } for(BlockPos pos : toRemove) - removeNode(pos); + NeutronNodeWorld.removeNode(pos); } ticks++; } diff --git a/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java b/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java deleted file mode 100644 index 457638a76..000000000 --- a/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hbm.handler.rbmkmk2; - -import com.hbm.items.machine.ItemRBMKPellet; -import com.hbm.items.machine.ItemRBMKRod; -import net.minecraft.util.MathHelper; - -import java.util.function.BiFunction; -import java.util.function.Function; - - -public class ItemRBMKRodFluxCurve extends ItemRBMKRod { - - /** Double 1: Flux ratio in. - * Double 2: Depletion value. - * Return double: Output flux ratio. - **/ - BiFunction ratioCurve; - - /** Double 1: Flux quantity in.
- * Double 2: Flux ratio in.
- * Return double: Output flux quantity. - **/ - BiFunction fluxCurve; - - public ItemRBMKRodFluxCurve(ItemRBMKPellet pellet) { - super(pellet); - } - - public ItemRBMKRodFluxCurve(String fullName) { - super(fullName); - } - - public ItemRBMKRodFluxCurve setOutputRatioCurve(Function func) { - this.ratioCurve = (fluxRatioIn, depletion) -> func.apply(fluxRatioIn) * 1.0D; - return this; - } - - public ItemRBMKRodFluxCurve setDepletionOutputRatioCurve(BiFunction func) { - this.ratioCurve = func; - return this; - } - - public ItemRBMKRodFluxCurve setOutputFluxCurve(BiFunction func) { - this.fluxCurve = func; - return this; - } - - public double fluxRatioOut(double fluxRatioIn, double depletion) { - return MathHelper.clamp_double(ratioCurve.apply(fluxRatioIn, depletion), 0, 1); - } - - public double fluxFromRatio(double quantity, double ratio) { - return fluxCurve.apply(quantity, ratio); - } -} diff --git a/src/main/java/com/hbm/hazard/HazardRegistry.java b/src/main/java/com/hbm/hazard/HazardRegistry.java index b8de08aa3..d9021d10d 100644 --- a/src/main/java/com/hbm/hazard/HazardRegistry.java +++ b/src/main/java/com/hbm/hazard/HazardRegistry.java @@ -394,7 +394,7 @@ public class HazardRegistry { registerRBMKRod(rbmk_fuel_zfb_pu241, pu239 * rod_rbmk * 0.1F, wst * rod_rbmk * 7.5F); registerRBMKRod(rbmk_fuel_zfb_am_mix, pu241 * rod_rbmk * 0.1F, wst * rod_rbmk * 10F); registerRBMK(rbmk_fuel_drx, bf * rod_rbmk, bf * rod_rbmk * 100F, true, true, 0, 1F/3F); - registerRBMKRod(rbmk_fuel_curve, saf * rod_rbmk * np237 * rod_rbmk, wst * rod_rbmk * 35F); + //registerRBMKRod(rbmk_fuel_curve, saf * rod_rbmk * np237 * rod_rbmk, wst * rod_rbmk * 35F); registerRBMKPellet(rbmk_pellet_ueu, u * billet, wst * billet * 20F); registerRBMKPellet(rbmk_pellet_meu, uf * billet, wst * billet * 21.5F); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 84d22bd43..1685902ee 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -7,7 +7,6 @@ import com.hbm.handler.ToolAbility; import com.hbm.handler.ToolAbility.LuckAbility; import com.hbm.handler.WeaponAbility; import com.hbm.handler.guncfg.*; -import com.hbm.handler.rbmkmk2.ItemRBMKRodFluxCurve; import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -1132,7 +1131,7 @@ public class ModItems { public static ItemRBMKRod rbmk_fuel_zfb_am_mix; public static ItemRBMKRod rbmk_fuel_drx; public static ItemRBMKRod rbmk_fuel_test; - public static ItemRBMKRodFluxCurve rbmk_fuel_curve; + //public static ItemRBMKRod rbmk_fuel_curve; public static ItemRBMKPellet rbmk_pellet_ueu; public static ItemRBMKPellet rbmk_pellet_meu; public static ItemRBMKPellet rbmk_pellet_heu233; @@ -3763,15 +3762,18 @@ public class ModItems { .setHeat(1.0D) .setMeltingPoint(100000) .setUnlocalizedName("rbmk_fuel_test").setTextureName(RefStrings.MODID + ":rbmk_fuel_test"); - rbmk_fuel_curve = (ItemRBMKRodFluxCurve) new ItemRBMKRodFluxCurve("3D curve test") + /* Experimental flux curve shit + rbmk_fuel_curve = (ItemRBMKRod) new ItemRBMKRod("3D Flux Curve Test") + .setFluxCurve(true) .setOutputFluxCurve((fluxQuantity, fluxRatio) -> fluxQuantity * (1 - Math.pow(fluxRatio, 2))) .setDepletionOutputRatioCurve((ratioIn, depletion) -> Math.pow(ratioIn, 2) * depletion) .setYield(1000000D) - .setStats(100) - .setFunction(EnumBurnFunc.EXPERIMENTAL) - .setHeat(1.0D) + .setStats(75) + .setFunction(EnumBurnFunc.SQUARE_ROOT) + .setHeat(1.5D) .setMeltingPoint(100000) .setUnlocalizedName("rbmk_fuel_curve").setTextureName(RefStrings.MODID + ":rbmk_fuel_curve"); + */ watz_pellet = new ItemWatzPellet().setUnlocalizedName("watz_pellet").setTextureName(RefStrings.MODID + ":watz_pellet"); watz_pellet_depleted = new ItemWatzPellet().setUnlocalizedName("watz_pellet_depleted").setTextureName(RefStrings.MODID + ":watz_pellet"); @@ -6613,7 +6615,7 @@ public class ModItems { GameRegistry.registerItem(rbmk_fuel_zfb_am_mix, rbmk_fuel_zfb_am_mix.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_drx, rbmk_fuel_drx.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_test, rbmk_fuel_test.getUnlocalizedName()); - GameRegistry.registerItem(rbmk_fuel_curve, rbmk_fuel_curve.getUnlocalizedName()); + //GameRegistry.registerItem(rbmk_fuel_curve, rbmk_fuel_curve.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_ueu, rbmk_pellet_ueu.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_meu, rbmk_pellet_meu.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java index c2e215307..853fe918f 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java @@ -2,7 +2,8 @@ package com.hbm.items.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.rbmk.RBMKBase; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKNeutronNode; import com.hbm.items.ModItems; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; @@ -15,8 +16,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; - public class ItemRBMKLid extends Item { @Override @@ -42,7 +41,7 @@ public class ItemRBMKLid extends Item { if(tile.hasLid()) return false; - RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(new BlockPos(te)); if (node != null) node.addLid(); diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 93e30f4ac..d02a393d2 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -2,6 +2,8 @@ package com.hbm.items.machine; import java.util.List; import java.util.Locale; +import java.util.function.BiFunction; +import java.util.function.Function; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; @@ -14,6 +16,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class ItemRBMKRod extends Item { @@ -241,7 +244,7 @@ public class ItemRBMKRod extends Item { } /** - * @param reactivity [0;100] ...or at least those are sane levels + * @param enrichment [0;100] ...or at least those are sane levels * @return the amount of reactivity yielded, unmodified by xenon */ public double reactivityFunc(double in, double enrichment) { @@ -355,7 +358,55 @@ public class ItemRBMKRod extends Item { public static double getPoisonLevel(ItemStack stack) { return getPoison(stack) / 100D; } - + + // START Special flux curve handling! + // Nothing really uses this yet, though it's a really fun feature to play around with. + + // For the RBMK handler to see if the rod is special. + public boolean specialFluxCurve = false; + + public ItemRBMKRod setFluxCurve(boolean bool) { + specialFluxCurve = bool; + return this; + } + + /** Double 1: Flux ratio in. + * Double 2: Depletion value. + * Return double: Output flux ratio. + **/ + BiFunction ratioCurve; + + /** Double 1: Flux quantity in.
+ * Double 2: Flux ratio in.
+ * Return double: Output flux quantity. + **/ + BiFunction fluxCurve; + + public ItemRBMKRod setOutputRatioCurve(Function func) { + this.ratioCurve = (fluxRatioIn, depletion) -> func.apply(fluxRatioIn) * 1.0D; + return this; + } + + public ItemRBMKRod setDepletionOutputRatioCurve(BiFunction func) { + this.ratioCurve = func; + return this; + } + + public ItemRBMKRod setOutputFluxCurve(BiFunction func) { + this.fluxCurve = func; + return this; + } + + public double fluxRatioOut(double fluxRatioIn, double depletion) { + return MathHelper.clamp_double(ratioCurve.apply(fluxRatioIn, depletion), 0, 1); + } + + public double fluxFromRatio(double quantity, double ratio) { + return fluxCurve.apply(quantity, ratio); + } + + // END Special flux curve handling. + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index ea4c568d9..725bad598 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -9,7 +9,9 @@ import java.util.Map; import java.util.Random; import java.util.UUID; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.PileNeutronHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; @@ -537,8 +539,8 @@ public class ModEventHandler { @SubscribeEvent public void onUnload(WorldEvent.Unload event) { - RBMKHandler.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. - RBMKHandler.removeAllNodes(); // Remove all nodes. + NeutronNodeWorld.StreamWorld.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. + NeutronNodeWorld.removeAllNodes(); // Remove all nodes. } public static boolean didSit = false; @@ -1151,7 +1153,9 @@ public class ModEventHandler { TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); // RBMK!!!! - RBMKHandler.runAllInteractions(); + RBMKNeutronHandler.runAllInteractions(); + // Chicago Pile!!!! + PileNeutronHandler.runAllInteractions(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java index 655c234ae..2b8464354 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronStream; public interface IRBMKFluxReceiver { @@ -16,5 +16,5 @@ public interface IRBMKFluxReceiver { } } - public void receiveFlux(RBMKHandler.NeutronStream stream); + public void receiveFlux(NeutronStream stream); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java index abbb5ceb1..d1c585539 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { @@ -19,8 +19,8 @@ public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.ABSORBER; + public RBMKType getRBMKType() { + return RBMKType.ABSORBER; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index a211e990e..2d3b5b616 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -8,8 +8,9 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.entity.effect.EntitySpear; import com.hbm.entity.projectile.EntityRBMKDebris; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler.RBMKType; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.BufPacket; @@ -42,7 +43,12 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; -import java.util.*; +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; +import java.util.Iterator; /** * Base class for all RBMK components, active or passive. Handles heat and the explosion sequence @@ -220,7 +226,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements public void invalidate() { super.invalidate(); - RBMKHandler.removeNode(new BlockPos(this)); // woo-fucking-hoo!!! + NeutronNodeWorld.removeNode(new BlockPos(this)); // woo-fucking-hoo!!! } @Override @@ -246,13 +252,15 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements heat = 20D; } - public abstract RBMKType getRBMKType(); + public RBMKType getRBMKType() { + return RBMKType.OTHER; + } protected static boolean diag = false; @Override public void readFromNBT(NBTTagCompound nbt) { - + if(!diag) { super.readFromNBT(nbt); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java index 08611e1b1..82a7137a9 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java @@ -1,7 +1,6 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKBlank extends TileEntityRBMKBase { @@ -18,11 +17,6 @@ public class TileEntityRBMKBlank extends TileEntityRBMKBase { super.onMelt(reduce); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.BLANK; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 2a1ea6801..1c1d4c29b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -8,7 +8,6 @@ import api.hbm.tile.IInfoProviderEC; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerRBMKGeneric; import com.hbm.inventory.fluid.FluidType; @@ -224,11 +223,6 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.BOILER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java index edb73195c..9e6d43868 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java @@ -2,7 +2,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -132,8 +132,8 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.CONTROL_ROD; + public RBMKType getRBMKType() { + return RBMKType.CONTROL_ROD; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java index e4134ab0c..fe3ddc71d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java @@ -2,7 +2,6 @@ package com.hbm.tileentity.machine.rbmk; import api.hbm.fluid.IFluidStandardReceiver; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; @@ -17,7 +16,6 @@ import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; import java.util.List; @@ -118,11 +116,6 @@ public class TileEntityRBMKCooler extends TileEntityRBMKBase implements IFluidSt this.lastCooled = buf.readInt(); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.COOLER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java index e54a5acbd..42aecf827 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java @@ -4,7 +4,6 @@ import api.hbm.fluid.IFluidStandardTransceiver; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.container.ContainerRBMKHeater; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -154,11 +153,6 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.HEATEX; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java index 7ce7c1e67..989b0af42 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKModerator extends TileEntityRBMKBase { @@ -19,8 +19,8 @@ public class TileEntityRBMKModerator extends TileEntityRBMKBase { } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.MODERATOR; + public RBMKType getRBMKType() { + return RBMKType.MODERATOR; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 3b701fc0e..7b39fa47b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -4,7 +4,8 @@ import api.hbm.fluid.IFluidStandardSender; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronStream; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.inventory.FluidStack; import com.hbm.inventory.container.ContainerRBMKOutgasser; import com.hbm.inventory.fluid.Fluids; @@ -92,7 +93,7 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement } @Override - public void receiveFlux(RBMKHandler.NeutronStream stream) { + public void receiveFlux(NeutronStream stream) { if(canProcess()) { @@ -167,8 +168,8 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OUTGASSER; + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.OUTGASSER; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java index 79e40867b..f2157f849 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKReflector extends TileEntityRBMKBase { @@ -19,8 +19,8 @@ public class TileEntityRBMKReflector extends TileEntityRBMKBase { } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.REFLECTOR; + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.REFLECTOR; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 838d418cd..28f90d118 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -5,10 +5,11 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.blocks.machine.rbmk.RBMKRod; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.NeutronStream; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.handler.radiation.ChunkRadiationManager; -import com.hbm.handler.rbmkmk2.RBMKHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler.NeutronStream; -import com.hbm.handler.rbmkmk2.ItemRBMKRodFluxCurve; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKNeutronNode; import com.hbm.inventory.container.ContainerRBMKRod; import com.hbm.inventory.gui.GUIRBMKRod; import com.hbm.items.ModItems; @@ -40,8 +41,6 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; -import static com.hbm.handler.rbmkmk2.RBMKHandler.*; - @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBMKFluxReceiver, IRBMKLoadable, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent { @@ -93,14 +92,15 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM double fluxRatioOut; double fluxQuantityOut; - if (rod instanceof ItemRBMKRodFluxCurve) { // Experimental flux ratio curve rods! - ItemRBMKRodFluxCurve rodCurve = (ItemRBMKRodFluxCurve) rod; + // Experimental flux ratio curve rods! + // Again, nothing really uses this so its just idle code at the moment. + if (rod.specialFluxCurve) { - fluxRatioOut = rodCurve.fluxRatioOut(this.fluxRatio, ItemRBMKRod.getEnrichment(slots[0])); + fluxRatioOut = rod.fluxRatioOut(this.fluxRatio, ItemRBMKRod.getEnrichment(slots[0])); double fluxIn; - fluxIn = rodCurve.fluxFromRatio(this.fluxQuantity, this.fluxRatio); + fluxIn = rod.fluxFromRatio(this.fluxQuantity, this.fluxRatio); fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); } else { @@ -182,15 +182,15 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM if (flux == 0) { // simple way to remove the node from the cache when no flux is going into it! - removeNode(pos); + NeutronNodeWorld.removeNode(pos); return; } - RBMKHandler.RBMKNode node = getNode(pos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(pos); if(node == null) { - node = RBMKHandler.makeNode(this); - addNode(node); + node = RBMKNeutronHandler.makeNode(this); + NeutronNodeWorld.addNode(node); } for(ForgeDirection dir : fluxDirs) { @@ -198,7 +198,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM Vec3 neutronVector = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); // Create new neutron streams - new NeutronStream(node, neutronVector, flux, ratio); + new RBMKNeutronHandler.RBMKNeutronStream(node, neutronVector, flux, ratio); } } @@ -215,7 +215,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.fluxRatio = 0; } else { this.fluxQuantity = nbt.getDouble("fluxQuantity"); - this.fluxRatio = nbt.getDouble("fluxRatio"); + this.fluxRatio = nbt.getDouble("fluxMod"); } this.hasRod = nbt.getBoolean("hasRod"); } @@ -223,8 +223,17 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxSlow", this.lastFluxQuantity * (1 - fluxRatio)); - nbt.setDouble("fluxFast", this.lastFluxQuantity * fluxRatio); + nbt.setDouble("fluxQuantity", this.fluxQuantity); + nbt.setDouble("fluxMod", this.fluxRatio); + nbt.setBoolean("hasRod", this.hasRod); + } + + // aaaaaaaa + public void writeToNBTDiag(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setDouble("fluxSlow", this.fluxQuantity * (1 - fluxRatio)); + nbt.setDouble("fluxFast", this.fluxQuantity * fluxRatio); nbt.setBoolean("hasRod", this.hasRod); } @@ -246,7 +255,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void getDiagData(NBTTagCompound nbt) { diag = true; - this.writeToNBT(nbt); + this.writeToNBTDiag(nbt); diag = false; if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { @@ -308,8 +317,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.ROD; + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.ROD; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index 74da00c39..d638e4795 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -1,12 +1,13 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler.RBMKNode; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.util.Vec3; -import static com.hbm.handler.rbmkmk2.RBMKHandler.*; +import static com.hbm.handler.neutron.RBMKNeutronHandler.*; public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { @@ -26,15 +27,15 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { if (flux == 0) { // simple way to remove the node from the cache when no flux is going into it! - removeNode(pos); + NeutronNodeWorld.removeNode(pos); return; } - RBMKNode node = getNode(pos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(pos); if(node == null) { node = makeNode(this); - addNode(node); + NeutronNodeWorld.addNode(node); } int count = RBMKDials.getReaSimCount(worldObj); @@ -44,7 +45,7 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - new NeutronStream(makeNode(this), neutronVector, flux, ratio); + new RBMKNeutronHandler.RBMKNeutronStream(makeNode(this), neutronVector, flux, ratio); // Create new neutron streams } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java index ac8621882..66809e58e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.inventory.container.ContainerRBMKStorage; import com.hbm.inventory.gui.GUIRBMKStorage; import com.hbm.items.machine.ItemRBMKRod; @@ -42,8 +42,8 @@ public class TileEntityRBMKStorage extends TileEntityRBMKSlottedBase implements } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.OTHER; } @Override From bd25da4c1a5009bd51fbc8ed16cc7a808b9971b1 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:21:12 -0500 Subject: [PATCH 12/70] oh my fucking god --- .../handler/neutron/PileNeutronHandler.java | 118 +++++++++++++++++- .../handler/neutron/RBMKNeutronHandler.java | 6 +- .../machine/pile/TileEntityPileBase.java | 115 +++++------------ .../pile/TileEntityPileBreedingFuel.java | 2 +- .../machine/pile/TileEntityPileFuel.java | 2 +- .../machine/pile/TileEntityPileSource.java | 2 +- 6 files changed, 158 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 9d9d88558..48377590e 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -1,6 +1,16 @@ package com.hbm.handler.neutron; +import api.hbm.block.IPileNeutronReceiver; +import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.machine.pile.TileEntityPileBase; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import java.util.ArrayList; @@ -9,14 +19,110 @@ import java.util.Map; public class PileNeutronHandler { + public static int range = 5; + public static class PileNeutronNode extends NeutronNode { public PileNeutronNode(TileEntityPileBase tile) { - super(tile, NeutronStream.NeutronType.RBMK); + super(tile, NeutronStream.NeutronType.PILE); } } + public static PileNeutronNode makeNode(TileEntityPileBase tile) { + BlockPos pos = new BlockPos(tile); + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + return (PileNeutronNode) NeutronNodeWorld.getNode(pos); + return new PileNeutronNode(tile); + } + + private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { + return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + } + + public static class PileNeutronStream extends NeutronStream { + + public PileNeutronStream(NeutronNode origin, Vec3 vector) { + super(origin, vector); + } + + public PileNeutronStream(NeutronNode origin, Vec3 vector, double flux) { + super(origin, vector, flux, 0D, NeutronType.PILE); + } + + @Override + public void runStreamInteraction(World worldObj) { + + //Random rand = origin.tile.getWorldObj().rand; + //Vec3 vec = Vec3.createVectorHelper(1, 0, 0); + //vec.rotateAroundZ((float)(rand.nextDouble() * Math.PI * 2D)); + //vec.rotateAroundY((float)(rand.nextDouble() * Math.PI * 2D)); + //vec.rotateAroundX((float)(rand.nextDouble() * Math.PI * 2D)); + + TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; + BlockPos pos = new BlockPos(originTE); + + for(float i = 1; i <= range; i += 0.5F) { + + BlockPos node = new BlockPos( + (int)Math.floor(pos.getX() + 0.5 + vector.xCoord * i), + (int)Math.floor(pos.getY() + 0.5 + vector.yCoord * i), + (int)Math.floor(pos.getZ() + 0.5 + vector.zCoord * i) + ); + + TileEntity tile; + + if (NeutronNodeWorld.nodeCache.containsKey(node)) + tile = NeutronNodeWorld.nodeCache.get(node).tile; + else { + tile = blockPosToTE(worldObj, node); + if (tile == null) + return; // Doesn't exist anymore! + if (tile instanceof TileEntityPileBase) + NeutronNodeWorld.addNode(new PileNeutronNode((TileEntityPileBase) tile)); + } + + TileEntityPileBase te = (TileEntityPileBase) tile; + Block block = te.getBlockType(); + + + // Return when a boron block is hit + if(block == ModBlocks.block_boron) + return; + + else if(block == ModBlocks.concrete || + block == ModBlocks.concrete_smooth || + block == ModBlocks.concrete_asbestos || + block == ModBlocks.concrete_colored || + block == ModBlocks.brick_concrete) + fluxQuantity *= 0.25; + + int meta = te.getBlockMetadata(); + + if(block == ModBlocks.block_graphite_rod && (meta & 8) == 0) + return; + + if(te instanceof IPileNeutronReceiver) { + + IPileNeutronReceiver rec = (IPileNeutronReceiver) te; + rec.receiveNeutrons((int) fluxQuantity); + + if(block != ModBlocks.block_graphite_detector || (meta & 8) == 0) + return; + } + + int x = (int) (node.getX() + 0.5); + int y = (int) (node.getY() + 0.5); + int z = (int) (node.getZ() + 0.5); + List entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x, y, z, x, y, z)); + + if(entities != null) + for(EntityLivingBase e : entities) + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.CREATIVE, (float) (fluxQuantity / 4D)); + } + } + } + // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { @@ -40,5 +146,15 @@ public class PileNeutronHandler { } world.getValue().removeAllStreams(); } + + for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { + + for (NeutronStream stream : world.getValue().streams) { + if (stream.type == NeutronStream.NeutronType.PILE) + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreamsOfType(NeutronStream.NeutronType.PILE); + } + } } diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index 88fab103a..d02c17629 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -410,8 +410,10 @@ public class RBMKNeutronHandler { ticks = 0; List toRemove = new ArrayList<>(); for(NeutronNode cachedNode : NeutronNodeWorld.nodeCache.values()) { - RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; - toRemove.addAll(node.checkNode()); + if (cachedNode.type == NeutronStream.NeutronType.RBMK) { + RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; + toRemove.addAll(node.checkNode()); + } } for(BlockPos pos : toRemove) diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java index 8c06fd658..b4745b170 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java @@ -1,96 +1,49 @@ package com.hbm.tileentity.machine.pile; -import java.util.List; -import java.util.Random; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.PileNeutronHandler; +import com.hbm.handler.neutron.PileNeutronHandler.PileNeutronStream; +import com.hbm.handler.neutron.PileNeutronHandler.PileNeutronNode; -import com.hbm.blocks.ModBlocks; -import com.hbm.util.ContaminationUtil; -import com.hbm.util.ContaminationUtil.ContaminationType; -import com.hbm.util.ContaminationUtil.HazardType; - -import api.hbm.block.IPileNeutronReceiver; -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; public abstract class TileEntityPileBase extends TileEntity { @Override public abstract void updateEntity(); - - protected void castRay(int flux, int range) { - Random rand = worldObj.rand; - Vec3 vec = Vec3.createVectorHelper(1, 0, 0); - vec.rotateAroundZ((float)(rand.nextDouble() * Math.PI * 2D)); - vec.rotateAroundY((float)(rand.nextDouble() * Math.PI * 2D)); - vec.rotateAroundX((float)(rand.nextDouble() * Math.PI * 2D)); - - int prevX = xCoord; - int prevY = yCoord; - int prevZ = zCoord; - - for(float i = 1; i <= range; i += 0.5F) { - int x = (int)Math.floor(xCoord + 0.5 + vec.xCoord * i); - int y = (int)Math.floor(yCoord + 0.5 + vec.yCoord * i); - int z = (int)Math.floor(zCoord + 0.5 + vec.zCoord * i); - - if(x == prevX && y == prevY && z == prevZ) - continue; + @Override + public void invalidate() { + super.invalidate(); - prevX = x; - prevY = y; - prevZ = z; - - /*if(i == range || i == 1) { - NBTTagCompound data2 = new NBTTagCompound(); - data2.setString("type", "vanillaExt"); - data2.setString("mode", i == range ? "greendust" : - i == 1 ? "reddust" : "bluedust"); - data2.setDouble("posX", xCoord + 0.5 + vec.xCoord * i); - data2.setDouble("posY", yCoord + 0.5 + vec.yCoord * i); - data2.setDouble("posZ", zCoord + 0.5 + vec.zCoord * i); - MainRegistry.proxy.effectNT(data2); - }*/ - - Block b = worldObj.getBlock(x, y, z); - - if(b == ModBlocks.concrete || b == ModBlocks.concrete_smooth || b == ModBlocks.concrete_asbestos || b == ModBlocks.concrete_colored || b == ModBlocks.brick_concrete) - flux *= 0.25; - - if(b == ModBlocks.block_boron) - return; - - int meta = worldObj.getBlockMetadata(x, y, z); - - if(b == ModBlocks.block_graphite_rod && (meta & 8) == 0) - return; - - TileEntity te = worldObj.getTileEntity(x, y, z); - - if(te instanceof IPileNeutronReceiver) { - - //this part throttles neutron efficiency for reactions that are way too close, efficiency reaches 100% after 1.5 meters - //This entire time, this multiplier has been using the max distance, not the actual one, meaning efficency has always been 100% - //float mult = Math.min((float)i / 1.5F, 1F); - //int n = (int)(flux * mult); - - IPileNeutronReceiver rec = (IPileNeutronReceiver) te; - rec.receiveNeutrons(flux); - - if(b != ModBlocks.block_graphite_detector || (meta & 8) == 0) - return; - } - - List entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x + 0.5, y + 0.5, z + 0.5, x + 0.5, y + 0.5, z + 0.5)); - - if(entities != null) - for(EntityLivingBase e : entities) { - - ContaminationUtil.contaminate(e, HazardType.RADIATION, ContaminationType.CREATIVE, flux / 4F); - } + NeutronNodeWorld.removeNode(new BlockPos(this)); + } + + protected void castRay(int flux) { + + BlockPos pos = new BlockPos(this); + + if (flux == 0) { + // simple way to remove the node from the cache when no flux is going into it! + NeutronNodeWorld.removeNode(pos); + return; } + + PileNeutronNode node = (PileNeutronNode) NeutronNodeWorld.getNode(pos); + + if(node == null) { + node = PileNeutronHandler.makeNode(this); + NeutronNodeWorld.addNode(node); + } + + Vec3 neutronVector = Vec3.createVectorHelper(1, 0, 0); + + neutronVector.rotateAroundX((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundZ((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + + new PileNeutronStream(node, neutronVector, flux); } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java index 1bbe94acb..c1f775e0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java @@ -35,7 +35,7 @@ public class TileEntityPileBreedingFuel extends TileEntityPileBase implements IP return; for(int i = 0; i < 2; i++) - this.castRay(1, 5); + this.castRay(1); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index 15233ad0c..0318a99b7 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -71,7 +71,7 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr this.heat += reaction; for(int i = 0; i < 12; i++) - this.castRay((int) Math.max(reaction * 0.25, 1), 5); + this.castRay((int) Math.max(reaction * 0.25, 1)); return lastProgress; } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java index c297f9dfb..6b38b7875 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java @@ -12,7 +12,7 @@ public class TileEntityPileSource extends TileEntityPileBase { int n = this.getBlockType() == ModBlocks.block_graphite_source ? 1 : 2; for(int i = 0; i < 12; i++) { - this.castRay(n, 5); + this.castRay(n); } } } From 05ca9203e95729bb78a5970f8880f230c8def127 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 2 Sep 2024 21:39:28 -0500 Subject: [PATCH 13/70] the ByteBuf shenanigans begin!! --- .../bomb/TileEntityNukeBalefire.java | 34 ++++--- .../tileentity/machine/TileEntityAshpit.java | 25 +++-- .../machine/TileEntityConveyorPress.java | 47 +++++----- .../tileentity/machine/TileEntityCore.java | 42 +++++---- .../machine/TileEntityCoreEmitter.java | 41 ++++---- .../machine/TileEntityCoreInjector.java | 28 ++++-- .../machine/TileEntityCoreReceiver.java | 26 ++++-- .../machine/TileEntityCoreStabilizer.java | 29 +++--- .../machine/TileEntityCustomMachine.java | 68 +++++++------- .../oil/TileEntityMachinePumpjack.java | 22 ++--- .../machine/oil/TileEntityOilDrillBase.java | 93 ++++++++++--------- .../machine/rbmk/TileEntityRBMKBase.java | 4 +- src/main/java/com/hbm/util/BufferUtil.java | 69 +++++++++++++- 13 files changed, 323 insertions(+), 205 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java index db18d4bfb..748bbfd3f 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java @@ -11,6 +11,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -54,22 +55,29 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU if(timer <= 0) { explode(); } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("timer", timer); - data.setBoolean("loaded", this.isLoaded()); - data.setBoolean("started", started); - networkPack(data, 250); + + networkPackNT(250); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - timer = data.getInteger("timer"); - started = data.getBoolean("started"); - loaded = data.getBoolean("loaded"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeInt(this.timer); + buf.writeBoolean(this.started); + buf.writeBoolean(this.loaded); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.timer = buf.readInt(); + this.started = buf.readBoolean(); + this.loaded = buf.readBoolean(); + } + public void handleButtonPacket(int value, int meta) { if(meta == 0 && this.isLoaded()) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java index acefaf0f2..dfb63df66 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java @@ -15,6 +15,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -103,11 +104,8 @@ public class TileEntityAshpit extends TileEntityMachineBase implements IGUIProvi for(int i = 0; i < 5; i++) { if(slots[i] != null) isFull = true; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("playersUsing", this.playersUsing); - data.setBoolean("isFull", this.isFull); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { this.prevDoorAngle = this.doorAngle; @@ -142,10 +140,19 @@ public class TileEntityAshpit extends TileEntityMachineBase implements IGUIProvi } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.playersUsing = nbt.getInteger("playersUsing"); - this.isFull = nbt.getBoolean("isFull"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeInt(this.playersUsing); + buf.writeBoolean(this.isFull); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.playersUsing = buf.readInt(); + this.isFull = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java index 418c9932c..0cb68f8ec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java @@ -7,13 +7,16 @@ import com.hbm.inventory.recipes.PressRecipes; import com.hbm.items.machine.ItemStamp; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; @@ -84,16 +87,7 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE delay--; } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setDouble("press", press); - if(slots[0] != null) { - NBTTagCompound stack = new NBTTagCompound(); - slots[0].writeToNBT(stack); - data.setTag("stack", stack); - } - - this.networkPack(data, 50); + this.networkPackNT(50); } else { // approach-based interpolation, GO! @@ -174,23 +168,26 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE } public boolean canRetract() { - if(this.power < usage) return false; - return true; + return this.power >= usage; } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.power = nbt.getLong("power"); - this.syncPress = nbt.getInteger("press"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); - } else { - this.syncStack = null; - } - + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(this.power); + buf.writeDouble(this.syncPress); + BufferUtil.writeItemStack(buf, syncStack); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.syncPress = buf.readDouble(); + this.syncStack = BufferUtil.readItemStack(buf); + this.turnProgress = 2; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java index 4fd9621ee..66c1f0e51 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java @@ -21,11 +21,13 @@ import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.ArmorUtil; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -138,15 +140,8 @@ public class TileEntityCore extends TileEntityMachineBase implements IGUIProvide if(heat > 0) radiation(); - - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - data.setInteger("field", field); - data.setInteger("heat", heat); - data.setInteger("color", color); - data.setBoolean("melt", meltdownTick); - networkPack(data, 250); + + networkPackNT(250); heat = 0; @@ -162,15 +157,28 @@ public class TileEntityCore extends TileEntityMachineBase implements IGUIProvide } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); - field = data.getInteger("field"); - heat = data.getInteger("heat"); - color = data.getInteger("color"); - meltdownTick = data.getBoolean("melt"); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + buf.writeInt(field); + buf.writeInt(heat); + buf.writeInt(color); + buf.writeBoolean(meltdownTick); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + this.field = buf.readInt(); + this.heat = buf.readInt(); + this.color = buf.readInt(); + this.meltdownTick = buf.readBoolean(); } private void radiation() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 507035d8d..f0d9d3080 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -18,6 +18,7 @@ import com.hbm.util.CompatEnergyControl; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -169,26 +170,32 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne this.markDirty(); - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("watts", watts); - data.setLong("prev", prev); - data.setInteger("beam", beam); - data.setBoolean("isOn", isOn); - tank.writeToNBT(data, "tank"); - this.networkPack(data, 250); + this.networkPackNT(250); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - power = data.getLong("power"); - watts = data.getInteger("watts"); - prev = data.getLong("prev"); - beam = data.getInteger("beam"); - isOn = data.getBoolean("isOn"); - tank.readFromNBT(data, "tank"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(power); + buf.writeInt(watts); + buf.writeLong(prev); + buf.writeInt(beam); + buf.writeBoolean(isOn); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.watts = buf.readInt(); + this.prev = buf.readLong(); + this.beam = buf.readInt(); + this.isOn = buf.readBoolean(); + tank.deserialize(buf); } public long getPowerScaled(long i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index ee599910d..af15165d2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -12,6 +12,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -101,19 +102,26 @@ public class TileEntityCoreInjector extends TileEntityMachineBase implements IFl this.markDirty(); - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("beam", beam); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - this.networkPack(data, 250); + this.networkPackNT(250); } } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - beam = data.getInteger("beam"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeInt(beam); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.beam = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java index 16f9fe511..077c94b8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java @@ -16,6 +16,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -69,19 +70,26 @@ public class TileEntityCoreReceiver extends TileEntityMachineBase implements IEn } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("joules", joules); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + this.networkPackNT(50); joules = 0; } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - joules = data.getLong("joules"); - tank.readFromNBT(data, "t"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(joules); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + joules = buf.readLong(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java index bb7e05bbb..bb80dea66 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java @@ -14,6 +14,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -93,11 +94,7 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("watts", watts); - data.setInteger("beam", beam); - this.networkPack(data, 250); + this.networkPackNT(250); } } @@ -106,13 +103,23 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - power = data.getLong("power"); - watts = data.getInteger("watts"); - beam = data.getInteger("beam"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(power); + buf.writeInt(watts); + buf.writeInt(beam); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.watts = buf.readInt(); + this.beam = buf.readInt(); } public long getPowerScaled(long i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java index afc3b4d8e..f31e1060c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java @@ -22,6 +22,7 @@ import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachinePolluting; import com.hbm.tileentity.TileEntityProxyBase; +import com.hbm.util.BufferUtil; import com.hbm.util.Compat; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -31,6 +32,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -221,23 +223,44 @@ public class TileEntityCustomMachine extends TileEntityMachinePolluting implemen } else { this.progress = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", this.machineType); - data.setLong("power", power); - data.setBoolean("structureOK", structureOK); - data.setInteger("flux", flux); - data.setInteger("heat", heat); - data.setInteger("progress", progress); - data.setInteger("maxProgress", maxProgress); - for (int i = 0; i < inputTanks.length; i++) inputTanks[i].writeToNBT(data, "i" + i); - for (int i = 0; i < outputTanks.length; i++) outputTanks[i].writeToNBT(data, "o" + i); - this.matcher.writeToNBT(data); - this.networkPack(data, 50); + this.networkPackNT(50); } } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(power); + buf.writeInt(progress); + buf.writeInt(flux); + buf.writeInt(heat); + buf.writeBoolean(structureOK); + buf.writeInt(maxProgress); + for (FluidTank inputTank : inputTanks) inputTank.serialize(buf); + for (FluidTank outputTank : outputTanks) outputTank.serialize(buf); + this.matcher.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.machineType = BufferUtil.readString(buf); + if(this.config == null) this.init(); + + this.power = buf.readLong(); + this.progress = buf.readInt(); + this.flux = buf.readInt(); + this.heat = buf.readInt(); + this.structureOK = buf.readBoolean(); + this.maxProgress = buf.readInt(); + for (FluidTank inputTank : inputTanks) inputTank.deserialize(buf); + for (FluidTank outputTank : outputTanks) outputTank.deserialize(buf); + this.matcher.deserialize(buf); + } + /** Only accepts inputs in a fixed order, saves a ton of performance because there's no permutations to check for */ public CustomMachineRecipe getMatchingRecipe() { List recipes = CustomMachineRecipes.recipes.get(this.config.recipeKey); @@ -459,25 +482,6 @@ public class TileEntityCustomMachine extends TileEntityMachinePolluting implemen return matcher.isValidForFilter(slots[filterSlot], index, stack); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.machineType = nbt.getString("type"); - if(this.config == null) this.init(); - - this.power = nbt.getLong("power"); - this.progress = nbt.getInteger("progress"); - this.flux = nbt.getInteger("flux"); - this.heat = nbt.getInteger("heat"); - this.structureOK = nbt.getBoolean("structureOK"); - this.maxProgress = nbt.getInteger("maxProgress"); - for(int i = 0; i < inputTanks.length; i++) inputTanks[i].readFromNBT(nbt, "i" + i); - for(int i = 0; i < outputTanks.length; i++) outputTanks[i].readFromNBT(nbt, "o" + i); - - this.matcher.readFromNBT(nbt); - } - @Override public void readFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java index 7d836a45f..7308e13e7 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java @@ -18,6 +18,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -110,19 +111,18 @@ public class TileEntityMachinePumpjack extends TileEntityOilDrillBase { } } } - - @Override - public void networkPack(NBTTagCompound nbt, int range) { - nbt.setFloat("speed", this.indicator == 0 ? (5F + (2F * this.speedLevel)) + (this.overLevel - 1F) * 10: 0F); - super.networkPack(nbt, range); - } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.speed = nbt.getFloat("speed"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeFloat(this.indicator == 0 ? (5F + (2F * this.speedLevel)) + (this.overLevel - 1F) * 10: 0F); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.speed = buf.readFloat(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java index a8b2e4555..e0b84079a 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java @@ -23,6 +23,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -90,83 +91,87 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple @Override public void updateEntity() { - - if(!worldObj.isRemote) { - + + if (!worldObj.isRemote) { + this.updateConnections(); - + this.tanks[0].unloadTank(1, 2, slots); this.tanks[1].unloadTank(3, 4, slots); - + UpgradeManager.eval(slots, 5, 7); this.speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); this.energyLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); this.overLevel = Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) + 1; int abLevel = Math.min(UpgradeManager.getLevel(UpgradeType.AFTERBURN), 3); - + int toBurn = Math.min(tanks[1].getFill(), abLevel * 10); - - if(toBurn > 0) { + + if (toBurn > 0) { tanks[1].setFill(tanks[1].getFill() - toBurn); this.power += toBurn * 5; - - if(this.power > this.getMaxPower()) + + if (this.power > this.getMaxPower()) this.power = this.getMaxPower(); } - + power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); - for(DirPos pos : getConPos()) { - if(tanks[0].getFill() > 0) this.sendFluid(tanks[0], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + for (DirPos pos : getConPos()) { + if (tanks[0].getFill() > 0) + this.sendFluid(tanks[0], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if (tanks[1].getFill() > 0) + this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - if(this.power >= this.getPowerReqEff() && this.tanks[0].getFill() < this.tanks[0].getMaxFill() && this.tanks[1].getFill() < this.tanks[1].getMaxFill()) { - + + if (this.power >= this.getPowerReqEff() && this.tanks[0].getFill() < this.tanks[0].getMaxFill() && this.tanks[1].getFill() < this.tanks[1].getMaxFill()) { + this.power -= this.getPowerReqEff(); - - if(worldObj.getTotalWorldTime() % getDelayEff() == 0) { + + if (worldObj.getTotalWorldTime() % getDelayEff() == 0) { this.indicator = 0; - - for(int y = yCoord - 1; y >= getDrillDepth(); y--) { - - if(worldObj.getBlock(xCoord, y, zCoord) != ModBlocks.oil_pipe) { - - if(trySuck(y)) { + + for (int y = yCoord - 1; y >= getDrillDepth(); y--) { + + if (worldObj.getBlock(xCoord, y, zCoord) != ModBlocks.oil_pipe) { + + if (trySuck(y)) { break; } else { tryDrill(y); break; } } - - if(y == getDrillDepth()) + + if (y == getDrillDepth()) this.indicator = 1; } } - + } else { this.indicator = 2; } - - this.sendUpdate(); + + this.networkPackNT(25); } } - - public void sendUpdate() { - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("indicator", this.indicator); - for(int i = 0; i < tanks.length; i++) tanks[i].writeToNBT(data, "t" + i); - this.networkPack(data, 25); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(this.power); + buf.writeInt(this.indicator); + for (FluidTank tank : tanks) tank.serialize(buf); } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.indicator = nbt.getInteger("indicator"); - for(int i = 0; i < tanks.length; i++) tanks[i].readFromNBT(nbt, "t" + i); + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.indicator = buf.readInt(); + for (FluidTank tank : tanks) tank.deserialize(buf); } public boolean canPump() { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 2d3b5b616..1dd976ed4 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -118,9 +118,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements this.worldObj.theProfiler.endStartSection("rbmkBase_rpassive_cooling"); coolPassively(); this.worldObj.theProfiler.endSection(); - - NBTTagCompound data = new NBTTagCompound(); - this.writeToNBT(data); + this.networkPackNT(trackingRange()); } } diff --git a/src/main/java/com/hbm/util/BufferUtil.java b/src/main/java/com/hbm/util/BufferUtil.java index 3f50e7e54..8a8c7c8ad 100644 --- a/src/main/java/com/hbm/util/BufferUtil.java +++ b/src/main/java/com/hbm/util/BufferUtil.java @@ -1,15 +1,22 @@ package com.hbm.util; +import java.io.IOException; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import io.netty.buffer.ByteBuf; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTSizeTracker; +import net.minecraft.nbt.NBTTagCompound; public class BufferUtil { - private static final Charset CHARSET = Charset.forName("UTF-8"); + private static final Charset CHARSET = StandardCharsets.UTF_8; // Writes a string to a byte buffer by encoding the length and raw bytes - public static final void writeString(ByteBuf buf, String value) { + public static void writeString(ByteBuf buf, String value) { if(value == null) { buf.writeInt(-1); return; @@ -20,7 +27,7 @@ public class BufferUtil { } // Reads a string from a byte buffer via the written length and raw bytes - public static final String readString(ByteBuf buf) { + public static String readString(ByteBuf buf) { final int count = buf.readInt(); if(count < 0) return null; @@ -30,4 +37,58 @@ public class BufferUtil { return new String(bytes, CHARSET); } -} + /** + * Writes the ItemStack to the buffer. + */ + public static void writeItemStack(ByteBuf buf, ItemStack item) { + if (item == null) + buf.writeShort(-1); + else { + buf.writeShort(Item.getIdFromItem(item.getItem())); + buf.writeByte(item.stackSize); + buf.writeShort(item.getItemDamage()); + NBTTagCompound nbtTagCompound = null; + + if (item.getItem().isDamageable() || item.getItem().getShareTag()) + nbtTagCompound = item.stackTagCompound; + + if(nbtTagCompound != null) { + byte[] nbtData = new byte[0]; + try { + nbtData = CompressedStreamTools.compress(nbtTagCompound); + } catch(IOException e) { + e.printStackTrace(); + } + buf.writeShort((short) nbtData.length); + buf.writeBytes(nbtData); + } else { + buf.writeShort(-1); + } + } + } + + /** + * Reads an ItemStack from a buffer + */ + public static ItemStack readItemStack(ByteBuf buf) { + ItemStack item = null; + short id = buf.readShort(); + + if (id >= 0) { + byte quantity = buf.readByte(); + short meta = buf.readShort(); + item = new ItemStack(Item.getItemById(id), quantity, meta); + + short nbtLength = buf.readByte(); + + byte[] tags = new byte[nbtLength]; + buf.readBytes(tags); + try { + item.stackTagCompound = CompressedStreamTools.func_152457_a(tags, new NBTSizeTracker(2097152L)); + } catch(IOException e) { + e.printStackTrace(); + } + } + return item; + } +} \ No newline at end of file From 4b490d56a1ea366e31e884aae05334b6d32d70e5 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 4 Sep 2024 21:37:37 -0500 Subject: [PATCH 14/70] holy shit what the fuck am i smoking --- .../hbm/tileentity/TileEntityMachineBase.java | 7 +- .../machine/TileEntityDeuteriumExtractor.java | 24 +++- .../machine/TileEntityDiFurnaceRTG.java | 35 +++--- .../machine/TileEntityElectrolyser.java | 74 +++++++----- .../machine/TileEntityFurnaceIron.java | 38 +++--- .../machine/TileEntityFurnaceSteel.java | 34 +++--- .../tileentity/machine/TileEntityHadron.java | 48 ++++++-- .../tileentity/machine/TileEntityITER.java | 65 +++++----- .../TileEntityMachineCombustionEngine.java | 35 +++--- .../machine/TileEntityMachineCompressor.java | 47 ++++---- .../machine/TileEntityMachineDiesel.java | 29 +++-- .../machine/TileEntityMachineEPress.java | 47 ++++---- .../TileEntityMachineLargeTurbine.java | 42 ++++--- .../machine/TileEntityMachineMiningLaser.java | 65 +++++----- .../TileEntityMachinePlasmaHeater.java | 34 +++--- .../machine/TileEntityMachinePress.java | 38 ++++-- .../machine/TileEntityMachineRadGen.java | 39 +++--- .../machine/TileEntityMachineRadiolysis.java | 41 ++++--- .../TileEntityMachineReactorBreeding.java | 27 +++-- ...eEntityMachineSchrabidiumTransmutator.java | 30 +++-- .../TileEntityMachineSolderingStation.java | 62 +++++----- .../machine/TileEntityMachineTurbineGas.java | 102 ++++++++-------- .../machine/TileEntityMachineTurbofan.java | 43 ++++--- .../machine/TileEntityMicrowave.java | 31 +++-- .../machine/TileEntityPWRController.java | 71 ++++++----- .../machine/TileEntityReactorControl.java | 55 +++++---- .../machine/TileEntityReactorResearch.java | 44 ++++--- .../machine/TileEntityReactorZirnox.java | 45 +++---- .../machine/TileEntitySoyuzLauncher.java | 45 +++---- .../tileentity/machine/TileEntityTesla.java | 44 +++---- .../tileentity/machine/TileEntityWatz.java | 41 ++++--- .../TileEntityMachineCatalyticReformer.java | 22 +++- .../machine/oil/TileEntityMachineCoker.java | 41 ++++--- .../oil/TileEntityMachineGasFlare.java | 34 +++--- .../oil/TileEntityMachineLiquefactor.java | 36 +++--- .../oil/TileEntityMachineRefinery.java | 39 +++--- .../oil/TileEntityMachineSolidifier.java | 36 +++--- .../oil/TileEntityMachineVacuumDistill.java | 31 +++-- .../machine/rbmk/TileEntityRBMKConsole.java | 113 +++++++++--------- .../network/TileEntityCraneBoxer.java | 23 ++-- .../network/TileEntityCraneGrabber.java | 29 +++-- .../network/TileEntityCraneRouter.java | 36 +++--- .../network/TileEntityRadioTorchCounter.java | 37 +++--- .../turret/TileEntityTurretArty.java | 25 ++-- .../turret/TileEntityTurretBaseNT.java | 61 ++++++---- .../turret/TileEntityTurretFritz.java | 16 +-- .../turret/TileEntityTurretHIMARS.java | 31 +++-- .../turret/TileEntityTurretMaxwell.java | 22 ++-- .../turret/TileEntityTurretRichard.java | 22 ++-- .../turret/TileEntityTurretSentry.java | 18 +-- .../turret/TileEntityTurretTauon.java | 22 ++-- src/main/java/com/hbm/util/BufferUtil.java | 90 ++++++++++---- 52 files changed, 1229 insertions(+), 937 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index d9a17469d..3440ea517 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -154,12 +154,7 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, val, id), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } @Deprecated public void processGauge(int val, int id) { } - - @Deprecated public void networkPack(NBTTagCompound nbt, int range) { - nbt.setBoolean("muffled", muffled); - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - + @Deprecated public void networkUnpack(NBTTagCompound nbt) { this.muffled = nbt.getBoolean("muffled"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index 12cc135b4..a1f55015b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -6,6 +6,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -44,13 +45,8 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - tanks[0].writeToNBT(data, "water"); - tanks[1].writeToNBT(data, "heavyWater"); - this.networkPack(data, 50); + this.networkPackNT(50); } } @@ -68,6 +64,22 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen tanks[1].readFromNBT(data, "heavyWater"); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + } + public boolean hasPower() { return power >= this.getMaxPower() / 20; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java index db4d16a27..3934be49c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java @@ -13,6 +13,7 @@ import com.hbm.util.RTGUtil; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -72,24 +73,28 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGU MachineDiFurnaceRTG.updateBlockState(isProcessing() || (canProcess() && hasPower()), getWorldObj(), xCoord, yCoord, zCoord); - NBTTagCompound data = new NBTTagCompound(); - data.setShort("progress", progress); - data.setShort("speed", processSpeed); - data.setByteArray("modes", new byte[] {(byte) sideUpper, (byte) sideLower}); - networkPack(data, 10); + networkPackNT(10); } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - progress = nbt.getShort("progress"); - processSpeed = nbt.getShort("speed"); - byte[] modes = nbt.getByteArray("modes"); - this.sideUpper = modes[0]; - this.sideLower = modes[1]; + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort(progress); + buf.writeShort(processSpeed); + buf.writeBytes(new byte[] {sideUpper, sideLower}); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + progress = buf.readShort(); + processSpeed = buf.readShort(); + byte[] bytes = new byte[2]; + buf.readBytes(bytes); + this.sideUpper = bytes[0]; + this.sideLower = bytes[1]; + } + private void processItem() { if(canProcess()) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 18cf9f14a..8ab35d24b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -39,6 +39,7 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -208,24 +209,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setInteger("progressFluid", this.progressFluid); - data.setInteger("progressOre", this.progressOre); - data.setInteger("usageOre", this.usageOre); - data.setInteger("usageFluid", this.usageFluid); - data.setInteger("processFluidTime", this.getDurationFluid()); - data.setInteger("processOreTime", this.getDurationMetal()); - if(this.leftStack != null) { - data.setInteger("leftType", leftStack.material.id); - data.setInteger("leftAmount", leftStack.amount); - } - if(this.rightStack != null) { - data.setInteger("rightType", rightStack.material.id); - data.setInteger("rightAmount", rightStack.amount); - } - for(int i = 0; i < 4; i++) tanks[i].writeToNBT(data, "t" + i); - this.networkPack(data, 50); + this.networkPackNT(50); } } @@ -244,21 +228,47 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.progressFluid); + buf.writeInt(this.progressOre); + buf.writeInt(this.usageOre); + buf.writeInt(this.usageFluid); + buf.writeInt(this.getDurationFluid()); + buf.writeInt(this.getDurationMetal()); + for(int i = 0; i < 4; i++) tanks[i].serialize(buf); + buf.writeBoolean(this.leftStack != null); + buf.writeBoolean(this.rightStack != null); + if(this.leftStack != null) { + buf.writeInt(leftStack.material.id); + buf.writeInt(leftStack.amount); + } + if(this.rightStack != null) { + buf.writeInt(rightStack.material.id); + buf.writeInt(rightStack.amount); + } + } - this.power = nbt.getLong("power"); - this.progressFluid = nbt.getInteger("progressFluid"); - this.progressOre = nbt.getInteger("progressOre"); - this.usageOre = nbt.getInteger("usageOre"); - this.usageFluid = nbt.getInteger("usageFluid"); - this.processFluidTime = nbt.getInteger("processFluidTime"); - this.processOreTime = nbt.getInteger("processOreTime"); - if(nbt.hasKey("leftType")) this.leftStack = new MaterialStack(Mats.matById.get(nbt.getInteger("leftType")), nbt.getInteger("leftAmount")); - else this.leftStack = null; - if(nbt.hasKey("rightType")) this.rightStack = new MaterialStack(Mats.matById.get(nbt.getInteger("rightType")), nbt.getInteger("rightAmount")); - else this.rightStack = null; - for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.progressFluid = buf.readInt(); + this.progressOre = buf.readInt(); + this.usageOre = buf.readInt(); + this.usageFluid = buf.readInt(); + this.processFluidTime = buf.readInt(); + this.processOreTime = buf.readInt(); + for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); + boolean left = buf.readBoolean(); + boolean right = buf.readBoolean(); + if(left) { + this.leftStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); + } + if(right) { + this.rightStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); + } } public boolean canProcessFluid() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java index c85bb845d..42d67d723 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java @@ -17,6 +17,7 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -115,14 +116,8 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI } else { this.progress = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("maxBurnTime", this.maxBurnTime); - data.setInteger("burnTime", this.burnTime); - data.setInteger("progress", this.progress); - data.setInteger("processingTime", this.processingTime); - data.setBoolean("wasOn", this.wasOn); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { if(this.progress > 0) { @@ -141,16 +136,25 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.maxBurnTime = nbt.getInteger("maxBurnTime"); - this.burnTime = nbt.getInteger("burnTime"); - this.progress = nbt.getInteger("progress"); - this.processingTime = nbt.getInteger("processingTime"); - this.wasOn = nbt.getBoolean("wasOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.maxBurnTime); + buf.writeInt(this.burnTime); + buf.writeInt(this.progress); + buf.writeInt(this.processingTime); + buf.writeBoolean(this.wasOn); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.maxBurnTime = buf.readInt(); + this.burnTime = buf.readInt(); + this.progress = buf.readInt(); + this.processingTime = buf.readInt(); + this.wasOn = buf.readBoolean(); + } + public boolean canSmelt() { if(this.burnTime <= 0) return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java index 4d6d7cbab..c67275db0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java @@ -8,11 +8,13 @@ import com.hbm.inventory.container.ContainerFurnaceSteel; import com.hbm.inventory.gui.GUIFurnaceSteel; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -96,13 +98,9 @@ public class TileEntityFurnaceSteel extends TileEntityMachineBase implements IGU } } - - NBTTagCompound data = new NBTTagCompound(); - data.setIntArray("progress", progress); - data.setIntArray("bonus", bonus); - data.setInteger("heat", heat); - data.setBoolean("wasOn", wasOn); - this.networkPack(data, 50); + + this.networkPackNT(50); + } else { if(this.wasOn) { @@ -122,13 +120,21 @@ public class TileEntityFurnaceSteel extends TileEntityMachineBase implements IGU } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.progress = nbt.getIntArray("progress"); - this.bonus = nbt.getIntArray("bonus"); - this.heat = nbt.getInteger("heat"); - this.wasOn = nbt.getBoolean("wasOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + BufferUtil.writeIntArray(buf, this.progress); + BufferUtil.writeIntArray(buf, this.bonus); + buf.writeInt(this.heat); + buf.writeBoolean(this.wasOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.progress = BufferUtil.readIntArray(buf); + this.bonus = BufferUtil.readIntArray(buf); + this.heat = buf.readInt(); + this.wasOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index 167f550c8..d091830b4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -25,6 +25,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.gui.GuiScreen; @@ -170,7 +171,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe data.setInteger("stat_x", stat_x); data.setInteger("stat_y", stat_y); data.setInteger("stat_z", stat_z); - this.networkPack(data, 50); + this.networkPackNT(50); } } @@ -212,22 +213,45 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.setStats(this.state, p.momentum, true); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.isOn); + buf.writeLong(this.power); + buf.writeBoolean(this.analysisOnly); + buf.writeInt(this.ioMode); + buf.writeByte((byte) this.state.ordinal()); + + buf.writeBoolean(this.stat_success); + buf.writeByte((byte) this.stat_state.ordinal()); + buf.writeInt(this.stat_charge); + buf.writeInt(this.stat_x); + buf.writeInt(this.stat_y); + buf.writeInt(this.stat_z); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.isOn = buf.readBoolean(); + this.power = buf.readLong(); + this.analysisOnly = buf.readBoolean(); + this.ioMode = buf.readInt(); + this.state = EnumHadronState.values()[buf.readByte()]; + + this.stat_success = buf.readBoolean(); + this.stat_state = EnumHadronState.values()[buf.readByte()]; + this.stat_charge = buf.readInt(); + this.stat_x = buf.readInt(); + this.stat_y = buf.readInt(); + this.stat_z = buf.readInt(); + } + @Override public void networkUnpack(NBTTagCompound data) { super.networkUnpack(data); - this.isOn = data.getBoolean("isOn"); - this.power = data.getLong("power"); - this.analysisOnly = data.getBoolean("analysis"); - this.ioMode = data.getInteger("ioMode"); - this.state = EnumHadronState.values()[data.getByte("state")]; - this.stat_success = data.getBoolean("stat_success"); - this.stat_state = EnumHadronState.values()[data.getByte("stat_state")]; - this.stat_charge = data.getInteger("stat_charge"); - this.stat_x = data.getInteger("stat_x"); - this.stat_y = data.getInteger("stat_y"); - this.stat_z = data.getInteger("stat_z"); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 9b0a0ed60..39f8678ec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -26,6 +26,7 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; @@ -36,6 +37,7 @@ import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -158,27 +160,7 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } } - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isOn", isOn); - data.setLong("power", power); - data.setInteger("progress", progress); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - plasma.writeToNBT(data, "t2"); - - if(slots[3] == null) { - data.setInteger("blanket", 0); - } else if(slots[3].getItem() == ModItems.fusion_shield_tungsten) { - data.setInteger("blanket", 1); - } else if(slots[3].getItem() == ModItems.fusion_shield_desh) { - data.setInteger("blanket", 2); - } else if(slots[3].getItem() == ModItems.fusion_shield_chlorophyte) { - data.setInteger("blanket", 3); - } else if(slots[3].getItem() == ModItems.fusion_shield_vaporwave) { - data.setInteger("blanket", 4); - } - - this.networkPack(data, 250); + this.networkPackNT(250); /// END Notif packets /// } else { @@ -378,16 +360,37 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.isOn = data.getBoolean("isOn"); - this.power = data.getLong("power"); - this.blanket = data.getInteger("blanket"); - this.progress = data.getInteger("progress"); // - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); - plasma.readFromNBT(data, "t2"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.isOn); + buf.writeLong(this.power); + buf.writeInt(this.progress); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + plasma.serialize(buf); + if(slots[3] == null) { + buf.writeInt(0); + } else if(slots[3].getItem() == ModItems.fusion_shield_tungsten) { + buf.writeInt(1); + } else if(slots[3].getItem() == ModItems.fusion_shield_desh) { + buf.writeInt(2); + } else if(slots[3].getItem() == ModItems.fusion_shield_chlorophyte) { + buf.writeInt(3); + } else if(slots[3].getItem() == ModItems.fusion_shield_vaporwave) { + buf.writeInt(4); + } + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.isOn = buf.readBoolean(); + this.power = buf.readLong(); + this.progress = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + plasma.deserialize(buf); + this.blanket = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java index 78292b220..da52bb30f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java @@ -23,6 +23,7 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -111,13 +112,8 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin if(power > maxPower) power = maxPower; - - data.setInteger("playersUsing", playersUsing); - data.setInteger("setting", setting); - data.setBoolean("isOn", isOn); - data.setBoolean("wasOn", wasOn); - tank.writeToNBT(data, "tank"); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { this.prevDoorAngle = this.doorAngle; @@ -200,14 +196,23 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.playersUsing = nbt.getInteger("playersUsing"); - this.setting = nbt.getInteger("setting"); - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - this.wasOn = nbt.getBoolean("wasOn"); - this.tank.readFromNBT(nbt, "tank"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.playersUsing); + buf.writeInt(this.setting); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.wasOn); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.playersUsing = buf.readInt(); + this.setting = buf.readInt(); + this.isOn = buf.readBoolean(); + this.wasOn = buf.readBoolean(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java index c3e94a705..a62846ea1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java @@ -27,6 +27,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -119,16 +120,8 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement for(DirPos pos : getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("progress", progress); - data.setInteger("processTime", processTime); - data.setInteger("powerRequirement", powerRequirement); - data.setLong("power", power); - tanks[0].writeToNBT(data, "0"); - tanks[1].writeToNBT(data, "1"); - data.setBoolean("isOn", isOn); - this.networkPack(data, 100); + + this.networkPackNT(100); } else { @@ -163,17 +156,29 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement } private float randSpeed = 0.1F; - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.progress = nbt.getInteger("progress"); - this.processTime = nbt.getInteger("processTime"); - this.powerRequirement = nbt.getInteger("powerRequirement"); - this.power = nbt.getLong("power"); - tanks[0].readFromNBT(nbt, "0"); - tanks[1].readFromNBT(nbt, "1"); - this.isOn = nbt.getBoolean("isOn"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.progress); + buf.writeInt(this.processTime); + buf.writeInt(this.powerRequirement); + buf.writeLong(this.power); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.progress = buf.readInt(); + this.processTime = buf.readInt(); + this.powerRequirement = buf.readInt(); + this.power = buf.readLong(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + this.isOn = buf.readBoolean(); } private void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index d36cb4336..3b0ea20a6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -28,6 +28,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -151,22 +152,26 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen generate(); - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("power", (int) power); - data.setInteger("powerCap", (int) powerCap); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + this.networkPackNT(50); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - power = data.getInteger("power"); - powerCap = data.getInteger("powerCap"); - tank.readFromNBT(data, "t"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt((int) power); + buf.writeInt((int) powerCap); + tank.serialize(buf); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readInt(); + this.powerCap = buf.readInt(); + tank.deserialize(buf); + } + public boolean hasAcceptableFuel() { return getHEFromFuel() > 0; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index 081aab10a..6ed33d35c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -13,6 +13,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; @@ -20,6 +21,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -117,16 +119,7 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("press", press); - if(slots[2] != null) { - NBTTagCompound stack = new NBTTagCompound(); - slots[2].writeToNBT(stack); - data.setTag("stack", stack); - } - - this.networkPack(data, 50); + this.networkPackNT(50); } else { @@ -141,21 +134,27 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE } } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.syncPress = nbt.getInteger("press"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); - } else { - this.syncStack = null; - } - + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeInt(press); + if (slots[2] == null) + buf.writeShort(-1); // indicate that the NBT doesn't actually exist to avoid null pointer errors. + else + BufferUtil.writeNBT(buf, slots[2].stackTagCompound); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.syncPress = buf.readInt(); + + NBTTagCompound stack = BufferUtil.readNBT(buf); + this.syncStack = ItemStack.loadItemStackFromNBT(stack); + this.turnProgress = 2; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index ba32528da..ce494df35 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -29,6 +29,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -102,6 +103,8 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme return "container.machineLargeTurbine"; } + private boolean operational; + @Override public void updateEntity() { @@ -117,9 +120,7 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme tanks[0].setType(0, 1, slots); tanks[0].loadTank(2, 3, slots); power = Library.chargeItemsFromTE(slots, 4, power, maxPower); - - boolean operational = false; - + FluidType in = tanks[0].getTankType(); boolean valid = false; if(in.hasTrait(FT_Coolable.class)) { @@ -145,13 +146,9 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme if(power > maxPower) power = maxPower; tanks[1].unloadTank(5, 6, slots); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setBoolean("operational", operational); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - this.networkPack(data, 50); + + this.networkPackNT(50); + } else { this.lastRotor = this.rotor; this.rotor += this.fanAcceleration; @@ -199,14 +196,23 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme new DirPos(xCoord + dir.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2, dir) }; } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - this.shouldTurn = data.getBoolean("operational"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeBoolean(operational); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.shouldTurn = buf.readBoolean(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } public long getPowerScaled(int i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index e5ad38a1b..2747502cb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -31,6 +31,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardSender; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.EntityLivingBase; @@ -83,6 +84,8 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen return "container.miningLaser"; } + private double clientBreakProgress; + @Override public void updateEntity() { @@ -108,8 +111,6 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen lastTargetY = targetY; lastTargetZ = targetZ; - double clientBreakProgress = 0; - if(isOn) { UpgradeManager.eval(slots, 1, 8); @@ -167,43 +168,45 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen this.tryFillContainer(xCoord, yCoord, zCoord + 2); this.tryFillContainer(xCoord, yCoord, zCoord - 2); - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("lastX", lastTargetX); - data.setInteger("lastY", lastTargetY); - data.setInteger("lastZ", lastTargetZ); - data.setInteger("x", targetX); - data.setInteger("y", targetY); - data.setInteger("z", targetZ); - data.setBoolean("beam", beam); - data.setBoolean("isOn", isOn); - data.setDouble("progress", clientBreakProgress); - tank.writeToNBT(data, "t"); - - this.networkPack(data, 250); + this.networkPackNT(250); } } private void updateConnections() { this.trySubscribe(worldObj, xCoord, yCoord + 2, zCoord, ForgeDirection.UP); } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - this.power = data.getLong("power"); - this.lastTargetX = data.getInteger("lastX"); - this.lastTargetY = data.getInteger("lastY"); - this.lastTargetZ = data.getInteger("lastZ"); - this.targetX = data.getInteger("x"); - this.targetY = data.getInteger("y"); - this.targetZ = data.getInteger("z"); - this.beam = data.getBoolean("beam"); - this.isOn = data.getBoolean("isOn"); - this.breakProgress = data.getDouble("progress"); - tank.readFromNBT(data, "t"); + @Override + public void serialize(ByteBuf buf) { + buf.writeLong(this.power); + buf.writeInt(this.lastTargetX); + buf.writeInt(this.lastTargetY); + buf.writeInt(this.lastTargetZ); + buf.writeInt(this.targetX); + buf.writeInt(this.targetY); + buf.writeInt(this.targetZ); + buf.writeBoolean(this.beam); + buf.writeBoolean(this.isOn); + buf.writeDouble(this.clientBreakProgress); + tank.serialize(buf); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.lastTargetX = buf.readInt(); + this.lastTargetY = buf.readInt(); + this.lastTargetZ = buf.readInt(); + this.targetX = buf.readInt(); + this.targetY = buf.readInt(); + this.targetZ = buf.readInt(); + this.beam = buf.readBoolean(); + this.isOn = buf.readBoolean(); + this.breakProgress = buf.readDouble(); + tank.deserialize(buf); + } + private void buildDam() { if(worldObj.getBlock(targetX + 1, targetY, targetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX + 1, targetY, targetZ, ModBlocks.barricade); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java index 8224d6f41..0d8621759 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java @@ -19,6 +19,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -122,13 +123,7 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme /// END Loading plasma into the ITER /// /// START Notif packets /// - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - plasma.writeToNBT(data, "t2"); - this.networkPack(data, 50); + this.networkPackNT(50); /// END Notif packets /// } } @@ -148,14 +143,23 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme } } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - tanks[0].readFromNBT(nbt, "t0"); - tanks[1].readFromNBT(nbt, "t1"); - plasma.readFromNBT(nbt, "t2"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + plasma.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + plasma.deserialize(buf); } private void updateType() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index 58a31e5bd..655ce48be 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -8,8 +8,10 @@ import com.hbm.items.machine.ItemStamp; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -133,17 +135,7 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU this.markChanged(); } - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("speed", speed); - data.setInteger("burnTime", burnTime); - data.setInteger("press", press); - if(slots[2] != null) { - NBTTagCompound stack = new NBTTagCompound(); - slots[2].writeToNBT(stack); - data.setTag("stack", stack); - } - - this.networkPack(data, 50); + this.networkPackNT(50); } else { @@ -158,6 +150,30 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU } } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.speed); + buf.writeInt(this.burnTime); + buf.writeInt(this.press); + if (slots[2] == null) + buf.writeShort(-1); // indicate that the NBT doesn't actually exist to avoid null pointer errors. + else + BufferUtil.writeNBT(buf, slots[2].stackTagCompound); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.speed = buf.readInt(); + this.burnTime = buf.readInt(); + this.press = buf.readInt(); + NBTTagCompound stack = BufferUtil.readNBT(buf); + this.syncStack = ItemStack.loadItemStackFromNBT(stack); + + this.turnProgress = 2; + } @Override public void networkUnpack(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java index 825937515..a4d1bcbec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java @@ -11,6 +11,7 @@ import com.hbm.items.special.ItemWasteLong; import com.hbm.items.special.ItemWasteShort; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.Tuple.Triplet; @@ -18,6 +19,7 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -111,26 +113,29 @@ public class TileEntityMachineRadGen extends TileEntityMachineBase implements IE if(this.power > maxPower) this.power = maxPower; - - NBTTagCompound data = new NBTTagCompound(); - data.setIntArray("progress", this.progress); - data.setIntArray("maxProgress", this.maxProgress); - data.setIntArray("production", this.production); - data.setLong("power", this.power); - data.setBoolean("isOn", this.isOn); - this.networkPack(data, 50); + + this.networkPackNT(50); } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.progress = nbt.getIntArray("progress"); - this.maxProgress = nbt.getIntArray("maxProgress"); - this.production = nbt.getIntArray("production"); - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + BufferUtil.writeIntArray(buf, this.progress); + BufferUtil.writeIntArray(buf, this.maxProgress); + BufferUtil.writeIntArray(buf, this.production); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.progress = BufferUtil.readIntArray(buf); + this.maxProgress = BufferUtil.readIntArray(buf); + this.production = BufferUtil.readIntArray(buf); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java index c468441a0..107d37ba1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java @@ -23,6 +23,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -98,16 +99,6 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement tanks[2].writeToNBT(nbt, "output2"); } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - this.heat = data.getInteger("heat"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); - tanks[2].readFromNBT(data, "t2"); - } - @Override public void updateEntity() { @@ -139,16 +130,30 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("heat", heat); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - tanks[2].writeToNBT(data, "t2"); - this.networkPack(data, 50); + + this.networkPackNT(50); } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.heat); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + tanks[2].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.heat = buf.readInt(); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + tanks[2].serialize(buf); + } protected DirPos[] getConPos() { return new DirPos[] { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java index ceb1bef2c..b0f71f6c1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java @@ -15,6 +15,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -66,19 +67,23 @@ public class TileEntityMachineReactorBreeding extends TileEntityMachineBase impl } else { progress = 0.0F; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("flux", flux); - data.setFloat("progress", progress); - this.networkPack(data, 20); + + this.networkPackNT(20); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - flux = data.getInteger("flux"); - progress = data.getFloat("progress"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(flux); + buf.writeFloat(progress); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.flux = buf.readInt(); + this.progress = buf.readFloat(); } public void getInteractions() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java index 7f9241d46..7e7784c6d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java @@ -16,6 +16,7 @@ import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -167,11 +168,8 @@ public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineB } else { process = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("progress", process); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { @@ -193,6 +191,20 @@ public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineB } } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.process); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.process = buf.readInt(); + } @Override public AudioWrapper createAudioLoop() { @@ -224,14 +236,6 @@ public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineB audio = null; } } - - @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - this.process = data.getInteger("progress"); - } @Override public void setPower(long i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java index 3ccf6ef70..0b2fb6dc7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java @@ -27,6 +27,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -69,6 +70,8 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } } + private SolderingRecipe recipe; + @Override public void updateEntity() { @@ -84,7 +87,7 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } } - SolderingRecipe recipe = SolderingRecipes.getRecipe(new ItemStack[] {slots[0], slots[1], slots[2], slots[3], slots[4], slots[5]}); + recipe = SolderingRecipes.getRecipe(new ItemStack[] {slots[0], slots[1], slots[2], slots[3], slots[4], slots[5]}); long intendedMaxPower; UpgradeManager.eval(slots, 9, 10); @@ -133,19 +136,8 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } this.maxPower = Math.max(intendedMaxPower, power); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setLong("maxPower", maxPower); - data.setLong("consumption", consumption); - data.setInteger("progress", progress); - data.setInteger("processTime", processTime); - if(recipe != null) { - data.setInteger("display", Item.getIdFromItem(recipe.output.getItem())); - data.setInteger("displayMeta", recipe.output.getItemDamage()); - } - this.tank.writeToNBT(data, "t"); - this.networkPack(data, 25); + + this.networkPackNT(25); } } @@ -240,22 +232,38 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.maxPower = nbt.getLong("maxPower"); - this.consumption = nbt.getLong("consumption"); - this.progress = nbt.getInteger("progress"); - this.processTime = nbt.getInteger("processTime"); - - if(nbt.hasKey("display")) { - this.display = new ItemStack(Item.getItemById(nbt.getInteger("display")), 1, nbt.getInteger("displayMeta")); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeLong(this.maxPower); + buf.writeLong(this.consumption); + buf.writeInt(this.progress); + buf.writeInt(this.processTime); + buf.writeBoolean(recipe != null); + if(recipe != null) { + buf.writeInt(Item.getIdFromItem(recipe.output.getItem())); + buf.writeInt(recipe.output.getItemDamage()); + } + this.tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.maxPower = buf.readLong(); + this.consumption = buf.readLong(); + this.progress = buf.readInt(); + this.processTime = buf.readInt(); + + if(buf.readBoolean()) { + int id = buf.readInt(); + this.display = new ItemStack(Item.getItemById(id), 1, buf.readInt()); } else { this.display = null; } - - this.tank.readFromNBT(nbt, "t"); + + this.tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index f7e3349f5..7c19022ab 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -28,6 +28,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -85,7 +86,9 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement tanks[2] = new FluidTank(Fluids.WATER, 16000); tanks[3] = new FluidTank(Fluids.HOTSTEAM, 160000); } - + + private long powerBeforeNet; + @Override public void updateEntity() { @@ -131,10 +134,9 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", Math.min(this.power, this.maxPower)); //set first to get an unmodified view of how much power was generated before deductions from the net - + + powerBeforeNet = Math.min(this.power, maxPower); + //do net/battery deductions first... power = Library.chargeItemsFromTE(slots, 0, power, maxPower); this.tryProvide(worldObj, xCoord - dir.offsetZ * 5, yCoord + 1, zCoord + dir.offsetX * 5, rot); //sends out power @@ -152,26 +154,8 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement this.trySubscribe(tanks[2].getTankType(), worldObj, xCoord + dir.offsetX * 2 + rot.offsetX * -4, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * -4, dir); //steam this.sendFluid(tanks[3], worldObj, xCoord + dir.offsetZ * 6, yCoord + 1, zCoord - dir.offsetX * 6, rot.getOpposite()); - - data.setInteger("rpm", this.rpm); - data.setInteger("temp", this.temp); - data.setInteger("state", this.state); - data.setBoolean("automode", this.autoMode); - data.setInteger("throttle", this.throttle); - data.setInteger("slidpos", this.powerSliderPos); - - if(state != 1) { - data.setInteger("counter", this.counter); //sent during startup and shutdown - } else { - data.setInteger("instantPow", this.instantPowerOutput); //sent while running - } - - tanks[0].writeToNBT(data, "fuel"); - tanks[1].writeToNBT(data, "lube"); - tanks[2].writeToNBT(data, "water"); - tanks[3].writeToNBT(data, "steam"); - this.networkPack(data, 150); + this.networkPackNT(150); } else { //client side, for sounds n shit @@ -200,6 +184,51 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.powerBeforeNet); + buf.writeInt(this.rpm); + buf.writeInt(this.temp); + buf.writeInt(this.state); + buf.writeBoolean(this.autoMode); + buf.writeInt(this.throttle); + buf.writeInt(this.powerSliderPos); + + if(state != 1) { + buf.writeInt(this.counter); //sent during startup and shutdown + } else { + buf.writeInt(this.instantPowerOutput); //sent while running + } + + tanks[0].serialize(buf); + tanks[1].serialize(buf); + tanks[2].serialize(buf); + tanks[3].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.rpm = buf.readInt(); + this.temp = buf.readInt(); + this.state = buf.readInt(); + this.autoMode = buf.readBoolean(); + this.powerSliderPos = buf.readInt(); + this.throttle = buf.readInt(); + + if(state != 1) + this.counter = buf.readInt(); + else + this.instantPowerOutput = buf.readInt(); //state 1 + + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.tanks[2].deserialize(buf); + this.tanks[3].deserialize(buf); + } private void stopIfNotReady() { @@ -378,30 +407,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.rpm = nbt.getInteger("rpm"); - this.temp = nbt.getInteger("temp"); - this.state = nbt.getInteger("state"); - this.autoMode = nbt.getBoolean("automode"); - this.powerSliderPos = nbt.getInteger("slidpos"); - this.throttle = nbt.getInteger("throttle"); - - if(nbt.hasKey("counter")) - this.counter = nbt.getInteger("counter"); //state 0 and -1 - else - this.instantPowerOutput = nbt.getInteger("instantPow"); //state 1 - - this.tanks[0].readFromNBT(nbt, "fuel"); - this.tanks[1].readFromNBT(nbt, "lube"); - this.tanks[2].readFromNBT(nbt, "water"); - this.tanks[3].readFromNBT(nbt, "steam"); - } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index d0e1306bc..b6cc7780d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -34,6 +34,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -284,15 +285,8 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem if(this.power > this.maxPower) { this.power = this.maxPower; } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setByte("after", (byte) afterburner); - data.setBoolean("wasOn", wasOn); - data.setBoolean("showBlood", showBlood); - tank.writeToNBT(data, "tank"); - blood.writeToNBT(data, "blood"); - this.networkPack(data, 150); + + this.networkPackNT(150); } else { @@ -385,16 +379,27 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem } } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.afterburner = nbt.getByte("after"); - this.wasOn = nbt.getBoolean("wasOn"); - this.showBlood = nbt.getBoolean("showBlood"); - tank.readFromNBT(nbt, "tank"); - blood.readFromNBT(nbt, "blood"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeByte((byte) afterburner); + buf.writeBoolean(wasOn); + buf.writeBoolean(showBlood); + tank.serialize(buf); + blood.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.afterburner = buf.readByte(); + this.wasOn = buf.readBoolean(); + this.showBlood = buf.readBoolean(); + tank.deserialize(buf); + blood.deserialize(buf); } public AudioWrapper createAudioLoop() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java index b6e4e9d55..48c671e50 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java @@ -11,6 +11,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -75,21 +76,25 @@ public class TileEntityMicrowave extends TileEntityMachineBase implements IEnerg time += speed * 2; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("time", time); - data.setInteger("speed", speed); - networkPack(data, 50); + + networkPackNT(50); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - power = data.getLong("power"); - time = data.getInteger("time"); - speed = data.getInteger("speed"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeInt(time); + buf.writeInt(speed); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + power = buf.readLong(); + time = buf.readInt(); + speed = buf.readInt(); } public void handleButtonPacket(int value, int meta) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 15fe1d786..d33ff0118 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -29,6 +29,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -270,22 +271,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.coreHeat = 0; } } - - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - data.setInteger("rodCount", rodCount); - data.setInteger("coreHeat", coreHeat); - data.setInteger("hullHeat", hullHeat); - data.setDouble("flux", flux); - data.setDouble("processTime", processTime); - data.setDouble("progress", progress); - data.setInteger("typeLoaded", typeLoaded); - data.setInteger("amountLoaded", amountLoaded); - data.setDouble("rodLevel", rodLevel); - data.setDouble("rodTarget", rodTarget); - data.setInteger("coreHeatCapacity", coreHeatCapacity); - this.networkPack(data, 150); + + this.networkPackNT(150); } else { if(amountLoaded > 0) { @@ -383,23 +370,41 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG protected int getRodCountForCoolant() { return this.rodCount + (int) Math.ceil(this.heatsinkCount / 4D); } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - tanks[0].readFromNBT(nbt, "t0"); - tanks[1].readFromNBT(nbt, "t1"); - rodCount = nbt.getInteger("rodCount"); - coreHeat = nbt.getInteger("coreHeat"); - hullHeat = nbt.getInteger("hullHeat"); - flux = nbt.getDouble("flux"); - processTime = nbt.getDouble("processTime"); - progress = nbt.getDouble("progress"); - typeLoaded = nbt.getInteger("typeLoaded"); - amountLoaded = nbt.getInteger("amountLoaded"); - rodLevel = nbt.getDouble("rodLevel"); - rodTarget = nbt.getInteger("rodTarget"); - coreHeatCapacity = nbt.getInteger("coreHeatCapacity"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.rodCount); + buf.writeInt(this.coreHeat); + buf.writeInt(this.hullHeat); + buf.writeDouble(this.flux); + buf.writeDouble(this.processTime); + buf.writeDouble(this.progress); + buf.writeInt(this.typeLoaded); + buf.writeInt(this.amountLoaded); + buf.writeDouble(this.rodLevel); + buf.writeDouble(this.rodTarget); + buf.writeInt(this.coreHeatCapacity); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.rodCount = buf.readInt(); + this.coreHeat = buf.readInt(); + this.hullHeat = buf.readInt(); + this.flux = buf.readDouble(); + this.processTime = buf.readDouble(); + this.progress = buf.readDouble(); + this.typeLoaded = buf.readInt(); + this.amountLoaded = buf.readInt(); + this.rodLevel = buf.readDouble(); + this.rodTarget = buf.readInt(); + this.coreHeatCapacity = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } protected void setupTanks() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java index 0a5fad22a..a8b1be570 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java @@ -13,6 +13,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -136,33 +137,37 @@ public class TileEntityReactorControl extends TileEntityMachineBase implements I reactor.setTarget(level); } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setDouble("level", level); - data.setInteger("flux", flux); - data.setBoolean("isLinked", isLinked); - data.setDouble("levelLower", levelLower); - data.setDouble("levelUpper", levelUpper); - data.setDouble("heatLower", heatLower); - data.setDouble("heatUpper", heatUpper); - data.setInteger("function", function.ordinal()); - this.networkPack(data, 150); + + this.networkPackNT(150); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.heat = data.getInteger("heat"); - this.level = data.getDouble("level"); - this.flux = data.getInteger("flux"); - isLinked = data.getBoolean("isLinked"); - levelLower = data.getDouble("levelLower"); - levelUpper = data.getDouble("levelUpper"); - heatLower = data.getDouble("heatLower"); - heatUpper = data.getDouble("heatUpper"); - function = RodFunction.values()[data.getInteger("function")]; + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(heat); + buf.writeDouble(level); + buf.writeInt(flux); + buf.writeBoolean(isLinked); + buf.writeDouble(levelLower); + buf.writeDouble(levelUpper); + buf.writeDouble(heatLower); + buf.writeDouble(heatUpper); + buf.writeByte(function.ordinal()); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.level = buf.readDouble(); + this.flux = buf.readInt(); + isLinked = buf.readBoolean(); + levelLower = buf.readDouble(); + levelUpper = buf.readDouble(); + heatLower = buf.readDouble(); + heatUpper = buf.readDouble(); + function = RodFunction.values()[buf.readByte()]; } private boolean establishLink() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java index e242b5ee2..2f35685ce 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java @@ -15,12 +15,14 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPlateFuel; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -151,27 +153,31 @@ public class TileEntityReactorResearch extends TileEntityMachineBase implements float rad = (float) heat / (float) maxHeat * 50F; ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, rad); } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setByte("water", water); - data.setDouble("level", level); - data.setDouble("targetLevel", targetLevel); - data.setIntArray("slotFlux", slotFlux); - data.setInteger("totalFlux", totalFlux); - this.networkPack(data, 150); + + this.networkPackNT(150); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.heat = data.getInteger("heat"); - this.water = data.getByte("water"); - this.level = data.getDouble("level"); - this.targetLevel = data.getDouble("targetLevel"); - this.slotFlux = data.getIntArray("slotFlux"); - this.totalFlux = data.getInteger("totalFlux"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.heat); + buf.writeByte(this.water); + buf.writeDouble(this.level); + buf.writeDouble(this.targetLevel); + BufferUtil.writeIntArray(buf, this.slotFlux); + buf.writeInt(this.totalFlux); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.water = buf.readByte(); + this.level = buf.readDouble(); + this.targetLevel = buf.readDouble(); + this.slotFlux = BufferUtil.readIntArray(buf); + this.totalFlux = buf.readInt(); } public byte getWater() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index d1a46f430..ec4902930 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -33,6 +33,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -128,17 +129,6 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.heat = data.getInteger("heat"); - this.pressure = data.getInteger("pressure"); - this.isOn = data.getBoolean("isOn"); - steam.readFromNBT(data, "t0"); - carbonDioxide.readFromNBT(data, "t1"); - water.readFromNBT(data, "t2"); - } - public int getGaugeScaled(int i, int type) { switch (type) { case 0: return (steam.getFill() * i) / steam.getMaxFill(); @@ -227,18 +217,33 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC } checkIfMeltdown(); - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setInteger("pressure", pressure); - data.setBoolean("isOn", isOn); - steam.writeToNBT(data, "t0"); - carbonDioxide.writeToNBT(data, "t1"); - water.writeToNBT(data, "t2"); - this.networkPack(data, 150); + + this.networkPackNT(150); } } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.heat); + buf.writeInt(this.pressure); + buf.writeBoolean(this.isOn); + steam.serialize(buf); + carbonDioxide.serialize(buf); + water.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.pressure = buf.readInt(); + this.isOn = buf.readBoolean(); + steam.deserialize(buf); + carbonDioxide.deserialize(buf); + water.deserialize(buf); + } + private void generateSteam() { // function of SHS produced per tick diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java index 346d171f5..5bcf63e9b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java @@ -23,6 +23,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.item.IDesignatorItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -94,15 +95,8 @@ public class TileEntitySoyuzLauncher extends TileEntityMachineBase implements IS } else { liftOff(); } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setByte("mode", mode); - data.setBoolean("starting", starting); - data.setByte("type", this.getType()); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - networkPack(data, 250); + + networkPackNT(250); } if(worldObj.isRemote) { @@ -189,18 +183,29 @@ public class TileEntitySoyuzLauncher extends TileEntityMachineBase implements IS audio = null; } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - power = data.getLong("power"); - mode = data.getByte("mode"); - starting = data.getBoolean("starting"); - rocketType = data.getByte("type"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeByte(mode); + buf.writeBoolean(starting); + buf.writeByte(this.getType()); + tanks[0].serialize(buf); + tanks[1].serialize(buf); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + power = buf.readLong(); + mode = buf.readByte(); + starting = buf.readBoolean(); + rocketType = buf.readByte(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + } + public void startCountdown() { if(canLaunch()) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java index ecdb619a0..ee498d053 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java @@ -15,6 +15,7 @@ import com.hbm.util.ArmorUtil; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityCreeper; @@ -69,17 +70,7 @@ public class TileEntityTesla extends TileEntityMachineBase implements IEnergyRec this.targets = zap(worldObj, dx, dy, dz, range, null); } - NBTTagCompound data = new NBTTagCompound(); - data.setShort("length", (short)targets.size()); - int i = 0; - for(double[] d : this.targets) { - data.setDouble("x" + i, d[0]); - data.setDouble("y" + i, d[1]); - data.setDouble("z" + i, d[2]); - i++; - } - - this.networkPack(data, 100); + this.networkPackNT(100); } } @@ -145,19 +136,30 @@ public class TileEntityTesla extends TileEntityMachineBase implements IEnergyRec return ret; } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - int s = data.getShort("length"); - + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort((short)targets.size()); + for(double[] d : this.targets) { + buf.writeDouble(d[0]); + buf.writeDouble(d[1]); + buf.writeDouble(d[2]); + } + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + int s = buf.readShort(); + this.targets.clear(); - + for(int i = 0; i < s; i++) this.targets.add(new double[] { - data.getDouble("x" + i), - data.getDouble("y" + i), - data.getDouble("z" + i) + buf.readDouble(), // X + buf.readDouble(), // Y + buf.readDouble() // Z }); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index 9168d4387..81957e0cd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -31,6 +31,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -120,7 +121,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand /* send sync packets (order doesn't matter) */ for(TileEntityWatz segment : segments) { segment.isOn = turnedOn; - segment.sendPacket(sharedTanks); + this.networkPackNT(25); segment.heat *= 0.99; //cool 1% per tick } @@ -277,30 +278,28 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand } } } - - public void sendPacket(FluidTank[] tanks) { - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", this.heat); - data.setBoolean("isOn", isOn); - data.setBoolean("lock", isLocked); - data.setDouble("flux", this.fluxLastReaction + this.fluxLastBase); - for(int i = 0; i < tanks.length; i++) { - tanks[i].writeToNBT(data, "t" + i); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.heat); + buf.writeBoolean(isOn); + buf.writeBoolean(isLocked); + buf.writeDouble(this.fluxLastReaction + this.fluxLastBase); + for (FluidTank tank : tanks) { + tank.serialize(buf); } - this.networkPack(data, 25); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.heat = nbt.getInteger("heat"); - this.isOn = nbt.getBoolean("isOn"); - this.isLocked = nbt.getBoolean("lock"); - this.fluxDisplay = nbt.getDouble("flux"); - for(int i = 0; i < tanks.length; i++) { - tanks[i].readFromNBT(nbt, "t" + i); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.isOn = buf.readBoolean(); + this.isLocked = buf.readBoolean(); + this.fluxDisplay = buf.readDouble(); + for (FluidTank tank : tanks) { + tank.deserialize(buf); } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java index 3ef9daf56..a95a94b68 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java @@ -20,6 +20,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -73,13 +74,24 @@ public class TileEntityMachineCatalyticReformer extends TileEntityMachineBase im } } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - for(int i = 0; i < 4; i++) tanks[i].writeToNBT(data, "" + i); - this.networkPack(data, 150); + + this.networkPackNT(150); } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + for(int i = 0; i < 4; i++) tanks[i].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); + } @Override public void networkUnpack(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java index cf90645d5..dcee0bbc2 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java @@ -12,6 +12,7 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.Tuple.Triplet; import com.hbm.util.fauxpointtwelve.DirPos; @@ -19,6 +20,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -107,14 +109,8 @@ public class TileEntityMachineCoker extends TileEntityMachineBase implements IFl for(DirPos pos : getConPos()) { if(this.tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("wasOn", this.wasOn); - data.setInteger("heat", this.heat); - data.setInteger("progress", this.progress); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - this.networkPack(data, 25); + + this.networkPackNT(25); } else { if(this.wasOn) { @@ -135,6 +131,8 @@ public class TileEntityMachineCoker extends TileEntityMachineBase implements IFl } } } + + public DirPos[] getConPos() { @@ -172,16 +170,25 @@ public class TileEntityMachineCoker extends TileEntityMachineBase implements IFl return true; } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.wasOn = nbt.getBoolean("wasOn"); - this.heat = nbt.getInteger("heat"); - this.progress = nbt.getInteger("progress"); - tanks[0].readFromNBT(nbt, "t0"); - tanks[1].readFromNBT(nbt, "t1"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.wasOn); + buf.writeInt(this.heat); + buf.writeInt(this.progress); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.wasOn = buf.readBoolean(); + this.heat = buf.readInt(); + this.progress = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index 1bfbfe835..ed34c417a 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -30,6 +30,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -178,13 +179,8 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements } power = Library.chargeItemsFromTE(slots, 0, power, maxPower); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setBoolean("isOn", isOn); - data.setBoolean("doesBurn", doesBurn); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { @@ -240,15 +236,23 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements new DirPos(xCoord, yCoord, zCoord - 2, Library.NEG_Z) }; } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - this.doesBurn = nbt.getBoolean("doesBurn"); - tank.readFromNBT(nbt, "t"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.doesBurn); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); + this.doesBurn = buf.readBoolean(); + tank.serialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index a97f9574d..201d7a409 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -24,6 +24,7 @@ import api.hbm.fluid.IFluidStandardSender; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -76,14 +77,8 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen this.progress = 0; this.sendFluid(); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setInteger("progress", this.progress); - data.setInteger("usage", this.usage); - data.setInteger("processTime", this.processTime); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + + this.networkPackNT(50); } } @@ -154,14 +149,23 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.progress = nbt.getInteger("progress"); - this.usage = nbt.getInteger("usage"); - this.processTime = nbt.getInteger("processTime"); - tank.readFromNBT(nbt, "t"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.progress); + buf.writeInt(this.usage); + buf.writeInt(this.processTime); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.progress = buf.readInt(); + this.usage = buf.readInt(); + this.processTime = buf.readInt(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index 65bf61681..29e46ab1f 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -37,6 +37,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -193,14 +194,9 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements } } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - for(int i = 0; i < 5; i++) tanks[i].writeToNBT(data, "" + i); - data.setBoolean("exploded", hasExploded); - data.setBoolean("onFire", onFire); - data.setBoolean("isOn", this.isOn); - this.networkPack(data, 150); + + this.networkPackNT(150); + } else { if(this.isOn) audioTime = 20; @@ -253,16 +249,25 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements audio = null; } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - for(int i = 0; i < 5; i++) tanks[i].readFromNBT(nbt, "" + i); - this.hasExploded = nbt.getBoolean("exploded"); - this.onFire = nbt.getBoolean("onFire"); - this.isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + for(int i = 0; i < 5; i++) tanks[i].serialize(buf); + buf.writeBoolean(this.hasExploded); + buf.writeBoolean(this.onFire); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + for(int i = 0; i < 5; i++) tanks[i].deserialize(buf); + this.hasExploded = buf.readBoolean(); + this.onFire = buf.readBoolean(); + this.isOn = buf.readBoolean(); } private void refine() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index 5f0545326..cb8daee0c 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -24,6 +24,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -75,14 +76,8 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement this.process(); else this.progress = 0; - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setInteger("progress", this.progress); - data.setInteger("usage", this.usage); - data.setInteger("processTime", this.processTime); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + + this.networkPackNT(50); } } @@ -171,14 +166,23 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.progress = nbt.getInteger("progress"); - this.usage = nbt.getInteger("usage"); - this.processTime = nbt.getInteger("processTime"); - tank.readFromNBT(nbt, "t"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.progress); + buf.writeInt(this.usage); + buf.writeInt(this.processTime); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.progress = buf.readInt(); + this.usage = buf.readInt(); + this.processTime = buf.readInt(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java index 037982ffd..c40b6dae4 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java @@ -20,6 +20,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -81,12 +82,9 @@ public class TileEntityMachineVacuumDistill extends TileEntityMachineBase implem } } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setBoolean("isOn", this.isOn); - for(int i = 0; i < 5; i++) tanks[i].writeToNBT(data, "" + i); - this.networkPack(data, 150); + + this.networkPackNT(150); + } else { if(this.isOn) audioTime = 20; @@ -139,14 +137,21 @@ public class TileEntityMachineVacuumDistill extends TileEntityMachineBase implem audio = null; } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - for(int i = 0; i < 5; i++) tanks[i].readFromNBT(nbt, "" + i); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + for(int i = 0; i < 5; i++) tanks[i].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); + for(int i = 0; i < 5; i++) tanks[i].deserialize(buf); } private void refine() { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index 78ea7a558..4d53c8c5d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -14,6 +14,7 @@ import com.hbm.inventory.gui.GUIRBMKConsole; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; +import com.hbm.util.BufferUtil; import com.hbm.util.Compat; import com.hbm.util.EnumUtil; import com.hbm.util.I18nUtil; @@ -21,6 +22,7 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -77,8 +79,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon this.worldObj.theProfiler.endSection(); prepareScreenInfo(); } - - prepareNetworkPack(); + + this.networkPackNT(50); } } @@ -185,66 +187,65 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon screen.display = text; } } - - private void prepareNetworkPack() { - - NBTTagCompound data = new NBTTagCompound(); - - if(this.worldObj.getTotalWorldTime() % 10 == 0) { - - data.setBoolean("full", true); - - for(int i = 0; i < columns.length; i++) { - - if(this.columns[i] != null) { - data.setTag("column_" + i, this.columns[i].data); - data.setShort("type_" + i, (short)this.columns[i].type.ordinal()); - } - } - - data.setIntArray("flux", this.fluxBuffer); - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - if(screen.display != null) { - data.setString("t" + i, screen.display); - } - } - } - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - data.setByte("s" + i, (byte) screen.type.ordinal()); - } - - this.networkPack(data, 50); - } - @Override - public void networkUnpack(NBTTagCompound data) { - - if(data.getBoolean("full")) { - this.columns = new RBMKColumn[15 * 15]; - - for(int i = 0; i < columns.length; i++) { - - if(data.hasKey("type_" + i)) { - this.columns[i] = new RBMKColumn(ColumnType.values()[data.getShort("type_" + i)], (NBTTagCompound)data.getTag("column_" + i)); + public void serialize(ByteBuf buf) { + super.serialize(buf); + + if (this.worldObj.getTotalWorldTime() % 10 == 0) { + buf.writeBoolean(true); + + for (RBMKColumn column : this.columns) { + if (column == null || column.type == null) + buf.writeByte(-1); + else { + buf.writeByte((byte) column.type.ordinal()); + BufferUtil.writeNBT(buf, column.data); } } - - this.fluxBuffer = data.getIntArray("flux"); - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - screen.display = data.getString("t" + i); + + BufferUtil.writeIntArray(buf, fluxBuffer); + + for (RBMKScreen screen : this.screens) { + BufferUtil.writeString(buf, screen.display); + } + + } else { + + buf.writeBoolean(false); + + for (RBMKScreen screen : screens) { + buf.writeByte((byte) screen.type.ordinal()); } } - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - screen.type = ScreenType.values()[data.getByte("s" + i)]; + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + if (buf.readBoolean()) { // check if it should be a full packet + + for(int i = 0; i < this.columns.length; i++) { + byte ordinal = buf.readByte(); + if (ordinal == -1) + this.columns[i] = null; + else + this.columns[i] = new RBMKColumn(ColumnType.values()[ordinal], BufferUtil.readNBT(buf)); + } + + this.fluxBuffer = BufferUtil.readIntArray(buf); + + for (RBMKScreen screen : this.screens) { + screen.display = BufferUtil.readString(buf); + } + + } else { + + for (RBMKScreen screen : this.screens) { + screen.type = ScreenType.values()[buf.readByte()]; + } + } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java index a634dcc79..a50aa77b8 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java @@ -8,6 +8,7 @@ import com.hbm.inventory.gui.GUICraneBoxer; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -143,17 +144,21 @@ public class TileEntityCraneBoxer extends TileEntityCraneBase implements IGUIPro worldObj.spawnEntityInWorld(moving); } } - - NBTTagCompound data = new NBTTagCompound(); - data.setByte("mode", mode); - this.networkPack(data, 15); + + this.networkPackNT(15); } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.mode = nbt.getByte("mode"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeByte(this.mode); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.mode = buf.readByte(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java index 26ed150ea..ddfa5db9c 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java @@ -13,6 +13,7 @@ import com.hbm.util.InventoryUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -130,21 +131,23 @@ public class TileEntityCraneGrabber extends TileEntityCraneBase implements IGUIP } } } - - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isWhitelist", isWhitelist); - this.matcher.writeToNBT(data); - this.networkPack(data, 15); + + this.networkPackNT(15); } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.isWhitelist = nbt.getBoolean("isWhitelist"); - this.matcher.modes = new String[this.matcher.modes.length]; - this.matcher.readFromNBT(nbt); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.isWhitelist); + this.matcher.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.isWhitelist = buf.readBoolean(); + this.matcher.deserialize(buf); } public boolean matchesFilter(ItemStack stack) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java index 6568f113b..50593e9d4 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java @@ -7,8 +7,10 @@ import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -44,26 +46,28 @@ public class TileEntityCraneRouter extends TileEntityMachineBase implements IGUI if(!worldObj.isRemote) { - NBTTagCompound data = new NBTTagCompound(); - for(int i = 0; i < patterns.length; i++) { - NBTTagCompound compound = new NBTTagCompound(); - patterns[i].writeToNBT(compound); - data.setTag("pattern" + i, compound); - } - data.setIntArray("modes", this.modes); - this.networkPack(data, 15); + this.networkPackNT(15); } } - + @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - for(int i = 0; i < patterns.length; i++) { - NBTTagCompound compound = data.getCompoundTag("pattern" + i); - patterns[i].readFromNBT(compound); + public void serialize(ByteBuf buf) { + super.serialize(buf); + for (ModulePatternMatcher pattern : patterns) { + pattern.serialize(buf); } - this.modes = data.getIntArray("modes"); + + BufferUtil.writeIntArray(buf, this.modes); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + for (ModulePatternMatcher pattern : patterns) { + pattern.deserialize(buf); + } + + this.modes = BufferUtil.readIntArray(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java index 4b4e18803..e2013512c 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java @@ -3,8 +3,10 @@ package com.hbm.tileentity.network; import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.Compat; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -68,24 +70,27 @@ public class TileEntityRadioTorchCounter extends TileEntityMachineBase implement this.lastCount[i] = count; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("polling", polling); - data.setIntArray("last", lastCount); - this.matcher.writeToNBT(data); - for(int i = 0; i < 3; i++) if(channel[i] != null) data.setString("c" + i, channel[i]); - this.networkPack(data, 15); + + this.networkPackNT(15); } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.polling = nbt.getBoolean("polling"); - this.lastCount = nbt.getIntArray("last"); - this.matcher.modes = new String[this.matcher.modes.length]; - this.matcher.readFromNBT(nbt); - for(int i = 0; i < 3; i++) this.channel[i] = nbt.getString("c" + i); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.polling); + BufferUtil.writeIntArray(buf, this.lastCount); + this.matcher.serialize(buf); + for(int i = 0; i < 3; i++) BufferUtil.writeString(buf, this.channel[i]); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.polling = buf.readBoolean(); + this.lastCount = BufferUtil.readIntArray(buf); + this.matcher.deserialize(buf); + for(int i = 0; i < 3; i++) this.channel[i] = BufferUtil.readString(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index 156472346..f741d7e4f 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -19,6 +19,7 @@ import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -317,9 +318,8 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); - - NBTTagCompound data = this.writePacket(); - this.networkPack(data, 250); + + this.networkPackNT(250); this.didJustShoot = false; @@ -409,20 +409,17 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - data.setShort("mode", mode); - if(didJustShoot) - data.setBoolean("didJustShoot", didJustShoot); - return data; + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort(this.mode); + buf.writeBoolean(this.didJustShoot); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.mode = nbt.getShort("mode"); - if(nbt.getBoolean("didJustShoot")) - this.retracting = true; + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.mode = buf.readShort(); + this.retracting = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 2ec8a6b26..848356340 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -34,6 +34,7 @@ import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -228,9 +229,8 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); - - NBTTagCompound data = this.writePacket(); - this.networkPack(data, 250); + + this.networkPackNT(250); if(usesCasings() && this.casingDelay() > 0) { if(casingDelay > 0) { @@ -252,26 +252,45 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } } } - - protected NBTTagCompound writePacket() { - - NBTTagCompound data = new NBTTagCompound(); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.tPos != null); if(this.tPos != null) { - data.setDouble("tX", this.tPos.xCoord); - data.setDouble("tY", this.tPos.yCoord); - data.setDouble("tZ", this.tPos.zCoord); + buf.writeDouble(this.tPos.xCoord); + buf.writeDouble(this.tPos.yCoord); + buf.writeDouble(this.tPos.zCoord); } - data.setDouble("pitch", this.rotationPitch); - data.setDouble("yaw", this.rotationYaw); - data.setLong("power", this.power); - data.setBoolean("isOn", this.isOn); - data.setBoolean("targetPlayers", this.targetPlayers); - data.setBoolean("targetAnimals", this.targetAnimals); - data.setBoolean("targetMobs", this.targetMobs); - data.setBoolean("targetMachines", this.targetMachines); - data.setInteger("stattrak", this.stattrak); - - return data; + buf.writeDouble(this.rotationPitch); + buf.writeDouble(this.rotationYaw); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.targetPlayers); + buf.writeBoolean(this.targetAnimals); + buf.writeBoolean(this.targetMobs); + buf.writeBoolean(this.targetMachines); + buf.writeInt(this.stattrak); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + boolean hasTPos = buf.readBoolean(); + if(hasTPos) { + this.tPos.xCoord = buf.readDouble(); + this.tPos.yCoord = buf.readDouble(); + this.tPos.zCoord = buf.readDouble(); + } + this.rotationPitch = buf.readDouble(); + this.rotationYaw = buf.readDouble(); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); + this.targetPlayers = buf.readBoolean(); + this.targetAnimals = buf.readBoolean(); + this.targetMobs = buf.readBoolean(); + this.targetMachines = buf.readBoolean(); + this.stattrak = buf.readInt(); } protected void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java index 924ec352c..19996d6af 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java @@ -22,6 +22,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -153,18 +154,17 @@ public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFl } } } - + @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - tank.writeToNBT(data, "t"); - return data; + public void serialize(ByteBuf buf) { + super.serialize(buf); + tank.serialize(buf); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - tank.readFromNBT(nbt, "t"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + tank.deserialize(buf); } @Override //TODO: clean this shit up diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 149dc136c..714ee338f 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -17,6 +17,7 @@ import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -249,9 +250,8 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem } this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); - - NBTTagCompound data = this.writePacket(); - this.networkPack(data, 250); + + this.networkPackNT(250); } else { @@ -267,22 +267,21 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem } @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - data.setShort("mode", this.mode); - data.setInteger("type", this.typeLoaded); - data.setInteger("ammo", this.ammo); - data.setFloat("crane", crane); - return data; + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort(this.mode); + buf.writeShort(this.typeLoaded); + buf.writeInt(this.ammo); + buf.writeFloat(this.crane); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.mode = nbt.getShort("mode"); - this.typeLoaded = nbt.getShort("type"); - this.ammo = nbt.getInteger("ammo"); - this.crane = nbt.getFloat("crane"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.mode = buf.readShort(); + this.typeLoaded = buf.readShort(); + this.ammo = buf.readInt(); + this.crane = buf.readFloat(); } public boolean hasAmmo() { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 91dc3e9ab..f9f4e82c5 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -19,6 +19,7 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -261,20 +262,21 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I } this.power -= demand; - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("shot", true); - this.networkPack(data, 250); + + this.networkPackNT(250); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - - if(nbt.hasKey("shot")) - beam = 5; - else - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(true); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.beam = buf.readBoolean() ? 5 : 0; } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java index f6c95d847..2dbe1e5bc 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java @@ -15,6 +15,7 @@ import cpw.mods.fml.relauncher.SideOnly; import com.hbm.items.ModItems; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -104,20 +105,21 @@ public class TileEntityTurretRichard extends TileEntityTurretBaseNT { if(this.getFirstConfigLoaded() == null) { this.loaded = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("loaded", this.loaded); - this.networkPack(data, 250); + + this.networkPackNT(250); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - - if(nbt.hasKey("loaded")) - this.loaded = nbt.getInteger("loaded"); - else - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.loaded); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.loaded = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java index 09b8d22ee..aca28eb62 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java @@ -15,6 +15,7 @@ import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -229,20 +230,19 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG } @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - if(didJustShootLeft) data.setBoolean("justShotLeft", didJustShootLeft); - if(didJustShootRight) data.setBoolean("justShotRight", didJustShootRight); + public void serialize(ByteBuf buf) { + super.serialize(buf); + if(didJustShootLeft) buf.writeBoolean(didJustShootLeft); + if(didJustShootRight) buf.writeBoolean(didJustShootRight); didJustShootLeft = false; didJustShootRight = false; - return data; } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - if(nbt.getBoolean("justShotLeft")) this.retractingLeft = true; - if(nbt.getBoolean("justShotRight")) this.retractingRight = true; + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + if(buf.readBoolean()) this.retractingLeft = true; + if(buf.readBoolean()) this.retractingRight = true; } protected void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java index d25acbc74..0510a86ac 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java @@ -13,6 +13,7 @@ import com.hbm.packet.PacketDispatcher; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -130,10 +131,8 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { this.target.attackEntityFrom(ModDamageSource.electricity, 30F + worldObj.rand.nextInt(11)); this.conusmeAmmo(conf.ammo); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.tauShoot", 4.0F, 0.9F + worldObj.rand.nextFloat() * 0.3F); - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("shot", true); - this.networkPack(data, 250); + + this.networkPackNT(250); Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); @@ -149,12 +148,15 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { } @Override - public void networkUnpack(NBTTagCompound nbt) { - - if(nbt.hasKey("shot")) - beam = 3; - else - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(true); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.beam = buf.readBoolean() ? 3 : 0; } @Override diff --git a/src/main/java/com/hbm/util/BufferUtil.java b/src/main/java/com/hbm/util/BufferUtil.java index 8a8c7c8ad..e81d259ec 100644 --- a/src/main/java/com/hbm/util/BufferUtil.java +++ b/src/main/java/com/hbm/util/BufferUtil.java @@ -14,7 +14,7 @@ import net.minecraft.nbt.NBTTagCompound; public class BufferUtil { private static final Charset CHARSET = StandardCharsets.UTF_8; - + // Writes a string to a byte buffer by encoding the length and raw bytes public static void writeString(ByteBuf buf, String value) { if(value == null) { @@ -22,7 +22,7 @@ public class BufferUtil { return; } - buf.writeInt(value.length()); + buf.writeInt(value.getBytes(CHARSET).length); buf.writeBytes(value.getBytes(CHARSET)); } @@ -37,6 +37,66 @@ public class BufferUtil { return new String(bytes, CHARSET); } + /** + * Writes an integer array to a buffer. + */ + public static void writeIntArray(ByteBuf buf, int[] array) { + buf.writeInt(array.length); + for (int value : array) { + buf.writeInt(value); + } + } + + /** + * Reads an integer array from a buffer. + */ + public static int[] readIntArray(ByteBuf buf) { + int length = buf.readInt(); + + int[] array = new int[length]; + + for (int i = 0; i < length; i++) { + array[i] = buf.readInt(); + } + + return array; + } + + /** + * Writes a NBTTagCompound to a buffer. + */ + public static void writeNBT(ByteBuf buf, NBTTagCompound compound) { + if(compound != null) { + byte[] nbtData = new byte[0]; + try { + nbtData = CompressedStreamTools.compress(compound); + } catch(IOException e) { + e.printStackTrace(); + } + buf.writeShort((short) nbtData.length); + buf.writeBytes(nbtData); + } else + buf.writeShort(-1); + } + + /** + * Reads a NBTTagCompound from a buffer. + */ + public static NBTTagCompound readNBT(ByteBuf buf) { + short nbtLength = buf.readShort(); + + if (nbtLength == -1) // check if no compound was even given. + return new NBTTagCompound(); + byte[] tags = new byte[nbtLength]; + buf.readBytes(tags); + try { + return CompressedStreamTools.func_152457_a(tags, new NBTSizeTracker(2097152L)); + } catch(IOException e) { + e.printStackTrace(); + } + return new NBTTagCompound(); + } + /** * Writes the ItemStack to the buffer. */ @@ -52,23 +112,12 @@ public class BufferUtil { if (item.getItem().isDamageable() || item.getItem().getShareTag()) nbtTagCompound = item.stackTagCompound; - if(nbtTagCompound != null) { - byte[] nbtData = new byte[0]; - try { - nbtData = CompressedStreamTools.compress(nbtTagCompound); - } catch(IOException e) { - e.printStackTrace(); - } - buf.writeShort((short) nbtData.length); - buf.writeBytes(nbtData); - } else { - buf.writeShort(-1); - } + writeNBT(buf, nbtTagCompound); } } /** - * Reads an ItemStack from a buffer + * Reads an ItemStack from a buffer. */ public static ItemStack readItemStack(ByteBuf buf) { ItemStack item = null; @@ -78,16 +127,7 @@ public class BufferUtil { byte quantity = buf.readByte(); short meta = buf.readShort(); item = new ItemStack(Item.getItemById(id), quantity, meta); - - short nbtLength = buf.readByte(); - - byte[] tags = new byte[nbtLength]; - buf.readBytes(tags); - try { - item.stackTagCompound = CompressedStreamTools.func_152457_a(tags, new NBTSizeTracker(2097152L)); - } catch(IOException e) { - e.printStackTrace(); - } + item.stackTagCompound = readNBT(buf); } return item; } From f0148a12e944c744ba4f8bbd184efa4cd4c7ef13 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 4 Sep 2024 21:55:11 -0500 Subject: [PATCH 15/70] part 1 --- .../java/com/hbm/handler/neutron/PileNeutronHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 48377590e..03af1a103 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -62,7 +62,7 @@ public class PileNeutronHandler { TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; BlockPos pos = new BlockPos(originTE); - for(float i = 1; i <= range; i += 0.5F) { + for(float i = 1; i <= range; i += 1F) { BlockPos node = new BlockPos( (int)Math.floor(pos.getX() + 0.5 + vector.xCoord * i), @@ -70,6 +70,9 @@ public class PileNeutronHandler { (int)Math.floor(pos.getZ() + 0.5 + vector.zCoord * i) ); + if(node.equals(pos)) + continue; // don't interact with itself! + TileEntity tile; if (NeutronNodeWorld.nodeCache.containsKey(node)) @@ -77,7 +80,7 @@ public class PileNeutronHandler { else { tile = blockPosToTE(worldObj, node); if (tile == null) - return; // Doesn't exist anymore! + return; // Doesn't exist! if (tile instanceof TileEntityPileBase) NeutronNodeWorld.addNode(new PileNeutronNode((TileEntityPileBase) tile)); } From ec15e85e4ec757038f0471f970ab90d9c0a4e93c Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 6 Sep 2024 19:43:18 -0500 Subject: [PATCH 16/70] holy shit im done (part 2) --- .../com/hbm/blocks/generic/BlockEmitter.java | 39 ++++---- .../hbm/blocks/machine/MachineCapacitor.java | 4 +- .../hbm/blocks/machine/PistonInserter.java | 47 +++++---- .../hbm/blocks/network/BlockCableGauge.java | 27 ++++-- .../hbm/blocks/network/FluidDuctGauge.java | 28 +++--- .../handler/neutron/PileNeutronHandler.java | 6 +- src/main/java/com/hbm/packet/NBTPacket.java | 97 ------------------- .../java/com/hbm/packet/PacketDispatcher.java | 3 +- .../hbm/tileentity/INBTPacketReceiver.java | 17 ---- .../hbm/tileentity/TileEntityMachineBase.java | 8 +- .../hbm/tileentity/TileEntityTickingBase.java | 18 +--- .../hbm/tileentity/bomb/TileEntityCharge.java | 29 +++--- .../bomb/TileEntityCompactLauncher.java | 6 +- .../bomb/TileEntityLaunchTable.java | 6 +- .../deco/TileEntityLanternBehemoth.java | 20 ++-- .../tileentity/machine/TileEntityCharger.java | 26 ++--- .../machine/TileEntityChimneyBase.java | 22 +++-- .../tileentity/machine/TileEntityChungus.java | 33 +++---- .../machine/TileEntityCondenser.java | 28 +++--- .../machine/TileEntityCondenserPowered.java | 21 +++- .../machine/TileEntityDeuteriumExtractor.java | 8 -- .../machine/TileEntityDiFurnace.java | 27 ++++-- .../tileentity/machine/TileEntityHadron.java | 7 -- .../machine/TileEntityHadronDiode.java | 26 ++--- .../machine/TileEntityHadronPower.java | 4 +- .../machine/TileEntityHeatBoiler.java | 47 +++++---- .../TileEntityHeatBoilerIndustrial.java | 47 +++++---- .../machine/TileEntityHeaterElectric.java | 30 +++--- .../machine/TileEntityHeaterHeatex.java | 36 +++---- .../machine/TileEntityMachineAssemfac.java | 13 --- .../machine/TileEntityMachineAutosaw.java | 30 +++--- .../machine/TileEntityMachineDrain.java | 6 +- .../machine/TileEntityMachineHephaestus.java | 38 +++++--- .../machine/TileEntityMachineIGenerator.java | 5 +- .../machine/TileEntityMachineMixer.java | 17 +--- .../machine/TileEntityMachinePress.java | 18 ---- .../machine/TileEntityMachinePumpBase.java | 35 +++---- .../TileEntityMachinePumpElectric.java | 17 ++-- .../machine/TileEntityMachinePumpSteam.java | 21 ++-- .../machine/TileEntityMachineRadarNT.java | 2 +- .../machine/TileEntityMachineRadarScreen.java | 13 +-- .../TileEntityMachineStrandCaster.java | 29 ++---- .../machine/TileEntityMachineTeleporter.java | 23 +++-- .../machine/TileEntityRadioRec.java | 23 +++-- .../tileentity/machine/TileEntitySawmill.java | 58 +++++------ .../machine/TileEntitySolarBoiler.java | 9 +- .../machine/TileEntitySolarMirror.java | 29 +++--- .../machine/TileEntitySteamEngine.java | 42 +++++--- .../machine/TileEntityStirling.java | 26 ++--- .../TileEntityMachineCatalyticCracker.java | 22 +++-- .../TileEntityMachineCatalyticReformer.java | 8 -- .../oil/TileEntityMachineFractionTower.java | 2 +- .../machine/pile/TileEntityPileBase.java | 4 +- .../machine/rbmk/TileEntityCraneConsole.java | 87 +++++++++-------- .../machine/rbmk/TileEntityRBMKBase.java | 10 +- .../rbmk/TileEntityRBMKSlottedBase.java | 17 ---- .../storage/TileEntityFileCabinet.java | 2 +- .../storage/TileEntityMassStorage.java | 35 ++++--- .../network/TileEntityDroneCrate.java | 36 ++++--- .../network/TileEntityDroneRequester.java | 20 ++-- .../network/TileEntityDroneWaypoint.java | 2 +- .../network/TileEntityRadioTelex.java | 42 ++++---- .../network/TileEntityRadioTorchBase.java | 31 +++--- .../network/TileEntityRadioTorchLogic.java | 36 ++++--- .../TileEntityRequestNetworkContainer.java | 8 -- .../turret/TileEntityTurretBaseNT.java | 22 ----- 66 files changed, 705 insertions(+), 850 deletions(-) delete mode 100644 src/main/java/com/hbm/packet/NBTPacket.java delete mode 100644 src/main/java/com/hbm/tileentity/INBTPacketReceiver.java diff --git a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java index 4d6b10199..9c59c282e 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java @@ -5,14 +5,15 @@ import java.util.List; import com.hbm.blocks.ITooltipProvider; import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import api.hbm.block.IToolable; +import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockPistonBase; @@ -103,7 +104,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP return false; } - public static class TileEntityEmitter extends TileEntity implements INBTPacketReceiver { + public static class TileEntityEmitter extends TileEntityLoadedBase implements IBufPacketReceiver { public static final int range = 100; public int color; @@ -146,7 +147,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP if(color == 0) { color = Color.HSBtoRGB(worldObj.getTotalWorldTime() / 50.0F, 0.5F, 0.25F) & 16777215; } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "plasmablast"); data.setFloat("r", ((float)((color & 0xff0000) >> 16)) / 256F); @@ -168,20 +169,16 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP data.setFloat("pitch", -90); data.setFloat("yaw", 90); } - + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(worldObj.provider.dimensionId, x, y, z, 100)); color = prevColor; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("beam", this.beam); - data.setInteger("color", this.color); - data.setFloat("girth", this.girth); - data.setInteger("effect", this.effect); - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(data, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + + sendStandard(150); + } } @@ -225,11 +222,19 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.beam = nbt.getInteger("beam"); - this.color = nbt.getInteger("color"); - this.girth = nbt.getFloat("girth"); - this.effect = nbt.getInteger("effect"); + public void serialize(ByteBuf buf) { + buf.writeInt(this.beam); + buf.writeInt(this.color); + buf.writeFloat(this.girth); + buf.writeInt(this.effect); + } + + @Override + public void deserialize(ByteBuf buf) { + this.beam = buf.readInt(); + this.color = buf.readInt(); + this.girth = buf.readFloat(); + this.effect = buf.readInt(); } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index f7a0fcfb8..e4221efec 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -199,8 +199,8 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP this.trySubscribe(worldObj, xCoord + opp.offsetX, yCoord + opp.offsetY, zCoord + opp.offsetZ, opp); - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 15)); - + sendStandard(15); + this.powerSent = 0; this.powerReceived = 0; } diff --git a/src/main/java/com/hbm/blocks/machine/PistonInserter.java b/src/main/java/com/hbm/blocks/machine/PistonInserter.java index 8b95fed92..7539e685e 100644 --- a/src/main/java/com/hbm/blocks/machine/PistonInserter.java +++ b/src/main/java/com/hbm/blocks/machine/PistonInserter.java @@ -4,11 +4,14 @@ import java.util.List; import com.hbm.blocks.BlockContainerBase; import com.hbm.blocks.ITooltipProvider; -import com.hbm.tileentity.INBTPacketReceiver; import api.hbm.block.IInsertable; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockPistonBase; import net.minecraft.block.material.Material; @@ -206,7 +209,7 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid // |___..---' _|____`-----..-----'\ // |_____________________| @ | ) // average coding session involving tile entities - public static class TileEntityPistonInserter extends TileEntity implements IInventory, INBTPacketReceiver { + public static class TileEntityPistonInserter extends TileEntityLoadedBase implements IInventory, IBufPacketReceiver { public ItemStack slot; @@ -257,15 +260,7 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid delay--; } - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("extend", extend); - if(this.slot != null) { - NBTTagCompound stack = new NBTTagCompound(); - slot.writeToNBT(stack); - data.setTag("stack", stack); - } - - INBTPacketReceiver.networkPack(this, data, 25); + sendStandard(25); } else { this.lastExtend = this.renderExtend; @@ -279,22 +274,32 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - this.syncExtend = nbt.getInteger("extend"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); + public void serialize(ByteBuf buf) { + buf.writeInt(extend); + + buf.writeBoolean(this.slot != null); + if(this.slot != null) { + BufferUtil.writeNBT(buf, slot.stackTagCompound); + } + + this.turnProgress = 2; + } + + @Override + public void deserialize(ByteBuf buf) { + this.syncExtend = buf.readInt(); + + if(buf.readBoolean()) { + NBTTagCompound stack = BufferUtil.readNBT(buf); this.slot = ItemStack.loadItemStackFromNBT(stack); } else this.slot = null; - + this.turnProgress = 2; } - - /* :3 NBT stuff */ - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java index bc31744fd..3c6cc0425 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java +++ b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java @@ -8,16 +8,20 @@ import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; +import com.hbm.packet.BufPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.render.block.RenderBlockMultipass; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityCableBaseNT; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import api.hbm.energymk2.PowerNetMK2; import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -105,7 +109,7 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, } @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) - public static class TileEntityCableGauge extends TileEntityCableBaseNT implements INBTPacketReceiver, SimpleComponent, CompatHandler.OCComponent { + public static class TileEntityCableGauge extends TileEntityCableBaseNT implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { private long deltaTick = 0; private long deltaSecond = 0; @@ -128,18 +132,21 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, } this.deltaSecond += deltaTick; } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("deltaT", deltaTick); - data.setLong("deltaS", deltaLastSecond); - INBTPacketReceiver.networkPack(this, data, 25); + + sendStandard(25); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.deltaTick = Math.max(nbt.getLong("deltaT"), 0); - this.deltaLastSecond = Math.max(nbt.getLong("deltaS"), 0); + public void serialize(ByteBuf buf) { + buf.writeLong(deltaTick); + buf.writeLong(deltaLastSecond); + } + + @Override + public void deserialize(ByteBuf buf) { + this.deltaTick = Math.max(buf.readLong(), 0); + this.deltaLastSecond = Math.max(buf.readLong(), 0); } @Override diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java index 2c60fbc59..153268f9f 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java @@ -11,15 +11,19 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.CompatHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; +import com.hbm.packet.BufPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.render.block.RenderBlockMultipass; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.I18nUtil; import api.hbm.fluid.IPipeNet; import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -30,7 +34,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; @@ -109,7 +112,7 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL } @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) - public static class TileEntityPipeGauge extends TileEntityPipeBaseNT implements INBTPacketReceiver, SimpleComponent, CompatHandler.OCComponent { + public static class TileEntityPipeGauge extends TileEntityPipeBaseNT implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { private BigInteger lastMeasurement = BigInteger.valueOf(10); private long deltaTick = 0; @@ -139,18 +142,21 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL } catch(Exception ex) { } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("deltaT", deltaTick); - data.setLong("deltaS", deltaLastSecond); - INBTPacketReceiver.networkPack(this, data, 25); + + sendStandard(25); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.deltaTick = Math.max(nbt.getLong("deltaT"), 0); - this.deltaLastSecond = Math.max(nbt.getLong("deltaS"), 0); + public void serialize(ByteBuf buf) { + buf.writeLong(deltaTick); + buf.writeLong(deltaLastSecond); + } + + @Override + public void deserialize(ByteBuf buf) { + this.deltaTick = Math.max(buf.readLong(), 0); + this.deltaLastSecond = Math.max(buf.readLong(), 0); } @Optional.Method(modid = "OpenComputers") diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 03af1a103..1285b6ad2 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -62,7 +62,7 @@ public class PileNeutronHandler { TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; BlockPos pos = new BlockPos(originTE); - for(float i = 1; i <= range; i += 1F) { + for(float i = 1; i <= range; i += 0.5F) { BlockPos node = new BlockPos( (int)Math.floor(pos.getX() + 0.5 + vector.xCoord * i), @@ -73,6 +73,8 @@ public class PileNeutronHandler { if(node.equals(pos)) continue; // don't interact with itself! + pos.mutate(node.getX(), node.getY(), node.getZ()); + TileEntity tile; if (NeutronNodeWorld.nodeCache.containsKey(node)) @@ -108,7 +110,7 @@ public class PileNeutronHandler { if(te instanceof IPileNeutronReceiver) { IPileNeutronReceiver rec = (IPileNeutronReceiver) te; - rec.receiveNeutrons((int) fluxQuantity); + rec.receiveNeutrons((int) Math.floor(fluxQuantity)); if(block != ModBlocks.block_graphite_detector || (meta & 8) == 0) return; diff --git a/src/main/java/com/hbm/packet/NBTPacket.java b/src/main/java/com/hbm/packet/NBTPacket.java deleted file mode 100644 index 3bd5afbcb..000000000 --- a/src/main/java/com/hbm/packet/NBTPacket.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.hbm.packet; - -import java.io.IOException; - -import com.hbm.tileentity.INBTPacketReceiver; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import net.minecraft.client.Minecraft; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; - - -@Deprecated // rest in peace sweet little prince -public class NBTPacket implements IMessage { - - PacketBuffer buffer; - int x; - int y; - int z; - - public NBTPacket() { } - - public NBTPacket(NBTTagCompound nbt, int x, int y, int z) { - - this.buffer = new PacketBuffer(Unpooled.buffer()); - this.x = x; - this.y = y; - this.z = z; - - try { - buffer.writeNBTTagCompoundToBuffer(nbt); - - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void fromBytes(ByteBuf buf) { - - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buffer.writeBytes(buf); - } - - @Override - public void toBytes(ByteBuf buf) { - - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buf.writeBytes(buffer); - } - - public static class Handler implements IMessageHandler { - - @Override - public IMessage onMessage(NBTPacket m, MessageContext ctx) { - - if(Minecraft.getMinecraft().theWorld == null) - return null; - - TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - - try { - - NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); - - if(nbt != null) { - - if(te instanceof INBTPacketReceiver) - ((INBTPacketReceiver) te).networkUnpack(nbt); - } - - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } - } - -} diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index e2dea4a51..73126336b 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -80,7 +80,8 @@ public class PacketDispatcher { //Tile sync wrapper.registerMessage(AuxGaugePacket.Handler.class, AuxGaugePacket.class, i++, Side.CLIENT); //The horrid one - wrapper.registerMessage(NBTPacket.Handler.class, NBTPacket.class, i++, Side.CLIENT); //The convenient but laggy one + // fucking DIE + //wrapper.registerMessage(NBTPacket.Handler.class, NBTPacket.class, i++, Side.CLIENT); //The convenient but laggy one wrapper.registerMessage(BufPacket.Handler.class, BufPacket.class, i++, Side.CLIENT); //The not-so-convenient but not laggy one } diff --git a/src/main/java/com/hbm/tileentity/INBTPacketReceiver.java b/src/main/java/com/hbm/tileentity/INBTPacketReceiver.java deleted file mode 100644 index fa230a3ba..000000000 --- a/src/main/java/com/hbm/tileentity/INBTPacketReceiver.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hbm.tileentity; - -import com.hbm.packet.NBTPacket; -import com.hbm.packet.PacketDispatcher; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; - -public interface INBTPacketReceiver { - - public void networkUnpack(NBTTagCompound nbt); - - public static void networkPack(TileEntity that, NBTTagCompound data, int range) { - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(data, that.xCoord, that.yCoord, that.zCoord), new TargetPoint(that.getWorldObj().provider.dimensionId, that.xCoord, that.yCoord, that.zCoord, range)); - } -} diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 3440ea517..a8e1ee651 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -2,7 +2,6 @@ package com.hbm.tileentity; import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.BufPacket; -import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.util.fauxpointtwelve.DirPos; @@ -17,7 +16,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidTank; -public abstract class TileEntityMachineBase extends TileEntityLoadedBase implements ISidedInventory, INBTPacketReceiver, IBufPacketReceiver { +public abstract class TileEntityMachineBase extends TileEntityLoadedBase implements ISidedInventory, IBufPacketReceiver { public ItemStack slots[]; @@ -154,11 +153,6 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, val, id), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } @Deprecated public void processGauge(int val, int id) { } - - @Deprecated - public void networkUnpack(NBTTagCompound nbt) { - this.muffled = nbt.getBoolean("muffled"); - } /** Sends a sync packet that uses ByteBuf for efficient information-cramming */ public void networkPackNT(int range) { diff --git a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java index 1d1871c2e..279b12d4b 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java @@ -1,15 +1,9 @@ package com.hbm.tileentity; -import com.hbm.packet.BufPacket; -import com.hbm.packet.NBTPacket; -import com.hbm.packet.PacketDispatcher; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; -import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidTank; -public abstract class TileEntityTickingBase extends TileEntityLoadedBase implements INBTPacketReceiver, IBufPacketReceiver { +public abstract class TileEntityTickingBase extends TileEntityLoadedBase implements IBufPacketReceiver { public TileEntityTickingBase() { } @@ -26,19 +20,11 @@ public abstract class TileEntityTickingBase extends TileEntityLoadedBase impleme @Override public abstract void updateEntity(); - @Deprecated public void networkPack(NBTTagCompound nbt, int range) { - - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - - @Deprecated public void networkUnpack(NBTTagCompound nbt) { } - @Deprecated public void handleButtonPacket(int value, int meta) { } public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + if(!worldObj.isRemote) sendStandard(range); } @Override public void serialize(ByteBuf buf) { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java index 6467ac91e..aee39ce6d 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java @@ -1,15 +1,15 @@ package com.hbm.tileentity.bomb; import com.hbm.blocks.bomb.BlockChargeBase; -import com.hbm.packet.NBTPacket; +import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.nbt.NBTTagCompound; +import cpw.mods.fml.common.network.NetworkRegistry; +import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; -public class TileEntityCharge extends TileEntity implements INBTPacketReceiver { +public class TileEntityCharge extends TileEntity implements IBufPacketReceiver { public boolean started; public int timer; @@ -29,18 +29,21 @@ public class TileEntityCharge extends TileEntity implements INBTPacketReceiver { ((BlockChargeBase)this.getBlockType()).explode(worldObj, xCoord, yCoord, zCoord); } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("timer", timer); - data.setBoolean("started", started); - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(data, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 100)); + + sendStandard(100); } } @Override - public void networkUnpack(NBTTagCompound data) { - timer = data.getInteger("timer"); - started = data.getBoolean("started"); + public void serialize(ByteBuf buf) { + buf.writeLong(this.timer); + buf.writeBoolean(this.started); + } + + @Override + public void deserialize(ByteBuf buf) { + this.timer = buf.readInt(); + this.started = buf.readBoolean(); } public String getMinutes() { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index 25ad4ef2a..dc0775e96 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -188,9 +188,9 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I if(worldObj.getTotalWorldTime() % 20 == 0) this.updateConnections(); - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + + sendStandard(50); + MissileStruct multipart = getStruct(slots[0]); if(multipart != null) diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index 67db230ec..b8ab5fab8 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -197,9 +197,9 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide this.decrStackSize(4, 1); solid += 250; } - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + + sendStandard(50); + MissileStruct multipart = getStruct(slots[0]); if(multipart != null) diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java index 758f1727d..30fc9e132 100644 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java +++ b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java @@ -13,11 +13,12 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.special.ItemKitCustom; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IRepairable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -27,7 +28,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; -public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketReceiver, IRepairable { +public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketReceiver, IRepairable { public boolean isBroken = false; public int comTimer = -1; @@ -63,10 +64,8 @@ public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketR if(comTimer >= 0) { comTimer--; } - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isBroken", isBroken); - INBTPacketReceiver.networkPack(this, data, 250); + + sendStandard(250); } } @@ -81,8 +80,13 @@ public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketR } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.isBroken = nbt.getBoolean("isBroken"); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.isBroken); + } + + @Override + public void deserialize(ByteBuf buf) { + this.isBroken = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java index 6df1f8bf9..966c25326 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java @@ -4,18 +4,17 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import com.hbm.tileentity.INBTPacketReceiver; -import com.hbm.tileentity.TileEntityLoadedBase; - import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IEnergyReceiverMK2; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyReceiverMK2, INBTPacketReceiver { +public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyReceiverMK2, IBufPacketReceiver { private List players = new ArrayList(); private long charge = 0; @@ -62,10 +61,7 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 0.2F, 0.5F); } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("c", charge); - data.setBoolean("p", particles); - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(50); } lastUsingTicks = usingTicks; @@ -94,9 +90,15 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.charge = nbt.getLong("c"); - this.particles = nbt.getBoolean("p"); + public void serialize(ByteBuf buf) { + buf.writeLong(this.charge); + buf.writeBoolean(this.particles); + } + + @Override + public void deserialize(ByteBuf buf) { + this.charge = buf.readLong(); + this.particles = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java index 08964ccc8..dd6627066 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java @@ -6,15 +6,15 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.fluid.IFluidUser; -import net.minecraft.nbt.NBTTagCompound; +import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public abstract class TileEntityChimneyBase extends TileEntityLoadedBase implements IFluidUser, INBTPacketReceiver { +public abstract class TileEntityChimneyBase extends TileEntityLoadedBase implements IFluidUser, IBufPacketReceiver { public long ashTick = 0; public long sootTick = 0; @@ -49,9 +49,7 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme this.sootTick = 0; } - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("onTicks", onTicks); - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); if(onTicks > 0) onTicks--; @@ -72,9 +70,15 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme } public void spawnParticles() { } - - public void networkUnpack(NBTTagCompound nbt) { - this.onTicks = nbt.getInteger("onTicks"); + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(this.onTicks); + } + + @Override + public void deserialize(ByteBuf buf) { + this.onTicks = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index 0ab6d68b2..e4daad9e7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -13,11 +13,9 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.main.MainRegistry; -import com.hbm.packet.NBTPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -27,9 +25,9 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -40,7 +38,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyProviderMK2, INBTPacketReceiver, IFluidStandardTransceiver, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent, IConfigurableMachine { +public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyProviderMK2, IFluidStandardTransceiver, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent, IConfigurableMachine, IBufPacketReceiver { public long power; private int turnTimer; @@ -139,12 +137,8 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr turnTimer--; if(operational) turnTimer = 25; - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("type", tanks[0].getTankType().getID()); - data.setInteger("operational", turnTimer); - this.networkPack(data, 150); + + sendStandard(150); } else { @@ -213,16 +207,19 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr new DirPos(xCoord - rot.offsetX * 3, yCoord, zCoord - rot.offsetZ * 3, rot.getOpposite()) }; } - - public void networkPack(NBTTagCompound nbt, int range) { - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + + @Override + public void serialize(ByteBuf buf) { + buf.writeLong(this.power); + buf.writeInt(this.turnTimer); + this.tanks[0].serialize(buf); } @Override - public void networkUnpack(NBTTagCompound data) { - this.power = data.getLong("power"); - this.turnTimer = data.getInteger("operational"); - this.tanks[0].setTankType(Fluids.fromID(data.getInteger("type"))); + public void deserialize(ByteBuf buf) { + this.power = buf.readLong(); + this.turnTimer = buf.readInt(); + this.tanks[0].deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 8d2730f8b..48a322a3b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -7,17 +7,16 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.saveddata.TomSaveData; -import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; -import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.*; import com.hbm.util.CompatEnergyControl; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.EnumSkyBlock; -public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidStandardTransceiver, INBTPacketReceiver, IInfoProviderEC, IConfigurableMachine { +public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidStandardTransceiver, IInfoProviderEC, IConfigurableMachine, IBufPacketReceiver { public int age = 0; public FluidTank[] tanks; @@ -52,8 +51,6 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS writer.name("I:outputTankSize").value(outputTankSize); } - - @Override public void updateEntity() { @@ -95,9 +92,7 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); - data.setByte("timer", (byte) this.waterTimer); - packExtra(data); - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); } } @@ -106,10 +101,17 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS public void postConvert(int convert) { } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.waterTimer = nbt.getByte("timer"); + public void serialize(ByteBuf buf) { + this.tanks[0].serialize(buf); + this.tanks[1].serialize(buf); + buf.writeByte(this.waterTimer); + } + + @Override + public void deserialize(ByteBuf buf) { + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.waterTimer = buf.readByte(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java index 9aabea820..2240477cd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java @@ -13,6 +13,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -98,11 +99,21 @@ public class TileEntityCondenserPowered extends TileEntityCondenser implements I } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.power = nbt.getLong("power"); - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.waterTimer = nbt.getByte("timer"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + this.tanks[0].serialize(buf); + this.tanks[1].serialize(buf); + buf.writeByte(this.waterTimer); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.waterTimer = buf.readByte(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index a1f55015b..26a075bda 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -56,14 +56,6 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - tanks[0].readFromNBT(data, "water"); - tanks[1].readFromNBT(data, "heavyWater"); - } - @Override public void serialize(ByteBuf buf) { super.serialize(buf); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java index c1d3bb893..9eacd6ed7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java @@ -10,7 +10,6 @@ import com.hbm.inventory.gui.GUIDiFurnace; import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachinePolluting; import com.hbm.util.CompatEnergyControl; @@ -18,6 +17,7 @@ import api.hbm.fluid.IFluidStandardSender; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -230,11 +230,7 @@ public class TileEntityDiFurnace extends TileEntityMachinePolluting implements I MachineDiFurnace.updateBlockState(this.progress > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); } - NBTTagCompound data = new NBTTagCompound(); - data.setShort("time", (short) this.progress); - data.setShort("fuel", (short) this.fuel); - data.setByteArray("modes", new byte[] { (byte) sideFuel, (byte) sideUpper, (byte) sideLower }); - INBTPacketReceiver.networkPack(this, data, 15); + networkPackNT(15); if(markDirty) { this.markDirty(); @@ -243,10 +239,21 @@ public class TileEntityDiFurnace extends TileEntityMachinePolluting implements I } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.progress = nbt.getShort("time"); - this.fuel = nbt.getShort("fuel"); - byte[] modes = nbt.getByteArray("modes"); + public void serialize(ByteBuf buf) { + buf.writeShort(this.progress); + buf.writeShort(this.fuel); + buf.writeBytes(new byte[] { + this.sideFuel, + this.sideUpper, + this.sideLower}); + } + + @Override + public void deserialize(ByteBuf buf) { + this.progress = buf.readShort(); + this.fuel = buf.readShort(); + byte[] modes = new byte[3]; + buf.readBytes(modes); this.sideFuel = modes[0]; this.sideUpper = modes[1]; this.sideLower = modes[2]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index d091830b4..17798d41c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -247,13 +247,6 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.stat_z = buf.readInt(); } - @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - - } - @Override public void handleButtonPacket(int value, int meta) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java index d77c5339a..f9c89de10 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine; import com.hbm.tileentity.TileEntityTickingBase; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -25,7 +26,7 @@ public class TileEntityHadronDiode extends TileEntityTickingBase { if(age >= 20) { age = 0; - sendSides(); + this.networkPackNT(250); } } else { @@ -35,27 +36,18 @@ public class TileEntityHadronDiode extends TileEntityTickingBase { } } } - - public void sendSides() { - - NBTTagCompound data = new NBTTagCompound(); - + + @Override public void serialize(ByteBuf buf) { for(int i = 0; i < 6; i++) { - - if(sides[i] != null) - data.setInteger("" + i, sides[i].ordinal()); + buf.writeByte(sides[i].ordinal()); } - - this.networkPack(data, 250); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - + @Override public void deserialize(ByteBuf buf) { for(int i = 0; i < 6; i++) { - sides[i] = DiodeConfig.values()[nbt.getInteger("" + i)]; + sides[i] = DiodeConfig.values()[buf.readByte()]; } - + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } @@ -75,7 +67,7 @@ public class TileEntityHadronDiode extends TileEntityTickingBase { public void setConfig(int side, int config) { sides[side] = DiodeConfig.values()[config]; this.markDirty(); - sendSides(); + this.networkPackNT(250); } public static enum DiodeConfig { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java index f044f3fad..3fce746dc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java @@ -29,8 +29,8 @@ public class TileEntityHadronPower extends TileEntityLoadedBase implements IEner for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 15)); + + sendStandard(15); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index c1c830cf5..be1fb7fd6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -18,8 +18,8 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.saveddata.TomSaveData; import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -27,13 +27,16 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.EnumSkyBlock; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { +public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { public int heat; public FluidTank[] tanks; @@ -54,14 +57,14 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPa this.tanks[0] = new FluidTank(Fluids.WATER, 16_000); this.tanks[1] = new FluidTank(Fluids.STEAM, 16_000 * 100); } + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); @Override public void updateEntity() { if(!worldObj.isRemote) { - NBTTagCompound data = new NBTTagCompound(); - if(!this.hasExploded) { this.setupTanks(); this.updateConnections(); @@ -72,23 +75,23 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPa if(light > 7 && TomSaveData.forWorld(worldObj).fire > 1e-5) { this.heat += ((maxHeat - heat) * 0.000005D); //constantly heat up 0.0005% of the remaining heat buffer for rampant but diminishing heating } - - data.setInteger("heat", lastHeat); - tanks[0].writeToNBT(data, "0"); + buf.writeInt(lastHeat); + + tanks[0].serialize(buf); this.isOn = false; this.tryConvert(); - tanks[1].writeToNBT(data, "1"); + tanks[1].serialize(buf); if(this.tanks[1].getFill() > 0) { this.sendFluid(); } } - data.setBoolean("exploded", this.hasExploded); - data.setBoolean("isOn", this.isOn); - data.setBoolean("muffled", this.muffled); - INBTPacketReceiver.networkPack(this, data, 25); + buf.writeBoolean(this.hasExploded); + buf.writeBoolean(this.muffled); + buf.writeBoolean(this.isOn); + sendStandard(25); } else { if(this.isOn) audioTime = 20; @@ -143,13 +146,19 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPa } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.hasExploded = nbt.getBoolean("exploded"); - this.muffled = nbt.getBoolean("muffled"); - this.heat = nbt.getInteger("heat"); - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + this.heat = buf.readInt(); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.hasExploded = buf.readBoolean(); + this.muffled = buf.readBoolean(); + this.isOn = buf.readBoolean(); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java index 04d66dda3..65c2765df 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java @@ -13,8 +13,8 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.saveddata.TomSaveData; import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -22,12 +22,15 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.EnumSkyBlock; -public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { +public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { public int heat; public FluidTank[] tanks; @@ -46,13 +49,14 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme this.tanks[0] = new FluidTank(Fluids.WATER, 64_000); this.tanks[1] = new FluidTank(Fluids.STEAM, 64_000 * 100); } - + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + @Override public void updateEntity() { if(!worldObj.isRemote) { - - NBTTagCompound data = new NBTTagCompound(); + this.setupTanks(); this.updateConnections(); this.tryPullHeat(); @@ -62,21 +66,22 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme if(light > 7 && TomSaveData.forWorld(worldObj).fire > 1e-5) { this.heat += ((maxHeat - heat) * 0.000005D); //constantly heat up 0.0005% of the remaining heat buffer for rampant but diminishing heating } - - data.setInteger("heat", lastHeat); - tanks[0].writeToNBT(data, "0"); + buf.writeInt(lastHeat); + + tanks[0].serialize(buf); this.isOn = false; this.tryConvert(); - tanks[1].writeToNBT(data, "1"); + tanks[1].serialize(buf); if(this.tanks[1].getFill() > 0) { this.sendFluid(); } - data.setBoolean("isOn", this.isOn); - data.setBoolean("muffled", this.muffled); - INBTPacketReceiver.networkPack(this, data, 25); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.muffled); + sendStandard(25); + } else { if(this.isOn) audioTime = 20; @@ -131,12 +136,18 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.heat = nbt.getInteger("heat"); - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.isOn = nbt.getBoolean("isOn"); - this.muffled = nbt.getBoolean("muffled"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + this.heat = buf.readInt(); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.isOn = buf.readBoolean(); + this.muffled = buf.readBoolean(); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java index 7c8a19797..72e216162 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -3,7 +3,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; @@ -12,12 +12,13 @@ import api.hbm.tile.IHeatSource; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyReceiverMK2, INBTPacketReceiver, IInfoProviderEC { +public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyReceiverMK2, IBufPacketReceiver, IInfoProviderEC { public long power; public int heatEnergy; @@ -47,12 +48,7 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH this.isOn = true; } - NBTTagCompound data = new NBTTagCompound(); - data.setByte("s", (byte) this.setting); - data.setInteger("h", this.heatEnergy); - data.setBoolean("o", isOn); - data.setBoolean("muffled", muffled); - INBTPacketReceiver.networkPack(this, data, 25); + sendStandard(25); } else { if(isOn) { @@ -103,11 +99,19 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.setting = nbt.getByte("s"); - this.heatEnergy = nbt.getInteger("h"); - this.isOn = nbt.getBoolean("o"); - this.muffled = nbt.getBoolean("muffled"); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.muffled); + buf.writeByte(this.setting); + buf.writeInt(this.heatEnergy); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + this.muffled = buf.readBoolean(); + this.setting = buf.readByte(); + this.heatEnergy = buf.readInt(); + this.isOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java index 1e9d5885d..3dee8b92a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java @@ -10,7 +10,6 @@ import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.inventory.gui.GUIHeaterHeatex; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -18,6 +17,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -27,7 +27,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHeatSource, INBTPacketReceiver, IFluidStandardTransceiver, IGUIProvider, IControlReceiver { +public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHeatSource, IFluidStandardTransceiver, IGUIProvider, IControlReceiver { public FluidTank[] tanks; public int amountToCool = 1; @@ -56,28 +56,30 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe this.heatEnergy *= 0.999; - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "0"); - this.tryConvert(); - tanks[1].writeToNBT(data, "1"); - data.setInteger("heat", heatEnergy); - data.setInteger("toCool", amountToCool); - data.setInteger("delay", tickDelay); - INBTPacketReceiver.networkPack(this, data, 25); + networkPackNT(25); for(DirPos pos : getConPos()) { if(this.tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - tanks[0].readFromNBT(nbt, "0"); - tanks[1].readFromNBT(nbt, "1"); - this.heatEnergy = nbt.getInteger("heat"); - this.amountToCool = nbt.getInteger("toCool"); - this.tickDelay = nbt.getInteger("delay"); + public void serialize(ByteBuf buf) { + tanks[0].serialize(buf); + tanks[1].serialize(buf); + buf.writeInt(this.heatEnergy); + buf.writeInt(this.amountToCool); + buf.writeInt(this.tickDelay); + } + + @Override + public void deserialize(ByteBuf buf) { + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + this.heatEnergy = buf.readInt(); + this.amountToCool = buf.readInt(); + this.tickDelay = buf.readInt(); } protected void setupTanks() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java index 948022a43..50be9bd1b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java @@ -133,19 +133,6 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im steam.deserialize(buf); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.progress = nbt.getIntArray("progress"); - this.maxProgress = nbt.getIntArray("maxProgress"); - this.isProgressing = nbt.getBoolean("isProgressing"); - - water.readFromNBT(nbt, "w"); - steam.readFromNBT(nbt, "s"); - } - private int getWaterRequired() { return 1000 / this.speed; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index 3ec39159b..a9f0f903d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -11,13 +11,14 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.ModDamageSource; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockLeaves; import net.minecraft.block.material.Material; @@ -29,7 +30,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; -public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardReceiver { +public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardReceiver { public static final HashSet acceptedFuels = new HashSet(); @@ -174,12 +175,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IN } } - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isOn", isOn); - data.setFloat("yaw", this.rotationYaw); - data.setFloat("pitch", this.rotationPitch); - tank.writeToNBT(data, "t"); - INBTPacketReceiver.networkPack(this, data, 100); + sendStandard(100); } else { this.lastSpin = this.spin; @@ -280,12 +276,20 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IN } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.isOn = nbt.getBoolean("isOn"); - this.syncYaw = nbt.getFloat("yaw"); - this.syncPitch = nbt.getFloat("pitch"); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.isOn); + buf.writeFloat(this.syncYaw); + buf.writeFloat(this.syncPitch); + this.tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + this.isOn = buf.readBoolean(); + this.syncYaw = buf.readFloat(); + this.syncPitch = buf.readFloat(); this.turnProgress = 3; //use 3-ply for extra smoothness - this.tank.readFromNBT(nbt, "t"); + this.tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java index 9a6dc8f21..5b2f427d7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java @@ -46,9 +46,9 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu if(worldObj.getTotalWorldTime() % 20 == 0) { for(DirPos pos : getConPos()) this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + + sendStandard(50); + if(tank.getFill() > 0) { if(tank.getTankType().hasTrait(FT_Amat.class)) { worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 10F, true, true); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java index eb22b3289..f5799e1ed 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java @@ -10,20 +10,23 @@ import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver { +public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver { public FluidTank input; public FluidTank output; @@ -41,7 +44,9 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements private long fissureScanTime; private AudioWrapper audio; - + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + @Override public void updateEntity() { @@ -66,21 +71,20 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements } } } - - NBTTagCompound data = new NBTTagCompound(); - input.writeToNBT(data, "i"); + + input.serialize(buf); heatFluid(); - output.writeToNBT(data, "o"); + output.serialize(buf); if(output.getFill() > 0) { for(DirPos pos : getConPos()) { this.sendFluid(output, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - data.setInteger("heat", this.getTotalHeat()); - INBTPacketReceiver.networkPack(this, data, 150); + buf.writeInt(this.getTotalHeat()); + sendStandard(150); } else { @@ -182,11 +186,17 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements } @Override - public void networkUnpack(NBTTagCompound nbt) { - input.readFromNBT(nbt, "i"); - output.readFromNBT(nbt, "o"); - - this.bufferedHeat = nbt.getInteger("heat"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + input.deserialize(buf); + output.deserialize(buf); + + this.bufferedHeat = buf.readInt(); } private void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index 7996973c8..4c844422d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -222,15 +222,18 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement return new int[] { 3, 4, 5, 6 }; } + // o7 + /* @Override public void networkUnpack(NBTTagCompound nbt) { super.networkUnpack(nbt); - + this.power = nbt.getLong("power"); this.spin = nbt.getInteger("spin"); this.burn = nbt.getIntArray("burn"); this.hasRTG = nbt.getBoolean("hasRTG"); } + */ public int getPowerFromFuel(boolean con) { FluidType type = tanks[1].getTankType(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java index e9751c820..4ddbe6acd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java @@ -14,7 +14,6 @@ import com.hbm.inventory.recipes.MixerRecipes.MixerRecipe; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.BobMathUtil; @@ -35,7 +34,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineMixer extends TileEntityMachineBase implements INBTPacketReceiver, IControlReceiver, IGUIProvider, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider { +public class TileEntityMachineMixer extends TileEntityMachineBase implements IControlReceiver, IGUIProvider, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider { public long power; public static final long maxPower = 10_000; @@ -162,20 +161,6 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements INB for(int i = 0; i < tanks.length; i++) tanks[i].deserialize(buf); } - - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.processTime = nbt.getInteger("processTime"); - this.progress = nbt.getInteger("progress"); - this.recipeIndex = nbt.getInteger("recipe"); - this.wasOn = nbt.getBoolean("wasOn"); - for(int i = 0; i < 3; i++) { - tanks[i].readFromNBT(nbt, i + ""); - } - } public boolean canProcess() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index 655ce48be..6bea61bca 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -175,24 +175,6 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU this.turnProgress = 2; } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.speed = nbt.getInteger("speed"); - this.burnTime = nbt.getInteger("burnTime"); - this.syncPress = nbt.getInteger("press"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); - } else { - this.syncStack = null; - } - - this.turnProgress = 2; - } - public boolean canProcess() { if(burnTime < 200) return false; if(slots[1] == null || slots[2] == null) return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java index 653064658..5c4b60c55 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java @@ -9,20 +9,19 @@ import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; -import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.*; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; -public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase implements IFluidStandardTransceiver, INBTPacketReceiver, IConfigurableMachine { +public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase implements IFluidStandardTransceiver, IBufPacketReceiver, IConfigurableMachine { public static final HashSet validBlocks = new HashSet(); @@ -50,7 +49,7 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp public static int groundDepth = 4; public static int steamSpeed = 1_000; public static int electricSpeed = 10_000; - + @Override public String getConfigName() { return "waterpump"; @@ -91,9 +90,8 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp this.isOn = true; this.operate(); } - - NBTTagCompound data = this.getSync(); - INBTPacketReceiver.networkPack(this, data, 150); + + sendStandard(150); } else { @@ -133,20 +131,19 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp return validBlocks >= invalidBlocks; // valid block count has to be at least 50% } - - protected NBTTagCompound getSync() { - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isOn", isOn); - data.setBoolean("onGround", onGround); - water.writeToNBT(data, "w"); - return data; + + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.onGround); + water.serialize(buf); } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.isOn = nbt.getBoolean("isOn"); - this.onGround = nbt.getBoolean("onGround"); - water.readFromNBT(nbt, "w"); + public void deserialize(ByteBuf buf) { + this.isOn = buf.readBoolean(); + this.onGround = buf.readBoolean(); + water.deserialize(buf); } protected abstract boolean canOperate(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java index 288193818..39835837b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java @@ -5,6 +5,7 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; public class TileEntityMachinePumpElectric extends TileEntityMachinePumpBase implements IEnergyReceiverMK2 { @@ -28,17 +29,17 @@ public class TileEntityMachinePumpElectric extends TileEntityMachinePumpBase imp super.updateEntity(); } - - protected NBTTagCompound getSync() { - NBTTagCompound data = super.getSync(); - data.setLong("power", power); - return data; + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.power = nbt.getLong("power"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java index d935cfbf4..fff843d0f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java @@ -4,6 +4,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.util.fauxpointtwelve.DirPos; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; public class TileEntityMachinePumpSteam extends TileEntityMachinePumpBase { @@ -47,19 +48,19 @@ public class TileEntityMachinePumpSteam extends TileEntityMachinePumpBase { public FluidTank[] getReceivingTanks() { return new FluidTank[] {steam}; } - - protected NBTTagCompound getSync() { - NBTTagCompound data = super.getSync(); - steam.writeToNBT(data, "s"); - lps.writeToNBT(data, "l"); - return data; + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + steam.serialize(buf); + lps.serialize(buf); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - steam.readFromNBT(nbt, "s"); - lps.readFromNBT(nbt, "l"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + steam.deserialize(buf); + lps.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index 0eb956fe3..ef8625264 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -215,7 +215,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I screen.refZ = zCoord; screen.range = this.getRange(); screen.linked = true; - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), 25)); + sendStandard(25); } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java index ba08f0d82..c08bfc9f3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java @@ -3,19 +3,16 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; import java.util.List; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; import api.hbm.entity.RadarEntry; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -public class TileEntityMachineRadarScreen extends TileEntity implements IBufPacketReceiver { +public class TileEntityMachineRadarScreen extends TileEntityLoadedBase implements IBufPacketReceiver { public List entries = new ArrayList(); public int refX; @@ -28,16 +25,12 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack public void updateEntity() { if(!worldObj.isRemote) { - this.networkPackNT(100); + this.sendStandard(100); entries.clear(); this.linked = false; } } - public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - @Override public void serialize(ByteBuf buf) { buf.writeBoolean(linked); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index 71caf6423..619574436 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -11,14 +11,12 @@ import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemScraps; -import com.hbm.packet.NBTPacket; -import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.util.fauxpointtwelve.DirPos; -import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -32,7 +30,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; //god thank you bob for this base class -public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase implements IGUIProvider, ICrucibleAcceptor, ISidedInventory, IFluidStandardTransceiver, INBTPacketReceiver, IInventory { +public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase implements IGUIProvider, ICrucibleAcceptor, ISidedInventory, IFluidStandardTransceiver, IBufPacketReceiver, IInventory { public FluidTank water; public FluidTank steam; @@ -110,12 +108,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase } } - NBTTagCompound data = new NBTTagCompound(); - - water.writeToNBT(data, "w"); - steam.writeToNBT(data, "s"); - - this.networkPack(data, 150); + sendStandard(150); } @@ -254,16 +247,14 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase return new GUIMachineStrandCaster(player.inventory, this); } - public void networkPack(NBTTagCompound nbt, int range) { - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + @Override public void serialize(ByteBuf buf) { + water.serialize(buf); + steam.serialize(buf); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - water.readFromNBT(nbt, "w"); - steam.readFromNBT(nbt, "s"); - + @Override public void deserialize(ByteBuf buf) { + water.deserialize(buf); + steam.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java index 0784cd130..2fc9636d8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java @@ -3,12 +3,14 @@ package com.hbm.tileentity.machine; import java.util.Iterator; import java.util.List; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energymk2.IEnergyReceiverMK2; +import com.hbm.util.BufferUtil; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.ReflectionHelper; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityTracker; @@ -29,7 +31,7 @@ import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements IEnergyReceiverMK2, INBTPacketReceiver { +public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements IEnergyReceiverMK2, IBufPacketReceiver { public long power = 0; public int targetX = -1; @@ -55,10 +57,7 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setIntArray("target", new int[] {targetX, targetY, targetZ, targetDim}); - INBTPacketReceiver.networkPack(this, data, 15); + sendStandard(15); } else { @@ -72,9 +71,15 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.power = nbt.getLong("power"); - int[] target = nbt.getIntArray("target"); + public void serialize(ByteBuf buf) { + buf.writeLong(power); + BufferUtil.writeIntArray(buf, new int[] {targetX, targetY, targetZ, targetDim}); + } + + @Override + public void deserialize(ByteBuf buf) { + this.power = buf.readLong(); + int[] target = BufferUtil.readIntArray(buf); this.targetX = target[0]; this.targetY = target[1]; this.targetZ = target[2]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java index 7c1f7ea37..817a57adb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java @@ -1,20 +1,22 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.RTTYSystem; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; +import com.hbm.util.BufferUtil; import com.hbm.util.NoteBuilder; import com.hbm.util.NoteBuilder.Instrument; import com.hbm.util.NoteBuilder.Note; import com.hbm.util.NoteBuilder.Octave; import com.hbm.util.Tuple.Triplet; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioRec extends TileEntity implements INBTPacketReceiver, IControlReceiver { +public class TileEntityRadioRec extends TileEntity implements IBufPacketReceiver, IControlReceiver { public String channel = ""; public boolean isOn = false; @@ -49,17 +51,20 @@ public class TileEntityRadioRec extends TileEntity implements INBTPacketReceiver } } - NBTTagCompound data = new NBTTagCompound(); - data.setString("channel", channel); - data.setBoolean("isOn", isOn); - INBTPacketReceiver.networkPack(this, data, 15); + sendStandard(15); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - channel = nbt.getString("channel"); - isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + BufferUtil.writeString(buf, this.channel); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + this.channel = BufferUtil.readString(buf); + this.isOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index f0b6a5500..84852dfc3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -10,15 +10,17 @@ import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; +import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; import api.hbm.tile.IHeatSource; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Blocks; @@ -27,7 +29,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; @@ -144,24 +146,8 @@ public class TileEntitySawmill extends TileEntityMachineBase { this.overspeed = 0; this.warnCooldown = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setInteger("progress", progress); - data.setBoolean("hasBlade", hasBlade); - NBTTagList list = new NBTTagList(); - for(int i = 0; i < slots.length; i++) { - if(slots[i] != null) { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte) i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - data.setTag("items", list); - - INBTPacketReceiver.networkPack(this, data, 150); + networkPackNT(150); this.heat = 0; @@ -180,20 +166,28 @@ public class TileEntitySawmill extends TileEntityMachineBase { } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.heat = nbt.getInteger("heat"); - this.progress = nbt.getInteger("progress"); - this.hasBlade = nbt.getBoolean("hasBlade"); - - NBTTagList list = nbt.getTagList("items", 10); + public void serialize(ByteBuf buf) { + buf.writeInt(heat); + buf.writeInt(progress); + buf.writeBoolean(hasBlade); - slots = new ItemStack[3]; - for(int i = 0; i < list.tagCount(); i++) { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } + ByteBuf itemBuf = new PacketBuffer(Unpooled.buffer()); + + for (ItemStack slot : slots) { + BufferUtil.writeItemStack(buf, slot); + } + + buf.writeBytes(itemBuf); + } + + @Override + public void deserialize(ByteBuf buf) { + this.heat = buf.readInt(); + this.progress = buf.readInt(); + this.hasBlade = buf.readBoolean(); + + for(int i = 0; i < slots.length; i++) { + slots[i] = BufferUtil.readItemStack(buf); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java index c2803d6c6..7d70c7295 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java @@ -5,13 +5,10 @@ import java.util.HashSet; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.fluid.IFluidStandardTransceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -56,7 +53,7 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui heat = 0; - networkPackNT(15); + sendStandard(15); } else { //a delayed queue of mirror positions because we can't expect the boiler to always tick first @@ -121,10 +118,6 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui public FluidTank[] getAllTanks() { return new FluidTank[] { water, steam }; } - - public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } @Override public void serialize(ByteBuf buf) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java index c64a83cec..f921d04ad 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java @@ -4,6 +4,7 @@ import com.hbm.tileentity.TileEntityTickingBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -28,7 +29,7 @@ public class TileEntitySolarMirror extends TileEntityTickingBase { if(!worldObj.isRemote) { if(worldObj.getTotalWorldTime() % 20 == 0) - sendUpdate(); + this.networkPackNT(200); if(tY < yCoord) { isOn = false; @@ -64,22 +65,18 @@ public class TileEntitySolarMirror extends TileEntityTickingBase { } } - public void sendUpdate() { - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("posX", tX); - data.setInteger("posY", tY); - data.setInteger("posZ", tZ); - data.setBoolean("isOn", isOn); - this.networkPack(data, 200); + @Override public void serialize(ByteBuf buf) { + buf.writeInt(this.tX); + buf.writeInt(this.tY); + buf.writeInt(this.tZ); + buf.writeBoolean(this.isOn); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - tX = nbt.getInteger("posX"); - tY = nbt.getInteger("posY"); - tZ = nbt.getInteger("posZ"); - isOn = nbt.getBoolean("isOn"); + @Override public void deserialize(ByteBuf buf) { + this.tX = buf.readInt(); + this.tY = buf.readInt(); + this.tZ = buf.readInt(); + this.isOn = buf.readBoolean(); } public void setTarget(int x, int y, int z) { @@ -87,7 +84,7 @@ public class TileEntitySolarMirror extends TileEntityTickingBase { tY = y; tZ = z; this.markDirty(); - this.sendUpdate(); + this.networkPackNT(200); } public void readFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java index a09c5747e..508786fec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java @@ -9,8 +9,8 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -18,13 +18,16 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEnergyProviderMK2, IFluidStandardTransceiver, INBTPacketReceiver, IConfigurableMachine { +public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEnergyProviderMK2, IFluidStandardTransceiver, IBufPacketReceiver, IConfigurableMachine { public long powerBuffer; @@ -66,7 +69,9 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner writer.name("I:ldsCap").value(ldsCap); writer.name("D:efficiency").value(efficiency); } - + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + @Override public void updateEntity() { @@ -76,9 +81,8 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner tanks[0].setTankType(Fluids.STEAM); tanks[1].setTankType(Fluids.SPENTSTEAM); - - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "s"); + + tanks[0].serialize(buf); FT_Coolable trait = tanks[0].getTankType().getTrait(FT_Coolable.class); double eff = trait.getEfficiency(CoolingType.TURBINE) * efficiency; @@ -105,9 +109,9 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.steamEngineOperate", getVolume(1.0F), 0.5F + (acceleration / 80F)); } - data.setLong("power", this.powerBuffer); - data.setFloat("rotor", this.rotor); - tanks[1].writeToNBT(data, "w"); + buf.writeLong(this.powerBuffer); + buf.writeFloat(this.rotor); + tanks[1].serialize(buf); for(DirPos pos : getConPos()) { if(this.powerBuffer > 0) this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); @@ -115,7 +119,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); } else { this.lastRotor = this.rotor; @@ -139,7 +143,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX, yCoord + 1, zCoord + rot.offsetZ * 2 - dir.offsetZ, rot) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -207,11 +211,17 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.powerBuffer = nbt.getLong("power"); - this.syncRotor = nbt.getFloat("rotor"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + this.powerBuffer = buf.readLong(); + this.syncRotor = buf.readFloat(); this.turnProgress = 3; //use 3-ply for extra smoothness - this.tanks[0].readFromNBT(nbt, "s"); - this.tanks[1].readFromNBT(nbt, "w"); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java index d59a5e933..8c86ca568 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java @@ -8,8 +8,8 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityCog; import com.hbm.lib.Library; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -17,12 +17,13 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityStirling extends TileEntityLoadedBase implements INBTPacketReceiver, IEnergyProviderMK2, IConfigurableMachine { +public class TileEntityStirling extends TileEntityLoadedBase implements IBufPacketReceiver, IEnergyProviderMK2, IConfigurableMachine { public long powerBuffer; public int heat; @@ -88,11 +89,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack this.warnCooldown = 0; } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", powerBuffer); - data.setInteger("heat", heat); - data.setBoolean("hasCog", hasCog); - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); if(hasCog) { for(DirPos pos : getConPos()) { @@ -143,10 +140,17 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.powerBuffer = nbt.getLong("power"); - this.heat = nbt.getInteger("heat"); - this.hasCog = nbt.getBoolean("hasCog"); + public void serialize(ByteBuf buf) { + buf.writeLong(this.powerBuffer); + buf.writeInt(this.heat); + buf.writeBoolean(this.hasCog); + } + + @Override + public void deserialize(ByteBuf buf) { + this.powerBuffer = buf.readLong(); + this.heat = buf.readInt(); + this.hasCog = buf.readBoolean(); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java index 37f9f4fb0..2579c61bd 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java @@ -5,7 +5,7 @@ import com.hbm.inventory.FluidStack; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CrackingRecipes; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; @@ -13,11 +13,12 @@ import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver { +public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver { public FluidTank[] tanks; @@ -52,22 +53,23 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl if(tanks[i].getFill() > 0) this.sendFluid(tanks[i], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - - NBTTagCompound data = new NBTTagCompound(); - for(int i = 0; i < 5; i++) - tanks[i].writeToNBT(data, "tank" + i); - - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(25); } this.worldObj.theProfiler.endSection(); } } @Override - public void networkUnpack(NBTTagCompound nbt) { + public void serialize(ByteBuf buf) { for(int i = 0; i < 5; i++) - tanks[i].readFromNBT(nbt, "tank" + i); + tanks[i].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + for(int i = 0; i < 5; i++) + tanks[i].deserialize(buf); } private void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java index a95a94b68..7196e9b31 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java @@ -93,14 +93,6 @@ public class TileEntityMachineCatalyticReformer extends TileEntityMachineBase im for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "" + i); - } - private void reform() { Triplet out = ReformingRecipes.getOutput(tanks[0].getTankType()); diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index 9052dd9fc..a96995673 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -69,7 +69,7 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme this.sendFluid(); - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + sendStandard(50); } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java index b4745b170..0463be416 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java @@ -40,9 +40,9 @@ public abstract class TileEntityPileBase extends TileEntity { Vec3 neutronVector = Vec3.createVectorHelper(1, 0, 0); - neutronVector.rotateAroundX((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); neutronVector.rotateAroundZ((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundX((float)(Math.PI * 2D * worldObj.rand.nextDouble())); new PileNeutronStream(node, neutronVector, flux); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index befccb90d..a1d770a95 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -6,14 +6,11 @@ import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.CompatHandler; import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.items.machine.ItemRBMKRod; -import com.hbm.packet.NBTPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; -import com.hbm.tileentity.INBTPacketReceiver; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -30,7 +27,7 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.List; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityCraneConsole extends TileEntity implements INBTPacketReceiver, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityCraneConsole extends TileEntity implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { public int centerX; public int centerY; @@ -165,26 +162,8 @@ public class TileEntityCraneConsole extends TileEntity implements INBTPacketRece this.loadedHeat = 0; this.loadedEnrichment = 0; } - - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setBoolean("crane", setUpCrane); - - if(setUpCrane) { //no need to send any of this if there's NO FUCKING CRANE THERE - nbt.setInteger("centerX", centerX); - nbt.setInteger("centerY", centerY); - nbt.setInteger("centerZ", centerZ); - nbt.setInteger("spanF", spanF); - nbt.setInteger("spanB", spanB); - nbt.setInteger("spanL", spanL); - nbt.setInteger("spanR", spanR); - nbt.setInteger("height", height); - nbt.setDouble("posFront", posFront); - nbt.setDouble("posLeft", posLeft); - nbt.setBoolean("loaded", this.hasItemLoaded()); - nbt.setDouble("loadedHeat", loadedHeat); - nbt.setDouble("loadedEnrichment", loadedEnrichment); - } - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); + + sendStandard(250); } } @@ -244,27 +223,49 @@ public class TileEntityCraneConsole extends TileEntity implements INBTPacketRece } @Override - public void networkUnpack(NBTTagCompound nbt) { - + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.setUpCrane); + + if(this.setUpCrane) { //no need to send any of this if there's NO FUCKING CRANE THERE + buf.writeInt(this.centerX); + buf.writeInt(this.centerY); + buf.writeInt(this.centerZ); + buf.writeInt(this.spanF); + buf.writeInt(this.spanB); + buf.writeInt(this.spanL); + buf.writeInt(this.spanR); + buf.writeInt(this.height); + buf.writeDouble(this.posFront); + buf.writeDouble(this.posLeft); + buf.writeBoolean(this.hasItemLoaded()); + buf.writeDouble(this.loadedHeat); + buf.writeDouble(this.loadedEnrichment); + } + } + + @Override + public void deserialize(ByteBuf buf) { lastPosFront = posFront; lastPosLeft = posLeft; lastProgress = progress; - - this.setUpCrane = nbt.getBoolean("crane"); - this.centerX = nbt.getInteger("centerX"); - this.centerY = nbt.getInteger("centerY"); - this.centerZ = nbt.getInteger("centerZ"); - this.spanF = nbt.getInteger("spanF"); - this.spanB = nbt.getInteger("spanB"); - this.spanL = nbt.getInteger("spanL"); - this.spanR = nbt.getInteger("spanR"); - this.height = nbt.getInteger("height"); - this.posFront = nbt.getDouble("posFront"); - this.posLeft = nbt.getDouble("posLeft"); - this.hasLoaded = nbt.getBoolean("loaded"); - this.posLeft = nbt.getDouble("posLeft"); - this.loadedHeat = nbt.getDouble("loadedHeat"); - this.loadedEnrichment = nbt.getDouble("loadedEnrichment"); + + this.setUpCrane = buf.readBoolean(); + if (this.setUpCrane) { + this.centerX = buf.readInt(); + this.centerY = buf.readInt(); + this.centerZ = buf.readInt(); + this.spanF = buf.readInt(); + this.spanB = buf.readInt(); + this.spanL = buf.readInt(); + this.spanR = buf.readInt(); + this.height = buf.readInt(); + this.posFront = buf.readDouble(); + this.posLeft = buf.readDouble(); + this.hasLoaded = buf.readBoolean(); + this.posLeft = buf.readDouble(); + this.loadedHeat = buf.readDouble(); + this.loadedEnrichment = buf.readDouble(); + } } public void setTarget(int x, int y, int z) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 1dd976ed4..53526b9bc 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -9,11 +9,9 @@ import com.hbm.entity.effect.EntitySpear; import com.hbm.entity.projectile.EntityRBMKDebris; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.neutron.NeutronNodeWorld; -import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.saveddata.TomSaveData; import com.hbm.tileentity.IBufPacketReceiver; @@ -119,7 +117,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements coolPassively(); this.worldObj.theProfiler.endSection(); - this.networkPackNT(trackingRange()); + this.sendStandard(trackingRange()); } } @@ -280,13 +278,8 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements nbt.setInteger("steam", this.steam); } - public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - @Override public void serialize(ByteBuf buf) { - buf.writeBoolean(this.muffled); buf.writeDouble(this.heat); buf.writeInt(this.water); buf.writeInt(this.steam); @@ -294,7 +287,6 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements @Override public void deserialize(ByteBuf buf) { - this.muffled = buf.readBoolean(); this.heat = buf.readDouble(); this.water = buf.readInt(); this.steam = buf.readInt(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java index 8fa2d7317..0ebc3d3dc 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java @@ -1,15 +1,11 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.packet.NBTPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.fluids.FluidTank; /** * Base class for RBMK components that have GUI slots and thus have to handle @@ -124,19 +120,6 @@ public abstract class TileEntityRBMKSlottedBase extends TileEntityRBMKActiveBase return new int[] {}; } - public int getGaugeScaled(int i, FluidTank tank) { - return tank.getFluidAmount() * i / tank.getCapacity(); - } - - public void networkPack(NBTTagCompound nbt, int range) { - - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - - public void handleButtonPacket(int value, int meta) { - } - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java index fc1451df5..acdfb8e7e 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java @@ -70,7 +70,7 @@ public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIPr } else timer = 0; - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); + sendStandard(25); } else { this.prevLowerExtent = lowerExtent; this.prevUpperExtent = upperExtent; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index 6db2f555f..dd80a4875 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -3,11 +3,13 @@ package com.hbm.tileentity.machine.storage; import com.hbm.inventory.container.ContainerMassStorage; import com.hbm.inventory.gui.GUIMassStorage; import com.hbm.items.ModItems; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IControlReceiverFilter; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -16,7 +18,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityMassStorage extends TileEntityCrateBase implements INBTPacketReceiver, IControlReceiverFilter { +public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPacketReceiver, IControlReceiverFilter { private int stack = 0; public boolean output = false; @@ -79,28 +81,30 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements INBTPa if(slots[2] == null) { slots[2] = slots[1].copy(); slots[2].stackSize = amount; - this.stack -= amount; } else { amount = Math.min(amount, slots[2].getMaxStackSize() - slots[2].stackSize); slots[2].stackSize += amount; - this.stack -= amount; } + this.stack -= amount; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("stack", getStockpile()); - data.setBoolean("output", output); - if(slots[1] != null) slots[1].writeToNBT(data); - INBTPacketReceiver.networkPack(this, data, 15); + + sendStandard(15); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.stack = nbt.getInteger("stack"); - this.output = nbt.getBoolean("output"); - this.type = ItemStack.loadItemStackFromNBT(nbt); + public void serialize(ByteBuf buf) { + buf.writeInt(this.stack); + buf.writeBoolean(this.output); + BufferUtil.writeItemStack(buf, this.type); + } + + @Override + public void deserialize(ByteBuf buf) { + this.stack = buf.readInt(); + this.output = buf.readBoolean(); + this.type = BufferUtil.readItemStack(buf); } public int getCapacity() { @@ -180,12 +184,11 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements INBTPa if(slots[2] == null) { slots[2] = slots[1].copy(); slots[2].stackSize = amount; - this.stack -= amount; } else { amount = Math.min(amount, slots[2].getMaxStackSize() - slots[2].stackSize); slots[2].stackSize += amount; - this.stack -= amount; } + this.stack -= amount; } if(data.hasKey("toggle")) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java index 280c16fd0..446d4bf6e 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java @@ -10,14 +10,15 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIDroneCrate; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.ParticleUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -27,7 +28,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIProvider, INBTPacketReceiver, IControlReceiver, IDroneLinkable, IFluidStandardTransceiver { +public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IDroneLinkable, IFluidStandardTransceiver { public FluidTank tank; @@ -82,26 +83,31 @@ public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIP (nextX - pos.getX()), (nextY - pos.getY()), (nextZ - pos.getZ()), 0x00ffff); } - - - NBTTagCompound data = new NBTTagCompound(); - data.setIntArray("pos", new int[] {nextX, nextY, nextZ}); - data.setBoolean("mode", sendingMode); - data.setBoolean("type", itemType); - tank.writeToNBT(data, "t"); - INBTPacketReceiver.networkPack(this, data, 25); + networkPackNT(25); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - int[] pos = nbt.getIntArray("pos"); + public void serialize(ByteBuf buf) { + BufferUtil.writeIntArray(buf, new int[] { + this.nextX, + this.nextY, + this.nextZ + }); + buf.writeBoolean(this.sendingMode); + buf.writeBoolean(this.itemType); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + int[] pos = BufferUtil.readIntArray(buf); this.nextX = pos[0]; this.nextY = pos[1]; this.nextZ = pos[2]; - this.sendingMode = nbt.getBoolean("mode"); - this.itemType = nbt.getBoolean("type"); - tank.readFromNBT(nbt, "t"); + this.sendingMode = buf.readBoolean(); + this.itemType = buf.readBoolean(); + tank.deserialize(buf); } protected void loadItems(EntityDeliveryDrone drone) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java index faa21f615..9d4948175 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java @@ -9,15 +9,16 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.container.ContainerDroneRequester; import com.hbm.inventory.gui.GUIDroneRequester; import com.hbm.module.ModulePatternMatcher; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.network.RequestNetwork.PathNode; import com.hbm.tileentity.network.RequestNetwork.RequestNode; import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -27,7 +28,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer implements INBTPacketReceiver, IGUIProvider, IControlReceiverFilter { +public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer implements IBufPacketReceiver, IGUIProvider, IControlReceiverFilter { public ModulePatternMatcher matcher; @@ -46,16 +47,17 @@ public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer super.updateEntity(); if(!worldObj.isRemote) { - - NBTTagCompound data = new NBTTagCompound(); - this.matcher.writeToNBT(data); - INBTPacketReceiver.networkPack(this, data, 15); + + sendStandard(15); } } - @Override - public void networkUnpack(NBTTagCompound nbt) { - this.matcher.readFromNBT(nbt); + @Override public void serialize(ByteBuf buf) { + this.matcher.serialize(buf); + } + + @Override public void deserialize(ByteBuf buf) { + this.matcher.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java index cb08c5bb8..4af12a1ab 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java @@ -39,7 +39,7 @@ public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketRec } } - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 15)); + sendStandard(15); } else { BlockPos pos = getCoord(dir); if(nextY != -1 && worldObj.getTotalWorldTime() % 2 == 0) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java index 26d6dec14..789f0a96d 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java @@ -6,14 +6,16 @@ import java.util.List; import com.hbm.handler.CompatHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.gui.GuiScreenRadioTelex; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; +import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -30,7 +32,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityRadioTelex extends TileEntity implements INBTPacketReceiver, IControlReceiver, IGUIProvider, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiver, IControlReceiver, IGUIProvider, SimpleComponent, CompatHandler.OCComponent { public static final int lineWidth = 33; public String txChannel = ""; @@ -130,28 +132,32 @@ public class TileEntityRadioTelex extends TileEntity implements INBTPacketReceiv } } - NBTTagCompound data = new NBTTagCompound(); - for(int i = 0; i < 5; i++) { - data.setString("tx" + i, txBuffer[i]); - data.setString("rx" + i, rxBuffer[i]); - } - data.setString("txChan", txChannel); - data.setString("rxChan", rxChannel); - data.setInteger("sending", sendingChar); - INBTPacketReceiver.networkPack(this, data, 16); + sendStandard(16); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - + public void serialize(ByteBuf buf) { for(int i = 0; i < 5; i++) { - txBuffer[i] = nbt.getString("tx" + i); - rxBuffer[i] = nbt.getString("rx" + i); + BufferUtil.writeString(buf, txBuffer[i]); + BufferUtil.writeString(buf, rxBuffer[i]); } - this.txChannel = nbt.getString("txChan"); - this.rxChannel = nbt.getString("rxChan"); - this.sendingChar = (char) nbt.getInteger("sending"); + + BufferUtil.writeString(buf, this.txChannel); + BufferUtil.writeString(buf, this.rxChannel); + buf.writeChar(this.sendingChar); + } + + @Override + public void deserialize(ByteBuf buf) { + for(int i = 0; i < 5; i++) { + txBuffer[i] = BufferUtil.readString(buf); + rxBuffer[i] = BufferUtil.readString(buf); + } + + this.txChannel = BufferUtil.readString(buf); + this.rxChannel = BufferUtil.readString(buf); + this.sendingChar = buf.readChar(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java index e881b1ecf..5a01077fa 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java @@ -1,8 +1,10 @@ package com.hbm.tileentity.network; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.util.BufferUtil; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -10,7 +12,7 @@ import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioTorchBase extends TileEntity implements INBTPacketReceiver, IControlReceiver { +public class TileEntityRadioTorchBase extends TileEntity implements IBufPacketReceiver, IControlReceiver { /** channel we're broadcasting on/listening to */ public String channel = ""; @@ -30,12 +32,7 @@ public class TileEntityRadioTorchBase extends TileEntity implements INBTPacketRe if(!worldObj.isRemote) { - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("p", polling); - data.setBoolean("m", customMap); - if(channel != null) data.setString("c", channel); - for(int i = 0; i < 16; i++) if(mapping[i] != null) data.setString("m" + i, mapping[i]); - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(50); } } @@ -62,11 +59,19 @@ public class TileEntityRadioTorchBase extends TileEntity implements INBTPacketRe } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.polling = nbt.getBoolean("p"); - this.customMap = nbt.getBoolean("m"); - this.channel = nbt.getString("c"); - for(int i = 0; i < 16; i++) this.mapping[i] = nbt.getString("m" + i); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.polling); + buf.writeBoolean(this.customMap); + BufferUtil.writeString(buf, this.channel); + for(int i = 0; i < 16; i++) BufferUtil.writeString(buf, this.mapping[i]); + } + + @Override + public void deserialize(ByteBuf buf) { + this.polling = buf.readBoolean(); + this.customMap = buf.readBoolean(); + this.channel = BufferUtil.readString(buf); + for(int i = 0; i < 16; i++) this.mapping[i] = BufferUtil.readString(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java index 4a44c3504..36b070cb2 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java @@ -1,9 +1,11 @@ package com.hbm.tileentity.network; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; +import com.hbm.util.BufferUtil; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -11,7 +13,7 @@ import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioTorchLogic extends TileEntity implements INBTPacketReceiver, IControlReceiver { +public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketReceiver, IControlReceiver { /** channel we're broadcasting on/listening to */ public String channel = ""; @@ -80,13 +82,7 @@ public class TileEntityRadioTorchLogic extends TileEntity implements INBTPacketR } } - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("p", polling); - data.setBoolean("d", descending); - if(channel != null) data.setString("c", channel); - for(int i = 0; i < 16; i++) if(!mapping[i].equals("")) data.setString("m" + i, mapping[i]); - for(int i = 0; i < 16; i++) if(conditions[i] > 0) data.setInteger("c" + i, conditions[i]); - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(50); } } @@ -150,12 +146,22 @@ public class TileEntityRadioTorchLogic extends TileEntity implements INBTPacketR for(int i = 0; i < 16; i++) if(conditions[i] > 0) nbt.setInteger("c" + i, conditions[i]); } - public void networkUnpack(NBTTagCompound nbt) { - this.polling = nbt.getBoolean("p"); - this.channel = nbt.getString("c"); - this.descending = nbt.getBoolean("d"); - for(int i = 0; i < 16; i++) this.mapping[i] = nbt.getString("m" + i); - for(int i = 0; i < 16; i++) this.conditions[i] = nbt.getInteger("c" + i); + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.polling); + BufferUtil.writeString(buf, this.channel); + buf.writeBoolean(this.descending); + for(int i = 0; i < 16; i++) BufferUtil.writeString(buf, this.mapping[i]); + for(int i = 0; i < 16; i++) buf.writeInt(this.conditions[i]); + } + + @Override + public void deserialize(ByteBuf buf) { + this.polling = buf.readBoolean(); + this.channel = BufferUtil.readString(buf); + this.descending = buf.readBoolean(); + for(int i = 0; i < 16; i++) this.mapping[i] = BufferUtil.readString(buf); + for(int i = 0; i < 16; i++) this.conditions[i] = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java index 71fc659f9..2d5c95a4f 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java @@ -1,9 +1,5 @@ package com.hbm.tileentity.network; -import com.hbm.packet.NBTPacket; -import com.hbm.packet.PacketDispatcher; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -107,10 +103,6 @@ public abstract class TileEntityRequestNetworkContainer extends TileEntityReques } } - public void networkPack(NBTTagCompound nbt, int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 848356340..77ac2a0fb 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -311,28 +311,6 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple this.trySubscribe(worldObj, xCoord + dir.offsetX * 2 + rot.offsetX * -1, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * -1, dir); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.turnProgress = 2; - this.syncRotationPitch = nbt.getDouble("pitch"); - this.syncRotationYaw = nbt.getDouble("yaw"); - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - this.targetPlayers = nbt.getBoolean("targetPlayers"); - this.targetAnimals = nbt.getBoolean("targetAnimals"); - this.targetMobs = nbt.getBoolean("targetMobs"); - this.targetMachines = nbt.getBoolean("targetMachines"); - this.stattrak = nbt.getInteger("stattrak"); - - if(nbt.hasKey("tX")) { - this.tPos = Vec3.createVectorHelper(nbt.getDouble("tX"), nbt.getDouble("tY"), nbt.getDouble("tZ")); - } else { - this.tPos = null; - } - } - @Override public void handleButtonPacket(int value, int meta) { From b7d0748c26fe0e86057e0e1841ffab201b3fcc3a Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 30 Aug 2024 14:43:45 +0200 Subject: [PATCH 17/70] Merge master into branch Optimization, intelliJ couldn't do it, so I did it myself. --- changelog | 9 +- .../api/hbm/energymk2/IEnergyProviderMK2.java | 2 +- .../api/hbm/energymk2/IEnergyReceiverMK2.java | 2 +- .../java/api/hbm/fluid/IFluidConnector.java | 2 +- src/main/java/api/hbm/fluid/IFluidUser.java | 2 +- .../java/api/hbm/item/IButtonReceiver.java | 17 - .../java/api/hbm/item/IClickReceiver.java | 20 - src/main/java/com/hbm/blocks/ModBlocks.java | 15 +- .../com/hbm/blocks/bomb/BlockCrashedBomb.java | 2 +- .../com/hbm/blocks/bomb/BlockVolcano.java | 2 +- .../com/hbm/blocks/generic/BlockEmitter.java | 2 +- .../com/hbm/blocks/generic/PartEmitter.java | 2 +- .../hbm/blocks/machine/MachineCapacitor.java | 3 - .../blocks/machine/MachineICFController.java | 2 +- .../blocks/machine/MachinePWRController.java | 2 +- .../hbm/blocks/machine/ZirnoxDestroyed.java | 2 +- .../blocks/machine/pile/BlockGraphite.java | 2 +- .../machine/rbmk/RBMKDebrisBurning.java | 2 +- .../machine/rbmk/RBMKDebrisRadiating.java | 2 +- .../com/hbm/blocks/network/FluidValve.java | 2 +- .../hbm/entity/item/EntityFallingBlockNT.java | 15 +- .../com/hbm/entity/item/EntityFireworks.java | 2 +- .../hbm/entity/item/EntityMagnusCartus.java | 2 +- .../com/hbm/entity/logic/EntityBomber.java | 2 +- .../hbm/entity/logic/EntityDeathBlast.java | 2 +- .../java/com/hbm/entity/logic/EntityEMP.java | 2 +- .../entity/logic/EntityNukeExplosionMK3.java | 2 +- .../entity/missile/EntityMissileShuttle.java | 2 +- .../hbm/entity/mob/EntityCreeperNuclear.java | 2 +- .../hbm/entity/mob/EntityHunterChopper.java | 2 +- .../java/com/hbm/entity/mob/EntityPigeon.java | 2 +- .../com/hbm/entity/mob/EntityTaintCrab.java | 2 +- .../java/com/hbm/entity/mob/EntityUFO.java | 2 +- .../hbm/entity/mob/glyphid/EntityGlyphid.java | 2 +- .../mob/glyphid/EntityGlyphidNuclear.java | 2 +- .../entity/mob/siege/EntitySiegeCraft.java | 2 +- .../entity/projectile/EntityBombletZeta.java | 2 +- .../entity/projectile/EntityBulletBaseNT.java | 2 +- .../com/hbm/entity/projectile/EntityCog.java | 2 +- .../hbm/entity/projectile/EntityRubble.java | 2 +- .../hbm/entity/projectile/EntitySawblade.java | 2 +- .../com/hbm/explosion/ExplosionChaos.java | 24 - .../com/hbm/explosion/ExplosionLarge.java | 2 +- .../com/hbm/explosion/ExplosionNukeSmall.java | 3 +- .../standard/ExplosionEffectAmat.java | 2 +- .../standard/ExplosionEffectStandard.java | 2 +- .../standard/PlayerProcessorStandard.java | 2 +- .../java/com/hbm/extprop/HbmLivingProps.java | 4 +- .../com/hbm/handler/BossSpawnHandler.java | 5 +- .../com/hbm/handler/EntityEffectHandler.java | 4 +- .../java/com/hbm/handler/HbmKeybinds.java | 23 +- .../com/hbm/handler/HbmKeybindsServer.java | 25 + .../java/com/hbm/handler/WeaponAbility.java | 2 +- .../handler/guncfg/BulletConfigFactory.java | 2 +- .../hbm/handler/guncfg/Gun12GaugeFactory.java | 2 +- .../handler/guncfg/Gun44MagnumFactory.java | 2 +- .../hbm/handler/guncfg/Gun4GaugeFactory.java | 2 +- .../hbm/handler/guncfg/Gun50BMGFactory.java | 2 +- .../hbm/handler/guncfg/Gun556mmFactory.java | 2 +- .../hbm/handler/guncfg/Gun75BoltFactory.java | 2 +- .../handler/guncfg/GunDetonatorFactory.java | 2 +- .../hbm/handler/guncfg/GunEnergyFactory.java | 4 +- .../hbm/handler/guncfg/GunFatmanFactory.java | 2 +- .../hbm/handler/guncfg/GunGrenadeFactory.java | 2 +- .../com/hbm/handler/guncfg/GunNPCFactory.java | 2 +- .../ChunkRadiationHandlerSimple.java | 2 +- .../hazard/type/HazardTypeHydroactive.java | 3 +- .../java/com/hbm/inventory/RecipesCommon.java | 15 +- .../java/com/hbm/inventory/gui/GUIAnvil.java | 2 +- .../java/com/hbm/inventory/gui/GUIBarrel.java | 2 +- .../inventory/gui/GUICombustionEngine.java | 2 +- .../com/hbm/inventory/gui/GUICompressor.java | 2 +- .../com/hbm/inventory/gui/GUICoreEmitter.java | 2 +- .../hbm/inventory/gui/GUICoreStabilizer.java | 2 +- .../hbm/inventory/gui/GUICounterTorch.java | 2 +- .../com/hbm/inventory/gui/GUICraneBoxer.java | 2 +- .../hbm/inventory/gui/GUICraneExtractor.java | 2 +- .../hbm/inventory/gui/GUICraneGrabber.java | 2 +- .../com/hbm/inventory/gui/GUICraneRouter.java | 2 +- .../com/hbm/inventory/gui/GUIDroneCrate.java | 2 +- .../inventory/gui/GUIElectrolyserFluid.java | 2 +- .../inventory/gui/GUIElectrolyserMetal.java | 2 +- .../java/com/hbm/inventory/gui/GUIFEL.java | 2 +- .../com/hbm/inventory/gui/GUIForceField.java | 2 +- .../java/com/hbm/inventory/gui/GUIFunnel.java | 2 +- .../java/com/hbm/inventory/gui/GUIHadron.java | 2 +- .../hbm/inventory/gui/GUIHeaterHeatex.java | 2 +- .../java/com/hbm/inventory/gui/GUIITER.java | 2 +- .../hbm/inventory/gui/GUILaunchPadRusted.java | 2 +- .../gui/GUIMachineArcFurnaceLarge.java | 2 +- .../hbm/inventory/gui/GUIMachineBattery.java | 2 +- .../inventory/gui/GUIMachineExcavator.java | 2 +- .../inventory/gui/GUIMachineFluidTank.java | 2 +- .../hbm/inventory/gui/GUIMachineGasFlare.java | 2 +- .../inventory/gui/GUIMachineLaunchTable.java | 2 +- .../gui/GUIMachineMissileAssembly.java | 2 +- .../hbm/inventory/gui/GUIMachineRadarNT.java | 2 +- .../inventory/gui/GUIMachineTurbineGas.java | 2 +- .../inventory/gui/GUIMachineWoodBurner.java | 2 +- .../com/hbm/inventory/gui/GUIMassStorage.java | 2 +- .../com/hbm/inventory/gui/GUIMicrowave.java | 2 +- .../com/hbm/inventory/gui/GUIMiningLaser.java | 2 +- .../java/com/hbm/inventory/gui/GUIMixer.java | 2 +- .../com/hbm/inventory/gui/GUINukeFstbmb.java | 2 +- .../com/hbm/inventory/gui/GUIOilburner.java | 2 +- .../java/com/hbm/inventory/gui/GUIPWR.java | 2 +- .../com/hbm/inventory/gui/GUIRBMKBoiler.java | 2 +- .../com/hbm/inventory/gui/GUIRBMKConsole.java | 2 +- .../com/hbm/inventory/gui/GUIRBMKControl.java | 2 +- .../hbm/inventory/gui/GUIRBMKControlAuto.java | 2 +- .../com/hbm/inventory/gui/GUIRadioRec.java | 2 +- .../hbm/inventory/gui/GUIReactorControl.java | 2 +- .../hbm/inventory/gui/GUIReactorResearch.java | 2 +- .../hbm/inventory/gui/GUIReactorZirnox.java | 2 +- .../java/com/hbm/inventory/gui/GUISILEX.java | 2 +- .../hbm/inventory/gui/GUIScreenBobmazon.java | 2 +- .../inventory/gui/GUIScreenDesignator.java | 2 +- .../com/hbm/inventory/gui/GUIScreenFluid.java | 2 +- .../inventory/gui/GUIScreenRadioTorch.java | 2 +- .../gui/GUIScreenRadioTorchLogic.java | 2 +- .../hbm/inventory/gui/GUIScreenSatCoord.java | 2 +- .../inventory/gui/GUIScreenSatInterface.java | 2 +- .../gui/GUIScreenTemplateFolder.java | 2 +- .../hbm/inventory/gui/GUISoyuzLauncher.java | 2 +- .../com/hbm/inventory/gui/GUITurretArty.java | 2 +- .../com/hbm/inventory/gui/GUITurretBase.java | 4 +- .../hbm/inventory/gui/GUITurretHIMARS.java | 2 +- .../java/com/hbm/inventory/gui/GUIWatz.java | 2 +- .../hbm/inventory/gui/GuiInfoContainer.java | 3 +- .../inventory/gui/GuiScreenRadioTelex.java | 2 +- .../java/com/hbm/items/IKeybindReceiver.java | 11 + src/main/java/com/hbm/items/ISyncButtons.java | 11 - src/main/java/com/hbm/items/ModItems.java | 15 +- .../com/hbm/items/armor/ArmorBJJetpack.java | 2 +- .../java/com/hbm/items/armor/ArmorDNT.java | 2 +- .../java/com/hbm/items/armor/ArmorDiesel.java | 2 +- .../com/hbm/items/armor/ItemModKnife.java | 2 +- .../java/com/hbm/items/armor/ItemModLens.java | 2 +- .../com/hbm/items/armor/JetpackBooster.java | 2 +- .../com/hbm/items/armor/JetpackBreak.java | 2 +- .../com/hbm/items/armor/JetpackRegular.java | 2 +- .../hbm/items/armor/JetpackVectorized.java | 2 +- .../java/com/hbm/items/food/ItemLemon.java | 2 +- .../hbm/items/machine/ItemFluidIDMulti.java | 2 +- .../com/hbm/items/special/ItemCigarette.java | 2 +- .../com/hbm/items/tool/ItemBlowtorch.java | 2 +- .../java/com/hbm/items/tool/ItemBoltgun.java | 2 +- .../java/com/hbm/items/tool/ItemChainsaw.java | 2 +- .../hbm/items/tool/ItemLaserDetonator.java | 2 +- .../com/hbm/items/tool/ItemOilDetector.java | 2 +- .../hbm/items/tool/ItemOreDensityScanner.java | 2 +- .../hbm/items/tool/ItemPollutionDetector.java | 2 +- .../com/hbm/items/tool/ItemPowerNetTool.java | 2 +- .../com/hbm/items/tool/ItemSatInterface.java | 2 +- .../com/hbm/items/tool/ItemToolAbility.java | 2 +- .../com/hbm/items/weapon/ItemAmmoArty.java | 2 +- .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 2 +- .../com/hbm/items/weapon/ItemCrucible.java | 2 +- .../com/hbm/items/weapon/ItemCryoCannon.java | 2 +- .../{gununified => }/ItemEnergyGunBase.java | 7 +- .../com/hbm/items/weapon/ItemGunBase.java | 6 +- .../hbm/items/weapon/ItemGunChemthrower.java | 2 +- .../com/hbm/items/weapon/ItemGunGauss.java | 2 +- .../com/hbm/items/weapon/ItemPlasmaSpear.java | 179 - .../hbm/items/weapon/gununified/GunFrame.java | 59 - .../weapon/gununified/GunRealoadable.java | 30 - .../weapon/gununified/IReloadBehavior.java | 10 - .../weapon/gununified/IStatusBarProvider.java | 13 - .../gununified/StatusBarDurability.java | 16 - .../hbm/items/weapon/sedna/BulletConfig.java | 36 + .../com/hbm/items/weapon/sedna/GunConfig.java | 62 + .../hbm/items/weapon/sedna/GunFactory.java | 25 + .../hbm/items/weapon/sedna/ItemGunBase.java | 112 + .../com/hbm/items/weapon/sedna/Receiver.java | 24 + .../items/weapon/sedna/mags/IMagazine.java | 24 + .../sedna/mags/MagazineRevolverDrum.java | 82 + .../sedna/mags/MagazineStandardBase.java | 60 + .../hbm/items/weapon/sedna/package-info.java | 24 + src/main/java/com/hbm/main/ClientProxy.java | 6 + src/main/java/com/hbm/main/MainRegistry.java | 1 + .../java/com/hbm/main/ModEventHandler.java | 4 +- .../com/hbm/main/ModEventHandlerClient.java | 49 +- .../com/hbm/main/ModEventHandlerRenderer.java | 21 + .../java/com/hbm/main/ResourceManager.java | 1 + .../java/com/hbm/packet/PacketDispatcher.java | 7 +- .../com/hbm/packet/SyncButtonsPacket.java | 56 - .../{ => toclient}/AuxElectricityPacket.java | 2 +- .../packet/{ => toclient}/AuxGaugePacket.java | 2 +- .../{ => toclient}/AuxParticlePacket.java | 2 +- .../{ => toclient}/AuxParticlePacketNT.java | 2 +- .../{ => toclient}/BiomeSyncPacket.java | 2 +- .../hbm/packet/{ => toclient}/BufPacket.java | 2 +- .../ExplosionKnockbackPacket.java | 2 +- ...lientEffectsAndParticleHandlingPacket.java | 2 +- .../packet/{ => toclient}/ExtPropPacket.java | 2 +- .../{ => toclient}/GunAnimationPacket.java | 2 +- .../LoopedEntitySoundPacket.java | 2 +- .../{ => toclient}/LoopedSoundPacket.java | 2 +- .../{ => toclient}/ParticleBurstPacket.java | 2 +- .../{ => toclient}/PermaSyncPacket.java | 4 +- .../{ => toclient}/PlayerInformPacket.java | 2 +- .../packet/{ => toclient}/SatPanelPacket.java | 2 +- .../{ => toclient}/TEDoorAnimationPacket.java | 2 +- .../hbm/packet/{ => toclient}/TEFFPacket.java | 2 +- .../TEMissileMultipartPacket.java | 2 +- .../packet/{ => toclient}/TESirenPacket.java | 2 +- .../packet/{ => toclient}/TEVaultPacket.java | 2 +- .../{ => toserver}/AnvilCraftPacket.java | 2 +- .../{ => toserver}/AuxButtonPacket.java | 2 +- .../{ => toserver}/GunButtonPacket.java | 2 +- .../{ => toserver}/ItemBobmazonPacket.java | 2 +- .../{ => toserver}/ItemDesignatorPacket.java | 2 +- .../{ => toserver}/ItemFolderPacket.java | 2 +- .../packet/{ => toserver}/KeybindPacket.java | 8 +- .../{ => toserver}/NBTControlPacket.java | 2 +- .../{ => toserver}/NBTItemControlPacket.java | 2 +- .../packet/{ => toserver}/SatCoordPacket.java | 2 +- .../packet/{ => toserver}/SatLaserPacket.java | 2 +- .../hbm/particle/helper/IParticleCreator.java | 2 +- .../item/weapon/ItemRenderWeaponGlass.java | 2 +- .../item/weapon/sedna/ItemRenderDebug.java | 44 + .../weapon/sedna/ItemRenderWeaponBase.java | 185 + .../com/hbm/render/tileentity/RenderLPW2.java | 2 +- .../render/tileentity/RenderSolarBoiler.java | 2 +- .../hbm/tileentity/IBufPacketReceiver.java | 2 +- .../hbm/tileentity/TileEntityDoorGeneric.java | 2 +- .../hbm/tileentity/TileEntityMachineBase.java | 6 +- .../hbm/tileentity/bomb/TileEntityCharge.java | 3 - .../bomb/TileEntityCompactLauncher.java | 4 +- .../tileentity/bomb/TileEntityFireworks.java | 2 +- .../bomb/TileEntityLaunchTable.java | 4 +- .../hbm/tileentity/deco/TileEntityGeysir.java | 2 +- .../machine/TileEntityBlastDoor.java | 2 +- .../machine/TileEntityBroadcaster.java | 2 +- .../machine/TileEntityCrucible.java | 2 +- .../machine/TileEntityElectrolyser.java | 2 +- .../machine/TileEntityForceField.java | 2 +- .../machine/TileEntityFoundryOutlet.java | 2 +- .../machine/TileEntityFoundrySlagtap.java | 2 +- .../tileentity/machine/TileEntityHadron.java | 2 +- .../machine/TileEntityHadronPower.java | 3 - .../hbm/tileentity/machine/TileEntityICF.java | 2 +- .../tileentity/machine/TileEntityITER.java | 2 +- .../machine/TileEntityMachineArcFurnace.java | 4 +- .../TileEntityMachineArcFurnaceLarge.java | 2 +- .../machine/TileEntityMachineArcWelder.java | 2 +- .../machine/TileEntityMachineDrain.java | 2 +- .../machine/TileEntityMachineGasCent.java | 2 +- .../TileEntityMachineMissileAssembly.java | 2 +- .../machine/TileEntityMachineOreSlopper.java | 2 +- .../machine/TileEntityMachineRTG.java | 2 +- .../machine/TileEntityMachineRadarNT.java | 2 +- .../machine/TileEntityMachineShredder.java | 2 +- .../machine/TileEntityMachineSiren.java | 2 +- .../TileEntityMachineSolderingStation.java | 2 +- .../machine/TileEntityMachineTurbofan.java | 2 +- .../tileentity/machine/TileEntitySawmill.java | 4 +- .../machine/TileEntityVaultDoor.java | 2 +- .../tileentity/machine/TileEntityWatz.java | 2 +- .../machine/TileEntityZirnoxDestroyed.java | 2 +- .../oil/TileEntityMachineFractionTower.java | 3 - .../machine/pile/TileEntityPileFuel.java | 2 +- .../machine/rbmk/TileEntityRBMKBase.java | 6 +- .../storage/TileEntityFileCabinet.java | 3 - .../storage/TileEntityMachineFluidTank.java | 2 +- .../network/TileEntityDroneWaypoint.java | 3 - .../network/TileEntityFluidValve.java | 11 +- .../network/TileEntityPipeBaseNT.java | 5 +- .../turret/TileEntityTurretArty.java | 2 +- .../turret/TileEntityTurretBaseNT.java | 2 +- .../turret/TileEntityTurretChekhov.java | 2 +- .../turret/TileEntityTurretFritz.java | 2 +- .../turret/TileEntityTurretHoward.java | 2 +- .../turret/TileEntityTurretHowardDamaged.java | 2 +- .../turret/TileEntityTurretJeremy.java | 2 +- .../turret/TileEntityTurretMaxwell.java | 2 +- .../turret/TileEntityTurretSentry.java | 2 +- .../turret/TileEntityTurretSentryDamaged.java | 2 +- .../turret/TileEntityTurretTauon.java | 2 +- src/main/java/com/hbm/util/ParticleUtil.java | 2 +- src/main/java/com/hbm/world/WorldUtil.java | 3 +- src/main/resources/META-INF/HBM_at.cfg | 3 + src/main/resources/assets/hbm/lang/de_DE.lang | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../assets/hbm/models/machines/lpw2.obj | 10610 +++++++++------- .../hbm/models/weapons/maresleg_mk2.obj | 2314 ++++ .../assets/hbm/models/weapons/pepperbox.obj | 3645 ++++++ .../blocks/playground/deco_steel_kit.png | Bin 1684 -> 2331 bytes .../hbm/textures/models/machines/lpw2.png | Bin 19602 -> 104090 bytes .../hbm/textures/models/weapons/debug_gun.png | Bin 0 -> 4269 bytes .../hbm/textures/models/weapons/lil_pip.png | Bin 4498 -> 0 bytes .../hbm/textures/models/weapons/maresleg.png | Bin 0 -> 4117 bytes .../hbm/textures/models/weapons/pepperbox.png | Bin 0 -> 3118 bytes 293 files changed, 13009 insertions(+), 5451 deletions(-) delete mode 100644 src/main/java/api/hbm/item/IButtonReceiver.java delete mode 100644 src/main/java/api/hbm/item/IClickReceiver.java create mode 100644 src/main/java/com/hbm/handler/HbmKeybindsServer.java create mode 100644 src/main/java/com/hbm/items/IKeybindReceiver.java delete mode 100644 src/main/java/com/hbm/items/ISyncButtons.java rename src/main/java/com/hbm/items/weapon/{gununified => }/ItemEnergyGunBase.java (95%) delete mode 100644 src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java delete mode 100644 src/main/java/com/hbm/items/weapon/gununified/GunFrame.java delete mode 100644 src/main/java/com/hbm/items/weapon/gununified/GunRealoadable.java delete mode 100644 src/main/java/com/hbm/items/weapon/gununified/IReloadBehavior.java delete mode 100644 src/main/java/com/hbm/items/weapon/gununified/IStatusBarProvider.java delete mode 100644 src/main/java/com/hbm/items/weapon/gununified/StatusBarDurability.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/GunConfig.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/GunFactory.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/ItemGunBase.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/Receiver.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/package-info.java delete mode 100644 src/main/java/com/hbm/packet/SyncButtonsPacket.java rename src/main/java/com/hbm/packet/{ => toclient}/AuxElectricityPacket.java (97%) rename src/main/java/com/hbm/packet/{ => toclient}/AuxGaugePacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/AuxParticlePacket.java (97%) rename src/main/java/com/hbm/packet/{ => toclient}/AuxParticlePacketNT.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/BiomeSyncPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/BufPacket.java (97%) rename src/main/java/com/hbm/packet/{ => toclient}/ExplosionKnockbackPacket.java (97%) rename src/main/java/com/hbm/packet/{ => toclient}/ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/ExtPropPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/GunAnimationPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/LoopedEntitySoundPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/LoopedSoundPacket.java (99%) rename src/main/java/com/hbm/packet/{ => toclient}/ParticleBurstPacket.java (97%) rename src/main/java/com/hbm/packet/{ => toclient}/PermaSyncPacket.java (94%) rename src/main/java/com/hbm/packet/{ => toclient}/PlayerInformPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/SatPanelPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/TEDoorAnimationPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/TEFFPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/TEMissileMultipartPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/TESirenPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toclient}/TEVaultPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toserver}/AnvilCraftPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toserver}/AuxButtonPacket.java (99%) rename src/main/java/com/hbm/packet/{ => toserver}/GunButtonPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toserver}/ItemBobmazonPacket.java (99%) rename src/main/java/com/hbm/packet/{ => toserver}/ItemDesignatorPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toserver}/ItemFolderPacket.java (99%) rename src/main/java/com/hbm/packet/{ => toserver}/KeybindPacket.java (84%) rename src/main/java/com/hbm/packet/{ => toserver}/NBTControlPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toserver}/NBTItemControlPacket.java (98%) rename src/main/java/com/hbm/packet/{ => toserver}/SatCoordPacket.java (97%) rename src/main/java/com/hbm/packet/{ => toserver}/SatLaserPacket.java (97%) create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDebug.java create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java create mode 100644 src/main/resources/assets/hbm/models/weapons/maresleg_mk2.obj create mode 100644 src/main/resources/assets/hbm/models/weapons/pepperbox.obj create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/debug_gun.png delete mode 100644 src/main/resources/assets/hbm/textures/models/weapons/lil_pip.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/maresleg.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/pepperbox.png diff --git a/changelog b/changelog index b675028b3..c26beadfa 100644 --- a/changelog +++ b/changelog @@ -5,8 +5,15 @@ * Removed forgotten bricks * Updated CMB brick texture * The ICF machine block now renders with its 3d model in the creative inventory +* "Toggle backpack" keybind is now called "toggle jetpack" to reduce confusion ## Fixed * Fixed pumpjack gauges not syncing properly * Fixed some concrete variants not being revertable into uncolored concrete -* Fixed the ore density scanner not using proper translations for the HUD \ No newline at end of file +* Fixed the ore density scanner not using proper translations for the HUD +* Fixed the solar boiler's rays rendering on fast graphics instead of on fancy graphics +* Fixed hydroreactive items not exploding when submerged in water +* Fixed fluid valves visually disconnecting when switching state +* Fixed fluid valves no visually connecting when type is set +* Fixed falling blocks spawned by nukes or impulse grenades dropping blocks that don't have drops +* Added even more exception handling to CompStacks, hopefully fixing an incompatibility with Mana Metal \ No newline at end of file diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index c264d0120..6643e3fcd 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -1,7 +1,7 @@ package api.hbm.energymk2; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; import api.hbm.energymk2.Nodespace.PowerNode; diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 5ec931234..27bcc21f2 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -1,7 +1,7 @@ package api.hbm.energymk2; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; import api.hbm.energymk2.Nodespace.PowerNode; diff --git a/src/main/java/api/hbm/fluid/IFluidConnector.java b/src/main/java/api/hbm/fluid/IFluidConnector.java index a6db68c2c..e299938c1 100644 --- a/src/main/java/api/hbm/fluid/IFluidConnector.java +++ b/src/main/java/api/hbm/fluid/IFluidConnector.java @@ -1,8 +1,8 @@ package api.hbm.fluid; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; import api.hbm.tile.ILoadedTile; diff --git a/src/main/java/api/hbm/fluid/IFluidUser.java b/src/main/java/api/hbm/fluid/IFluidUser.java index 4c98dfd14..3f5ab4f95 100644 --- a/src/main/java/api/hbm/fluid/IFluidUser.java +++ b/src/main/java/api/hbm/fluid/IFluidUser.java @@ -2,8 +2,8 @@ package api.hbm.fluid; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/api/hbm/item/IButtonReceiver.java b/src/main/java/api/hbm/item/IButtonReceiver.java deleted file mode 100644 index db1741b55..000000000 --- a/src/main/java/api/hbm/item/IButtonReceiver.java +++ /dev/null @@ -1,17 +0,0 @@ -package api.hbm.item; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -public interface IButtonReceiver { - - /** - * Called in ModEventHandlerClient for any keyboard input related to this item - * @param stack - * @param player - */ - @SideOnly(Side.CLIENT) - public void handleKeyboardInput(ItemStack stack, EntityPlayer player); -} diff --git a/src/main/java/api/hbm/item/IClickReceiver.java b/src/main/java/api/hbm/item/IClickReceiver.java deleted file mode 100644 index fd6830410..000000000 --- a/src/main/java/api/hbm/item/IClickReceiver.java +++ /dev/null @@ -1,20 +0,0 @@ -package api.hbm.item; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -public interface IClickReceiver { - - /** - * Called in ModEventHandlerClient for any mouse input related to this item - * @param stack - * @param player - * @param button - * @param state - * @return true if the event should be canceled - */ - @SideOnly(Side.CLIENT) - public boolean handleMouseInput(ItemStack stack, EntityPlayer player, int button, boolean state); -} diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 7a1a9f6e2..46eec14fd 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -893,7 +893,6 @@ public class ModBlocks { public static Block watz_element; public static Block watz_cooler; public static Block watz_end; - public static Block watz_conductor; public static Block balefire; public static Block fire_digamma; @@ -1997,7 +1996,6 @@ public class ModBlocks { watz_element = new BlockPillar(Material.iron, RefStrings.MODID + ":watz_element_top").setBlockName("watz_element").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_element_side"); watz_cooler = new BlockPillar(Material.iron, RefStrings.MODID + ":watz_cooler_top").setBlockName("watz_cooler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_cooler_side"); watz_end = new BlockToolConversion(Material.iron).addVariant("_bolted").setBlockName("watz_end").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_casing"); - watz_conductor = new BlockCableConnect(Material.iron).setBlockName("watz_conductor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":watz_conductor_top"); watz = new Watz().setBlockName("watz").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); watz_pump = new WatzPump().setBlockName("watz_pump").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3310,6 +3308,12 @@ public class ModBlocks { GameRegistry.registerBlock(plasma, ItemBlockLore.class, plasma.getUnlocalizedName()); GameRegistry.registerBlock(iter, iter.getUnlocalizedName()); GameRegistry.registerBlock(plasma_heater, plasma_heater.getUnlocalizedName()); + + register(watz_element); + register(watz_cooler); + register(watz_end); + register(watz); + register(watz_pump); register(machine_icf_press); register(icf_laser_component); @@ -3317,13 +3321,6 @@ public class ModBlocks { register(icf_block); register(icf_component); register(icf); - - GameRegistry.registerBlock(watz_element, watz_element.getUnlocalizedName()); - GameRegistry.registerBlock(watz_cooler, watz_cooler.getUnlocalizedName()); - register(watz_end); - GameRegistry.registerBlock(watz_conductor, watz_conductor.getUnlocalizedName()); - GameRegistry.registerBlock(watz, watz.getUnlocalizedName()); - GameRegistry.registerBlock(watz_pump, watz_pump.getUnlocalizedName()); //E GameRegistry.registerBlock(balefire, balefire.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java b/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java index 93683f0d2..f2a3f7783 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java @@ -7,8 +7,8 @@ import com.hbm.config.BombConfig; import com.hbm.entity.logic.EntityBalefire; import com.hbm.interfaces.IBomb; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.bomb.TileEntityCrashedBomb; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java index f2a8d73d7..8ae9a63a3 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java @@ -9,8 +9,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityShrapnel; import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java index 9c59c282e..c6d8d59f6 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java @@ -4,9 +4,9 @@ import java.awt.Color; import java.util.List; import com.hbm.blocks.ITooltipProvider; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IToolable; import com.hbm.tileentity.TileEntityLoadedBase; diff --git a/src/main/java/com/hbm/blocks/generic/PartEmitter.java b/src/main/java/com/hbm/blocks/generic/PartEmitter.java index db823972c..771c9e37d 100644 --- a/src/main/java/com/hbm/blocks/generic/PartEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/PartEmitter.java @@ -3,8 +3,8 @@ package com.hbm.blocks.generic; import java.util.List; import com.hbm.blocks.ITooltipProvider; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ParticleUtil; import api.hbm.block.IToolable; diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index e4221efec..fd525f9f6 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -10,8 +10,6 @@ import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityLoadedBase; @@ -22,7 +20,6 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/blocks/machine/MachineICFController.java b/src/main/java/com/hbm/blocks/machine/MachineICFController.java index 321d8307d..10d851109 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineICFController.java +++ b/src/main/java/com/hbm/blocks/machine/MachineICFController.java @@ -11,8 +11,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; import com.hbm.blocks.machine.BlockICFLaserComponent.EnumICFPart; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.machine.TileEntityICFController; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 4c9654659..0fcbc6117 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -9,8 +9,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.machine.TileEntityPWRController; import com.hbm.util.fauxpointtwelve.BlockPos; diff --git a/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java b/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java index 73526c494..459e958fd 100644 --- a/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java +++ b/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java @@ -8,8 +8,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityZirnoxDestroyed; diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java index c5018700a..28ddcd06a 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphite.java @@ -4,7 +4,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockFlammable; import com.hbm.items.ModItems; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.ParticleBurstPacket; +import com.hbm.packet.toclient.ParticleBurstPacket; import api.hbm.block.IToolable; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java index 0480adc74..dc2f70829 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java @@ -4,8 +4,8 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java index 299cf9f3c..9aef21c0b 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java @@ -5,8 +5,8 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; diff --git a/src/main/java/com/hbm/blocks/network/FluidValve.java b/src/main/java/com/hbm/blocks/network/FluidValve.java index 5a0b3d5b3..bfea2582e 100644 --- a/src/main/java/com/hbm/blocks/network/FluidValve.java +++ b/src/main/java/com/hbm/blocks/network/FluidValve.java @@ -54,6 +54,7 @@ public class FluidValve extends FluidDuctBase implements ILookOverlay { if(!player.isSneaking()) { int meta = world.getBlockMetadata(x, y, z); + TileEntityFluidValve te = (TileEntityFluidValve) world.getTileEntity(x, y, z); if(meta == 0) { world.setBlockMetadataWithNotify(x, y, z, 1, 2); world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 1.0F); @@ -62,7 +63,6 @@ public class FluidValve extends FluidDuctBase implements ILookOverlay { world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 0.85F); } - TileEntityFluidValve te = (TileEntityFluidValve) world.getTileEntity(x, y, z); te.updateState(); return true; diff --git a/src/main/java/com/hbm/entity/item/EntityFallingBlockNT.java b/src/main/java/com/hbm/entity/item/EntityFallingBlockNT.java index 150c4352f..6e1375bbc 100644 --- a/src/main/java/com/hbm/entity/item/EntityFallingBlockNT.java +++ b/src/main/java/com/hbm/entity/item/EntityFallingBlockNT.java @@ -109,6 +109,7 @@ public class EntityFallingBlockNT extends Entity { int x = MathHelper.floor_double(this.posX); int y = MathHelper.floor_double(this.posY); int z = MathHelper.floor_double(this.posZ); + int meta = this.getMeta(); if(this.fallingTicks == 1) { if(this.worldObj.getBlock(x, y, z) != this.getBlock()) { @@ -127,10 +128,10 @@ public class EntityFallingBlockNT extends Entity { if(this.worldObj.getBlock(x, y, z) != Blocks.piston_extension) { this.setDead(); - if(!this.destroyOnLand && replacementCheck(x, y, z) && this.worldObj.setBlock(x, y, z, this.getBlock(), this.getMeta(), 3)) { + if(!this.destroyOnLand && replacementCheck(x, y, z) && this.worldObj.setBlock(x, y, z, this.getBlock(), meta, 3)) { - if(this.getBlock() instanceof BlockFalling) ((BlockFalling) this.getBlock()).func_149828_a(this.worldObj, x, y, z, this.getMeta()); - if(this.getBlock() instanceof BlockFallingNT) ((BlockFallingNT) this.getBlock()).onLand(this.worldObj, x, y, z, this.getMeta()); + if(this.getBlock() instanceof BlockFalling) ((BlockFalling) this.getBlock()).func_149828_a(this.worldObj, x, y, z, meta); + if(this.getBlock() instanceof BlockFallingNT) ((BlockFallingNT) this.getBlock()).onLand(this.worldObj, x, y, z, meta); if(this.tileNBT != null && this.getBlock() instanceof ITileEntityProvider) { TileEntity tileentity = this.worldObj.getTileEntity(x, y, z); @@ -153,13 +154,13 @@ public class EntityFallingBlockNT extends Entity { tileentity.markDirty(); } } - } else if(this.canDrop && !this.destroyOnLand) { - this.entityDropItem(new ItemStack(this.getBlock(), 1, this.getBlock().damageDropped(this.getMeta())), 0.0F); + } else if(this.canDrop && !this.destroyOnLand && this.getBlock().getItemDropped(meta, rand, 0) != null) { + this.entityDropItem(new ItemStack(this.getBlock().getItemDropped(meta, rand, 0), 1, this.getBlock().damageDropped(meta)), 0.0F); } } } else if(this.fallingTicks > 100 && !this.worldObj.isRemote && (y < 1 || y > 256) || this.fallingTicks > 600) { - if(this.canDrop) { - this.entityDropItem(new ItemStack(this.getBlock(), 1, this.getBlock().damageDropped(this.getMeta())), 0.0F); + if(this.canDrop && this.getBlock().getItemDropped(meta, rand, 0) != null) { + this.entityDropItem(new ItemStack(this.getBlock().getItemDropped(meta, rand, 0), 1, this.getBlock().damageDropped(meta)), 0.0F); } this.setDead(); diff --git a/src/main/java/com/hbm/entity/item/EntityFireworks.java b/src/main/java/com/hbm/entity/item/EntityFireworks.java index 64227e4aa..6602c2ef4 100644 --- a/src/main/java/com/hbm/entity/item/EntityFireworks.java +++ b/src/main/java/com/hbm/entity/item/EntityFireworks.java @@ -1,7 +1,7 @@ package com.hbm.entity.item; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java b/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java index 478363a7d..53f379cae 100644 --- a/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java +++ b/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java @@ -1,8 +1,8 @@ package com.hbm.entity.item; import com.hbm.entity.cart.EntityMinecartBogie; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/entity/logic/EntityBomber.java b/src/main/java/com/hbm/entity/logic/EntityBomber.java index 820bdfc3b..25cc3acb4 100644 --- a/src/main/java/com/hbm/entity/logic/EntityBomber.java +++ b/src/main/java/com/hbm/entity/logic/EntityBomber.java @@ -11,8 +11,8 @@ import com.hbm.explosion.ExplosionChaos; import com.hbm.explosion.ExplosionLarge; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.LoopedEntitySoundPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.LoopedEntitySoundPacket; import com.hbm.util.ParticleUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java b/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java index 75fea35f7..e8da0ab89 100644 --- a/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java +++ b/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java @@ -2,8 +2,8 @@ package com.hbm.entity.logic; import com.hbm.entity.projectile.EntityBulletBaseNT; import com.hbm.handler.BulletConfigSyncingUtil; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/entity/logic/EntityEMP.java b/src/main/java/com/hbm/entity/logic/EntityEMP.java index 3ba75fc54..c322b4fa7 100644 --- a/src/main/java/com/hbm/entity/logic/EntityEMP.java +++ b/src/main/java/com/hbm/entity/logic/EntityEMP.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.ParticleBurstPacket; +import com.hbm.packet.toclient.ParticleBurstPacket; import api.hbm.energymk2.IEnergyHandlerMK2; import cofh.api.energy.IEnergyProvider; diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java index 665d9550d..c72a26679 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java @@ -16,8 +16,8 @@ import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionSolinium; import com.hbm.interfaces.Spaghetti; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java index bdee6f5f4..6c07d944d 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java @@ -8,8 +8,8 @@ import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.init.Blocks; diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java index ca78f32a9..8322f29b6 100644 --- a/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java @@ -9,8 +9,8 @@ import com.hbm.items.ModItems; import com.hbm.items.ItemAmmoEnums.AmmoFatman; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; diff --git a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java index c5e3bb9f7..cffaee494 100644 --- a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java +++ b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java @@ -5,8 +5,8 @@ import com.hbm.entity.projectile.EntityChopperMine; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.entity.IRadiationImmune; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/entity/mob/EntityPigeon.java b/src/main/java/com/hbm/entity/mob/EntityPigeon.java index ad6d203fc..34e19c294 100644 --- a/src/main/java/com/hbm/entity/mob/EntityPigeon.java +++ b/src/main/java/com/hbm/entity/mob/EntityPigeon.java @@ -8,8 +8,8 @@ import com.hbm.entity.mob.ai.EntityAIStopFlying; import com.hbm.entity.mob.ai.EntityAISwimmingConditional; import com.hbm.entity.mob.ai.EntityAIWanderConditional; import com.hbm.items.tool.ItemFertilizer; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java b/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java index aa0851cc9..e6db43891 100644 --- a/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java +++ b/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java @@ -6,8 +6,8 @@ import java.util.List; import com.hbm.entity.projectile.EntityBulletBaseNT; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.tileentity.machine.TileEntityTesla; diff --git a/src/main/java/com/hbm/entity/mob/EntityUFO.java b/src/main/java/com/hbm/entity/mob/EntityUFO.java index 4a8f46ee5..f30a84f93 100644 --- a/src/main/java/com/hbm/entity/mob/EntityUFO.java +++ b/src/main/java/com/hbm/entity/mob/EntityUFO.java @@ -9,8 +9,8 @@ import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java index a3ac74fbf..423f68429 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java @@ -15,8 +15,8 @@ import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.items.ModItems; import com.hbm.main.ResourceManager; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java index 7c1ce74e1..daad80877 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java @@ -11,8 +11,8 @@ import com.hbm.explosion.vanillant.standard.EntityProcessorStandard; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java index 72c0e29de..47dfee456 100644 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java +++ b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java @@ -5,8 +5,8 @@ import java.util.List; import com.hbm.entity.mob.EntityUFOBase; import com.hbm.entity.projectile.EntitySiegeLaser; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; diff --git a/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java b/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java index 1a21d96c2..8775e9510 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java @@ -4,8 +4,8 @@ import com.hbm.config.BombConfig; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.explosion.ExplosionChaos; import com.hbm.explosion.ExplosionLarge; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java index 2e44faf9f..d6370efb8 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java @@ -25,8 +25,8 @@ import com.hbm.handler.BulletConfiguration; import com.hbm.handler.GunConfiguration; import com.hbm.items.weapon.ItemGunBase; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorUtil; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/entity/projectile/EntityCog.java b/src/main/java/com/hbm/entity/projectile/EntityCog.java index 84c27bb77..8fb460a3e 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityCog.java +++ b/src/main/java/com/hbm/entity/projectile/EntityCog.java @@ -2,8 +2,8 @@ package com.hbm.entity.projectile; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/entity/projectile/EntityRubble.java b/src/main/java/com/hbm/entity/projectile/EntityRubble.java index b19f7263b..4cc2daf1f 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityRubble.java +++ b/src/main/java/com/hbm/entity/projectile/EntityRubble.java @@ -2,7 +2,7 @@ package com.hbm.entity.projectile; import com.hbm.lib.ModDamageSource; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.ParticleBurstPacket; +import com.hbm.packet.toclient.ParticleBurstPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/entity/projectile/EntitySawblade.java b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java index 9d4a3b592..fcc0c5a79 100644 --- a/src/main/java/com/hbm/entity/projectile/EntitySawblade.java +++ b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java @@ -2,8 +2,8 @@ package com.hbm.entity.projectile; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/explosion/ExplosionChaos.java b/src/main/java/com/hbm/explosion/ExplosionChaos.java index ea23952ef..ded0a8193 100644 --- a/src/main/java/com/hbm/explosion/ExplosionChaos.java +++ b/src/main/java/com/hbm/explosion/ExplosionChaos.java @@ -70,29 +70,6 @@ public class ExplosionChaos { } } - public static void antiCheat(World world, int x, int y, int z, int bombStartStrength) { - - int r = bombStartStrength; - int r2 = r * r; - int r22 = r2 / 2; - for (int xx = -r; xx < r; xx++) { - int X = xx + x; - int XX = xx * xx; - for (int yy = -r; yy < r; yy++) { - int Y = yy + y; - int YY = XX + yy * yy; - for (int zz = -r; zz < r; zz++) { - int Z = zz + z; - int ZZ = YY + zz * zz; - if (ZZ < r22) { - if (rand.nextInt(15) == 0 && world.getBlock(X, Y, Z) != Blocks.air) - world.setBlock(X, Y, Z, ModBlocks.cheater_virus); - } - } - } - } - } - public static void hardenVirus(World world, int x, int y, int z, int bombStartStrength) { int r = bombStartStrength; @@ -405,7 +382,6 @@ public class ExplosionChaos { } public static void pDestruction(World world, int x, int y, int z) { - EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, (double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), world.getBlock(x, y, z), world.getBlockMetadata(x, y, z)); world.spawnEntityInWorld(entityfallingblock); } diff --git a/src/main/java/com/hbm/explosion/ExplosionLarge.java b/src/main/java/com/hbm/explosion/ExplosionLarge.java index 2fff85b46..ae8f4e5cb 100644 --- a/src/main/java/com/hbm/explosion/ExplosionLarge.java +++ b/src/main/java/com/hbm/explosion/ExplosionLarge.java @@ -5,8 +5,8 @@ import java.util.Random; import com.hbm.entity.projectile.EntityRubble; import com.hbm.entity.projectile.EntityShrapnel; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ParticleUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java index 0734db2e5..cca47893b 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java @@ -5,8 +5,9 @@ import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; + import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java b/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java index 088c38a83..be83da6b2 100644 --- a/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java +++ b/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java @@ -2,8 +2,8 @@ package com.hbm.explosion.vanillant.standard; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.interfaces.IExplosionSFX; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectStandard.java b/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectStandard.java index 79b5b6966..583eaa004 100644 --- a/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectStandard.java +++ b/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectStandard.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.interfaces.IExplosionSFX; -import com.hbm.packet.ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.util.MathHelper; diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/PlayerProcessorStandard.java b/src/main/java/com/hbm/explosion/vanillant/standard/PlayerProcessorStandard.java index 186ea3b85..73f75de27 100644 --- a/src/main/java/com/hbm/explosion/vanillant/standard/PlayerProcessorStandard.java +++ b/src/main/java/com/hbm/explosion/vanillant/standard/PlayerProcessorStandard.java @@ -5,8 +5,8 @@ import java.util.Map.Entry; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.interfaces.IPlayerProcessor; -import com.hbm.packet.ExplosionKnockbackPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.ExplosionKnockbackPacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 81a44a47a..18c6a73fa 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -8,9 +8,9 @@ import com.hbm.config.RadiationConfig; import com.hbm.entity.mob.EntityDuck; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.util.ChatBuilder; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/handler/BossSpawnHandler.java b/src/main/java/com/hbm/handler/BossSpawnHandler.java index 485de324f..fa14f7d41 100644 --- a/src/main/java/com/hbm/handler/BossSpawnHandler.java +++ b/src/main/java/com/hbm/handler/BossSpawnHandler.java @@ -245,8 +245,9 @@ public class BossSpawnHandler { Vec3 vec; if(repell) { vec = Vec3.createVectorHelper(meteor.posX - player.posX, 0, meteor.posZ - player.posZ).normalize(); - vec.xCoord = vec.xCoord * meteorRand.nextDouble() - 0.5D; - vec.zCoord = vec.zCoord * meteorRand.nextDouble() - 0.5D; + double vel = meteorRand.nextDouble(); + vec.xCoord = vec.xCoord * vel; + vec.zCoord = vec.zCoord * vel; meteor.safe = true; } else { vec = Vec3.createVectorHelper(meteorRand.nextDouble() - 0.5D, 0, 0); diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index a7f68661a..0810bb580 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -20,10 +20,10 @@ import com.hbm.interfaces.IArmorModDash; import com.hbm.items.armor.ArmorFSB; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.packet.toclient.ExtPropPacket; import com.hbm.potion.HbmPotion; -import com.hbm.packet.ExtPropPacket; import com.hbm.saveddata.AuxSavedData; import com.hbm.util.ArmorRegistry; import com.hbm.util.ArmorUtil; diff --git a/src/main/java/com/hbm/handler/HbmKeybinds.java b/src/main/java/com/hbm/handler/HbmKeybinds.java index 6ae2507e1..7aa5525b1 100644 --- a/src/main/java/com/hbm/handler/HbmKeybinds.java +++ b/src/main/java/com/hbm/handler/HbmKeybinds.java @@ -1,13 +1,14 @@ package com.hbm.handler; import com.hbm.inventory.gui.GUICalculator; + import cpw.mods.fml.common.FMLCommonHandler; import org.lwjgl.input.Keyboard; import com.hbm.extprop.HbmPlayerProps; import com.hbm.main.MainRegistry; -import com.hbm.packet.KeybindPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.KeybindPacket; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -21,10 +22,14 @@ public class HbmKeybinds { public static KeyBinding calculatorKey = new KeyBinding(category + ".calculator", Keyboard.KEY_N, category); public static KeyBinding jetpackKey = new KeyBinding(category + ".toggleBack", Keyboard.KEY_C, category); public static KeyBinding hudKey = new KeyBinding(category + ".toggleHUD", Keyboard.KEY_V, category); - public static KeyBinding reloadKey = new KeyBinding(category + ".reload", Keyboard.KEY_R, category); public static KeyBinding dashKey = new KeyBinding(category + ".dash", Keyboard.KEY_LSHIFT, category); public static KeyBinding trainKey = new KeyBinding(category + ".trainInv", Keyboard.KEY_R, category); + public static KeyBinding reloadKey = new KeyBinding(category + ".reload", Keyboard.KEY_R, category); + public static KeyBinding gunPrimaryKey = new KeyBinding(category + ".gunPrimary", -100, category); + public static KeyBinding gunSecondaryKey = new KeyBinding(category + ".gunSecondary", -99, category); + public static KeyBinding gunTertiaryKey = new KeyBinding(category + ".gunTertitary", -98, category); + public static KeyBinding craneUpKey = new KeyBinding(category + ".craneMoveUp", Keyboard.KEY_UP, category); public static KeyBinding craneDownKey = new KeyBinding(category + ".craneMoveDown", Keyboard.KEY_DOWN, category); public static KeyBinding craneLeftKey = new KeyBinding(category + ".craneMoveLeft", Keyboard.KEY_LEFT, category); @@ -35,10 +40,14 @@ public class HbmKeybinds { ClientRegistry.registerKeyBinding(calculatorKey); ClientRegistry.registerKeyBinding(jetpackKey); ClientRegistry.registerKeyBinding(hudKey); - ClientRegistry.registerKeyBinding(reloadKey); ClientRegistry.registerKeyBinding(dashKey); ClientRegistry.registerKeyBinding(trainKey); + ClientRegistry.registerKeyBinding(reloadKey); + ClientRegistry.registerKeyBinding(gunPrimaryKey); + ClientRegistry.registerKeyBinding(gunSecondaryKey); + ClientRegistry.registerKeyBinding(gunTertiaryKey); + ClientRegistry.registerKeyBinding(craneUpKey); ClientRegistry.registerKeyBinding(craneDownKey); ClientRegistry.registerKeyBinding(craneLeftKey); @@ -69,13 +78,17 @@ public class HbmKeybinds { JETPACK, TOGGLE_JETPACK, TOGGLE_HEAD, - RELOAD, DASH, TRAIN, CRANE_UP, CRANE_DOWN, CRANE_LEFT, CRANE_RIGHT, - CRANE_LOAD + CRANE_LOAD, + + GUN_PRIMARY, + GUN_SECONDARY, + GUN_TERTIARY, + RELOAD, } } diff --git a/src/main/java/com/hbm/handler/HbmKeybindsServer.java b/src/main/java/com/hbm/handler/HbmKeybindsServer.java new file mode 100644 index 000000000..46b76a22c --- /dev/null +++ b/src/main/java/com/hbm/handler/HbmKeybindsServer.java @@ -0,0 +1,25 @@ +package com.hbm.handler; + +import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.HbmKeybinds.EnumKeybind; +import com.hbm.items.IKeybindReceiver; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public class HbmKeybindsServer { + + /** Can't put this in HbmKeybinds because it's littered with clientonly stuff */ + public static void onPressedServer(EntityPlayer player, EnumKeybind key, boolean state) { + + // EXTPROP HANDLING + HbmPlayerProps props = HbmPlayerProps.getData(player); + props.setKeyPressed(key, state); + + // ITEM HANDLING + ItemStack held = player.getHeldItem(); + if(held != null && held.getItem() instanceof IKeybindReceiver) { + ((IKeybindReceiver) held.getItem()).handleKeybind(player, held, key, state); + } + } +} diff --git a/src/main/java/com/hbm/handler/WeaponAbility.java b/src/main/java/com/hbm/handler/WeaponAbility.java index 11e2621b3..46025acce 100644 --- a/src/main/java/com/hbm/handler/WeaponAbility.java +++ b/src/main/java/com/hbm/handler/WeaponAbility.java @@ -4,8 +4,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.items.ModItems; import com.hbm.items.tool.IItemAbility; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.util.ContaminationUtil; diff --git a/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java b/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java index 5dac19082..b355567bf 100644 --- a/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java @@ -14,8 +14,8 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ItemAmmoEnums.*; import com.hbm.items.ModItems; import com.hbm.lib.Library; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorRegistry; import com.hbm.util.ArmorRegistry.HazardClass; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun12GaugeFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun12GaugeFactory.java index 0bb1f6103..a6d351802 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun12GaugeFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun12GaugeFactory.java @@ -11,8 +11,8 @@ import com.hbm.items.ModItems; import com.hbm.lib.HbmCollection; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.main.ResourceManager; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun44MagnumFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun44MagnumFactory.java index 9f7a5aca7..98ac02468 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun44MagnumFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun44MagnumFactory.java @@ -17,8 +17,8 @@ import com.hbm.lib.HbmCollection; import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.lib.HbmCollection.EnumGunManufacturer; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun4GaugeFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun4GaugeFactory.java index 786346617..80dd4fc6d 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun4GaugeFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun4GaugeFactory.java @@ -19,8 +19,8 @@ import com.hbm.lib.HbmCollection; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.main.ResourceManager; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java index 847a3f3ab..ac04b5aa4 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java @@ -14,8 +14,8 @@ import com.hbm.items.ItemAmmoEnums.AmmoLunaticSniper; import com.hbm.lib.HbmCollection; import com.hbm.lib.RefStrings; import com.hbm.lib.HbmCollection.EnumGunManufacturer; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java index 4c0f19804..34c25392a 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java @@ -12,8 +12,8 @@ import com.hbm.items.ItemAmmoEnums.Ammo556mm; import com.hbm.items.ModItems; import com.hbm.lib.HbmCollection; import com.hbm.lib.HbmCollection.EnumGunManufacturer; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java index 47ae1fb7d..8362c2605 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java @@ -10,8 +10,8 @@ import com.hbm.items.ModItems; import com.hbm.lib.HbmCollection; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; diff --git a/src/main/java/com/hbm/handler/guncfg/GunDetonatorFactory.java b/src/main/java/com/hbm/handler/guncfg/GunDetonatorFactory.java index 2d76d18e6..f5b88310c 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunDetonatorFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunDetonatorFactory.java @@ -11,7 +11,7 @@ import com.hbm.main.MainRegistry; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.render.util.RenderScreenOverlay.Crosshair; import com.hbm.util.ChatBuilder; diff --git a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java index 0ea31f450..ed16b5fa1 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java @@ -19,9 +19,9 @@ import com.hbm.items.ModItems; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.ExplosionKnockbackPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.packet.toclient.ExplosionKnockbackPacket; import com.hbm.potion.HbmPotion; import com.hbm.render.util.RenderScreenOverlay.Crosshair; import com.hbm.tileentity.IRepairable; diff --git a/src/main/java/com/hbm/handler/guncfg/GunFatmanFactory.java b/src/main/java/com/hbm/handler/guncfg/GunFatmanFactory.java index 5ed0b21db..123d99d7e 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunFatmanFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunFatmanFactory.java @@ -17,8 +17,8 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; import com.hbm.items.ItemAmmoEnums.AmmoFatman; import com.hbm.lib.HbmCollection.EnumGunManufacturer; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.util.RenderScreenOverlay.Crosshair; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/handler/guncfg/GunGrenadeFactory.java b/src/main/java/com/hbm/handler/guncfg/GunGrenadeFactory.java index 1d7f84c1f..2aa52a588 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunGrenadeFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunGrenadeFactory.java @@ -12,8 +12,8 @@ import com.hbm.items.ItemAmmoEnums.AmmoGrenade; import com.hbm.lib.HbmCollection; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.main.ResourceManager; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.render.anim.HbmAnimations.AnimType; diff --git a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java index d7fff5e2b..2bdf1cb63 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java @@ -12,8 +12,8 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.BobMathUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java b/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java index 161dd5522..e09d50209 100644 --- a/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java +++ b/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java @@ -5,8 +5,8 @@ import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; import com.hbm.config.RadiationConfig; -import com.hbm.packet.AuxParticlePacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.material.Material; diff --git a/src/main/java/com/hbm/hazard/type/HazardTypeHydroactive.java b/src/main/java/com/hbm/hazard/type/HazardTypeHydroactive.java index f7d6a3c49..a716f925c 100644 --- a/src/main/java/com/hbm/hazard/type/HazardTypeHydroactive.java +++ b/src/main/java/com/hbm/hazard/type/HazardTypeHydroactive.java @@ -6,6 +6,7 @@ import com.hbm.config.RadiationConfig; import com.hbm.hazard.modifier.HazardModifier; import com.hbm.util.I18nUtil; +import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -32,7 +33,7 @@ public class HazardTypeHydroactive extends HazardTypeBase { if(RadiationConfig.disableHydro) return; - if(item.isWet()) { + if(item.isWet() || item.worldObj.getBlock((int) Math.floor(item.posX), (int) Math.floor(item.posY), (int) Math.floor(item.posZ)).getMaterial() == Material.water) { item.setDead(); item.worldObj.newExplosion(null, item.posX, item.posY + item.height * 0.5, item.posZ, level, false, true); } diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index 85a43f6bf..c2f5914db 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -116,10 +116,17 @@ public class RecipesCommon { this.stacksize = 1; return; } - this.item = stack.getItem(); - if(this.item == null) this.item = ModItems.nothing; //i'm going to bash some fuckard's head in - this.stacksize = stack.stackSize; - this.meta = stack.getItemDamage(); + try { + this.item = stack.getItem(); + if(this.item == null) this.item = ModItems.nothing; //i'm going to bash some fuckard's head in + this.stacksize = stack.stackSize; + this.meta = stack.getItemDamage(); + } catch(Exception ex) { + this.item = ModItems.nothing; + if(!GeneralConfig.enableSilentCompStackErrors) { + ex.printStackTrace(); + } + } } public ComparableStack makeSingular() { diff --git a/src/main/java/com/hbm/inventory/gui/GUIAnvil.java b/src/main/java/com/hbm/inventory/gui/GUIAnvil.java index 2b9bbe7ea..5ad9b2944 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAnvil.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAnvil.java @@ -17,8 +17,8 @@ import com.hbm.inventory.recipes.anvil.AnvilRecipes; import com.hbm.inventory.recipes.anvil.AnvilRecipes.AnvilConstructionRecipe; import com.hbm.inventory.recipes.anvil.AnvilRecipes.AnvilOutput; import com.hbm.lib.RefStrings; -import com.hbm.packet.AnvilCraftPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AnvilCraftPacket; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; diff --git a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java index e739e81d6..bba645724 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerBarrel; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.storage.TileEntityBarrel; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUICombustionEngine.java b/src/main/java/com/hbm/inventory/gui/GUICombustionEngine.java index dc8f89785..d75127785 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICombustionEngine.java +++ b/src/main/java/com/hbm/inventory/gui/GUICombustionEngine.java @@ -9,8 +9,8 @@ import com.hbm.inventory.fluid.trait.FT_Combustible; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPistons.EnumPistonType; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineCombustionEngine; import com.hbm.util.EnumUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUICompressor.java b/src/main/java/com/hbm/inventory/gui/GUICompressor.java index 66e72609b..9e2d4aa51 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICompressor.java +++ b/src/main/java/com/hbm/inventory/gui/GUICompressor.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCompressor; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineCompressor; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java index e8ac99bda..89502cc38 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java @@ -6,8 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCoreEmitter; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityCoreEmitter; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java b/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java index 99c6fb2be..30ec1aa1d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java @@ -6,8 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCoreStabilizer; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityCoreStabilizer; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java b/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java index b4c4dd7b2..6a066a684 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java +++ b/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java @@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCounterTorch; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityRadioTorchCounter; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java b/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java index e2faf5fa4..80dc88555 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneBoxer; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityCraneBoxer; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java index e6937c829..7e8f74ab0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java @@ -6,8 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneExtractor; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityCraneExtractor; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java b/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java index ef1465205..6bff412fc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java @@ -6,8 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneGrabber; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityCraneGrabber; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java index f378237df..77798355b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java @@ -8,8 +8,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneRouter; import com.hbm.lib.RefStrings; import com.hbm.module.ModulePatternMatcher; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityCraneRouter; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIDroneCrate.java b/src/main/java/com/hbm/inventory/gui/GUIDroneCrate.java index cd99405b4..4e98d7c4a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIDroneCrate.java +++ b/src/main/java/com/hbm/inventory/gui/GUIDroneCrate.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerDroneCrate; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityDroneCrate; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java index 914228045..32a547130 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java +++ b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserFluid.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerElectrolyserFluid; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityElectrolyser; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java index 3e4eabfd9..670acabb0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java +++ b/src/main/java/com/hbm/inventory/gui/GUIElectrolyserMetal.java @@ -8,8 +8,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerElectrolyserMetal; import com.hbm.inventory.material.Mats; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityElectrolyser; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIFEL.java b/src/main/java/com/hbm/inventory/gui/GUIFEL.java index 890cb3299..443c01cac 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFEL.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFEL.java @@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerFEL; import com.hbm.items.machine.ItemFELCrystal.EnumWavelengths; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityFEL; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIForceField.java b/src/main/java/com/hbm/inventory/gui/GUIForceField.java index 506541074..e18aca9f1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIForceField.java +++ b/src/main/java/com/hbm/inventory/gui/GUIForceField.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerForceField; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityForceField; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIFunnel.java b/src/main/java/com/hbm/inventory/gui/GUIFunnel.java index 817be3b10..80fd75371 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFunnel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFunnel.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerFunnel; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineFunnel; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIHadron.java b/src/main/java/com/hbm/inventory/gui/GUIHadron.java index b39db1804..92d97a872 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIHadron.java +++ b/src/main/java/com/hbm/inventory/gui/GUIHadron.java @@ -8,8 +8,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerHadron; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityHadron; import com.hbm.tileentity.machine.TileEntityHadron.EnumHadronState; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIHeaterHeatex.java b/src/main/java/com/hbm/inventory/gui/GUIHeaterHeatex.java index a5a2a781f..d4eefef9a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIHeaterHeatex.java +++ b/src/main/java/com/hbm/inventory/gui/GUIHeaterHeatex.java @@ -8,8 +8,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerHeaterHeatex; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityHeaterHeatex; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIITER.java b/src/main/java/com/hbm/inventory/gui/GUIITER.java index 4e9b1d85c..27f78ff5d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIITER.java +++ b/src/main/java/com/hbm/inventory/gui/GUIITER.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerITER; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityITER; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java b/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java index a90bd4799..d3bf1c87f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java +++ b/src/main/java/com/hbm/inventory/gui/GUILaunchPadRusted.java @@ -10,8 +10,8 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.container.ContainerLaunchPadRusted; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.render.item.ItemRenderMissileGeneric; import com.hbm.tileentity.bomb.TileEntityLaunchPadRusted; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnaceLarge.java b/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnaceLarge.java index f1fdb4d91..7e50956a2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnaceLarge.java @@ -11,8 +11,8 @@ import com.hbm.inventory.container.ContainerMachineArcFurnaceLarge; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java index 11480d37d..2fa8c4bbe 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java @@ -14,8 +14,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineBattery; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java b/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java index 4b78d4aa5..fe81cccba 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineExcavator; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineExcavator; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java b/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java index 54ddb47e9..9ef320390 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineFluidTank; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.storage.TileEntityMachineFluidTank; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java b/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java index abcc30b6e..eca4887c6 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java @@ -5,8 +5,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineGasFlare; import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.oil.TileEntityMachineGasFlare; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java b/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java index c5373d331..975fb7ad1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java @@ -6,8 +6,8 @@ import com.hbm.inventory.container.ContainerLaunchTable; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.render.util.MissileMultipart; import com.hbm.render.util.MissilePronter; import com.hbm.tileentity.bomb.TileEntityLaunchTable; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineMissileAssembly.java b/src/main/java/com/hbm/inventory/gui/GUIMachineMissileAssembly.java index c40100afa..d8aec81b6 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineMissileAssembly.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineMissileAssembly.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineMissileAssembly; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.render.util.MissileMultipart; import com.hbm.render.util.MissilePart; import com.hbm.render.util.MissilePronter; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java index 68fd71f77..43fd1ba61 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java @@ -5,8 +5,8 @@ import java.util.Arrays; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 310bc7db0..fe6ecbdea 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -11,8 +11,8 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.trait.FT_Combustible; import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineTurbineGas; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java b/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java index 977f11d20..659febdab 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java @@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineWoodBurner; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineWoodBurner; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMassStorage.java b/src/main/java/com/hbm/inventory/gui/GUIMassStorage.java index dfa413f97..08d74a6c3 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMassStorage.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMassStorage.java @@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMassStorage; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.storage.TileEntityMassStorage; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMicrowave.java b/src/main/java/com/hbm/inventory/gui/GUIMicrowave.java index bc64a398e..13a3ac0f7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMicrowave.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMicrowave.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMicrowave; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityMicrowave; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java b/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java index 79681e6f8..6f5441984 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMiningLaser; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntityMachineMiningLaser; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMixer.java b/src/main/java/com/hbm/inventory/gui/GUIMixer.java index 79f6461d6..974e41635 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMixer.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMixer.java @@ -9,8 +9,8 @@ import com.hbm.inventory.container.ContainerMixer; import com.hbm.inventory.recipes.MixerRecipes; import com.hbm.inventory.recipes.MixerRecipes.MixerRecipe; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineMixer; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java index b03155b93..a3147d449 100644 --- a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java +++ b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java @@ -6,8 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerNukeFstbmb; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.bomb.TileEntityNukeBalefire; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIOilburner.java b/src/main/java/com/hbm/inventory/gui/GUIOilburner.java index 8d040b03f..d93949e1a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIOilburner.java +++ b/src/main/java/com/hbm/inventory/gui/GUIOilburner.java @@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerOilburner; import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityHeaterOilburner; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index db21f4194..3220d178b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -9,8 +9,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPWR; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.render.util.GaugeUtil; import com.hbm.tileentity.machine.TileEntityPWRController; diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKBoiler.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKBoiler.java index 0b32f00e1..8a645908c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKBoiler.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKBoiler.java @@ -6,8 +6,8 @@ import com.hbm.inventory.container.ContainerRBMKGeneric; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBoiler; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java index b07d3a19c..7867f1bc2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java @@ -11,8 +11,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.RBMKColumn; diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKControl.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKControl.java index fecf9b8e3..b1c8f415e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKControl.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKControl.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerRBMKControl; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java index 13ce7330f..acb1efae1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java @@ -6,8 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerRBMKControlAuto; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlAuto; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java b/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java index f9014122c..c1fb2b367 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java @@ -6,8 +6,8 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityRadioRec; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java b/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java index b141317da..b44711ee5 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java @@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerReactorControl; import com.hbm.lib.RefStrings; import com.hbm.module.NumberDisplay; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityReactorControl; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java b/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java index e02d155a5..e8d13b703 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java @@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerReactorResearch; import com.hbm.lib.RefStrings; import com.hbm.module.NumberDisplay; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityReactorResearch; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java b/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java index f09558da7..be0312a00 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorZirnox.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerReactorZirnox; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityReactorZirnox; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUISILEX.java b/src/main/java/com/hbm/inventory/gui/GUISILEX.java index 64b9f36bd..b36c07fcd 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISILEX.java +++ b/src/main/java/com/hbm/inventory/gui/GUISILEX.java @@ -10,8 +10,8 @@ import com.hbm.inventory.recipes.SILEXRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFELCrystal.EnumWavelengths; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntitySILEX; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenBobmazon.java b/src/main/java/com/hbm/inventory/gui/GUIScreenBobmazon.java index a96b12b6a..14ed3b483 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenBobmazon.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenBobmazon.java @@ -9,8 +9,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.ItemBobmazonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.ItemBobmazonPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenDesignator.java b/src/main/java/com/hbm/inventory/gui/GUIScreenDesignator.java index 67cae4179..7f9c35ac9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenDesignator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenDesignator.java @@ -8,8 +8,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; -import com.hbm.packet.ItemDesignatorPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.ItemDesignatorPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java index e72526ced..e25744def 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java @@ -12,8 +12,8 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFluidIDMulti; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTItemControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTItemControlPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java index fc90751df..1f879d0a7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java @@ -6,8 +6,8 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityRadioTorchBase; import com.hbm.tileentity.network.TileEntityRadioTorchSender; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java index c78ea3061..11b38f125 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java @@ -7,8 +7,8 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityRadioTorchLogic; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java index af560d0d9..e7f4fe2bb 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java @@ -8,7 +8,7 @@ import com.hbm.items.ISatChip; import com.hbm.items.tool.ItemSatInterface; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.SatCoordPacket; +import com.hbm.packet.toserver.SatCoordPacket; import com.hbm.saveddata.satellites.Satellite.CoordActions; import com.hbm.saveddata.satellites.Satellite.Interfaces; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSatInterface.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSatInterface.java index 392f620f9..bba6b5b4f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenSatInterface.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSatInterface.java @@ -10,7 +10,7 @@ import com.hbm.items.ISatChip; import com.hbm.items.tool.ItemSatInterface; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.SatLaserPacket; +import com.hbm.packet.toserver.SatLaserPacket; import com.hbm.saveddata.satellites.Satellite.InterfaceActions; import com.hbm.saveddata.satellites.Satellite.Interfaces; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index f58519d0a..a91652ef0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -24,8 +24,8 @@ import com.hbm.items.machine.ItemStamp; import com.hbm.items.machine.ItemStamp.StampType; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.ItemFolderPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.ItemFolderPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; diff --git a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java index 644f6eff6..a1fdb30cc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java +++ b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerSoyuzLauncher; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntitySoyuzLauncher; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretArty.java b/src/main/java/com/hbm/inventory/gui/GUITurretArty.java index f53a71a13..04b188f14 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretArty.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretArty.java @@ -1,8 +1,8 @@ package com.hbm.inventory.gui; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.turret.TileEntityTurretArty; import com.hbm.tileentity.turret.TileEntityTurretBaseNT; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretBase.java b/src/main/java/com/hbm/inventory/gui/GUITurretBase.java index c4c79e551..c5964c108 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretBase.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretBase.java @@ -8,9 +8,9 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.turret.TileEntityTurretBaseNT; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java b/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java index 1458112b9..2ca5524f1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java @@ -1,8 +1,8 @@ package com.hbm.inventory.gui; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.turret.TileEntityTurretBaseNT; import com.hbm.tileentity.turret.TileEntityTurretHIMARS; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIWatz.java b/src/main/java/com/hbm/inventory/gui/GUIWatz.java index c22046d29..cf190b93e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIWatz.java +++ b/src/main/java/com/hbm/inventory/gui/GUIWatz.java @@ -6,8 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerWatz; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.render.util.GaugeUtil; import com.hbm.render.util.GaugeUtil.Gauge; import com.hbm.tileentity.machine.TileEntityWatz; diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index bec49c8d3..d58fa3c3c 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -7,8 +7,9 @@ import codechicken.nei.api.INEIGuiHandler; import codechicken.nei.api.TaggedInventoryArea; import com.hbm.inventory.SlotPattern; import com.hbm.inventory.container.ContainerBase; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; + import cpw.mods.fml.common.Optional; import net.minecraft.item.Item; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/inventory/gui/GuiScreenRadioTelex.java b/src/main/java/com/hbm/inventory/gui/GuiScreenRadioTelex.java index 316c6e9fb..c406fd3c9 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiScreenRadioTelex.java +++ b/src/main/java/com/hbm/inventory/gui/GuiScreenRadioTelex.java @@ -7,8 +7,8 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; -import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityRadioTelex; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/items/IKeybindReceiver.java b/src/main/java/com/hbm/items/IKeybindReceiver.java new file mode 100644 index 000000000..77ba05157 --- /dev/null +++ b/src/main/java/com/hbm/items/IKeybindReceiver.java @@ -0,0 +1,11 @@ +package com.hbm.items; + +import com.hbm.handler.HbmKeybinds.EnumKeybind; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface IKeybindReceiver { + + public void handleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind, boolean state); +} diff --git a/src/main/java/com/hbm/items/ISyncButtons.java b/src/main/java/com/hbm/items/ISyncButtons.java deleted file mode 100644 index e06e3e78c..000000000 --- a/src/main/java/com/hbm/items/ISyncButtons.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.items; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.client.event.MouseEvent; - -public interface ISyncButtons { - - public boolean canReceiveMouse(EntityPlayer player, ItemStack stack, MouseEvent event, int button, boolean buttonstate); - public void receiveMouse(EntityPlayer player, ItemStack stack, int button, boolean buttonstate); -} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 1685902ee..4e4fffd1f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -36,7 +36,7 @@ import com.hbm.items.weapon.ItemCustomMissilePart.*; import com.hbm.items.weapon.ItemMissile.MissileFormFactor; import com.hbm.items.weapon.ItemMissile.MissileFuel; import com.hbm.items.weapon.ItemMissile.MissileTier; -import com.hbm.items.weapon.gununified.ItemEnergyGunBase; +import com.hbm.items.weapon.sedna.GunFactory; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.potion.HbmPotion; @@ -1612,11 +1612,9 @@ public class ModItems { public static Item gun_m2; public static Item gun_lunatic_marksman; public static Item gun_uac_pistol; - - // We'll figure this part out later - //public static Item gun_llr, gun_mlr, gun_hlr, gun_twr, gun_lunatic, gun_lunatic_shotty; - //public static Item gun_uac_pistol, gun_uac_dmr, gun_uac_carbine, gun_uac_lmg; - //public static Item gun_benelli, gun_benelli_mod, gun_g36, spear_bishamonten, pagoda; + + public static Item gun_debug; + public static Item ammo_debug; public static Item crucible; @@ -5474,6 +5472,8 @@ public class ModItems { mysteryshovel = new ItemMS().setUnlocalizedName("mysteryshovel").setFull3D().setMaxStackSize(1).setTextureName(RefStrings.MODID + ":cursed_shovel"); memory = new ItemBattery(Long.MAX_VALUE / 100L, 100000000000000L, 100000000000000L).setUnlocalizedName("memory").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":mo8_anim"); + GunFactory.init(); + FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.mud_fluid, 1000), new ItemStack(ModItems.bucket_mud), new ItemStack(Items.bucket)); FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.acid_fluid, 1000), new ItemStack(ModItems.bucket_acid), new ItemStack(Items.bucket)); FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.toxic_fluid, 1000), new ItemStack(ModItems.bucket_toxic), new ItemStack(Items.bucket)); @@ -7012,6 +7012,9 @@ public class ModItems { GameRegistry.registerItem(gun_glass_cannon, gun_glass_cannon.getUnlocalizedName()); GameRegistry.registerItem(gun_lunatic_marksman, gun_lunatic_marksman.getUnlocalizedName()); + GameRegistry.registerItem(gun_debug, gun_debug.getUnlocalizedName()); + GameRegistry.registerItem(ammo_debug, ammo_debug.getUnlocalizedName()); + //Ammo GameRegistry.registerItem(gun_b92_ammo, gun_b92_ammo.getUnlocalizedName()); GameRegistry.registerItem(gun_xvl1456_ammo, gun_xvl1456_ammo.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java b/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java index 5882236e7..5702fed77 100644 --- a/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java +++ b/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java @@ -3,8 +3,8 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.extprop.HbmPlayerProps; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.model.ModelArmorBJ; import com.hbm.util.ArmorUtil; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/items/armor/ArmorDNT.java b/src/main/java/com/hbm/items/armor/ArmorDNT.java index 068ae49f1..88e9d3773 100644 --- a/src/main/java/com/hbm/items/armor/ArmorDNT.java +++ b/src/main/java/com/hbm/items/armor/ArmorDNT.java @@ -6,8 +6,8 @@ import java.util.UUID; import com.google.common.collect.Multimap; import com.hbm.extprop.HbmPlayerProps; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.model.ModelArmorDNT; import com.hbm.util.ArmorUtil; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/items/armor/ArmorDiesel.java b/src/main/java/com/hbm/items/armor/ArmorDiesel.java index e42510fc3..2bc61d99c 100644 --- a/src/main/java/com/hbm/items/armor/ArmorDiesel.java +++ b/src/main/java/com/hbm/items/armor/ArmorDiesel.java @@ -6,8 +6,8 @@ import com.hbm.handler.ArmorModHandler; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.model.ModelArmorDiesel; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/items/armor/ItemModKnife.java b/src/main/java/com/hbm/items/armor/ItemModKnife.java index 9d61d7e2e..0c49f092f 100644 --- a/src/main/java/com/hbm/items/armor/ItemModKnife.java +++ b/src/main/java/com/hbm/items/armor/ItemModKnife.java @@ -5,8 +5,8 @@ import java.util.UUID; import com.hbm.handler.ArmorModHandler; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/com/hbm/items/armor/ItemModLens.java b/src/main/java/com/hbm/items/armor/ItemModLens.java index a9df9cfff..7aeafb941 100644 --- a/src/main/java/com/hbm/items/armor/ItemModLens.java +++ b/src/main/java/com/hbm/items/armor/ItemModLens.java @@ -5,8 +5,8 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.handler.ArmorModHandler; import com.hbm.items.ISatChip; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.saveddata.SatelliteSavedData; import com.hbm.saveddata.satellites.Satellite; import com.hbm.saveddata.satellites.SatelliteScanner; diff --git a/src/main/java/com/hbm/items/armor/JetpackBooster.java b/src/main/java/com/hbm/items/armor/JetpackBooster.java index 09b90947b..f3dbc31bb 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBooster.java +++ b/src/main/java/com/hbm/items/armor/JetpackBooster.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.extprop.HbmPlayerProps; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/items/armor/JetpackBreak.java b/src/main/java/com/hbm/items/armor/JetpackBreak.java index 340fd2f09..f92b8798b 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBreak.java +++ b/src/main/java/com/hbm/items/armor/JetpackBreak.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.extprop.HbmPlayerProps; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/items/armor/JetpackRegular.java b/src/main/java/com/hbm/items/armor/JetpackRegular.java index cbf04933b..9e23c4375 100644 --- a/src/main/java/com/hbm/items/armor/JetpackRegular.java +++ b/src/main/java/com/hbm/items/armor/JetpackRegular.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.extprop.HbmPlayerProps; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/items/armor/JetpackVectorized.java b/src/main/java/com/hbm/items/armor/JetpackVectorized.java index d95312f80..1017fd2a4 100644 --- a/src/main/java/com/hbm/items/armor/JetpackVectorized.java +++ b/src/main/java/com/hbm/items/armor/JetpackVectorized.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.extprop.HbmPlayerProps; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/items/food/ItemLemon.java b/src/main/java/com/hbm/items/food/ItemLemon.java index 17499655c..032fbf61a 100644 --- a/src/main/java/com/hbm/items/food/ItemLemon.java +++ b/src/main/java/com/hbm/items/food/ItemLemon.java @@ -3,8 +3,8 @@ package com.hbm.items.food; import java.util.List; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/items/machine/ItemFluidIDMulti.java b/src/main/java/com/hbm/items/machine/ItemFluidIDMulti.java index 612eb8442..0592359de 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidIDMulti.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidIDMulti.java @@ -8,7 +8,7 @@ import com.hbm.inventory.gui.GUIScreenFluid; import com.hbm.items.IItemControlReceiver; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.util.ChatBuilder; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/items/special/ItemCigarette.java b/src/main/java/com/hbm/items/special/ItemCigarette.java index 092885af4..b38fd2d29 100644 --- a/src/main/java/com/hbm/items/special/ItemCigarette.java +++ b/src/main/java/com/hbm/items/special/ItemCigarette.java @@ -5,8 +5,8 @@ import java.util.List; import com.hbm.extprop.HbmLivingProps; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/items/tool/ItemBlowtorch.java b/src/main/java/com/hbm/items/tool/ItemBlowtorch.java index e690582c0..57698b4a0 100644 --- a/src/main/java/com/hbm/items/tool/ItemBlowtorch.java +++ b/src/main/java/com/hbm/items/tool/ItemBlowtorch.java @@ -8,8 +8,8 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IToolable; import api.hbm.block.IToolable.ToolType; diff --git a/src/main/java/com/hbm/items/tool/ItemBoltgun.java b/src/main/java/com/hbm/items/tool/ItemBoltgun.java index 0b4ef3dd2..16eb83a0b 100644 --- a/src/main/java/com/hbm/items/tool/ItemBoltgun.java +++ b/src/main/java/com/hbm/items/tool/ItemBoltgun.java @@ -5,8 +5,8 @@ import com.hbm.items.IAnimatedItem; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.util.EntityDamageUtil; diff --git a/src/main/java/com/hbm/items/tool/ItemChainsaw.java b/src/main/java/com/hbm/items/tool/ItemChainsaw.java index a2d4dfb38..b20f5ba3b 100644 --- a/src/main/java/com/hbm/items/tool/ItemChainsaw.java +++ b/src/main/java/com/hbm/items/tool/ItemChainsaw.java @@ -2,8 +2,8 @@ package com.hbm.items.tool; import com.hbm.inventory.fluid.FluidType; import com.hbm.items.IHeldSoundProvider; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayerMP; diff --git a/src/main/java/com/hbm/items/tool/ItemLaserDetonator.java b/src/main/java/com/hbm/items/tool/ItemLaserDetonator.java index 4fee946c8..eddb41ace 100644 --- a/src/main/java/com/hbm/items/tool/ItemLaserDetonator.java +++ b/src/main/java/com/hbm/items/tool/ItemLaserDetonator.java @@ -11,7 +11,7 @@ import com.hbm.interfaces.IHoldableWeapon; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.render.util.RenderScreenOverlay.Crosshair; import com.hbm.util.ChatBuilder; diff --git a/src/main/java/com/hbm/items/tool/ItemOilDetector.java b/src/main/java/com/hbm/items/tool/ItemOilDetector.java index 45d41af10..3b9cf86b7 100644 --- a/src/main/java/com/hbm/items/tool/ItemOilDetector.java +++ b/src/main/java/com/hbm/items/tool/ItemOilDetector.java @@ -5,7 +5,7 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.util.ChatBuilder; import net.minecraft.client.resources.I18n; diff --git a/src/main/java/com/hbm/items/tool/ItemOreDensityScanner.java b/src/main/java/com/hbm/items/tool/ItemOreDensityScanner.java index 12483fac7..5fd3ac58f 100644 --- a/src/main/java/com/hbm/items/tool/ItemOreDensityScanner.java +++ b/src/main/java/com/hbm/items/tool/ItemOreDensityScanner.java @@ -3,7 +3,7 @@ package com.hbm.items.tool; import com.hbm.items.special.ItemBedrockOreBase; import com.hbm.items.special.ItemBedrockOreNew.BedrockOreType; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.util.ChatBuilder; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java b/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java index 1776249cf..c83ca9459 100644 --- a/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java +++ b/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java @@ -4,7 +4,7 @@ import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionData; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.util.ChatBuilder; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java b/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java index a5907f3f5..660c0ed82 100644 --- a/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java +++ b/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java @@ -3,8 +3,8 @@ package com.hbm.items.tool; import java.util.List; import com.hbm.blocks.BlockDummyable; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ChatBuilder; import com.hbm.util.fauxpointtwelve.BlockPos; diff --git a/src/main/java/com/hbm/items/tool/ItemSatInterface.java b/src/main/java/com/hbm/items/tool/ItemSatInterface.java index f67a8cc9e..512bfcc72 100644 --- a/src/main/java/com/hbm/items/tool/ItemSatInterface.java +++ b/src/main/java/com/hbm/items/tool/ItemSatInterface.java @@ -6,7 +6,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemSatChip; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.SatPanelPacket; +import com.hbm.packet.toclient.SatPanelPacket; import com.hbm.saveddata.SatelliteSavedData; import com.hbm.saveddata.satellites.Satellite; import com.hbm.tileentity.IGUIProvider; diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index 43b6c885e..99ce2d356 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -13,7 +13,7 @@ import com.hbm.handler.ToolAbility; import com.hbm.handler.ToolAbility.*; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.util.ChatBuilder; import com.hbm.handler.WeaponAbility; diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index d6482e22f..0014cb736 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -23,8 +23,8 @@ import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.particle.helper.ExplosionCreator; diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java index 61ad4299d..f50d3ba0f 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -15,8 +15,8 @@ import com.hbm.explosion.vanillant.standard.EntityProcessorCross; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.helper.ExplosionCreator; import com.hbm.potion.HbmPotion; diff --git a/src/main/java/com/hbm/items/weapon/ItemCrucible.java b/src/main/java/com/hbm/items/weapon/ItemCrucible.java index 0fbfb1a64..14e0818cf 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCrucible.java +++ b/src/main/java/com/hbm/items/weapon/ItemCrucible.java @@ -6,8 +6,8 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.hbm.items.IEquipReceiver; import com.hbm.items.tool.ItemSwordAbility; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ShadyUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/items/weapon/ItemCryoCannon.java b/src/main/java/com/hbm/items/weapon/ItemCryoCannon.java index 6a69055ab..4831b4556 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCryoCannon.java +++ b/src/main/java/com/hbm/items/weapon/ItemCryoCannon.java @@ -5,8 +5,8 @@ import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.GunConfiguration; import com.hbm.inventory.fluid.Fluids; -import com.hbm.packet.GunAnimationPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.GunAnimationPacket; import com.hbm.render.anim.HbmAnimations.AnimType; import net.minecraft.enchantment.Enchantment; diff --git a/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java b/src/main/java/com/hbm/items/weapon/ItemEnergyGunBase.java similarity index 95% rename from src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java rename to src/main/java/com/hbm/items/weapon/ItemEnergyGunBase.java index 554f5a6ea..ffbc0388d 100644 --- a/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java +++ b/src/main/java/com/hbm/items/weapon/ItemEnergyGunBase.java @@ -1,4 +1,4 @@ -package com.hbm.items.weapon.gununified; +package com.hbm.items.weapon; import java.util.List; @@ -9,10 +9,9 @@ import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.GunConfiguration; import com.hbm.interfaces.IHoldableWeapon; -import com.hbm.items.weapon.ItemGunBase; -import com.hbm.packet.GunAnimationPacket; -import com.hbm.packet.GunButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.GunAnimationPacket; +import com.hbm.packet.toserver.GunButtonPacket; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/items/weapon/ItemGunBase.java b/src/main/java/com/hbm/items/weapon/ItemGunBase.java index e40e9889c..56e9d3be8 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunBase.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunBase.java @@ -19,10 +19,10 @@ import com.hbm.items.IEquipReceiver; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; import com.hbm.lib.HbmCollection; -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.GunAnimationPacket; -import com.hbm.packet.GunButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.packet.toclient.GunAnimationPacket; +import com.hbm.packet.toserver.GunButtonPacket; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay; diff --git a/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java index 110ed0f3e..3a9ec6fba 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java @@ -10,8 +10,8 @@ import com.hbm.interfaces.IHoldableWeapon; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.machine.ItemFluidIcon; -import com.hbm.packet.GunAnimationPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.GunAnimationPacket; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/items/weapon/ItemGunGauss.java b/src/main/java/com/hbm/items/weapon/ItemGunGauss.java index 7dd20b1a0..b3c7e83c0 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunGauss.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunGauss.java @@ -5,8 +5,8 @@ import com.hbm.handler.GunConfiguration; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.GunAnimationPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.GunAnimationPacket; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.sound.AudioWrapper; diff --git a/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java b/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java deleted file mode 100644 index 38b210a38..000000000 --- a/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.hbm.items.weapon; - -import java.util.List; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.Fluids; -import com.hbm.items.ISyncButtons; -import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.PacketDispatcher; - -import api.hbm.fluid.IFillableItem; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.client.event.MouseEvent; - -public class ItemPlasmaSpear extends Item implements IFillableItem, ISyncButtons { - - public static final int maxFuel = 3_000; - - @Override - public boolean showDurabilityBar(ItemStack stack) { - return getFill(stack) < maxFuel; - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - return 1 - (double) getFill(stack) / (double) maxFuel; - } - - @Override - public int getFill(ItemStack stack) { - if(stack.stackTagCompound == null) { - stack.stackTagCompound = new NBTTagCompound(); - setFill(stack, maxFuel); - return maxFuel; - } - - return stack.stackTagCompound.getInteger("fuel"); - } - - public void setFill(ItemStack stack, int fill) { - if(stack.stackTagCompound == null) { - stack.stackTagCompound = new NBTTagCompound(); - } - - stack.stackTagCompound.setInteger("fuel", fill); - } - - public static ItemStack getEmptyTool(Item item) { - ItemPlasmaSpear tool = (ItemPlasmaSpear) item; - ItemStack stack = new ItemStack(item); - tool.setFill(stack, 0); - return stack; - } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - - if(world.isRemote) return stack; - - if(!stack.hasTagCompound()) { - stack.stackTagCompound = new NBTTagCompound(); - } - - stack.stackTagCompound.setBoolean("melee", !stack.stackTagCompound.getBoolean("melee")); - world.playSoundAtEntity(player, "random.orb", 0.25F, 1.25F); - - return stack; - } - - @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { - - if(stack.hasTagCompound() && !stack.stackTagCompound.getBoolean("melee")) { - return true; //cancel hitting, it's ranged - } - - return false; - } - - @Override - public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { - - if(!(entityLiving instanceof EntityPlayerMP)) - return false; - - if(getFill(stack) <= 0) - return false; - - if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) { - return true; //cancel hitting, it's ranged - } - - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setString("type", "anim"); - nbt.setString("mode", "lSwing"); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); - - return false; - } - - @Override - public boolean canReceiveMouse(EntityPlayer player, ItemStack stack, MouseEvent event, int button, boolean buttonstate) { - - if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) { - return false; - } - - if(button == 0) { - event.setCanceled(true); - return true; - } - - return false; - } - - @Override - public void receiveMouse(EntityPlayer player, ItemStack stack, int button, boolean buttonstate) { - Vec3 start = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight() - player.yOffset, player.posZ); - Vec3 look = player.getLookVec(); - Vec3 end = start.addVector(look.xCoord * 100, look.yCoord * 100, look.zCoord * 100); - - List targets = player.worldObj.getEntitiesWithinAABBExcludingEntity(player, AxisAlignedBB.getBoundingBox( - Math.min(start.xCoord, end.xCoord), - Math.min(start.yCoord, end.yCoord), - Math.min(start.zCoord, end.zCoord), - Math.max(start.xCoord, end.xCoord), - Math.max(start.yCoord, end.yCoord), - Math.max(start.zCoord, end.zCoord) - )); - - for(Entity target : targets) { - - AxisAlignedBB aabb = target.boundingBox; - MovingObjectPosition hitMop = aabb.calculateIntercept(start, end); - - if(hitMop != null) { - target.attackEntityFrom(new EntityDamageSource(ModDamageSource.s_laser, player).setDamageBypassesArmor(), 15F); - } - } - } - - @Override - public boolean acceptsFluid(FluidType type, ItemStack stack) { - return type == Fluids.SCHRABIDIC; - } - - @Override - public int tryFill(FluidType type, int amount, ItemStack stack) { - - int fill = this.getFill(stack); - int toFill = this.maxFuel - fill; - toFill = Math.min(toFill, amount); - toFill = Math.min(toFill, 10); - - this.setFill(stack, fill + toFill); - - return amount - toFill; - } - - @Override public boolean providesFluid(FluidType type, ItemStack stack) { return false; } - @Override public int tryEmpty(FluidType type, int amount, ItemStack stack) { return 0; } - - @Override - public FluidType getFirstFluidType(ItemStack stack) { - return Fluids.SCHRABIDIC; - } -} diff --git a/src/main/java/com/hbm/items/weapon/gununified/GunFrame.java b/src/main/java/com/hbm/items/weapon/gununified/GunFrame.java deleted file mode 100644 index ad2ab4f0d..000000000 --- a/src/main/java/com/hbm/items/weapon/gununified/GunFrame.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hbm.items.weapon.gununified; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.util.Tuple.Pair; -import com.hbm.util.Tuple.Triplet; - -import api.hbm.item.IClickReceiver; -import api.hbm.item.IGunHUDProvider; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -@Deprecated -public abstract class GunFrame extends Item implements IGunHUDProvider, IClickReceiver { - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isCurrentItem) { - - if(entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entity; - - if(world.isRemote) { - this.updatePlayerClient(stack, world, player, slot, isCurrentItem); - } else { - this.updatePlayerServer(stack, world, player, slot, isCurrentItem); - } - } - } - - public void updatePlayerClient(ItemStack stack, World world, EntityPlayer player, int slot, boolean isCurrentItem) { } - public void updatePlayerServer(ItemStack stack, World world, EntityPlayer player, int slot, boolean isCurrentItem) { } - - @Override - @SideOnly(Side.CLIENT) - public boolean handleMouseInput(ItemStack stack, EntityPlayer player, int button, boolean state) { - return false; - } - - @Override - public List> getStatusBars(ItemStack stack, EntityPlayer player) { - return new ArrayList(); - } - - @Override - public List> getAmmoInfo(ItemStack stack, EntityPlayer player) { - return null; - } - - public static double getDurabilityBar(ItemStack stack) { - return 1.0D; - } -} diff --git a/src/main/java/com/hbm/items/weapon/gununified/GunRealoadable.java b/src/main/java/com/hbm/items/weapon/gununified/GunRealoadable.java deleted file mode 100644 index d1cfc831f..000000000 --- a/src/main/java/com/hbm/items/weapon/gununified/GunRealoadable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.hbm.items.weapon.gununified; - -import org.lwjgl.input.Keyboard; - -import com.hbm.handler.HbmKeybinds; - -import api.hbm.item.IButtonReceiver; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -public class GunRealoadable extends GunFrame implements IButtonReceiver { - - private IReloadBehavior reload; - public static boolean lastReload = false; - - @Override - @SideOnly(Side.CLIENT) - public void handleKeyboardInput(ItemStack stack, EntityPlayer player) { - - boolean reload = Keyboard.isKeyDown(HbmKeybinds.reloadKey.getKeyCode()); - - if(this.reload != null) { - this.reload.tryStartReload(stack, player); - } - - lastReload = reload; - } -} diff --git a/src/main/java/com/hbm/items/weapon/gununified/IReloadBehavior.java b/src/main/java/com/hbm/items/weapon/gununified/IReloadBehavior.java deleted file mode 100644 index 1bc6e3d19..000000000 --- a/src/main/java/com/hbm/items/weapon/gununified/IReloadBehavior.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.hbm.items.weapon.gununified; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -public interface IReloadBehavior { - - public boolean tryStartReload(ItemStack stack, EntityPlayer player); - public boolean updateRelaod(ItemStack stack, EntityPlayer player); -} diff --git a/src/main/java/com/hbm/items/weapon/gununified/IStatusBarProvider.java b/src/main/java/com/hbm/items/weapon/gununified/IStatusBarProvider.java deleted file mode 100644 index 6d91fce96..000000000 --- a/src/main/java/com/hbm/items/weapon/gununified/IStatusBarProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.hbm.items.weapon.gununified; - -import java.util.List; - -import com.hbm.util.Tuple.Triplet; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -public interface IStatusBarProvider { - - public void provideBars(ItemStack stack, EntityPlayer player, List> bars); -} diff --git a/src/main/java/com/hbm/items/weapon/gununified/StatusBarDurability.java b/src/main/java/com/hbm/items/weapon/gununified/StatusBarDurability.java deleted file mode 100644 index 9a47d0664..000000000 --- a/src/main/java/com/hbm/items/weapon/gununified/StatusBarDurability.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hbm.items.weapon.gununified; - -import java.util.List; - -import com.hbm.util.Tuple.Triplet; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -public class StatusBarDurability implements IStatusBarProvider { - - @Override - public void provideBars(ItemStack stack, EntityPlayer player, List> bars) { - //TODO - } -} diff --git a/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java b/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java new file mode 100644 index 000000000..9cc858b8b --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java @@ -0,0 +1,36 @@ +package com.hbm.items.weapon.sedna; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.inventory.RecipesCommon.ComparableStack; + +import net.minecraft.item.Item; + +public class BulletConfig { + + public static List configs = new ArrayList(); + + public final int id; + + public ComparableStack ammo; + public int ammoReloadCount = 1; + public float velocity = 5F; + public float spread = 0F; + public float wear = 1F; + public int projectilesMin = 1; + public int projectilesMax = 1; + + public float damageMult = 1.0F; + public float headshotMult = 1.0F; + + public double gravity = 0; + public int expires = 100; + + public BulletConfig() { + this.id = configs.size(); + configs.add(this); + } + + public BulletConfig setItem(Item ammo) { this.ammo = new ComparableStack(ammo); return this; } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/GunConfig.java b/src/main/java/com/hbm/items/weapon/sedna/GunConfig.java new file mode 100644 index 000000000..91bdffc24 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/GunConfig.java @@ -0,0 +1,62 @@ +package com.hbm.items.weapon.sedna; + +import java.util.function.BiConsumer; + +import com.hbm.render.util.RenderScreenOverlay.Crosshair; + +import net.minecraft.item.ItemStack; + +public class GunConfig { + + /* FIELDS */ + + /** List of receivers used by the gun, primary and secondary are usually indices 0 and 1 respectively, if applicable */ + protected Receiver[] receivers; + protected float durability; + protected int drawDuration = 0; + protected Crosshair crosshair; + /** Lambda functions for clicking shit */ + protected BiConsumer onPressPrimary; + protected BiConsumer onPressSecondary; + protected BiConsumer onPressTertiary; + protected BiConsumer onPressReload; + /** Lambda functions for releasing the aforementioned shit */ + protected BiConsumer onReleasePrimary; + protected BiConsumer onReleaseSecondary; + protected BiConsumer onReleaseTertiary; + protected BiConsumer onReleaseReload; + + /* GETTERS */ + + public Receiver[] getReceivers(ItemStack stack) { return receivers; } + public float getDurability(ItemStack stack) { return durability; } + public int getDrawDuration(ItemStack stack) { return drawDuration; } + public Crosshair getCrosshair(ItemStack stack) { return crosshair; } + + public BiConsumer getPressPrimary(ItemStack stack) { return this.onPressPrimary; } + public BiConsumer getPressSecondary(ItemStack stack) { return this.onPressSecondary; } + public BiConsumer getPressTertiary(ItemStack stack) { return this.onPressTertiary; } + public BiConsumer getPressReload(ItemStack stack) { return this.onPressReload; } + + public BiConsumer getReleasePrimary(ItemStack stack) { return this.onReleasePrimary; } + public BiConsumer getReleaseSecondary(ItemStack stack) { return this.onReleaseSecondary; } + public BiConsumer getReleaseTertiary(ItemStack stack) { return this.onReleaseTertiary; } + public BiConsumer getReleaseReload(ItemStack stack) { return this.onReleaseReload; } + + /* SETTERS */ + + public GunConfig rec(Receiver... receivers) { this.receivers = receivers; return this; } + public GunConfig dura(float dura) { this.durability = dura; return this; } + public GunConfig draw(int draw) { this.drawDuration = draw; return this; } + public GunConfig crosshair(Crosshair crosshair) { this.crosshair = crosshair; return this; } + + public GunConfig pp(BiConsumer lambda) { this.onPressPrimary = lambda; return this; } + public GunConfig ps(BiConsumer lambda) { this.onPressSecondary = lambda; return this; } + public GunConfig pt(BiConsumer lambda) { this.onPressTertiary = lambda; return this; } + public GunConfig pr(BiConsumer lambda) { this.onPressReload = lambda; return this; } + + public GunConfig rp(BiConsumer lambda) { this.onReleasePrimary = lambda; return this; } + public GunConfig rs(BiConsumer lambda) { this.onReleaseSecondary = lambda; return this; } + public GunConfig rt(BiConsumer lambda) { this.onReleaseTertiary = lambda; return this; } + public GunConfig rr(BiConsumer lambda) { this.onReleaseReload = lambda; return this; } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/GunFactory.java new file mode 100644 index 000000000..d27913133 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/GunFactory.java @@ -0,0 +1,25 @@ +package com.hbm.items.weapon.sedna; + +import com.hbm.items.ModItems; +import com.hbm.items.weapon.sedna.mags.MagazineRevolverDrum; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.render.util.RenderScreenOverlay.Crosshair; + +import net.minecraft.item.Item; + +public class GunFactory { + + public static void init() { + + ModItems.ammo_debug = new Item().setUnlocalizedName("ammo_debug").setTextureName(RefStrings.MODID + ":ammo_45"); + + BulletConfig ammo_debug = new BulletConfig().setItem(ModItems.ammo_debug); + + ModItems.gun_debug = new ItemGunBase(new GunConfig() + .dura(600).draw(15).crosshair(Crosshair.L_CLASSIC) + .rec(new Receiver() + .dmg(10F).delay(10).mag(new MagazineRevolverDrum(0, 6).addConfigs(ammo_debug))) + ).setUnlocalizedName("gun_debug").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_darter"); + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBase.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBase.java new file mode 100644 index 000000000..1a82c51ba --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBase.java @@ -0,0 +1,112 @@ +package com.hbm.items.weapon.sedna; + +import com.hbm.handler.HbmKeybinds.EnumKeybind; +import com.hbm.items.IKeybindReceiver; +import com.hbm.util.EnumUtil; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class ItemGunBase extends Item implements IKeybindReceiver { + + public static final String KEY_DRAWN = "drawn"; + public static final String KEY_TIMER = "timer"; + public static final String KEY_STATE = "state"; + public static final String KEY_PRIMARY = "mouse1"; + public static final String KEY_SECONDARY = "mouse2"; + public static final String KEY_TERTIARY = "mouse3"; + public static final String KEY_RELOAD = "reload"; + + /** NEVER ACCESS DIRECTLY - USE GETTER */ + private GunConfig config_DNA; + + public GunConfig getConfig(ItemStack stack) { + return config_DNA; + } + + public ItemGunBase(GunConfig cfg) { + this.setMaxStackSize(1); + this.config_DNA = cfg; + } + + public static enum GunState { + DRAWING, //initial delay after selecting + IDLE, //gun can be fired or reloaded + WINDUP, //fire button is down, added delay before fire + JUST_FIRED, //gun has been fired, cooldown + RELOADING //gun is currently reloading + } + + @Override + public void handleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind, boolean newState) { + + GunConfig config = getConfig(stack); + + if(keybind == EnumKeybind.GUN_PRIMARY && newState && !getPrimary(stack)) { if(config.getPressPrimary(stack) != null) config.getPressPrimary(stack).accept(stack, config); return; } + if(keybind == EnumKeybind.GUN_PRIMARY && !newState && getPrimary(stack)) { if(config.getReleasePrimary(stack) != null) config.getReleasePrimary(stack).accept(stack, config); return; } + if(keybind == EnumKeybind.GUN_SECONDARY && newState && !getSecondary(stack)) { if(config.getPressSecondary(stack) != null) config.getPressSecondary(stack).accept(stack, config); return; } + if(keybind == EnumKeybind.GUN_SECONDARY && !newState && getSecondary(stack)) { if(config.getReleaseSecondary(stack) != null) config.getReleaseSecondary(stack).accept(stack, config); return; } + if(keybind == EnumKeybind.GUN_TERTIARY && newState && !getTertiary(stack)) { if(config.getPressTertiary(stack) != null) config.getPressTertiary(stack).accept(stack, config); return; } + if(keybind == EnumKeybind.GUN_TERTIARY && !newState && getTertiary(stack)) { if(config.getReleaseTertiary(stack) != null) config.getReleaseTertiary(stack).accept(stack, config); return; } + if(keybind == EnumKeybind.RELOAD && newState && !getReloadKey(stack)) { if(config.getPressReload(stack) != null) config.getPressReload(stack).accept(stack, config); return; } + if(keybind == EnumKeybind.RELOAD && !newState && getReloadKey(stack)) { if(config.getReleaseReload(stack) != null) config.getReleaseReload(stack).accept(stack, config); return; } + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHeld) { + if(world.isRemote) return; + + GunConfig config = this.getConfig(stack); + + if(!isHeld) { + this.setState(stack, GunState.DRAWING); + this.setTimer(stack, config.getDrawDuration(stack)); + return; + } + + int timer = this.getTimer(stack); + if(timer > 0) this.setTimer(stack, timer - 1); + if(timer <= 1) nextState(); + } + + public void nextState() { + // run the decider + } + + // GUN DRAWN // + public static boolean getIsDrawn(ItemStack stack) { return getValueBool(stack, KEY_DRAWN); } + public static void setIsDrawn(ItemStack stack, boolean value) { setValueBool(stack, KEY_DRAWN, value); } + + // GUN STATE TIMER // + public static int getTimer(ItemStack stack) { return getValueInt(stack, KEY_TIMER); } + public static void setTimer(ItemStack stack, int value) { setValueInt(stack, KEY_TIMER, value); } + + // GUN STATE // + public static GunState getState(ItemStack stack) { return EnumUtil.grabEnumSafely(GunState.class, getValueByte(stack, KEY_STATE)); } + public static void setState(ItemStack stack, GunState value) { setValueByte(stack, KEY_STATE, (byte) value.ordinal()); } + + // BUTTON STATES // + public static boolean getPrimary(ItemStack stack) { return getValueBool(stack, KEY_PRIMARY); } + public static void setPrimary(ItemStack stack, boolean value) { setValueBool(stack, KEY_PRIMARY, value); } + public static boolean getSecondary(ItemStack stack) { return getValueBool(stack, KEY_SECONDARY); } + public static void setSecondary(ItemStack stack, boolean value) { setValueBool(stack, KEY_SECONDARY, value); } + public static boolean getTertiary(ItemStack stack) { return getValueBool(stack, KEY_TERTIARY); } + public static void setTertiary(ItemStack stack, boolean value) { setValueBool(stack, KEY_TERTIARY, value); } + public static boolean getReloadKey(ItemStack stack) { return getValueBool(stack, KEY_RELOAD); } + public static void setReloadKey(ItemStack stack, boolean value) { setValueBool(stack, KEY_RELOAD, value); } + + + /// UTIL /// + public static int getValueInt(ItemStack stack, String name) { if(stack.hasTagCompound()) stack.getTagCompound().getInteger(name); return 0; } + public static void setValueInt(ItemStack stack, String name, int value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setInteger(name, value); } + + public static byte getValueByte(ItemStack stack, String name) { if(stack.hasTagCompound()) stack.getTagCompound().getByte(name); return 0; } + public static void setValueByte(ItemStack stack, String name, byte value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setByte(name, value); } + + public static boolean getValueBool(ItemStack stack, String name) { if(stack.hasTagCompound()) stack.getTagCompound().getBoolean(name); return false; } + public static void setValueBool(ItemStack stack, String name, boolean value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setBoolean(name, value); } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/Receiver.java b/src/main/java/com/hbm/items/weapon/sedna/Receiver.java new file mode 100644 index 000000000..fbc3ec079 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/Receiver.java @@ -0,0 +1,24 @@ +package com.hbm.items.weapon.sedna; + +import com.hbm.handler.CasingEjector; +import com.hbm.items.weapon.sedna.mags.IMagazine; + +public class Receiver { + + protected float baseDamage; + protected int delayAfterFire; + protected int roundsPerCycle = 1; + protected boolean refireOnHold = false; + protected int burstSize = 1; + protected int delayAfterBurst = 0; + protected CasingEjector ejector = null; + protected IMagazine magazine; + + public Receiver dmg(float dmg) { this.baseDamage = dmg; return this; } + public Receiver delay(int delay) { this.delayAfterFire = delay; return this; } + public Receiver rounds(int rounds) { this.roundsPerCycle = rounds; return this; } + public Receiver auto(boolean auto) { this.refireOnHold = auto; return this; } + public Receiver burst(int size, int delay) { this.burstSize = size; this.delayAfterBurst = delay; return this; } + public Receiver burst(CasingEjector ejector) { this.ejector = ejector; return this; } + public Receiver mag(IMagazine magazine) { this.magazine = magazine; return this; } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java b/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java new file mode 100644 index 000000000..90d6a2337 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java @@ -0,0 +1,24 @@ +package com.hbm.items.weapon.sedna.mags; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface IMagazine { + + /** What ammo is loaded currently */ + public Object getType(ItemStack stack); + /** Sets the mag's ammo type */ + public void setType(ItemStack stack, Object type); + /** How much ammo this mag can carry */ + public int getCapacity(ItemStack stack); + /** How much ammo is currently loaded */ + public int getAmount(ItemStack stack); + /** Sets the mag's ammo level */ + public void setAmount(ItemStack stack, int amount); + /** If a reload can even be initiated, i.e. the player even has bullets to load */ + public boolean canReload(ItemStack stack, EntityPlayer player); + /** The action done at the end of one reload cycle, either loading one shell or replacing the whole mag */ + public void reloadAction(ItemStack stack, EntityPlayer player); + /** The stack that should be displayed for the ammo HUD */ + public ItemStack getIcon(ItemStack stack); +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java new file mode 100644 index 000000000..628d1a73d --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineRevolverDrum.java @@ -0,0 +1,82 @@ +package com.hbm.items.weapon.sedna.mags; + +import com.hbm.items.weapon.sedna.BulletConfig; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +/** Uses individual bullets which are loaded all at once */ +public class MagazineRevolverDrum extends MagazineStandardBase { + + public MagazineRevolverDrum(int index, int capacity) { + super(index, capacity); + } + + /** Returns true if the player has the same ammo if partially loaded, or any valid ammo if not */ + @Override + public boolean canReload(ItemStack stack, EntityPlayer player) { + + for(ItemStack slot : player.inventory.mainInventory) { + + if(slot != null) { + if(this.getAmount(stack) == 0) { + for(BulletConfig config : this.acceptedBullets) { + if(config.ammo.matchesRecipe(slot, true)) return true; + } + } else { + BulletConfig config = (BulletConfig) this.getType(stack); + if(config == null) { config = this.acceptedBullets.get(0); this.setType(stack, config); } + if(config.ammo.matchesRecipe(slot, true)) return true; + } + } + } + + return false; + } + + /** Reloads all rounds at once. If the mag is empty, the mag's type will change to the first valid ammo type */ + @Override + public void reloadAction(ItemStack stack, EntityPlayer player) { + + for(int i = 0; i < player.inventory.mainInventory.length; i++) { + ItemStack slot = player.inventory.mainInventory[i]; + + if(slot != null) { + + //mag is empty, assume next best type + if(this.getAmount(stack) == 0) { + + for(BulletConfig config : this.acceptedBullets) { + if(config.ammo.matchesRecipe(slot, true)) { + this.setType(stack, config); + int toLoad = Math.min(this.getCapacity(stack), slot.stackSize); + this.setAmount(stack, toLoad); + player.inventory.decrStackSize(i, toLoad); + break; + } + } + //mag has a type set, only load that + } else { + BulletConfig config = (BulletConfig) this.getType(stack); + if(config == null) { config = this.acceptedBullets.get(0); this.setType(stack, config); } //fixing broken NBT + + if(config.ammo.matchesRecipe(slot, true)) { + int alreadyLoaded = this.getAmount(stack); + int toLoad = Math.min(this.getCapacity(stack) - alreadyLoaded, slot.stackSize); + this.setAmount(stack, toLoad + alreadyLoaded); + player.inventory.decrStackSize(i, toLoad); + } + } + } + } + } + + @Override + public ItemStack getIcon(ItemStack stack) { + Object o = this.getType(stack); + if(o instanceof BulletConfig) { + return ((BulletConfig) o).ammo.toStack(); + } + return null; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java new file mode 100644 index 000000000..4ce6a9eb9 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineStandardBase.java @@ -0,0 +1,60 @@ +package com.hbm.items.weapon.sedna.mags; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.items.weapon.sedna.ItemGunBase; +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +/** Base class for typical magazines, i.e. ones that hold bullets, shells, grenades, etc, any ammo item. Type methods deal with BulletConfigs */ +public abstract class MagazineStandardBase implements IMagazine { + + public static final String KEY_MAG_COUNT = "magcount"; + public static final String KEY_MAG_TYPE = "magtype"; + + protected List acceptedBullets = new ArrayList(); + + /** A number so the gun tell multiple mags apart */ + public int index; + /** How much ammo this mag can hold */ + public int capacity; + public Receiver parent; + + public MagazineStandardBase(int index, int capacity) { + this.index = index; + this.capacity = capacity; + } + + public MagazineStandardBase addConfigs(BulletConfig... cfgs) { for(BulletConfig cfg : cfgs) acceptedBullets.add(cfg); return this; } + + @Override + public Object getType(ItemStack stack) { + int type = getMagType(stack, index); + if(type >= 0 && type < acceptedBullets.size()) { + return acceptedBullets.get(type); + } + return null; + } + + @Override + public void setType(ItemStack stack, Object type) { + if(!(type instanceof BulletConfig)) return; + int i = acceptedBullets.indexOf(type); + if(i >= 0) setMagType(stack, index, i); + } + + @Override public int getCapacity(ItemStack stack) { return capacity; } + @Override public int getAmount(ItemStack stack) { return getMagCount(stack, index); } + @Override public void setAmount(ItemStack stack, int amount) { setMagCount(stack, index, amount); } + + // MAG TYPE // + public static int getMagType(ItemStack stack, int index) { return ItemGunBase.getValueInt(stack, KEY_MAG_TYPE + index); } + public static void setMagType(ItemStack stack, int index, int value) { ItemGunBase.setValueInt(stack, KEY_MAG_TYPE + index, value); } + + // MAG COUNT // + public static int getMagCount(ItemStack stack, int index) { return ItemGunBase.getValueInt(stack, KEY_MAG_COUNT + index); } + public static void setMagCount(ItemStack stack, int index, int value) { ItemGunBase.setValueInt(stack, KEY_MAG_COUNT + index, value); } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/package-info.java b/src/main/java/com/hbm/items/weapon/sedna/package-info.java new file mode 100644 index 000000000..a23713eca --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/package-info.java @@ -0,0 +1,24 @@ +/** + * + */ +/** + * @author hbm + * + */ +package com.hbm.items.weapon.sedna; + +/* + +The MK2 unified gun system SEDNA + +ItemGunBase - NBT, timer, keybind handling + | GunConfig (1) - durability and sights + | Receiver (n) - base damage, fire modes + | Magazine (1) - NBT, reload management + | BulletConfig (n) - ammo stats + +Based on this system, alt fire that should logically use the same receiver actually use two different receivers, and +by extension two different mag fields. In this case, make sure to use the same mag instance (or an identical one) +on either receiver to ensure that both receivers access the same ammo pool and accept the same ammo types. + +*/ \ No newline at end of file diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index c84df18c8..7bd969303 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -104,6 +104,7 @@ import com.hbm.render.item.*; import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType; import com.hbm.render.item.block.*; import com.hbm.render.item.weapon.*; +import com.hbm.render.item.weapon.sedna.*; import com.hbm.render.loader.HmfModelLoader; import com.hbm.render.model.ModelPigeon; import com.hbm.render.tileentity.*; @@ -602,6 +603,8 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.gun_coilgun, new ItemRenderWeaponCoilgun()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_cryocannon, new ItemRenderWeaponCryoCannon()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_congolake, new ItemRenderWeaponCongo()); + //SEDNA + MinecraftForgeClient.registerItemRenderer(ModItems.gun_debug, new ItemRenderDebug()); //multitool MinecraftForgeClient.registerItemRenderer(ModItems.multitool_dig, new ItemRenderMultitool()); MinecraftForgeClient.registerItemRenderer(ModItems.multitool_silk, new ItemRenderMultitool()); @@ -2110,6 +2113,9 @@ public class ClientProxy extends ServerProxy { case CRANE_LEFT: return HbmKeybinds.craneLeftKey.getIsKeyPressed(); case CRANE_RIGHT: return HbmKeybinds.craneRightKey.getIsKeyPressed(); case CRANE_LOAD: return HbmKeybinds.craneLoadKey.getIsKeyPressed(); + case GUN_PRIMARY: return HbmKeybinds.gunPrimaryKey.getIsKeyPressed(); + case GUN_SECONDARY: return HbmKeybinds.gunSecondaryKey.getIsKeyPressed(); + case GUN_TERTIARY: return HbmKeybinds.gunTertiaryKey.getIsKeyPressed(); } return false; diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 5a88ba3bf..acdda9f2e 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1422,6 +1422,7 @@ public class MainRegistry { ignoreMappings.add("hbm:item.gas7"); ignoreMappings.add("hbm:item.gas8"); ignoreMappings.add("hbm:tile.brick_forgotten"); + ignoreMappings.add("hbm:tile.watz_conductor"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 725bad598..478c1fe9a 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -60,8 +60,8 @@ import com.hbm.lib.HbmCollection; import com.hbm.lib.ModDamageSource; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PermaSyncPacket; -import com.hbm.packet.PlayerInformPacket; +import com.hbm.packet.toclient.PermaSyncPacket; +import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.potion.HbmPotion; import com.hbm.saveddata.AuxSavedData; import com.hbm.tileentity.machine.TileEntityMachineRadarNT; diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 317e05ba7..9b2bddb31 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -33,7 +33,6 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; import com.hbm.inventory.gui.GUIScreenPreview; import com.hbm.inventory.gui.GUIScreenWikiRender; -import com.hbm.items.ISyncButtons; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; import com.hbm.items.armor.ArmorFSBPowered; @@ -46,10 +45,9 @@ import com.hbm.items.machine.ItemRBMKPellet; import com.hbm.items.weapon.ItemGunBase; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; -import com.hbm.packet.AuxButtonPacket; -import com.hbm.packet.GunButtonPacket; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.SyncButtonsPacket; +import com.hbm.packet.toserver.AuxButtonPacket; +import com.hbm.packet.toserver.GunButtonPacket; import com.hbm.render.anim.HbmAnimations; import com.hbm.render.anim.HbmAnimations.Animation; import com.hbm.render.block.ct.CTStitchReceiver; @@ -80,9 +78,6 @@ import com.hbm.util.ArmorUtil; import com.hbm.util.ArmorRegistry.HazardClass; import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; -import api.hbm.item.IButtonReceiver; -import api.hbm.item.IClickReceiver; - import com.hbm.sound.MovingSoundPlayerLoop.EnumHbmSound; import cpw.mods.fml.client.FMLClientHandler; @@ -91,7 +86,6 @@ import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent; -import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; @@ -593,15 +587,6 @@ public class ModEventHandlerClient { Item held = player.getHeldItem().getItem(); - if(held instanceof IClickReceiver) { - IClickReceiver rec = (IClickReceiver) held; - - if(rec.handleMouseInput(player.getHeldItem(), player, event.button, event.buttonstate)) { - event.setCanceled(true); - return; - } - } - if(held instanceof ItemGunBase) { if(event.button == 0) @@ -620,30 +605,6 @@ public class ModEventHandlerClient { item.startActionClient(player.getHeldItem(), player.worldObj, player, false); } } - - if(held instanceof ISyncButtons) { - ISyncButtons rec = (ISyncButtons) held; - - if(rec.canReceiveMouse(player, player.getHeldItem(), event, event.button, event.buttonstate)) { - PacketDispatcher.wrapper.sendToServer(new SyncButtonsPacket(event.buttonstate, event.button)); - } - } - } - } - - @SubscribeEvent - public void keyEvent(KeyInputEvent event) { - - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - - if(player.getHeldItem() != null) { - - Item held = player.getHeldItem().getItem(); - - if(held instanceof IButtonReceiver) { - IButtonReceiver rec = (IButtonReceiver) held; - rec.handleKeyboardInput(player.getHeldItem(), player); - } } } @@ -1110,8 +1071,8 @@ public class ModEventHandlerClient { @SideOnly(Side.CLIENT) @SubscribeEvent - public void onMouseClicked(InputEvent.KeyInputEvent event) { - + public void onMouseClicked(InputEvent.MouseInputEvent event) { + Minecraft mc = Minecraft.getMinecraft(); if(GeneralConfig.enableKeybindOverlap && (mc.currentScreen == null || mc.currentScreen.allowUserInput)) { boolean state = Mouse.getEventButtonState(); @@ -1122,7 +1083,7 @@ public class ModEventHandlerClient { KeyBinding key = (KeyBinding) o; if(key.getKeyCode() == keyCode && KeyBinding.hash.lookup(key.getKeyCode()) != key) { - + key.pressed = state; if(state) { key.pressTime++; diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 7fb0fc35b..693c8e20c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -9,6 +9,7 @@ import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.items.armor.IArmorDisableModel; import com.hbm.items.armor.IArmorDisableModel.EnumPlayerPart; import com.hbm.packet.PermaSyncHandler; +import com.hbm.render.item.weapon.sedna.ItemRenderWeaponBase; import com.hbm.render.model.ModelMan; import com.hbm.world.biome.BiomeGenCraterBase; @@ -33,11 +34,15 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors; import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.common.ForgeModContainer; @@ -409,6 +414,22 @@ public class ModEventHandlerRenderer { } } + @SubscribeEvent + public void onRenderHand(RenderHandEvent event) { + + //can't use plaxer.getHeldItem() here because the item rendering persists for a few frames after hitting the switch key + ItemStack toRender = Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender; + + if(toRender != null) { + IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(toRender, ItemRenderType.EQUIPPED_FIRST_PERSON); + + if(renderer instanceof ItemRenderWeaponBase) { + ((ItemRenderWeaponBase) renderer).setPerspectiveAndRender(toRender, event.partialTicks); + event.setCanceled(true); + } + } + } + private static boolean fogInit = false; private static int fogX; private static int fogZ; diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index aa3ff784d..07f22e0cb 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -951,6 +951,7 @@ public class ResourceManager { public static final ResourceLocation congolake_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/congolake.png"); public static final ResourceLocation lilmac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lilmac.png"); public static final ResourceLocation lilmac_scope_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lilmac_scope.png"); + public static final ResourceLocation debug_gun_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/debug_gun.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 73126336b..903a7939a 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -1,6 +1,8 @@ package com.hbm.packet; import com.hbm.lib.RefStrings; +import com.hbm.packet.toclient.*; +import com.hbm.packet.toserver.*; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; @@ -11,8 +13,7 @@ public class PacketDispatcher { //Mark 1 Packet Sending Device public static final SimpleNetworkWrapper wrapper = NetworkRegistry.INSTANCE.newSimpleChannel(RefStrings.MODID); - public static final void registerPackets() - { + public static final void registerPackets() { int i = 0; //Sound packet that keeps client and server separated @@ -71,8 +72,6 @@ public class PacketDispatcher { wrapper.registerMessage(ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.Handler.class, ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.class, i++, Side.CLIENT); //Packet to send NBT data from clients to the serverside held item wrapper.registerMessage(NBTItemControlPacket.Handler.class, NBTItemControlPacket.class, i++, Side.SERVER); - //sends a button press to the held item, assuming it is an ISyncButtons - wrapper.registerMessage(SyncButtonsPacket.Handler.class, SyncButtonsPacket.class, i++, Side.SERVER); //General syncing for global values wrapper.registerMessage(PermaSyncPacket.Handler.class, PermaSyncPacket.class, i++, Side.CLIENT); //Syncs biome information for single positions or entire chunks diff --git a/src/main/java/com/hbm/packet/SyncButtonsPacket.java b/src/main/java/com/hbm/packet/SyncButtonsPacket.java deleted file mode 100644 index b460a4141..000000000 --- a/src/main/java/com/hbm/packet/SyncButtonsPacket.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.hbm.packet; - -import com.hbm.items.ISyncButtons; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import cpw.mods.fml.relauncher.Side; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayer; - -public class SyncButtonsPacket implements IMessage { - - boolean state; - int button; - - public SyncButtonsPacket() { } - - public SyncButtonsPacket(boolean s, int b) { - state = s; - button = b; - } - - @Override - public void fromBytes(ByteBuf buf) { - state = buf.readBoolean(); - button = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeBoolean(state); - buf.writeInt(button); - } - - public static class Handler implements IMessageHandler { - - @Override - public IMessage onMessage(SyncButtonsPacket m, MessageContext ctx) { - - if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) - return null; - - EntityPlayer p = ctx.getServerHandler().playerEntity; - - if(p.getHeldItem() != null && p.getHeldItem().getItem() instanceof ISyncButtons) { - - ISyncButtons item = (ISyncButtons)p.getHeldItem().getItem(); - item.receiveMouse(p, p.getHeldItem(), m.button, m.state); - } - - return null; - } - } -} diff --git a/src/main/java/com/hbm/packet/AuxElectricityPacket.java b/src/main/java/com/hbm/packet/toclient/AuxElectricityPacket.java similarity index 97% rename from src/main/java/com/hbm/packet/AuxElectricityPacket.java rename to src/main/java/com/hbm/packet/toclient/AuxElectricityPacket.java index 39c27e7e1..571f925ce 100644 --- a/src/main/java/com/hbm/packet/AuxElectricityPacket.java +++ b/src/main/java/com/hbm/packet/toclient/AuxElectricityPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import api.hbm.energymk2.IEnergyHandlerMK2; import cpw.mods.fml.common.network.simpleimpl.IMessage; diff --git a/src/main/java/com/hbm/packet/AuxGaugePacket.java b/src/main/java/com/hbm/packet/toclient/AuxGaugePacket.java similarity index 98% rename from src/main/java/com/hbm/packet/AuxGaugePacket.java rename to src/main/java/com/hbm/packet/toclient/AuxGaugePacket.java index 17af20444..190a7f4b4 100644 --- a/src/main/java/com/hbm/packet/AuxGaugePacket.java +++ b/src/main/java/com/hbm/packet/toclient/AuxGaugePacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.interfaces.Spaghetti; import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; diff --git a/src/main/java/com/hbm/packet/AuxParticlePacket.java b/src/main/java/com/hbm/packet/toclient/AuxParticlePacket.java similarity index 97% rename from src/main/java/com/hbm/packet/AuxParticlePacket.java rename to src/main/java/com/hbm/packet/toclient/AuxParticlePacket.java index 1483e297d..317e121c0 100644 --- a/src/main/java/com/hbm/packet/AuxParticlePacket.java +++ b/src/main/java/com/hbm/packet/toclient/AuxParticlePacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.main.MainRegistry; diff --git a/src/main/java/com/hbm/packet/AuxParticlePacketNT.java b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java similarity index 98% rename from src/main/java/com/hbm/packet/AuxParticlePacketNT.java rename to src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java index f3b311e3a..beace3830 100644 --- a/src/main/java/com/hbm/packet/AuxParticlePacketNT.java +++ b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import java.io.IOException; diff --git a/src/main/java/com/hbm/packet/BiomeSyncPacket.java b/src/main/java/com/hbm/packet/toclient/BiomeSyncPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/BiomeSyncPacket.java rename to src/main/java/com/hbm/packet/toclient/BiomeSyncPacket.java index 203ddc281..3f529e1c3 100644 --- a/src/main/java/com/hbm/packet/BiomeSyncPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BiomeSyncPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; diff --git a/src/main/java/com/hbm/packet/BufPacket.java b/src/main/java/com/hbm/packet/toclient/BufPacket.java similarity index 97% rename from src/main/java/com/hbm/packet/BufPacket.java rename to src/main/java/com/hbm/packet/toclient/BufPacket.java index 7ff502c9d..2e9b32c12 100644 --- a/src/main/java/com/hbm/packet/BufPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BufPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.tileentity.IBufPacketReceiver; diff --git a/src/main/java/com/hbm/packet/ExplosionKnockbackPacket.java b/src/main/java/com/hbm/packet/toclient/ExplosionKnockbackPacket.java similarity index 97% rename from src/main/java/com/hbm/packet/ExplosionKnockbackPacket.java rename to src/main/java/com/hbm/packet/toclient/ExplosionKnockbackPacket.java index 9d0aa99c2..0a4972bfe 100644 --- a/src/main/java/com/hbm/packet/ExplosionKnockbackPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExplosionKnockbackPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; diff --git a/src/main/java/com/hbm/packet/ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.java b/src/main/java/com/hbm/packet/toclient/ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.java rename to src/main/java/com/hbm/packet/toclient/ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.java index c8300a0da..142a3fb26 100644 --- a/src/main/java/com/hbm/packet/ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import java.util.ArrayList; import java.util.Iterator; diff --git a/src/main/java/com/hbm/packet/ExtPropPacket.java b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/ExtPropPacket.java rename to src/main/java/com/hbm/packet/toclient/ExtPropPacket.java index 641bc9b68..0364bf7e9 100644 --- a/src/main/java/com/hbm/packet/ExtPropPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import java.io.IOException; diff --git a/src/main/java/com/hbm/packet/GunAnimationPacket.java b/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/GunAnimationPacket.java rename to src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java index c744f72fd..58389f2f4 100644 --- a/src/main/java/com/hbm/packet/GunAnimationPacket.java +++ b/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.items.weapon.ItemGunBase; import com.hbm.render.anim.BusAnimation; diff --git a/src/main/java/com/hbm/packet/LoopedEntitySoundPacket.java b/src/main/java/com/hbm/packet/toclient/LoopedEntitySoundPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/LoopedEntitySoundPacket.java rename to src/main/java/com/hbm/packet/toclient/LoopedEntitySoundPacket.java index 0d364608f..f5282515a 100644 --- a/src/main/java/com/hbm/packet/LoopedEntitySoundPacket.java +++ b/src/main/java/com/hbm/packet/toclient/LoopedEntitySoundPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.entity.logic.EntityBomber; import com.hbm.sound.MovingSoundBomber; diff --git a/src/main/java/com/hbm/packet/LoopedSoundPacket.java b/src/main/java/com/hbm/packet/toclient/LoopedSoundPacket.java similarity index 99% rename from src/main/java/com/hbm/packet/LoopedSoundPacket.java rename to src/main/java/com/hbm/packet/toclient/LoopedSoundPacket.java index 0312680a0..5533245d1 100644 --- a/src/main/java/com/hbm/packet/LoopedSoundPacket.java +++ b/src/main/java/com/hbm/packet/toclient/LoopedSoundPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.interfaces.Spaghetti; import com.hbm.sound.*; diff --git a/src/main/java/com/hbm/packet/ParticleBurstPacket.java b/src/main/java/com/hbm/packet/toclient/ParticleBurstPacket.java similarity index 97% rename from src/main/java/com/hbm/packet/ParticleBurstPacket.java rename to src/main/java/com/hbm/packet/toclient/ParticleBurstPacket.java index c6b58a8b7..6be55c831 100644 --- a/src/main/java/com/hbm/packet/ParticleBurstPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ParticleBurstPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; diff --git a/src/main/java/com/hbm/packet/PermaSyncPacket.java b/src/main/java/com/hbm/packet/toclient/PermaSyncPacket.java similarity index 94% rename from src/main/java/com/hbm/packet/PermaSyncPacket.java rename to src/main/java/com/hbm/packet/toclient/PermaSyncPacket.java index 2415e3696..dcf7ee365 100644 --- a/src/main/java/com/hbm/packet/PermaSyncPacket.java +++ b/src/main/java/com/hbm/packet/toclient/PermaSyncPacket.java @@ -1,4 +1,6 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; + +import com.hbm.packet.PermaSyncHandler; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; diff --git a/src/main/java/com/hbm/packet/PlayerInformPacket.java b/src/main/java/com/hbm/packet/toclient/PlayerInformPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/PlayerInformPacket.java rename to src/main/java/com/hbm/packet/toclient/PlayerInformPacket.java index 01bb8b599..0cdb23d20 100644 --- a/src/main/java/com/hbm/packet/PlayerInformPacket.java +++ b/src/main/java/com/hbm/packet/toclient/PlayerInformPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.main.MainRegistry; diff --git a/src/main/java/com/hbm/packet/SatPanelPacket.java b/src/main/java/com/hbm/packet/toclient/SatPanelPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/SatPanelPacket.java rename to src/main/java/com/hbm/packet/toclient/SatPanelPacket.java index 89252d7e1..3a1a343d3 100644 --- a/src/main/java/com/hbm/packet/SatPanelPacket.java +++ b/src/main/java/com/hbm/packet/toclient/SatPanelPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import java.io.IOException; diff --git a/src/main/java/com/hbm/packet/TEDoorAnimationPacket.java b/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/TEDoorAnimationPacket.java rename to src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java index 7321aa015..3511f0d07 100644 --- a/src/main/java/com/hbm/packet/TEDoorAnimationPacket.java +++ b/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.interfaces.IAnimatedDoor; diff --git a/src/main/java/com/hbm/packet/TEFFPacket.java b/src/main/java/com/hbm/packet/toclient/TEFFPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/TEFFPacket.java rename to src/main/java/com/hbm/packet/toclient/TEFFPacket.java index 4549dfc11..26de5bd91 100644 --- a/src/main/java/com/hbm/packet/TEFFPacket.java +++ b/src/main/java/com/hbm/packet/toclient/TEFFPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.tileentity.machine.TileEntityForceField; import cpw.mods.fml.common.network.simpleimpl.IMessage; diff --git a/src/main/java/com/hbm/packet/TEMissileMultipartPacket.java b/src/main/java/com/hbm/packet/toclient/TEMissileMultipartPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/TEMissileMultipartPacket.java rename to src/main/java/com/hbm/packet/toclient/TEMissileMultipartPacket.java index 9bf955906..e25d5bbac 100644 --- a/src/main/java/com/hbm/packet/TEMissileMultipartPacket.java +++ b/src/main/java/com/hbm/packet/toclient/TEMissileMultipartPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.handler.MissileStruct; import com.hbm.tileentity.bomb.TileEntityCompactLauncher; diff --git a/src/main/java/com/hbm/packet/TESirenPacket.java b/src/main/java/com/hbm/packet/toclient/TESirenPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/TESirenPacket.java rename to src/main/java/com/hbm/packet/toclient/TESirenPacket.java index bdd3d0ea0..8e6f79825 100644 --- a/src/main/java/com/hbm/packet/TESirenPacket.java +++ b/src/main/java/com/hbm/packet/toclient/TESirenPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.items.machine.ItemCassette.SoundType; import com.hbm.items.machine.ItemCassette.TrackType; diff --git a/src/main/java/com/hbm/packet/TEVaultPacket.java b/src/main/java/com/hbm/packet/toclient/TEVaultPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/TEVaultPacket.java rename to src/main/java/com/hbm/packet/toclient/TEVaultPacket.java index 2b0139e92..84721d0b9 100644 --- a/src/main/java/com/hbm/packet/TEVaultPacket.java +++ b/src/main/java/com/hbm/packet/toclient/TEVaultPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toclient; import com.hbm.tileentity.machine.TileEntityBlastDoor; import com.hbm.tileentity.machine.TileEntityVaultDoor; diff --git a/src/main/java/com/hbm/packet/AnvilCraftPacket.java b/src/main/java/com/hbm/packet/toserver/AnvilCraftPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/AnvilCraftPacket.java rename to src/main/java/com/hbm/packet/toserver/AnvilCraftPacket.java index d8b1049a4..1a33e48a6 100644 --- a/src/main/java/com/hbm/packet/AnvilCraftPacket.java +++ b/src/main/java/com/hbm/packet/toserver/AnvilCraftPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import com.hbm.inventory.container.ContainerAnvil; import com.hbm.inventory.recipes.anvil.AnvilRecipes; diff --git a/src/main/java/com/hbm/packet/AuxButtonPacket.java b/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java similarity index 99% rename from src/main/java/com/hbm/packet/AuxButtonPacket.java rename to src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java index c80dfd5ef..7f41feeb1 100644 --- a/src/main/java/com/hbm/packet/AuxButtonPacket.java +++ b/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import com.hbm.config.MobConfig; import com.hbm.entity.mob.EntityDuck; diff --git a/src/main/java/com/hbm/packet/GunButtonPacket.java b/src/main/java/com/hbm/packet/toserver/GunButtonPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/GunButtonPacket.java rename to src/main/java/com/hbm/packet/toserver/GunButtonPacket.java index a9688de1d..0dc5f0e99 100644 --- a/src/main/java/com/hbm/packet/GunButtonPacket.java +++ b/src/main/java/com/hbm/packet/toserver/GunButtonPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import com.hbm.items.weapon.ItemGunBase; diff --git a/src/main/java/com/hbm/packet/ItemBobmazonPacket.java b/src/main/java/com/hbm/packet/toserver/ItemBobmazonPacket.java similarity index 99% rename from src/main/java/com/hbm/packet/ItemBobmazonPacket.java rename to src/main/java/com/hbm/packet/toserver/ItemBobmazonPacket.java index c665f8891..9866b4596 100644 --- a/src/main/java/com/hbm/packet/ItemBobmazonPacket.java +++ b/src/main/java/com/hbm/packet/toserver/ItemBobmazonPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import java.util.Random; diff --git a/src/main/java/com/hbm/packet/ItemDesignatorPacket.java b/src/main/java/com/hbm/packet/toserver/ItemDesignatorPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/ItemDesignatorPacket.java rename to src/main/java/com/hbm/packet/toserver/ItemDesignatorPacket.java index 126325b16..8acdcc808 100644 --- a/src/main/java/com/hbm/packet/ItemDesignatorPacket.java +++ b/src/main/java/com/hbm/packet/toserver/ItemDesignatorPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/packet/ItemFolderPacket.java b/src/main/java/com/hbm/packet/toserver/ItemFolderPacket.java similarity index 99% rename from src/main/java/com/hbm/packet/ItemFolderPacket.java rename to src/main/java/com/hbm/packet/toserver/ItemFolderPacket.java index 7f70ce19a..e6258ba19 100644 --- a/src/main/java/com/hbm/packet/ItemFolderPacket.java +++ b/src/main/java/com/hbm/packet/toserver/ItemFolderPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.AssemblerRecipes; diff --git a/src/main/java/com/hbm/packet/KeybindPacket.java b/src/main/java/com/hbm/packet/toserver/KeybindPacket.java similarity index 84% rename from src/main/java/com/hbm/packet/KeybindPacket.java rename to src/main/java/com/hbm/packet/toserver/KeybindPacket.java index 3b3f2a80c..945d21e69 100644 --- a/src/main/java/com/hbm/packet/KeybindPacket.java +++ b/src/main/java/com/hbm/packet/toserver/KeybindPacket.java @@ -1,7 +1,7 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; -import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.HbmKeybinds.EnumKeybind; +import com.hbm.handler.HbmKeybindsServer; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; @@ -39,9 +39,7 @@ public class KeybindPacket implements IMessage { public IMessage onMessage(KeybindPacket m, MessageContext ctx) { EntityPlayer p = ctx.getServerHandler().playerEntity; - HbmPlayerProps props = HbmPlayerProps.getData(p); - - props.setKeyPressed(EnumKeybind.values()[m.key], m.pressed); + HbmKeybindsServer.onPressedServer(p, EnumKeybind.values()[m.key], m.pressed); return null; } diff --git a/src/main/java/com/hbm/packet/NBTControlPacket.java b/src/main/java/com/hbm/packet/toserver/NBTControlPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/NBTControlPacket.java rename to src/main/java/com/hbm/packet/toserver/NBTControlPacket.java index 226b3eae1..52ca6261c 100644 --- a/src/main/java/com/hbm/packet/NBTControlPacket.java +++ b/src/main/java/com/hbm/packet/toserver/NBTControlPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import java.io.IOException; diff --git a/src/main/java/com/hbm/packet/NBTItemControlPacket.java b/src/main/java/com/hbm/packet/toserver/NBTItemControlPacket.java similarity index 98% rename from src/main/java/com/hbm/packet/NBTItemControlPacket.java rename to src/main/java/com/hbm/packet/toserver/NBTItemControlPacket.java index 7f03f6894..3bae1121a 100644 --- a/src/main/java/com/hbm/packet/NBTItemControlPacket.java +++ b/src/main/java/com/hbm/packet/toserver/NBTItemControlPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import java.io.IOException; diff --git a/src/main/java/com/hbm/packet/SatCoordPacket.java b/src/main/java/com/hbm/packet/toserver/SatCoordPacket.java similarity index 97% rename from src/main/java/com/hbm/packet/SatCoordPacket.java rename to src/main/java/com/hbm/packet/toserver/SatCoordPacket.java index 0d165165d..b36ef3245 100644 --- a/src/main/java/com/hbm/packet/SatCoordPacket.java +++ b/src/main/java/com/hbm/packet/toserver/SatCoordPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import com.hbm.items.ISatChip; import com.hbm.items.tool.ItemSatInterface; diff --git a/src/main/java/com/hbm/packet/SatLaserPacket.java b/src/main/java/com/hbm/packet/toserver/SatLaserPacket.java similarity index 97% rename from src/main/java/com/hbm/packet/SatLaserPacket.java rename to src/main/java/com/hbm/packet/toserver/SatLaserPacket.java index 1dc430a7b..9b0bacea8 100644 --- a/src/main/java/com/hbm/packet/SatLaserPacket.java +++ b/src/main/java/com/hbm/packet/toserver/SatLaserPacket.java @@ -1,4 +1,4 @@ -package com.hbm.packet; +package com.hbm.packet.toserver; import com.hbm.items.ISatChip; import com.hbm.items.tool.ItemSatInterface; diff --git a/src/main/java/com/hbm/particle/helper/IParticleCreator.java b/src/main/java/com/hbm/particle/helper/IParticleCreator.java index 2dbae2da1..f55ef2f05 100644 --- a/src/main/java/com/hbm/particle/helper/IParticleCreator.java +++ b/src/main/java/com/hbm/particle/helper/IParticleCreator.java @@ -2,8 +2,8 @@ package com.hbm.particle.helper; import java.util.Random; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponGlass.java b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponGlass.java index aa8e186e4..418636da7 100644 --- a/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponGlass.java +++ b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponGlass.java @@ -3,7 +3,7 @@ package com.hbm.render.item.weapon; import org.lwjgl.opengl.GL11; import com.hbm.handler.BulletConfiguration; -import com.hbm.items.weapon.gununified.ItemEnergyGunBase; +import com.hbm.items.weapon.ItemEnergyGunBase; import com.hbm.main.ResourceManager; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDebug.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDebug.java new file mode 100644 index 000000000..4e52a079a --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDebug.java @@ -0,0 +1,44 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; + +public class ItemRenderDebug extends ItemRenderWeaponBase { + + @Override + public void renderFirstPerson(ItemStack stack) { + + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(90, 0, 1, 0); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.debug_gun_tex); + ResourceManager.lilmac.renderPart("Gun"); + ResourceManager.lilmac.renderPart("Cylinder"); + ResourceManager.lilmac.renderPart("Bullets"); + ResourceManager.lilmac.renderPart("Casings"); + ResourceManager.lilmac.renderPart("Pivot"); + ResourceManager.lilmac.renderPart("Hammer"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + GL11.glRotated(90, 0, 1, 0); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.debug_gun_tex); + ResourceManager.lilmac.renderPart("Gun"); + ResourceManager.lilmac.renderPart("Cylinder"); + ResourceManager.lilmac.renderPart("Bullets"); + ResourceManager.lilmac.renderPart("Casings"); + ResourceManager.lilmac.renderPart("Pivot"); + ResourceManager.lilmac.renderPart("Hammer"); + GL11.glShadeModel(GL11.GL_FLAT); + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java new file mode 100644 index 000000000..66f862e0f --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -0,0 +1,185 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.util.glu.Project; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraftforge.client.IItemRenderer; + +public abstract class ItemRenderWeaponBase implements IItemRenderer { + + public static float interp; + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type != ItemRenderType.FIRST_PERSON_MAP; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION; + } + + @SuppressWarnings("incomplete-switch") //shut the fuck up + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + switch(type) { + case EQUIPPED_FIRST_PERSON: setupFirstPerson(item); renderFirstPerson(item); break; + case EQUIPPED: setupThirdPerson(item); renderOther(item, type); break; + case INVENTORY: setupInv(item); renderOther(item, type); break; + case ENTITY: setupEntity(item); renderOther(item, type); break; + } + GL11.glPopMatrix(); + } + + public void setPerspectiveAndRender(ItemStack stack, float interp) { + + this.interp = interp; + + Minecraft mc = Minecraft.getMinecraft(); + EntityRenderer entityRenderer = mc.entityRenderer; + float farPlaneDistance = mc.gameSettings.renderDistanceChunks * 16; + + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + + Project.gluPerspective(this.getFOVModifier(interp, false), (float) mc.displayWidth / (float) mc.displayHeight, 0.05F, farPlaneDistance * 2.0F); + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + + GL11.glPushMatrix(); + + if(mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping() && !mc.gameSettings.hideGUI && !mc.playerController.enableEverythingIsScrewedUpMode()) { + entityRenderer.enableLightmap(interp); + this.setupTransformsAndRender(stack); + entityRenderer.disableLightmap(interp); + } + + GL11.glPopMatrix(); + + if(mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping()) { + entityRenderer.itemRenderer.renderOverlays(interp); + } + } + + private float getFOVModifier(float interp, boolean useFOVSetting) { + + Minecraft mc = Minecraft.getMinecraft(); + EntityLivingBase entityplayer = (EntityLivingBase) mc.renderViewEntity; + float fov = 70.0F; + + if(useFOVSetting) fov = mc.gameSettings.fovSetting; + + if(entityplayer.getHealth() <= 0.0F) { + float f2 = (float) entityplayer.deathTime + interp; + fov /= (1.0F - 500.0F / (f2 + 500.0F)) * 2.0F + 1.0F; + } + + Block block = ActiveRenderInfo.getBlockAtEntityViewpoint(mc.theWorld, entityplayer, interp); + if(block.getMaterial() == Material.water) fov = fov * 60.0F / 70.0F; + + return fov; + } + + protected void setupTransformsAndRender(ItemStack itemstack) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer player = mc.thePlayer; + + float pitch = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * interp; + GL11.glPushMatrix(); + GL11.glRotatef(pitch, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * interp, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + EntityPlayerSP entityplayersp = (EntityPlayerSP) player; + float armPitch = entityplayersp.prevRenderArmPitch + (entityplayersp.renderArmPitch - entityplayersp.prevRenderArmPitch) * interp; + float armYaw = entityplayersp.prevRenderArmYaw + (entityplayersp.renderArmYaw - entityplayersp.prevRenderArmYaw) * interp; + GL11.glRotatef((player.rotationPitch - armPitch) * 0.1F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef((player.rotationYaw - armYaw) * 0.1F, 0.0F, 1.0F, 0.0F); + + int i = mc.theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ), 0); + int j = i % 65536; + int k = i / 65536; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) j / 1.0F, (float) k / 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + if(itemstack != null) { + int l = itemstack.getItem().getColorFromItemStack(itemstack, 0); + float r = (float) (l >> 16 & 255) / 255.0F; + float g = (float) (l >> 8 & 255) / 255.0F; + float b = (float) (l & 255) / 255.0F; + GL11.glColor4f(r, g, b, 1.0F); + } + + float f8; + float f13; + + GL11.glPushMatrix(); + + f13 = 0.8F; + + float swing = player.getSwingProgress(interp); + float swingZ = MathHelper.sin(swing * (float) Math.PI); + float swingX = MathHelper.sin(MathHelper.sqrt_float(swing) * (float) Math.PI); + GL11.glTranslatef(-swingX * 0.4F, MathHelper.sin(MathHelper.sqrt_float(swing) * (float) Math.PI * 2.0F) * 0.2F, -swingZ * 0.2F); + + GL11.glTranslatef(0.7F * f13, -0.65F * f13 - (1.0F - 1/* raiseprogress */) * 0.6F, -0.9F * f13); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float swingYaw = MathHelper.sin(swing * swing * (float) Math.PI); + float swingPitchRoll = MathHelper.sin(MathHelper.sqrt_float(swing) * (float) Math.PI); + GL11.glRotatef(-swingYaw * 20.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-swingPitchRoll * 20.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-swingPitchRoll * 80.0F, 1.0F, 0.0F, 0.0F); + + f8 = 0.4F; + GL11.glScalef(f8, f8, f8); + + this.renderItem(ItemRenderType.EQUIPPED_FIRST_PERSON, itemstack, null, player); + + GL11.glPopMatrix(); + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + } + + protected void setupFirstPerson(ItemStack stack) { + //GL11.glRotated(90, 0, 1, 0); + //GL11.glRotated(40, -1, 0, 0); + } + + protected void setupThirdPerson(ItemStack stack) { + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + } + + protected void setupInv(ItemStack stack) { + GL11.glScaled(1, 1, -1); + GL11.glTranslated(8, 8, 0); + GL11.glRotated(225, 0, 0, 1); + GL11.glRotated(90, 0, 1, 0); + } + + protected void setupEntity(ItemStack stack) { + + } + + public abstract void renderFirstPerson(ItemStack stack); + public abstract void renderOther(ItemStack stack, ItemRenderType type); +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderLPW2.java b/src/main/java/com/hbm/render/tileentity/RenderLPW2.java index bb5e674f0..4e4eacf41 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLPW2.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLPW2.java @@ -139,7 +139,7 @@ public class RenderLPW2 extends TileEntitySpecialRenderer { GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glLoadIdentity(); - GL11.glTranslated(0, BobMathUtil.sps(errorTimer) + errorTimer / 2D - 1, 0); + GL11.glTranslated(0, (BobMathUtil.sps(errorTimer) + errorTimer / 2D) % 1, 0); ResourceManager.lpw2.renderPart("Screen"); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glLoadIdentity(); diff --git a/src/main/java/com/hbm/render/tileentity/RenderSolarBoiler.java b/src/main/java/com/hbm/render/tileentity/RenderSolarBoiler.java index 54c3c1ad1..f15a7d778 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSolarBoiler.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSolarBoiler.java @@ -38,7 +38,7 @@ public class RenderSolarBoiler extends TileEntitySpecialRenderer { GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); - if(te instanceof TileEntitySolarBoiler && !Minecraft.getMinecraft().gameSettings.fancyGraphics) { + if(te instanceof TileEntitySolarBoiler && Minecraft.getMinecraft().gameSettings.fancyGraphics) { TileEntitySolarBoiler boiler = (TileEntitySolarBoiler) te; Tessellator tess = Tessellator.instance; diff --git a/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java b/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java index 688962e83..04d1fe52a 100644 --- a/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java +++ b/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java @@ -1,7 +1,7 @@ package com.hbm.tileentity; -import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.BufPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index a8f856310..d05ac0843 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -10,7 +10,7 @@ import com.hbm.interfaces.IAnimatedDoor; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TEDoorAnimationPacket; +import com.hbm.packet.toclient.TEDoorAnimationPacket; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.machine.TileEntityLockableBase; import com.hbm.util.fauxpointtwelve.BlockPos; diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index a8e1ee651..e9e8c0e05 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -1,8 +1,8 @@ package com.hbm.tileentity; -import com.hbm.packet.AuxGaugePacket; -import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxGaugePacket; +import com.hbm.packet.toclient.BufPacket; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -153,7 +153,7 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, val, id), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } @Deprecated public void processGauge(int val, int id) { } - + /** Sends a sync packet that uses ByteBuf for efficient information-cramming */ public void networkPackNT(int range) { if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java index aee39ce6d..4d4b08836 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java @@ -1,11 +1,8 @@ package com.hbm.tileentity.bomb; import com.hbm.blocks.bomb.BlockChargeBase; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; -import cpw.mods.fml.common.network.NetworkRegistry; import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index dc0775e96..40a3d4644 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -16,9 +16,9 @@ import com.hbm.items.weapon.ItemCustomMissilePart.FuelType; import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TEMissileMultipartPacket; +import com.hbm.packet.toclient.BufPacket; +import com.hbm.packet.toclient.TEMissileMultipartPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IRadarCommandReceiver; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java index be34e001c..ed97928b7 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.bomb; import com.hbm.entity.item.EntityFireworks; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index b8ab5fab8..cd1aa132d 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -17,9 +17,9 @@ import com.hbm.items.weapon.ItemCustomMissilePart.FuelType; import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TEMissileMultipartPacket; +import com.hbm.packet.toclient.BufPacket; +import com.hbm.packet.toclient.TEMissileMultipartPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IRadarCommandReceiver; diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java b/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java index 122e52ba3..ac6bfec24 100644 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java +++ b/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java @@ -7,8 +7,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.particle.EntityOrangeFX; import com.hbm.entity.projectile.EntityShrapnel; import com.hbm.entity.projectile.EntityWaterSplash; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java index e13795a69..d22bd4150 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java @@ -3,7 +3,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.DummyBlockBlast; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TEVaultPacket; +import com.hbm.packet.toclient.TEVaultPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java index 0c580bf65..744e3bab9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java @@ -3,8 +3,8 @@ package com.hbm.tileentity.machine; import java.util.List; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.LoopedSoundPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.LoopedSoundPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 1fb87fc69..3e2450404 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -18,8 +18,8 @@ import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 8ab35d24b..40ce00a0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -23,8 +23,8 @@ import com.hbm.inventory.recipes.ElectrolyserMetalRecipes.ElectrolysisMetalRecip import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java b/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java index 417c24894..91d89b53e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java @@ -8,7 +8,7 @@ import com.hbm.inventory.gui.GUIForceField; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TEFFPacket; +import com.hbm.packet.toclient.TEFFPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java index 1414283fe..8c795202b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -2,8 +2,8 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.inventory.material.NTMMaterial; import com.hbm.util.CrucibleUtil; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java index ba297333f..ecf625688 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java @@ -3,8 +3,8 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockDynamicSlag.TileEntitySlag; import com.hbm.inventory.material.Mats.MaterialStack; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; import api.hbm.block.ICrucibleAcceptor; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index 17798d41c..89fd43fe1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -15,8 +15,8 @@ import com.hbm.inventory.recipes.HadronRecipes; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityHadronDiode.DiodeConfig; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java index 3fce746dc..c42db2790 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java @@ -1,13 +1,10 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.machine.BlockHadronPower; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energymk2.IEnergyReceiverMK2; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java b/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java index 4f4c3d65d..62d4ae6a7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java @@ -11,8 +11,8 @@ import com.hbm.inventory.gui.GUIICF; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemICFPellet; import com.hbm.lib.Library; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 39f8678ec..3fd90d627 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -21,8 +21,8 @@ import com.hbm.items.ModItems; import com.hbm.items.special.ItemFusionShield; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java index 2162cfeb8..bff0afcdb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java @@ -6,9 +6,9 @@ import com.hbm.inventory.container.ContainerMachineArcFurnace; import com.hbm.inventory.gui.GUIMachineArcFurnace; import com.hbm.items.ModItems; import com.hbm.lib.Library; -import com.hbm.packet.AuxElectricityPacket; -import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxElectricityPacket; +import com.hbm.packet.toclient.AuxGaugePacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java index abd5b4ec2..c1e92720a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java @@ -21,8 +21,8 @@ import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java index 6a3132006..5eb5af98f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java @@ -14,8 +14,8 @@ import com.hbm.inventory.recipes.ArcWelderRecipes.ArcWelderRecipe; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java index 5b2f427d7..f019f0815 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java @@ -12,8 +12,8 @@ import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous; import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Liquid; import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Viscous; import com.hbm.main.MainRegistry; -import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index b3179241c..92fb4d7a7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -11,8 +11,8 @@ import com.hbm.inventory.recipes.GasCentrifugeRecipes.PseudoFluidType; import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.lib.Library; -import com.hbm.packet.LoopedSoundPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.LoopedSoundPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.BufferUtil; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMissileAssembly.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMissileAssembly.java index 4ffd642d6..9560bbd23 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMissileAssembly.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMissileAssembly.java @@ -8,7 +8,7 @@ import com.hbm.items.weapon.ItemCustomMissilePart; import com.hbm.items.weapon.ItemCustomMissilePart.FuelType; import com.hbm.items.weapon.ItemCustomMissilePart.PartType; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TEMissileMultipartPacket; +import com.hbm.packet.toclient.TEMissileMultipartPacket; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java index 90e1ec36e..4d6aad8ab 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java @@ -18,8 +18,8 @@ import com.hbm.items.special.ItemBedrockOreNew.BedrockOreType; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java index 56ab3442f..6172e954e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java @@ -4,8 +4,8 @@ import com.hbm.config.VersatileConfig; import com.hbm.inventory.container.ContainerMachineRTG; import com.hbm.inventory.gui.GUIMachineRTG; import com.hbm.items.machine.ItemRTGPellet; -import com.hbm.packet.AuxElectricityPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxElectricityPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index ef8625264..9c224199a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -18,8 +18,8 @@ import com.hbm.items.ModItems; import com.hbm.items.tool.ItemCoordinateBase; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.BufPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.BufPacket; import com.hbm.saveddata.SatelliteSavedData; import com.hbm.saveddata.satellites.Satellite; import com.hbm.saveddata.satellites.SatelliteHorizons; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java index 9ac85cf5c..53cf6a7d4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java @@ -5,8 +5,8 @@ import com.hbm.inventory.gui.GUIMachineShredder; import com.hbm.inventory.recipes.ShredderRecipes; import com.hbm.items.machine.ItemBlades; import com.hbm.lib.Library; -import com.hbm.packet.AuxElectricityPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxElectricityPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSiren.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSiren.java index a2ebd812f..9cd3671b4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSiren.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSiren.java @@ -8,7 +8,7 @@ import com.hbm.items.machine.ItemCassette; import com.hbm.items.machine.ItemCassette.SoundType; import com.hbm.items.machine.ItemCassette.TrackType; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TESirenPacket; +import com.hbm.packet.toclient.TESirenPacket; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java index 0b2fb6dc7..3a405ca0d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java @@ -14,8 +14,8 @@ import com.hbm.inventory.recipes.SolderingRecipes.SolderingRecipe; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index b6cc7780d..6970a921f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -18,8 +18,8 @@ import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index 84852dfc3..1599374d9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -8,8 +8,8 @@ import com.hbm.entity.projectile.EntitySawblade; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; import com.hbm.util.BufferUtil; @@ -148,7 +148,7 @@ public class TileEntitySawmill extends TileEntityMachineBase { } networkPackNT(150); - + this.heat = 0; } else { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityVaultDoor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityVaultDoor.java index 8ca80eb24..8fa592af5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityVaultDoor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityVaultDoor.java @@ -3,7 +3,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.DummyBlockVault; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.TEVaultPacket; +import com.hbm.packet.toclient.TEVaultPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index 81957e0cd..e3489abe0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -18,8 +18,8 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemWatzPellet; import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.Compat; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java b/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java index 4fb2be3ef..562109830 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java @@ -3,8 +3,8 @@ package com.hbm.tileentity.machine; import java.util.List; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index a96995673..15e1f0977 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -5,15 +5,12 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.FractionRecipes; import com.hbm.lib.Library; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index 0318a99b7..aedcb0082 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -3,8 +3,8 @@ package com.hbm.tileentity.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IPileNeutronReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 53526b9bc..9bb659bd1 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -11,8 +11,8 @@ import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.neutron.NeutronNodeWorld; import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.saveddata.TomSaveData; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IOverpressurable; @@ -224,7 +224,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements NeutronNodeWorld.removeNode(new BlockPos(this)); // woo-fucking-hoo!!! } - + @Override public void markDirty() { @@ -251,7 +251,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements public RBMKType getRBMKType() { return RBMKType.OTHER; } - + protected static boolean diag = false; @Override diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java index acdfb8e7e..7b66c3d55 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java @@ -2,12 +2,9 @@ package com.hbm.tileentity.machine.storage; import com.hbm.inventory.container.ContainerFileCabinet; import com.hbm.inventory.gui.GUIFileCabinet; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index 51a133253..6d20ef764 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -19,8 +19,8 @@ import com.hbm.inventory.gui.GUIMachineFluidTank; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.IPersistentNBT; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java index 4af12a1ab..ffd51fb0f 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java @@ -4,12 +4,9 @@ import java.util.List; import com.hbm.entity.item.EntityDeliveryDrone; import com.hbm.util.ParticleUtil; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.util.fauxpointtwelve.BlockPos; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java b/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java index 6e1a226dd..7d6ff74d8 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java @@ -1,16 +1,20 @@ package com.hbm.tileentity.network; import api.hbm.fluid.PipeNet; +import net.minecraft.block.Block; +import net.minecraft.world.World; public class TileEntityFluidValve extends TileEntityPipeBaseNT { @Override - public boolean canUpdate() { + public boolean shouldConnect() { return this.worldObj != null && this.getBlockMetadata() == 1 && super.canUpdate(); } public void updateState() { + this.blockMetadata = -1; // delete cache + if(this.getBlockMetadata() == 0 && this.network != null) { this.network.destroy(); this.network = null; @@ -24,4 +28,9 @@ public class TileEntityFluidValve extends TileEntityPipeBaseNT { } } } + + @Override + public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) { + return oldBlock != newBlock; + } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java b/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java index 4db863014..b3004d9b0 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java @@ -28,7 +28,7 @@ public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor lastType = type; } - if(!worldObj.isRemote && canUpdate()) { + if(!worldObj.isRemote && shouldConnect()) { //we got here either because the net doesn't exist or because it's not valid, so that's safe to assume this.setPipeNet(type, null); @@ -101,8 +101,7 @@ public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor /** * Only update until a power net is formed, in >99% of the cases it should be the first tick. Everything else is handled by neighbors and the net itself. */ - @Override - public boolean canUpdate() { + public boolean shouldConnect() { return (this.network == null || !this.network.isValid()) && !this.isInvalid(); } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index f741d7e4f..e4e646eb7 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -11,8 +11,8 @@ import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemAmmoArty; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.Optional; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 77ac2a0fb..3866c7d4b 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -21,8 +21,8 @@ import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemTurretBiometry; import com.hbm.lib.Library; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java index 6ca6c4e35..64f329a79 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java @@ -7,8 +7,8 @@ import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.CasingEjector; import com.hbm.inventory.gui.GUITurretChekhov; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java index 19996d6af..e11edbc53 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java @@ -15,8 +15,8 @@ import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Liquid; import com.hbm.inventory.gui.GUITurretFritz; import com.hbm.items.ModItems; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java index 5afbd8afa..f726cdff3 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java @@ -10,8 +10,8 @@ import com.hbm.handler.CasingEjector; import com.hbm.handler.guncfg.GunDGKFactory; import com.hbm.inventory.gui.GUITurretHoward; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.util.EntityDamageUtil; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java index 26536ffb5..c3e9d7655 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java @@ -3,8 +3,8 @@ package com.hbm.tileentity.turret; import com.hbm.config.WeaponConfig; import com.hbm.handler.guncfg.GunDGKFactory; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.EntityDamageUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java index f89b81cbd..e5c323f2b 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java @@ -7,8 +7,8 @@ import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.CasingEjector; import com.hbm.inventory.gui.GUITurretJeremy; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index f9f4e82c5..b39e07cb2 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -8,8 +8,8 @@ import com.hbm.inventory.gui.GUITurretMaxwell; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java index aca28eb62..6c7c5359f 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java @@ -8,8 +8,8 @@ import com.hbm.handler.BulletConfiguration; import com.hbm.handler.CasingEjector; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.inventory.gui.GUITurretSentry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java index acb7898cb..bc3dc51ff 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java @@ -2,8 +2,8 @@ package com.hbm.tileentity.turret; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java index 0510a86ac..4932f013d 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java @@ -7,8 +7,8 @@ import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.inventory.gui.GUITurretTauon; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/util/ParticleUtil.java b/src/main/java/com/hbm/util/ParticleUtil.java index 45898c14d..2c654de56 100644 --- a/src/main/java/com/hbm/util/ParticleUtil.java +++ b/src/main/java/com/hbm/util/ParticleUtil.java @@ -1,8 +1,8 @@ package com.hbm.util; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/world/WorldUtil.java b/src/main/java/com/hbm/world/WorldUtil.java index b06cf9d86..4f23a6865 100644 --- a/src/main/java/com/hbm/world/WorldUtil.java +++ b/src/main/java/com/hbm/world/WorldUtil.java @@ -1,7 +1,8 @@ package com.hbm.world; -import com.hbm.packet.BiomeSyncPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.BiomeSyncPacket; + import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 09bf2e8c3..c84644c46 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -34,3 +34,6 @@ public net.minecraft.world.gen.ChunkProviderFlat field_82702_h # ha # ChunkProviderServer public net.minecraft.world.gen.ChunkProviderServer field_73248_b # chunksToUnload + +# ItemRenderer +public net.minecraft.client.renderer.ItemRenderer.field_78453_b # itemToRender \ No newline at end of file diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 026f86d95..9a0f2e0cc 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -654,7 +654,7 @@ hbm.key.craneMoveDown=Kran rückwärts hbm.key.craneMoveLeft=Kran nach links hbm.key.craneMoveRight=Kran nach rechts hbm.key.craneMoveUp=Kran vorwärts -hbm.key.toggleBack=Rucksack umschalten +hbm.key.toggleBack=Jetpack umschalten hbm.key.toggleHUD=HUD umschalten hbm.key.reload=Nachladen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 336ad59dc..2e7c34e4a 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1350,7 +1350,7 @@ hbm.key.craneMoveLeft=Move Crane Left hbm.key.craneMoveRight=Move Crane Right hbm.key.craneMoveUp=Move Crane Forward hbm.key.dash=Dash (Unbind from Crouch in config) -hbm.key.toggleBack=Toggle Backpack +hbm.key.toggleBack=Toggle Jetpack hbm.key.toggleHUD=Toggle HUD hbm.key.reload=Reload diff --git a/src/main/resources/assets/hbm/models/machines/lpw2.obj b/src/main/resources/assets/hbm/models/machines/lpw2.obj index ff9ea5ee8..aa4a22e47 100644 --- a/src/main/resources/assets/hbm/models/machines/lpw2.obj +++ b/src/main/resources/assets/hbm/models/machines/lpw2.obj @@ -2101,7 +2101,7 @@ vt 0.365749 0.937209 vt 0.364028 0.958140 vt 0.365749 0.965116 vt 0.364028 0.944186 -vt 0.462995 0.962791 +vt 0.462995 0.965116 vt 0.478485 0.958140 vt 0.478485 0.965116 vt 0.462995 0.979070 @@ -2120,20 +2120,22 @@ vt 0.462995 0.937209 vt 0.462995 0.951163 vt 0.483649 0.958140 vt 0.483649 0.965116 +vt 0.479346 0.972093 vt 0.483649 0.979070 vt 0.480207 0.979070 vt 0.481067 0.923256 vt 0.483649 0.930233 vt 0.482788 0.930233 +vt 0.479346 0.958140 vt 0.483649 0.951163 vt 0.483649 0.972093 vt 0.481067 0.951163 vt 0.483649 0.944186 -vt 0.488812 0.972093 +vt 0.487952 0.972093 vt 0.487091 0.979070 vt 0.486231 0.923256 vt 0.484509 0.930233 -vt 0.488812 0.958140 +vt 0.487952 0.958140 vt 0.488812 0.965116 vt 0.486231 0.951163 vt 0.482788 0.944186 @@ -2148,7 +2150,9 @@ vt 0.509466 0.944186 vt 0.488812 0.944186 vt 0.488812 0.951163 vt 0.509466 0.958140 +vt 0.488812 0.958140 vt 0.509466 0.972093 +vt 0.488812 0.972093 vt 0.509466 0.951163 vt 0.509466 0.965116 vt 0.509466 0.979070 @@ -2557,7 +2561,7 @@ vt 0.365749 0.965116 vt 0.364028 0.958140 vt 0.364028 0.944186 vt 0.478485 0.958140 -vt 0.462995 0.962791 +vt 0.462995 0.965116 vt 0.478485 0.965116 vt 0.478485 0.972093 vt 0.462995 0.979070 @@ -2574,7 +2578,9 @@ vt 0.462995 0.972093 vt 0.462995 0.937209 vt 0.462995 0.951163 vt 0.483649 0.958140 +vt 0.479346 0.958140 vt 0.483649 0.979070 +vt 0.479346 0.972093 vt 0.480207 0.979070 vt 0.483649 0.930233 vt 0.481067 0.923256 @@ -2584,11 +2590,11 @@ vt 0.481067 0.951163 vt 0.483649 0.965116 vt 0.483649 0.944186 vt 0.482788 0.944186 -vt 0.488812 0.972093 +vt 0.487952 0.972093 vt 0.483649 0.972093 vt 0.486231 0.923256 vt 0.483649 0.923256 -vt 0.488812 0.958140 +vt 0.487952 0.958140 vt 0.488812 0.965116 vt 0.486231 0.951163 vt 0.483649 0.937209 @@ -2603,7 +2609,9 @@ vt 0.509466 0.944186 vt 0.488812 0.944186 vt 0.509466 0.958140 vt 0.488812 0.951163 +vt 0.488812 0.958140 vt 0.509466 0.972093 +vt 0.488812 0.972093 vt 0.509466 0.951163 vt 0.509466 0.965116 vt 0.509466 0.979070 @@ -3643,381 +3651,381 @@ f 594/1031/73 587/1019/64 586/1021/65 f 599/1032/26 592/1025/68 591/1027/12 f 597/1033/10 590/1028/70 589/1030/72 f 587/1019/64 604/1034/74 603/1035/13 -f 586/1021/65 601/1036/75 585/1037/66 -f 585/1038/66 607/1039/76 592/1040/68 -f 588/1018/63 605/1041/77 604/1034/74 -f 586/1021/65 603/1035/13 602/1042/78 -f 589/1043/72 606/1044/79 605/1041/77 -f 601/1036/75 609/1045/80 608/1046/81 -f 607/1039/76 608/1047/81 614/1048/82 -f 605/1041/77 611/1049/83 604/1034/74 -f 602/1042/78 610/1050/85 609/1045/80 -f 606/1044/79 612/1051/84 605/1041/77 -f 604/1034/74 610/1050/85 603/1035/13 -f 590/1052/70 591/1053/12 606/1044/79 -f 606/1044/79 591/1053/12 613/1054/86 -f 592/1040/68 607/1039/76 591/1053/12 -f 607/1039/76 614/1048/82 591/1053/12 -f 614/1055/82 615/1056/87 591/1057/12 -f 608/1058/81 622/1059/88 614/1055/82 -f 591/1057/12 621/1060/89 613/1061/86 -f 612/1062/84 619/1063/90 611/1049/83 -f 610/1050/85 617/1064/91 609/1045/80 -f 613/1061/86 620/1065/92 612/1062/84 -f 611/1049/83 618/1066/93 610/1050/85 -f 609/1045/80 616/1067/73 608/1068/81 -f 626/1069/10 633/1070/70 634/1071/72 -f 624/1072/26 631/1073/68 632/1074/12 -f 629/1075/73 636/1076/64 637/1077/65 -f 627/1078/71 634/1071/72 635/1079/63 -f 625/1080/69 632/1074/12 633/1070/70 -f 623/1081/67 638/1082/66 631/1073/68 -f 630/1083/9 637/1077/65 638/1084/66 -f 628/1085/27 635/1079/63 636/1076/64 -f 647/1086/94 640/1087/12 652/1088/95 -f 650/1089/96 643/1090/20 649/1091/97 -f 652/1088/95 641/1092/26 651/1093/98 -f 653/1094/99 645/1095/21 647/1086/94 -f 649/1091/97 644/1096/13 648/1097/100 -f 648/1097/100 646/1098/27 616/1099/73 -f 616/1100/73 639/1101/16 653/1094/99 -f 651/1093/98 642/1102/15 650/1089/96 -f 648/1103/100 616/1104/73 659/1105/101 -f 617/1106/91 659/1105/101 616/1104/73 -f 653/1107/99 654/1108/102 616/1109/73 -f 622/1110/88 616/1109/73 654/1108/102 -f 655/1111/103 651/1093/98 656/1112/69 -f 658/1113/105 650/1114/96 649/1115/97 -f 660/1116/106 652/1117/95 655/1111/103 -f 657/1118/104 651/1093/98 650/1114/96 -f 659/1105/101 649/1115/97 648/1103/100 -f 654/1108/102 647/1119/94 660/1116/106 -f 622/1110/88 660/1116/106 615/1120/87 -f 619/1121/90 658/1113/105 618/1122/93 -f 620/1065/92 655/1111/103 656/1112/69 -f 615/1120/87 655/1111/103 621/1123/89 -f 618/1122/93 659/1105/101 617/1106/91 -f 619/1121/90 656/1112/69 657/1118/104 -f 636/1076/64 664/1124/74 663/1125/13 -f 637/1126/65 661/1127/75 638/1128/66 -f 638/1129/66 667/1130/76 631/1131/68 -f 635/1132/63 665/1133/77 664/1124/74 -f 636/1076/64 662/1134/78 637/1126/65 -f 634/1135/72 666/1136/79 665/1133/77 -f 661/1127/75 669/1137/80 668/1138/81 -f 667/1130/76 668/1139/81 674/1140/82 -f 665/1133/77 671/1141/83 664/1124/74 -f 662/1134/78 670/1142/85 669/1137/80 -f 666/1136/79 672/1143/84 665/1133/77 -f 664/1124/74 670/1142/85 663/1125/13 -f 633/1144/70 632/1145/12 666/1136/79 -f 666/1136/79 632/1145/12 673/1146/86 -f 631/1131/68 667/1130/76 632/1145/12 -f 667/1130/76 674/1140/82 632/1145/12 -f 674/1147/82 675/1148/87 632/1149/12 -f 668/1150/81 682/1151/88 674/1147/82 -f 632/1149/12 681/1152/89 673/1153/86 -f 672/1154/84 679/1155/90 671/1156/83 -f 670/1142/85 677/1157/91 669/1158/80 -f 673/1153/86 680/1159/92 672/1154/84 -f 671/1156/83 678/1160/93 670/1142/85 -f 669/1158/80 676/1161/73 668/1162/81 -f 691/1163/94 684/1164/12 696/1165/95 -f 694/1166/96 687/1167/20 693/1168/97 -f 696/1165/95 685/1169/26 695/1170/98 -f 697/1171/99 689/1172/21 691/1163/94 -f 693/1168/97 688/1173/13 692/1174/100 -f 692/1174/100 690/1175/27 676/1176/73 -f 676/1177/73 683/1178/16 697/1171/99 -f 695/1170/98 686/1179/15 694/1166/96 -f 692/1180/100 676/1181/73 703/1182/101 -f 677/1183/91 703/1182/101 676/1181/73 -f 697/1184/99 698/1185/102 676/1186/73 -f 682/1187/88 676/1186/73 698/1185/102 -f 699/1188/103 695/1170/98 700/1189/69 -f 701/1190/104 693/1191/97 702/1192/105 -f 704/1193/106 696/1194/95 699/1188/103 -f 700/1189/69 694/1195/96 701/1190/104 -f 703/1182/101 693/1191/97 692/1180/100 -f 698/1185/102 691/1196/94 704/1193/106 -f 675/1197/87 698/1185/102 704/1193/106 -f 679/1198/90 702/1192/105 678/1199/93 -f 680/1159/92 699/1188/103 700/1189/69 -f 675/1197/87 699/1188/103 681/1200/89 -f 678/1199/93 703/1182/101 677/1183/91 -f 680/1159/92 701/1190/104 679/1198/90 -f 720/1201/13 705/1202/27 712/1203/13 -f 718/1204/15 711/1205/20 710/1206/15 -f 716/1207/12 709/1208/26 708/1209/12 -f 713/1210/16 707/1211/21 706/1212/16 -f 719/1213/20 712/1203/13 711/1205/20 -f 717/1214/26 710/1206/15 709/1215/26 -f 715/1216/21 708/1209/12 707/1211/21 -f 714/1217/27 706/1212/16 705/1202/27 -f 733/1218/107 462/819/108 461/817/107 -f 734/1219/108 463/821/109 462/819/108 -f 735/1220/109 464/824/110 463/821/109 -f 464/824/110 721/1221/111 449/823/112 -f 721/1222/111 450/826/113 449/823/112 -f 722/1223/114 451/828/115 450/826/113 -f 451/828/115 724/1224/116 452/814/116 -f 452/814/116 725/1225/117 453/816/117 -f 453/816/117 726/1226/118 454/818/119 -f 454/818/119 727/1227/120 455/820/120 -f 455/820/120 728/1228/121 456/822/121 -f 728/1229/121 457/1230/122 456/822/121 -f 457/825/122 730/1231/123 458/827/123 -f 730/1232/123 459/813/124 458/827/123 -f 731/1233/124 460/815/125 459/813/124 -f 732/1234/126 461/817/107 460/815/125 -f 784/1235/13 769/1236/27 776/1237/13 -f 782/1238/15 775/1239/20 774/1240/15 -f 780/1241/12 773/1242/26 772/1243/12 -f 777/1244/16 771/1245/21 770/1246/16 -f 783/1247/20 776/1237/13 775/1239/20 -f 781/1248/26 774/1240/15 773/1249/26 -f 779/1250/21 772/1243/12 771/1245/21 -f 778/1251/27 770/1246/16 769/1236/27 -f 800/1252/13 785/1253/27 792/1254/13 -f 798/1255/15 791/1256/20 790/1257/15 -f 796/1258/12 789/1259/26 788/1260/12 -f 793/1261/16 787/1262/21 786/1263/16 -f 799/1264/20 792/1254/13 791/1256/20 -f 797/1265/26 790/1257/15 789/1266/26 -f 795/1267/21 788/1260/12 787/1262/21 -f 794/1268/27 786/1263/16 785/1253/27 -f 816/1269/13 801/1270/27 808/1271/13 -f 814/1272/15 807/1273/20 806/1274/15 -f 812/1275/12 805/1276/26 804/1277/12 -f 809/1278/16 803/1279/21 802/1280/16 -f 815/1281/20 808/1271/13 807/1273/20 -f 813/1282/26 806/1274/15 805/1283/26 -f 811/1284/21 804/1277/12 803/1279/21 -f 810/1285/27 802/1280/16 801/1270/27 -f 820/1286/127 827/1287/27 819/1288/128 -f 818/1289/129 825/1290/9 817/1291/130 -f 817/1292/130 832/1293/67 824/1294/131 -f 823/1295/15 830/1296/69 822/1297/132 -f 821/1298/133 828/1299/71 820/1286/127 -f 819/1288/128 826/1300/73 818/1289/129 -f 824/1294/131 831/1301/26 823/1295/15 -f 822/1297/132 829/1302/10 821/1298/133 -f 819/1288/128 836/1303/134 820/1304/127 -f 833/1305/135 818/1306/129 817/1307/130 -f 839/1308/136 817/1309/130 824/1310/131 -f 820/1304/127 837/1311/137 821/1312/133 -f 834/1313/138 819/1288/128 818/1306/129 -f 821/1312/133 838/1314/139 822/1315/132 -f 833/1305/135 841/1316/140 834/1313/138 -f 839/1308/136 840/1317/141 833/1318/135 -f 843/1319/142 837/1311/137 836/1303/134 -f 841/1316/140 835/1320/16 834/1313/138 -f 844/1321/143 838/1314/139 837/1311/137 -f 842/1322/144 836/1303/134 835/1320/16 -f 822/1315/132 838/1314/139 823/1323/15 -f 838/1314/139 845/1324/145 823/1323/15 -f 824/1310/131 823/1323/15 839/1308/136 -f 839/1308/136 823/1323/15 846/1325/146 -f 847/1326/93 846/1327/146 823/1328/15 -f 854/1329/91 840/1330/141 846/1327/146 -f 853/1331/90 823/1328/15 845/1332/145 -f 851/1333/89 844/1334/143 843/1335/142 -f 849/1336/88 842/1322/144 841/1337/140 -f 852/1338/92 845/1332/145 844/1334/143 -f 850/1339/87 843/1335/142 842/1322/144 -f 848/1340/73 841/1337/140 840/1341/141 -f 865/1342/132 858/1343/10 866/1344/133 -f 863/1345/131 856/1346/26 864/1347/15 -f 868/1348/128 861/1349/73 869/1350/129 -f 866/1344/133 859/1351/71 867/1352/127 -f 864/1347/15 857/1353/69 865/1342/132 -f 870/1354/130 855/1355/67 863/1345/131 -f 869/1350/129 862/1356/9 870/1357/130 -f 867/1352/127 860/1358/27 868/1348/128 -f 872/1359/15 879/1360/97 884/1361/96 -f 875/1362/21 882/1363/95 881/1364/94 -f 873/1365/26 884/1361/96 883/1366/98 -f 877/1367/20 885/1368/100 879/1360/97 -f 876/1369/16 881/1364/94 880/1370/99 -f 878/1371/27 880/1370/99 848/1372/73 -f 871/1373/13 848/1374/73 885/1368/100 -f 874/1375/12 883/1366/98 882/1363/95 -f 880/1376/99 891/1377/102 848/1378/73 -f 849/1379/88 848/1378/73 891/1377/102 -f 885/1380/100 848/1381/73 886/1382/101 -f 854/1383/91 886/1382/101 848/1381/73 -f 883/1366/98 887/1384/104 888/1385/69 -f 890/1386/106 882/1387/95 889/1388/103 -f 884/1389/96 892/1390/105 887/1384/104 -f 889/1388/103 883/1366/98 888/1385/69 -f 891/1377/102 881/1391/94 890/1386/106 -f 879/1392/97 886/1382/101 892/1390/105 -f 892/1390/105 854/1383/91 847/1393/93 -f 850/1394/87 889/1388/103 851/1395/89 -f 888/1385/69 853/1396/90 852/1338/92 -f 887/1384/104 847/1393/93 853/1396/90 -f 849/1379/88 890/1386/106 850/1394/87 -f 889/1388/103 852/1338/92 851/1395/89 -f 895/1397/16 867/1398/127 868/1348/128 -f 870/1399/130 894/1400/138 869/1401/129 -f 899/1402/136 870/1403/130 863/1404/131 -f 867/1398/127 897/1405/137 866/1406/133 -f 894/1400/138 868/1348/128 869/1401/129 -f 866/1406/133 898/1407/139 865/1408/132 -f 893/1409/135 901/1410/140 894/1400/138 -f 899/1402/136 900/1411/141 893/1412/135 -f 903/1413/142 897/1405/137 896/1414/134 -f 894/1400/138 902/1415/144 895/1397/16 -f 904/1416/143 898/1407/139 897/1405/137 -f 902/1415/144 896/1414/134 895/1397/16 -f 865/1408/132 898/1407/139 864/1417/15 -f 898/1407/139 905/1418/145 864/1417/15 -f 863/1404/131 864/1417/15 899/1402/136 -f 899/1402/136 864/1417/15 906/1419/146 -f 907/1420/93 906/1421/146 864/1422/15 -f 914/1423/91 900/1424/141 906/1421/146 -f 913/1425/90 864/1422/15 905/1426/145 -f 911/1427/89 904/1428/143 903/1429/142 -f 909/1430/88 902/1415/144 901/1431/140 -f 912/1432/92 905/1426/145 904/1428/143 -f 910/1433/87 903/1429/142 902/1415/144 -f 908/1434/73 901/1431/140 900/1435/141 -f 916/1436/15 923/1437/97 928/1438/96 -f 919/1439/21 926/1440/95 925/1441/94 -f 917/1442/26 928/1438/96 927/1443/98 -f 921/1444/20 929/1445/100 923/1437/97 -f 920/1446/16 925/1441/94 924/1447/99 -f 922/1448/27 924/1447/99 908/1449/73 -f 915/1450/13 908/1451/73 929/1445/100 -f 918/1452/12 927/1443/98 926/1440/95 -f 924/1453/99 935/1454/102 908/1455/73 -f 909/1456/88 908/1455/73 935/1454/102 -f 929/1457/100 908/1458/73 930/1459/101 -f 914/1460/91 930/1459/101 908/1458/73 -f 927/1443/98 931/1461/104 932/1462/69 -f 925/1463/94 933/1464/103 934/1465/106 -f 931/1461/104 923/1466/97 936/1467/105 -f 933/1464/103 927/1443/98 932/1462/69 -f 935/1454/102 925/1463/94 934/1465/106 -f 923/1466/97 930/1459/101 936/1467/105 -f 936/1467/105 914/1460/91 907/1468/93 -f 910/1469/87 933/1464/103 911/1470/89 -f 912/1432/92 931/1461/104 913/1471/90 -f 931/1461/104 907/1468/93 913/1471/90 -f 909/1456/88 934/1465/106 910/1469/87 -f 933/1464/103 912/1432/92 911/1470/89 -f 940/1472/127 947/1473/27 939/1474/128 -f 938/1475/129 945/1476/9 937/1477/130 -f 937/1478/130 952/1479/67 944/1480/131 -f 943/1481/15 950/1482/69 942/1483/132 -f 941/1484/133 948/1485/71 940/1472/127 -f 939/1474/128 946/1486/73 938/1475/129 -f 944/1480/131 951/1487/26 943/1481/15 -f 942/1483/132 949/1488/10 941/1484/133 -f 939/1474/128 956/1489/134 940/1472/127 -f 953/1490/135 938/1475/129 937/1491/130 -f 959/1492/136 937/1493/130 944/1494/131 -f 940/1472/127 957/1495/137 941/1496/133 -f 938/1475/129 955/1497/16 939/1474/128 -f 941/1496/133 958/1498/139 942/1499/132 -f 953/1490/135 961/1500/140 954/1501/138 -f 959/1492/136 960/1502/141 953/1503/135 -f 963/1504/142 957/1495/137 956/1489/134 -f 954/1501/138 962/1505/144 955/1497/16 -f 964/1506/143 958/1498/139 957/1495/137 -f 962/1505/144 956/1489/134 955/1497/16 -f 942/1499/132 958/1498/139 943/1507/15 -f 958/1498/139 965/1508/145 943/1507/15 -f 944/1494/131 943/1507/15 959/1492/136 -f 959/1492/136 943/1507/15 966/1509/146 -f 967/1510/93 966/1511/146 943/1512/15 -f 974/1513/91 960/1514/141 966/1511/146 -f 973/1515/90 943/1512/15 965/1516/145 -f 971/1517/89 964/1518/143 963/1504/142 -f 969/1519/88 962/1505/144 961/1500/140 -f 972/1520/92 965/1516/145 964/1518/143 -f 970/1521/87 963/1504/142 962/1505/144 -f 968/1522/73 961/1500/140 960/1523/141 -f 985/1524/132 978/1525/10 986/1526/133 -f 983/1527/131 976/1528/26 984/1529/15 -f 988/1530/128 981/1531/73 989/1532/129 -f 986/1526/133 979/1533/71 987/1534/127 -f 984/1529/15 977/1535/69 985/1524/132 -f 990/1536/130 975/1537/67 983/1527/131 -f 989/1532/129 982/1538/9 990/1539/130 -f 987/1534/127 980/1540/27 988/1530/128 -f 992/1541/15 999/1542/97 1004/1543/96 -f 995/1544/21 1002/1545/95 1001/1546/94 -f 993/1547/26 1004/1543/96 1003/1548/98 -f 997/1549/20 1005/1550/100 999/1542/97 -f 996/1551/16 1001/1546/94 1000/1552/99 -f 998/1553/27 1000/1552/99 968/1554/73 -f 991/1555/13 968/1556/73 1005/1550/100 -f 994/1557/12 1003/1548/98 1002/1545/95 -f 1000/1558/99 1011/1559/102 968/1560/73 -f 969/1561/88 968/1560/73 1011/1559/102 -f 1005/1562/100 968/1563/73 1006/1564/101 -f 974/1565/91 1006/1564/101 968/1563/73 -f 1003/1548/98 1007/1566/104 1008/1567/69 -f 1010/1568/106 1002/1569/95 1009/1570/103 -f 1004/1571/96 1012/1572/105 1007/1566/104 -f 1009/1570/103 1003/1548/98 1008/1567/69 -f 1011/1559/102 1001/1573/94 1010/1568/106 -f 999/1574/97 1006/1564/101 1012/1572/105 -f 1012/1572/105 974/1565/91 967/1575/93 -f 1010/1568/106 971/1576/89 970/1577/87 -f 972/1520/92 1007/1566/104 973/1578/90 -f 1007/1566/104 967/1575/93 973/1578/90 -f 969/1561/88 1010/1568/106 970/1577/87 -f 971/1576/89 1008/1567/69 972/1520/92 -f 988/1530/128 1016/1579/134 987/1580/127 -f 1013/1581/135 989/1582/129 990/1583/130 -f 1019/1584/136 990/1585/130 983/1586/131 -f 987/1580/127 1017/1587/137 986/1588/133 -f 1014/1589/138 988/1530/128 989/1582/129 -f 986/1588/133 1018/1590/139 985/1591/132 -f 1013/1581/135 1021/1592/140 1014/1589/138 -f 1019/1584/136 1020/1593/141 1013/1594/135 -f 1023/1595/142 1017/1587/137 1016/1579/134 -f 1014/1589/138 1022/1596/144 1015/1597/16 -f 1024/1598/143 1018/1590/139 1017/1587/137 -f 1022/1596/144 1016/1579/134 1015/1597/16 -f 985/1591/132 1018/1590/139 984/1599/15 -f 1018/1590/139 1025/1600/145 984/1599/15 -f 983/1586/131 984/1599/15 1019/1584/136 -f 1019/1584/136 984/1599/15 1026/1601/146 -f 1027/1602/93 1026/1603/146 984/1604/15 -f 1034/1605/91 1020/1606/141 1026/1603/146 -f 1033/1607/90 984/1604/15 1025/1608/145 -f 1031/1609/89 1024/1610/143 1023/1611/142 -f 1029/1612/88 1022/1596/144 1021/1613/140 -f 1032/1614/92 1025/1608/145 1024/1610/143 -f 1030/1615/87 1023/1611/142 1022/1596/144 -f 1028/1616/73 1021/1613/140 1020/1617/141 -f 1036/1618/15 1043/1619/97 1048/1620/96 -f 1039/1621/21 1046/1622/95 1045/1623/94 -f 1037/1624/26 1048/1620/96 1047/1625/98 -f 1041/1626/20 1049/1627/100 1043/1619/97 -f 1040/1628/16 1045/1623/94 1044/1629/99 -f 1042/1630/27 1044/1629/99 1028/1631/73 -f 1035/1632/13 1028/1633/73 1049/1627/100 -f 1038/1634/12 1047/1625/98 1046/1622/95 -f 1044/1635/99 1055/1636/102 1028/1637/73 -f 1029/1638/88 1028/1637/73 1055/1636/102 -f 1049/1639/100 1028/1640/73 1050/1641/101 -f 1034/1642/91 1050/1641/101 1028/1640/73 -f 1047/1625/98 1051/1643/104 1052/1644/69 -f 1045/1645/94 1053/1646/103 1054/1647/106 -f 1048/1648/96 1056/1649/105 1051/1643/104 -f 1046/1650/95 1052/1644/69 1053/1646/103 -f 1055/1636/102 1045/1645/94 1054/1647/106 -f 1043/1651/97 1050/1641/101 1056/1649/105 -f 1027/1652/93 1050/1641/101 1034/1642/91 -f 1054/1647/106 1031/1653/89 1030/1654/87 -f 1032/1614/92 1051/1643/104 1033/1655/90 -f 1051/1643/104 1027/1652/93 1033/1655/90 -f 1029/1638/88 1054/1647/106 1030/1654/87 -f 1053/1646/103 1032/1614/92 1031/1653/89 +f 586/1036/65 601/1037/75 585/1038/66 +f 585/1039/66 607/1040/76 592/1041/68 +f 588/1042/63 605/1043/77 604/1034/74 +f 586/1036/65 603/1035/13 602/1044/78 +f 589/1045/72 606/1046/79 605/1043/77 +f 601/1037/75 609/1047/80 608/1048/81 +f 607/1040/76 608/1049/81 614/1050/82 +f 605/1043/77 611/1051/83 604/1034/74 +f 602/1044/78 610/1052/85 609/1047/80 +f 606/1046/79 612/1053/84 605/1043/77 +f 604/1034/74 610/1052/85 603/1035/13 +f 590/1054/70 591/1055/12 606/1046/79 +f 606/1046/79 591/1055/12 613/1056/86 +f 592/1041/68 607/1040/76 591/1055/12 +f 607/1040/76 614/1050/82 591/1055/12 +f 614/1057/82 615/1058/87 591/1059/12 +f 608/1060/81 622/1061/88 614/1057/82 +f 591/1059/12 621/1062/89 613/1063/86 +f 612/1064/84 619/1065/90 611/1066/83 +f 610/1052/85 617/1067/91 609/1068/80 +f 613/1063/86 620/1069/92 612/1064/84 +f 611/1066/83 618/1070/93 610/1052/85 +f 609/1068/80 616/1071/73 608/1072/81 +f 626/1073/10 633/1074/70 634/1075/72 +f 624/1076/26 631/1077/68 632/1078/12 +f 629/1079/73 636/1080/64 637/1081/65 +f 627/1082/71 634/1075/72 635/1083/63 +f 625/1084/69 632/1078/12 633/1074/70 +f 623/1085/67 638/1086/66 631/1077/68 +f 630/1087/9 637/1081/65 638/1088/66 +f 628/1089/27 635/1083/63 636/1080/64 +f 647/1090/94 640/1091/12 652/1092/95 +f 650/1093/96 643/1094/20 649/1095/97 +f 652/1092/95 641/1096/26 651/1097/98 +f 653/1098/99 645/1099/21 647/1090/94 +f 649/1095/97 644/1100/13 648/1101/100 +f 648/1101/100 646/1102/27 616/1103/73 +f 616/1104/73 639/1105/16 653/1098/99 +f 651/1097/98 642/1106/15 650/1093/96 +f 648/1107/100 616/1108/73 659/1109/101 +f 617/1110/91 659/1109/101 616/1108/73 +f 653/1111/99 654/1112/102 616/1113/73 +f 622/1114/88 616/1113/73 654/1112/102 +f 655/1115/103 651/1097/98 656/1116/69 +f 658/1117/105 650/1118/96 649/1119/97 +f 660/1120/106 652/1121/95 655/1115/103 +f 657/1122/104 651/1097/98 650/1118/96 +f 659/1109/101 649/1119/97 648/1107/100 +f 654/1112/102 647/1123/94 660/1120/106 +f 622/1114/88 660/1120/106 615/1124/87 +f 619/1125/90 658/1117/105 618/1126/93 +f 620/1069/92 655/1115/103 656/1116/69 +f 615/1124/87 655/1115/103 621/1127/89 +f 618/1126/93 659/1109/101 617/1110/91 +f 619/1125/90 656/1116/69 657/1122/104 +f 636/1080/64 664/1128/74 663/1129/13 +f 637/1130/65 661/1131/75 638/1132/66 +f 638/1133/66 667/1134/76 631/1135/68 +f 635/1136/63 665/1137/77 664/1128/74 +f 636/1080/64 662/1138/78 637/1130/65 +f 634/1139/72 666/1140/79 665/1137/77 +f 661/1131/75 669/1141/80 668/1142/81 +f 667/1134/76 668/1143/81 674/1144/82 +f 665/1137/77 671/1145/83 664/1128/74 +f 662/1138/78 670/1146/85 669/1141/80 +f 666/1140/79 672/1147/84 665/1137/77 +f 664/1128/74 670/1146/85 663/1129/13 +f 633/1148/70 632/1149/12 666/1140/79 +f 666/1140/79 632/1149/12 673/1150/86 +f 631/1135/68 667/1134/76 632/1149/12 +f 667/1134/76 674/1144/82 632/1149/12 +f 674/1151/82 675/1152/87 632/1153/12 +f 668/1154/81 682/1155/88 674/1151/82 +f 632/1153/12 681/1156/89 673/1157/86 +f 672/1158/84 679/1159/90 671/1160/83 +f 670/1146/85 677/1161/91 669/1162/80 +f 673/1157/86 680/1163/92 672/1158/84 +f 671/1160/83 678/1164/93 670/1146/85 +f 669/1162/80 676/1165/73 668/1166/81 +f 691/1167/94 684/1168/12 696/1169/95 +f 694/1170/96 687/1171/20 693/1172/97 +f 696/1169/95 685/1173/26 695/1174/98 +f 697/1175/99 689/1176/21 691/1167/94 +f 693/1172/97 688/1177/13 692/1178/100 +f 692/1178/100 690/1179/27 676/1180/73 +f 676/1181/73 683/1182/16 697/1175/99 +f 695/1174/98 686/1183/15 694/1170/96 +f 692/1184/100 676/1185/73 703/1186/101 +f 677/1187/91 703/1186/101 676/1185/73 +f 697/1188/99 698/1189/102 676/1190/73 +f 682/1191/88 676/1190/73 698/1189/102 +f 699/1192/103 695/1174/98 700/1193/69 +f 701/1194/104 693/1195/97 702/1196/105 +f 704/1197/106 696/1198/95 699/1192/103 +f 700/1193/69 694/1199/96 701/1194/104 +f 703/1186/101 693/1195/97 692/1184/100 +f 698/1189/102 691/1200/94 704/1197/106 +f 675/1201/87 698/1189/102 704/1197/106 +f 679/1202/90 702/1196/105 678/1203/93 +f 680/1163/92 699/1192/103 700/1193/69 +f 675/1201/87 699/1192/103 681/1204/89 +f 678/1203/93 703/1186/101 677/1187/91 +f 680/1163/92 701/1194/104 679/1202/90 +f 720/1205/13 705/1206/27 712/1207/13 +f 718/1208/15 711/1209/20 710/1210/15 +f 716/1211/12 709/1212/26 708/1213/12 +f 713/1214/16 707/1215/21 706/1216/16 +f 719/1217/20 712/1207/13 711/1209/20 +f 717/1218/26 710/1210/15 709/1219/26 +f 715/1220/21 708/1213/12 707/1215/21 +f 714/1221/27 706/1216/16 705/1206/27 +f 733/1222/107 462/819/108 461/817/107 +f 734/1223/108 463/821/109 462/819/108 +f 735/1224/109 464/824/110 463/821/109 +f 464/824/110 721/1225/111 449/823/112 +f 721/1226/111 450/826/113 449/823/112 +f 722/1227/114 451/828/115 450/826/113 +f 451/828/115 724/1228/116 452/814/116 +f 452/814/116 725/1229/117 453/816/117 +f 453/816/117 726/1230/118 454/818/119 +f 454/818/119 727/1231/120 455/820/120 +f 455/820/120 728/1232/121 456/822/121 +f 728/1233/121 457/1234/122 456/822/121 +f 457/825/122 730/1235/123 458/827/123 +f 730/1236/123 459/813/124 458/827/123 +f 731/1237/124 460/815/125 459/813/124 +f 732/1238/126 461/817/107 460/815/125 +f 784/1239/13 769/1240/27 776/1241/13 +f 782/1242/15 775/1243/20 774/1244/15 +f 780/1245/12 773/1246/26 772/1247/12 +f 777/1248/16 771/1249/21 770/1250/16 +f 783/1251/20 776/1241/13 775/1243/20 +f 781/1252/26 774/1244/15 773/1253/26 +f 779/1254/21 772/1247/12 771/1249/21 +f 778/1255/27 770/1250/16 769/1240/27 +f 800/1256/13 785/1257/27 792/1258/13 +f 798/1259/15 791/1260/20 790/1261/15 +f 796/1262/12 789/1263/26 788/1264/12 +f 793/1265/16 787/1266/21 786/1267/16 +f 799/1268/20 792/1258/13 791/1260/20 +f 797/1269/26 790/1261/15 789/1270/26 +f 795/1271/21 788/1264/12 787/1266/21 +f 794/1272/27 786/1267/16 785/1257/27 +f 816/1273/13 801/1274/27 808/1275/13 +f 814/1276/15 807/1277/20 806/1278/15 +f 812/1279/12 805/1280/26 804/1281/12 +f 809/1282/16 803/1283/21 802/1284/16 +f 815/1285/20 808/1275/13 807/1277/20 +f 813/1286/26 806/1278/15 805/1287/26 +f 811/1288/21 804/1281/12 803/1283/21 +f 810/1289/27 802/1284/16 801/1274/27 +f 820/1290/127 827/1291/27 819/1292/128 +f 818/1293/129 825/1294/9 817/1295/130 +f 817/1296/130 832/1297/67 824/1298/131 +f 823/1299/15 830/1300/69 822/1301/132 +f 821/1302/133 828/1303/71 820/1290/127 +f 819/1292/128 826/1304/73 818/1293/129 +f 824/1298/131 831/1305/26 823/1299/15 +f 822/1301/132 829/1306/10 821/1302/133 +f 819/1292/128 836/1307/134 820/1308/127 +f 833/1309/135 818/1310/129 817/1311/130 +f 839/1312/136 817/1313/130 824/1314/131 +f 820/1308/127 837/1315/137 821/1316/133 +f 834/1317/138 819/1292/128 818/1310/129 +f 821/1316/133 838/1318/139 822/1319/132 +f 833/1309/135 841/1320/140 834/1317/138 +f 839/1312/136 840/1321/141 833/1322/135 +f 843/1323/142 837/1315/137 836/1307/134 +f 841/1320/140 835/1324/16 834/1317/138 +f 844/1325/143 838/1318/139 837/1315/137 +f 842/1326/144 836/1307/134 835/1324/16 +f 822/1319/132 838/1318/139 823/1327/15 +f 838/1318/139 845/1328/145 823/1327/15 +f 824/1314/131 823/1327/15 839/1312/136 +f 839/1312/136 823/1327/15 846/1329/146 +f 847/1330/93 846/1331/146 823/1332/15 +f 854/1333/91 840/1334/141 846/1331/146 +f 853/1335/90 823/1332/15 845/1336/145 +f 851/1337/89 844/1338/143 843/1339/142 +f 849/1340/88 842/1326/144 841/1341/140 +f 852/1342/92 845/1336/145 844/1338/143 +f 850/1343/87 843/1339/142 842/1326/144 +f 848/1344/73 841/1341/140 840/1345/141 +f 865/1346/132 858/1347/10 866/1348/133 +f 863/1349/131 856/1350/26 864/1351/15 +f 868/1352/128 861/1353/73 869/1354/129 +f 866/1348/133 859/1355/71 867/1356/127 +f 864/1351/15 857/1357/69 865/1346/132 +f 870/1358/130 855/1359/67 863/1349/131 +f 869/1354/129 862/1360/9 870/1361/130 +f 867/1356/127 860/1362/27 868/1352/128 +f 872/1363/15 879/1364/97 884/1365/96 +f 875/1366/21 882/1367/95 881/1368/94 +f 873/1369/26 884/1365/96 883/1370/98 +f 877/1371/20 885/1372/100 879/1364/97 +f 876/1373/16 881/1368/94 880/1374/99 +f 878/1375/27 880/1374/99 848/1376/73 +f 871/1377/13 848/1378/73 885/1372/100 +f 874/1379/12 883/1370/98 882/1367/95 +f 880/1380/99 891/1381/102 848/1382/73 +f 849/1383/88 848/1382/73 891/1381/102 +f 885/1384/100 848/1385/73 886/1386/101 +f 854/1387/91 886/1386/101 848/1385/73 +f 883/1370/98 887/1388/104 888/1389/69 +f 890/1390/106 882/1391/95 889/1392/103 +f 884/1393/96 892/1394/105 887/1388/104 +f 889/1392/103 883/1370/98 888/1389/69 +f 891/1381/102 881/1395/94 890/1390/106 +f 879/1396/97 886/1386/101 892/1394/105 +f 892/1394/105 854/1387/91 847/1397/93 +f 850/1398/87 889/1392/103 851/1399/89 +f 888/1389/69 853/1400/90 852/1342/92 +f 887/1388/104 847/1397/93 853/1400/90 +f 849/1383/88 890/1390/106 850/1398/87 +f 889/1392/103 852/1342/92 851/1399/89 +f 895/1401/16 867/1402/127 868/1352/128 +f 870/1403/130 894/1404/138 869/1405/129 +f 899/1406/136 870/1407/130 863/1408/131 +f 867/1402/127 897/1409/137 866/1410/133 +f 894/1404/138 868/1352/128 869/1405/129 +f 866/1410/133 898/1411/139 865/1412/132 +f 893/1413/135 901/1414/140 894/1404/138 +f 899/1406/136 900/1415/141 893/1416/135 +f 903/1417/142 897/1409/137 896/1418/134 +f 894/1404/138 902/1419/144 895/1401/16 +f 904/1420/143 898/1411/139 897/1409/137 +f 902/1419/144 896/1418/134 895/1401/16 +f 865/1412/132 898/1411/139 864/1421/15 +f 898/1411/139 905/1422/145 864/1421/15 +f 863/1408/131 864/1421/15 899/1406/136 +f 899/1406/136 864/1421/15 906/1423/146 +f 907/1424/93 906/1425/146 864/1426/15 +f 914/1427/91 900/1428/141 906/1425/146 +f 913/1429/90 864/1426/15 905/1430/145 +f 911/1431/89 904/1432/143 903/1433/142 +f 909/1434/88 902/1419/144 901/1435/140 +f 912/1436/92 905/1430/145 904/1432/143 +f 910/1437/87 903/1433/142 902/1419/144 +f 908/1438/73 901/1435/140 900/1439/141 +f 916/1440/15 923/1441/97 928/1442/96 +f 919/1443/21 926/1444/95 925/1445/94 +f 917/1446/26 928/1442/96 927/1447/98 +f 921/1448/20 929/1449/100 923/1441/97 +f 920/1450/16 925/1445/94 924/1451/99 +f 922/1452/27 924/1451/99 908/1453/73 +f 915/1454/13 908/1455/73 929/1449/100 +f 918/1456/12 927/1447/98 926/1444/95 +f 924/1457/99 935/1458/102 908/1459/73 +f 909/1460/88 908/1459/73 935/1458/102 +f 929/1461/100 908/1462/73 930/1463/101 +f 914/1464/91 930/1463/101 908/1462/73 +f 927/1447/98 931/1465/104 932/1466/69 +f 925/1467/94 933/1468/103 934/1469/106 +f 931/1465/104 923/1470/97 936/1471/105 +f 933/1468/103 927/1447/98 932/1466/69 +f 935/1458/102 925/1467/94 934/1469/106 +f 923/1470/97 930/1463/101 936/1471/105 +f 936/1471/105 914/1464/91 907/1472/93 +f 910/1473/87 933/1468/103 911/1474/89 +f 912/1436/92 931/1465/104 913/1475/90 +f 931/1465/104 907/1472/93 913/1475/90 +f 909/1460/88 934/1469/106 910/1473/87 +f 933/1468/103 912/1436/92 911/1474/89 +f 940/1476/127 947/1477/27 939/1478/128 +f 938/1479/129 945/1480/9 937/1481/130 +f 937/1482/130 952/1483/67 944/1484/131 +f 943/1485/15 950/1486/69 942/1487/132 +f 941/1488/133 948/1489/71 940/1476/127 +f 939/1478/128 946/1490/73 938/1479/129 +f 944/1484/131 951/1491/26 943/1485/15 +f 942/1487/132 949/1492/10 941/1488/133 +f 939/1478/128 956/1493/134 940/1494/127 +f 953/1495/135 938/1496/129 937/1497/130 +f 959/1498/136 937/1499/130 944/1500/131 +f 940/1494/127 957/1501/137 941/1502/133 +f 938/1496/129 955/1503/16 939/1478/128 +f 941/1502/133 958/1504/139 942/1505/132 +f 953/1495/135 961/1506/140 954/1507/138 +f 959/1498/136 960/1508/141 953/1509/135 +f 963/1510/142 957/1501/137 956/1493/134 +f 954/1507/138 962/1511/144 955/1503/16 +f 964/1512/143 958/1504/139 957/1501/137 +f 962/1511/144 956/1493/134 955/1503/16 +f 942/1505/132 958/1504/139 943/1513/15 +f 958/1504/139 965/1514/145 943/1513/15 +f 944/1500/131 943/1513/15 959/1498/136 +f 959/1498/136 943/1513/15 966/1515/146 +f 967/1516/93 966/1517/146 943/1518/15 +f 974/1519/91 960/1520/141 966/1517/146 +f 973/1521/90 943/1518/15 965/1522/145 +f 971/1523/89 964/1524/143 963/1525/142 +f 969/1526/88 962/1511/144 961/1527/140 +f 972/1528/92 965/1522/145 964/1524/143 +f 970/1529/87 963/1525/142 962/1511/144 +f 968/1530/73 961/1527/140 960/1531/141 +f 985/1532/132 978/1533/10 986/1534/133 +f 983/1535/131 976/1536/26 984/1537/15 +f 988/1538/128 981/1539/73 989/1540/129 +f 986/1534/133 979/1541/71 987/1542/127 +f 984/1537/15 977/1543/69 985/1532/132 +f 990/1544/130 975/1545/67 983/1535/131 +f 989/1540/129 982/1546/9 990/1547/130 +f 987/1542/127 980/1548/27 988/1538/128 +f 992/1549/15 999/1550/97 1004/1551/96 +f 995/1552/21 1002/1553/95 1001/1554/94 +f 993/1555/26 1004/1551/96 1003/1556/98 +f 997/1557/20 1005/1558/100 999/1550/97 +f 996/1559/16 1001/1554/94 1000/1560/99 +f 998/1561/27 1000/1560/99 968/1562/73 +f 991/1563/13 968/1564/73 1005/1558/100 +f 994/1565/12 1003/1556/98 1002/1553/95 +f 1000/1566/99 1011/1567/102 968/1568/73 +f 969/1569/88 968/1568/73 1011/1567/102 +f 1005/1570/100 968/1571/73 1006/1572/101 +f 974/1573/91 1006/1572/101 968/1571/73 +f 1003/1556/98 1007/1574/104 1008/1575/69 +f 1010/1576/106 1002/1577/95 1009/1578/103 +f 1004/1579/96 1012/1580/105 1007/1574/104 +f 1009/1578/103 1003/1556/98 1008/1575/69 +f 1011/1567/102 1001/1581/94 1010/1576/106 +f 999/1582/97 1006/1572/101 1012/1580/105 +f 1012/1580/105 974/1573/91 967/1583/93 +f 1010/1576/106 971/1584/89 970/1585/87 +f 972/1528/92 1007/1574/104 973/1586/90 +f 1007/1574/104 967/1583/93 973/1586/90 +f 969/1569/88 1010/1576/106 970/1585/87 +f 971/1584/89 1008/1575/69 972/1528/92 +f 988/1538/128 1016/1587/134 987/1588/127 +f 1013/1589/135 989/1590/129 990/1591/130 +f 1019/1592/136 990/1593/130 983/1594/131 +f 987/1588/127 1017/1595/137 986/1596/133 +f 1014/1597/138 988/1538/128 989/1590/129 +f 986/1596/133 1018/1598/139 985/1599/132 +f 1013/1589/135 1021/1600/140 1014/1597/138 +f 1019/1592/136 1020/1601/141 1013/1602/135 +f 1023/1603/142 1017/1595/137 1016/1587/134 +f 1014/1597/138 1022/1604/144 1015/1605/16 +f 1024/1606/143 1018/1598/139 1017/1595/137 +f 1022/1604/144 1016/1587/134 1015/1605/16 +f 985/1599/132 1018/1598/139 984/1607/15 +f 1018/1598/139 1025/1608/145 984/1607/15 +f 983/1594/131 984/1607/15 1019/1592/136 +f 1019/1592/136 984/1607/15 1026/1609/146 +f 1027/1610/93 1026/1611/146 984/1612/15 +f 1034/1613/91 1020/1614/141 1026/1611/146 +f 1033/1615/90 984/1612/15 1025/1616/145 +f 1031/1617/89 1024/1618/143 1023/1619/142 +f 1029/1620/88 1022/1604/144 1021/1621/140 +f 1032/1622/92 1025/1616/145 1024/1618/143 +f 1030/1623/87 1023/1619/142 1022/1604/144 +f 1028/1624/73 1021/1621/140 1020/1625/141 +f 1036/1626/15 1043/1627/97 1048/1628/96 +f 1039/1629/21 1046/1630/95 1045/1631/94 +f 1037/1632/26 1048/1628/96 1047/1633/98 +f 1041/1634/20 1049/1635/100 1043/1627/97 +f 1040/1636/16 1045/1631/94 1044/1637/99 +f 1042/1638/27 1044/1637/99 1028/1639/73 +f 1035/1640/13 1028/1641/73 1049/1635/100 +f 1038/1642/12 1047/1633/98 1046/1630/95 +f 1044/1643/99 1055/1644/102 1028/1645/73 +f 1029/1646/88 1028/1645/73 1055/1644/102 +f 1049/1647/100 1028/1648/73 1050/1649/101 +f 1034/1650/91 1050/1649/101 1028/1648/73 +f 1047/1633/98 1051/1651/104 1052/1652/69 +f 1045/1653/94 1053/1654/103 1054/1655/106 +f 1048/1656/96 1056/1657/105 1051/1651/104 +f 1046/1658/95 1052/1652/69 1053/1654/103 +f 1055/1644/102 1045/1653/94 1054/1655/106 +f 1043/1659/97 1050/1649/101 1056/1657/105 +f 1027/1660/93 1050/1649/101 1034/1650/91 +f 1054/1655/106 1031/1661/89 1030/1662/87 +f 1032/1622/92 1051/1651/104 1033/1663/90 +f 1051/1651/104 1027/1660/93 1033/1663/90 +f 1029/1646/88 1054/1655/106 1030/1662/87 +f 1053/1654/103 1032/1622/92 1031/1661/89 f 28/556/19 44/587/19 45/557/20 f 21/559/21 37/588/21 38/560/22 f 29/558/20 45/557/20 46/562/23 @@ -4050,22 +4058,22 @@ f 58/452/43 59/209/44 43/583/44 f 59/215/44 60/217/45 44/587/45 f 60/221/45 61/223/46 45/557/46 f 45/557/46 61/458/46 62/227/31 -f 32/571/47 80/1656/47 79/590/48 +f 32/571/47 80/1664/47 79/590/48 f 30/563/49 31/567/48 79/591/48 f 29/558/50 30/563/49 78/593/49 -f 29/558/50 77/1657/50 76/595/51 -f 28/556/51 76/1658/51 75/596/52 -f 27/584/52 75/1659/52 74/597/53 -f 26/580/53 74/1660/53 73/598/54 +f 29/558/50 77/1665/50 76/595/51 +f 28/556/51 76/1666/51 75/596/52 +f 27/584/52 75/1667/52 74/597/53 +f 26/580/53 74/1668/53 73/598/54 f 24/569/55 25/573/54 73/599/54 -f 24/569/55 72/1661/55 71/601/56 -f 23/565/56 71/1662/56 70/602/57 -f 22/561/57 70/1663/57 69/603/58 +f 24/569/55 72/1669/55 71/601/56 +f 23/565/56 71/1670/56 70/602/57 +f 22/561/57 70/1671/57 69/603/58 f 20/586/59 21/559/58 69/604/58 f 19/582/60 20/586/59 68/606/59 -f 19/582/60 67/1664/60 66/608/61 -f 18/576/61 66/1665/61 65/609/62 -f 17/574/62 65/1666/62 80/610/47 +f 19/582/60 67/1672/60 66/608/61 +f 18/576/61 66/1673/61 65/609/62 +f 17/574/62 65/1674/62 80/610/47 f 113/28/27 129/72/27 144/69/25 f 114/32/28 130/435/28 129/72/27 f 115/31/16 131/76/16 130/435/28 @@ -4100,7 +4108,7 @@ f 191/110/13 207/154/13 206/151/23 f 192/113/25 208/157/25 207/154/13 f 224/611/13 217/627/27 209/612/27 f 222/614/15 223/623/20 215/615/20 -f 220/617/12 221/1667/26 213/618/26 +f 220/617/12 221/1675/26 213/618/26 f 218/620/16 219/626/21 211/621/21 f 223/623/20 224/611/13 216/613/13 f 221/624/26 222/614/15 214/616/15 @@ -4108,7 +4116,7 @@ f 219/626/21 220/617/12 212/619/12 f 217/627/27 218/620/16 210/622/16 f 240/628/12 233/644/26 225/629/26 f 238/631/16 239/640/21 231/632/21 -f 236/634/13 237/1668/27 229/635/27 +f 236/634/13 237/1676/27 229/635/27 f 234/637/15 235/643/20 227/638/20 f 239/640/21 240/628/12 232/630/12 f 237/641/27 238/631/16 230/633/16 @@ -4116,7 +4124,7 @@ f 235/643/20 236/634/13 228/636/13 f 233/644/26 234/637/15 226/639/15 f 256/645/15 249/661/20 241/646/20 f 254/648/12 255/657/26 247/649/26 -f 252/651/16 253/1669/21 245/652/21 +f 252/651/16 253/1677/21 245/652/21 f 250/654/13 251/660/27 243/655/27 f 255/657/26 256/645/15 248/647/15 f 253/658/21 254/648/12 246/650/12 @@ -4124,7 +4132,7 @@ f 251/660/27 252/651/16 244/653/16 f 249/661/20 250/654/13 242/656/13 f 272/662/16 265/678/21 257/663/21 f 270/665/13 271/674/27 263/666/27 -f 268/668/15 269/1670/20 261/669/20 +f 268/668/15 269/1678/20 261/669/20 f 266/671/12 267/677/26 259/672/26 f 271/674/27 272/662/16 264/664/16 f 269/675/20 270/665/13 262/667/13 @@ -4132,7 +4140,7 @@ f 267/677/26 268/668/15 260/670/15 f 265/678/21 266/671/12 258/673/12 f 288/679/20 281/695/13 273/680/13 f 286/682/26 287/691/15 279/683/15 -f 284/685/21 285/1671/12 277/686/12 +f 284/685/21 285/1679/12 277/686/12 f 282/688/27 283/694/16 275/689/16 f 287/691/15 288/679/20 280/681/20 f 285/692/12 286/682/26 278/684/26 @@ -4140,7 +4148,7 @@ f 283/694/16 284/685/21 276/687/21 f 281/695/13 282/688/27 274/690/27 f 304/696/21 297/712/12 289/697/12 f 302/699/27 303/708/16 295/700/16 -f 300/702/20 301/1672/13 293/703/13 +f 300/702/20 301/1680/13 293/703/13 f 298/705/26 299/711/15 291/706/15 f 303/708/16 304/696/21 296/698/21 f 301/709/13 302/699/27 294/701/27 @@ -4148,7 +4156,7 @@ f 299/711/15 300/702/20 292/704/20 f 297/712/12 298/705/26 290/707/26 f 320/713/26 313/729/15 305/714/15 f 318/716/21 319/725/12 311/717/12 -f 316/719/27 317/1673/16 309/720/16 +f 316/719/27 317/1681/16 309/720/16 f 314/722/20 315/728/13 307/723/13 f 319/725/12 320/713/26 312/715/26 f 317/726/16 318/716/21 310/718/21 @@ -4156,7 +4164,7 @@ f 315/728/13 316/719/27 308/721/27 f 313/729/15 314/722/20 306/724/20 f 336/730/27 329/746/16 321/731/16 f 334/733/20 335/742/13 327/734/13 -f 332/736/26 333/1674/15 325/737/15 +f 332/736/26 333/1682/15 325/737/15 f 330/739/21 331/745/12 323/740/12 f 335/742/13 336/730/27 328/732/27 f 333/743/15 334/733/20 326/735/20 @@ -4164,7 +4172,7 @@ f 331/745/12 332/736/26 324/738/26 f 329/746/16 330/739/21 322/741/21 f 337/747/27 353/751/27 354/748/28 f 352/750/25 368/777/25 353/751/27 -f 345/752/26 361/1675/26 362/753/29 +f 345/752/26 361/1683/26 362/753/29 f 338/749/28 354/748/28 355/755/16 f 346/754/29 362/753/29 363/757/15 f 339/756/16 355/755/16 356/759/30 @@ -4196,7 +4204,7 @@ f 394/311/29 395/314/15 379/278/15 f 387/297/16 388/299/30 372/466/30 f 401/780/27 417/784/27 418/781/28 f 416/783/25 432/810/25 417/784/27 -f 409/785/26 425/1676/26 426/786/29 +f 409/785/26 425/1684/26 426/786/29 f 402/782/28 418/781/28 419/788/16 f 410/787/29 426/786/29 427/790/15 f 403/789/16 419/788/16 420/792/30 @@ -4219,7 +4227,7 @@ f 454/818/22 455/820/12 439/339/12 f 462/819/23 463/821/13 447/487/13 f 455/820/12 456/822/24 440/343/24 f 463/821/13 464/824/25 448/321/25 -f 456/822/24 457/1230/26 441/491/26 +f 456/822/24 457/1234/26 441/491/26 f 449/823/27 450/826/28 434/326/28 f 464/824/25 449/823/27 433/488/27 f 457/825/26 458/827/29 442/347/29 @@ -4228,7 +4236,7 @@ f 458/827/29 459/813/15 443/350/15 f 451/828/16 452/814/30 436/489/30 f 475/829/27 476/841/71 468/830/63 f 473/832/9 474/843/73 466/833/65 -f 480/835/67 473/1677/9 465/836/66 +f 480/835/67 473/1685/9 465/836/66 f 478/838/69 479/844/26 471/839/12 f 476/841/71 477/845/10 469/842/72 f 474/843/73 475/829/27 467/831/64 @@ -4236,18 +4244,18 @@ f 479/844/26 480/835/67 472/837/68 f 477/845/10 478/838/69 470/840/70 f 467/831/64 468/854/63 484/846/74 f 466/848/65 482/856/78 481/849/75 -f 465/851/66 481/1678/75 487/852/76 +f 465/851/66 481/1686/75 487/852/76 f 468/854/63 469/857/72 485/855/77 f 466/848/65 467/831/64 483/847/13 f 469/857/72 470/866/70 486/858/79 f 481/849/75 482/856/78 489/859/80 -f 487/852/76 481/1678/75 488/861/81 +f 487/852/76 481/1686/75 488/861/81 f 485/855/77 492/864/84 491/863/83 f 483/847/13 490/865/85 489/859/80 f 486/858/79 493/868/86 492/864/84 f 484/846/74 491/863/83 490/865/85 f 494/869/82 502/873/88 495/870/87 -f 488/872/81 496/1679/73 502/873/88 +f 488/872/81 496/1687/73 502/873/88 f 471/871/12 495/870/87 501/874/89 f 492/876/84 500/881/92 499/877/90 f 490/865/85 498/882/93 497/879/91 @@ -4259,7 +4267,7 @@ f 504/888/26 503/897/67 511/889/68 f 509/891/73 508/901/27 516/892/64 f 507/894/71 506/885/10 514/887/72 f 505/896/69 504/888/26 512/890/12 -f 503/897/67 510/1680/9 518/898/66 +f 503/897/67 510/1688/9 518/898/66 f 510/899/9 509/891/73 517/893/65 f 508/901/27 507/894/71 515/895/63 f 527/902/94 525/911/21 520/903/12 @@ -4268,7 +4276,7 @@ f 532/904/95 520/903/12 521/908/26 f 533/910/99 519/917/16 525/911/21 f 529/907/97 523/906/20 524/912/13 f 528/913/100 524/912/13 526/914/27 -f 496/916/73 526/1681/27 519/917/16 +f 496/916/73 526/1689/27 519/917/16 f 531/909/98 521/908/26 522/918/15 f 535/927/103 532/933/95 531/909/98 f 537/929/104 530/934/96 529/930/97 @@ -4284,18 +4292,18 @@ f 497/922/91 498/938/93 538/931/105 f 500/881/92 536/928/69 537/929/104 f 515/940/63 544/949/74 543/941/13 f 517/942/65 542/950/78 541/943/75 -f 518/945/66 541/1682/75 547/946/76 +f 518/945/66 541/1690/75 547/946/76 f 515/940/63 514/951/72 545/948/77 f 516/892/64 543/941/13 542/950/78 f 514/951/72 513/960/70 546/952/79 f 541/943/75 542/950/78 549/953/80 -f 547/946/76 541/1682/75 548/955/81 +f 547/946/76 541/1690/75 548/955/81 f 545/948/77 552/959/84 551/957/83 f 542/950/78 543/941/13 550/958/85 f 546/952/79 553/962/86 552/959/84 f 544/949/74 551/957/83 550/958/85 f 554/963/82 562/967/88 555/964/87 -f 548/966/81 556/1683/73 562/967/88 +f 548/966/81 556/1691/73 562/967/88 f 512/965/12 555/964/87 561/968/89 f 552/970/84 560/975/92 559/971/90 f 550/958/85 558/976/93 557/973/91 @@ -4308,7 +4316,7 @@ f 576/981/95 564/980/12 565/985/26 f 577/987/99 563/994/16 569/988/21 f 573/984/97 567/983/20 568/989/13 f 572/990/100 568/989/13 570/991/27 -f 556/993/73 570/1684/27 563/994/16 +f 556/993/73 570/1692/27 563/994/16 f 575/986/98 565/985/26 566/995/15 f 579/1004/103 576/1010/95 575/986/98 f 581/1006/104 574/1011/96 573/1007/97 @@ -4324,340 +4332,340 @@ f 557/999/91 558/1015/93 582/1008/105 f 560/975/92 580/1005/69 581/1006/104 f 595/1017/27 596/1029/71 588/1018/63 f 593/1020/9 594/1031/73 586/1021/65 -f 600/1023/67 593/1685/9 585/1024/66 +f 600/1023/67 593/1693/9 585/1024/66 f 598/1026/69 599/1032/26 591/1027/12 f 596/1029/71 597/1033/10 589/1030/72 f 594/1031/73 595/1017/27 587/1019/64 f 599/1032/26 600/1023/67 592/1025/68 f 597/1033/10 598/1026/69 590/1028/70 -f 587/1019/64 588/1018/63 604/1034/74 -f 586/1021/65 602/1042/78 601/1036/75 -f 585/1038/66 601/1686/75 607/1039/76 -f 588/1018/63 589/1043/72 605/1041/77 -f 586/1021/65 587/1019/64 603/1035/13 -f 589/1043/72 590/1052/70 606/1044/79 -f 601/1036/75 602/1042/78 609/1045/80 -f 607/1039/76 601/1686/75 608/1047/81 -f 605/1041/77 612/1051/84 611/1049/83 -f 602/1042/78 603/1035/13 610/1050/85 -f 606/1044/79 613/1054/86 612/1051/84 -f 604/1034/74 611/1049/83 610/1050/85 -f 614/1055/82 622/1059/88 615/1056/87 -f 608/1058/81 616/1687/73 622/1059/88 -f 591/1057/12 615/1056/87 621/1060/89 -f 612/1062/84 620/1065/92 619/1063/90 -f 610/1050/85 618/1066/93 617/1064/91 -f 613/1061/86 621/1060/89 620/1065/92 -f 611/1049/83 619/1063/90 618/1066/93 -f 609/1045/80 617/1064/91 616/1067/73 -f 626/1069/10 625/1080/69 633/1070/70 -f 624/1072/26 623/1081/67 631/1073/68 -f 629/1075/73 628/1085/27 636/1076/64 -f 627/1078/71 626/1069/10 634/1071/72 -f 625/1080/69 624/1072/26 632/1074/12 -f 623/1081/67 630/1688/9 638/1082/66 -f 630/1083/9 629/1075/73 637/1077/65 -f 628/1085/27 627/1078/71 635/1079/63 -f 647/1086/94 645/1095/21 640/1087/12 -f 650/1089/96 642/1102/15 643/1090/20 -f 652/1088/95 640/1087/12 641/1092/26 -f 653/1094/99 639/1101/16 645/1095/21 -f 649/1091/97 643/1090/20 644/1096/13 -f 648/1097/100 644/1096/13 646/1098/27 -f 616/1100/73 646/1689/27 639/1101/16 -f 651/1093/98 641/1092/26 642/1102/15 -f 655/1111/103 652/1117/95 651/1093/98 -f 658/1113/105 657/1118/104 650/1114/96 -f 660/1116/106 647/1119/94 652/1117/95 -f 657/1118/104 656/1112/69 651/1093/98 -f 659/1105/101 658/1113/105 649/1115/97 -f 654/1108/102 653/1107/99 647/1119/94 -f 622/1110/88 654/1108/102 660/1116/106 -f 619/1121/90 657/1118/104 658/1113/105 -f 620/1065/92 621/1123/89 655/1111/103 -f 615/1120/87 660/1116/106 655/1111/103 -f 618/1122/93 658/1113/105 659/1105/101 -f 619/1121/90 620/1065/92 656/1112/69 -f 636/1076/64 635/1132/63 664/1124/74 -f 637/1126/65 662/1134/78 661/1127/75 -f 638/1129/66 661/1690/75 667/1130/76 -f 635/1132/63 634/1135/72 665/1133/77 -f 636/1076/64 663/1125/13 662/1134/78 -f 634/1135/72 633/1144/70 666/1136/79 -f 661/1127/75 662/1134/78 669/1137/80 -f 667/1130/76 661/1690/75 668/1139/81 -f 665/1133/77 672/1143/84 671/1141/83 -f 662/1134/78 663/1125/13 670/1142/85 -f 666/1136/79 673/1146/86 672/1143/84 -f 664/1124/74 671/1141/83 670/1142/85 -f 674/1147/82 682/1151/88 675/1148/87 -f 668/1150/81 676/1691/73 682/1151/88 -f 632/1149/12 675/1148/87 681/1152/89 -f 672/1154/84 680/1159/92 679/1155/90 -f 670/1142/85 678/1160/93 677/1157/91 -f 673/1153/86 681/1152/89 680/1159/92 -f 671/1156/83 679/1155/90 678/1160/93 -f 669/1158/80 677/1157/91 676/1161/73 -f 691/1163/94 689/1172/21 684/1164/12 -f 694/1166/96 686/1179/15 687/1167/20 -f 696/1165/95 684/1164/12 685/1169/26 -f 697/1171/99 683/1178/16 689/1172/21 -f 693/1168/97 687/1167/20 688/1173/13 -f 692/1174/100 688/1173/13 690/1175/27 -f 676/1177/73 690/1692/27 683/1178/16 -f 695/1170/98 685/1169/26 686/1179/15 -f 699/1188/103 696/1194/95 695/1170/98 -f 701/1190/104 694/1195/96 693/1191/97 -f 704/1193/106 691/1196/94 696/1194/95 -f 700/1189/69 695/1170/98 694/1195/96 -f 703/1182/101 702/1192/105 693/1191/97 -f 698/1185/102 697/1184/99 691/1196/94 -f 675/1197/87 682/1187/88 698/1185/102 -f 679/1198/90 701/1190/104 702/1192/105 -f 680/1159/92 681/1200/89 699/1188/103 -f 675/1197/87 704/1193/106 699/1188/103 -f 678/1199/93 702/1192/105 703/1182/101 -f 680/1159/92 700/1189/69 701/1190/104 -f 720/1201/13 714/1217/27 705/1202/27 -f 718/1204/15 719/1213/20 711/1205/20 -f 716/1207/12 717/1693/26 709/1208/26 -f 713/1210/16 715/1216/21 707/1211/21 -f 719/1213/20 720/1201/13 712/1203/13 -f 717/1214/26 718/1204/15 710/1206/15 -f 715/1216/21 716/1207/12 708/1209/12 -f 714/1217/27 713/1210/16 706/1212/16 -f 733/1218/107 734/1694/108 462/819/108 -f 734/1219/108 735/1695/109 463/821/109 -f 735/1220/109 736/1696/147 464/824/110 -f 464/824/110 736/1697/147 721/1221/111 -f 721/1222/111 722/1698/114 450/826/113 -f 722/1223/114 723/1699/115 451/828/115 -f 451/828/115 723/1700/115 724/1224/116 -f 452/814/116 724/1701/116 725/1225/117 -f 453/816/117 725/1702/117 726/1226/118 -f 454/818/119 726/1703/118 727/1227/120 -f 455/820/120 727/1704/120 728/1228/121 -f 728/1229/121 729/1705/122 457/1230/122 -f 457/825/122 729/1706/122 730/1231/123 -f 730/1232/123 731/1707/124 459/813/124 -f 731/1233/124 732/1708/126 460/815/125 -f 732/1234/126 733/1709/107 461/817/107 -f 784/1235/13 778/1251/27 769/1236/27 -f 782/1238/15 783/1247/20 775/1239/20 -f 780/1241/12 781/1710/26 773/1242/26 -f 777/1244/16 779/1250/21 771/1245/21 -f 783/1247/20 784/1235/13 776/1237/13 -f 781/1248/26 782/1238/15 774/1240/15 -f 779/1250/21 780/1241/12 772/1243/12 -f 778/1251/27 777/1244/16 770/1246/16 -f 800/1252/13 794/1268/27 785/1253/27 -f 798/1255/15 799/1264/20 791/1256/20 -f 796/1258/12 797/1711/26 789/1259/26 -f 793/1261/16 795/1267/21 787/1262/21 -f 799/1264/20 800/1252/13 792/1254/13 -f 797/1265/26 798/1255/15 790/1257/15 -f 795/1267/21 796/1258/12 788/1260/12 -f 794/1268/27 793/1261/16 786/1263/16 -f 816/1269/13 810/1285/27 801/1270/27 -f 814/1272/15 815/1281/20 807/1273/20 -f 812/1275/12 813/1712/26 805/1276/26 -f 809/1278/16 811/1284/21 803/1279/21 -f 815/1281/20 816/1269/13 808/1271/13 -f 813/1282/26 814/1272/15 806/1274/15 -f 811/1284/21 812/1275/12 804/1277/12 -f 810/1285/27 809/1278/16 802/1280/16 -f 820/1286/127 828/1299/71 827/1287/27 -f 818/1289/129 826/1300/73 825/1290/9 -f 817/1292/130 825/1713/9 832/1293/67 -f 823/1295/15 831/1301/26 830/1296/69 -f 821/1298/133 829/1302/10 828/1299/71 -f 819/1288/128 827/1287/27 826/1300/73 -f 824/1294/131 832/1293/67 831/1301/26 -f 822/1297/132 830/1296/69 829/1302/10 -f 819/1288/128 835/1320/16 836/1303/134 -f 833/1305/135 834/1313/138 818/1306/129 -f 839/1308/136 833/1318/135 817/1309/130 -f 820/1304/127 836/1303/134 837/1311/137 -f 834/1313/138 835/1320/16 819/1288/128 -f 821/1312/133 837/1311/137 838/1314/139 -f 833/1305/135 840/1714/141 841/1316/140 -f 839/1308/136 846/1325/146 840/1317/141 -f 843/1319/142 844/1321/143 837/1311/137 -f 841/1316/140 842/1322/144 835/1320/16 -f 844/1321/143 845/1324/145 838/1314/139 -f 842/1322/144 843/1319/142 836/1303/134 -f 847/1326/93 854/1329/91 846/1327/146 -f 854/1329/91 848/1715/73 840/1330/141 -f 853/1331/90 847/1326/93 823/1328/15 -f 851/1333/89 852/1338/92 844/1334/143 -f 849/1336/88 850/1339/87 842/1322/144 -f 852/1338/92 853/1331/90 845/1332/145 -f 850/1339/87 851/1333/89 843/1335/142 -f 848/1340/73 849/1336/88 841/1337/140 -f 865/1342/132 857/1353/69 858/1343/10 -f 863/1345/131 855/1355/67 856/1346/26 -f 868/1348/128 860/1358/27 861/1349/73 -f 866/1344/133 858/1343/10 859/1351/71 -f 864/1347/15 856/1346/26 857/1353/69 -f 870/1354/130 862/1716/9 855/1355/67 -f 869/1350/129 861/1349/73 862/1356/9 -f 867/1352/127 859/1351/71 860/1358/27 -f 872/1359/15 877/1367/20 879/1360/97 -f 875/1362/21 874/1375/12 882/1363/95 -f 873/1365/26 872/1359/15 884/1361/96 -f 877/1367/20 871/1373/13 885/1368/100 -f 876/1369/16 875/1362/21 881/1364/94 -f 878/1371/27 876/1369/16 880/1370/99 -f 871/1373/13 878/1717/27 848/1374/73 -f 874/1375/12 873/1365/26 883/1366/98 -f 883/1366/98 884/1389/96 887/1384/104 -f 890/1386/106 881/1391/94 882/1387/95 -f 884/1389/96 879/1392/97 892/1390/105 -f 889/1388/103 882/1387/95 883/1366/98 -f 891/1377/102 880/1376/99 881/1391/94 -f 879/1392/97 885/1380/100 886/1382/101 -f 892/1390/105 886/1382/101 854/1383/91 -f 850/1394/87 890/1386/106 889/1388/103 -f 888/1385/69 887/1384/104 853/1396/90 -f 887/1384/104 892/1390/105 847/1393/93 -f 849/1379/88 891/1377/102 890/1386/106 -f 889/1388/103 888/1385/69 852/1338/92 -f 895/1397/16 896/1414/134 867/1398/127 -f 870/1399/130 893/1409/135 894/1400/138 -f 899/1402/136 893/1412/135 870/1403/130 -f 867/1398/127 896/1414/134 897/1405/137 -f 894/1400/138 895/1397/16 868/1348/128 -f 866/1406/133 897/1405/137 898/1407/139 -f 893/1409/135 900/1718/141 901/1410/140 -f 899/1402/136 906/1419/146 900/1411/141 -f 903/1413/142 904/1416/143 897/1405/137 -f 894/1400/138 901/1410/140 902/1415/144 -f 904/1416/143 905/1418/145 898/1407/139 -f 902/1415/144 903/1413/142 896/1414/134 -f 907/1420/93 914/1423/91 906/1421/146 -f 914/1423/91 908/1719/73 900/1424/141 -f 913/1425/90 907/1420/93 864/1422/15 -f 911/1427/89 912/1432/92 904/1428/143 -f 909/1430/88 910/1433/87 902/1415/144 -f 912/1432/92 913/1425/90 905/1426/145 -f 910/1433/87 911/1427/89 903/1429/142 -f 908/1434/73 909/1430/88 901/1431/140 -f 916/1436/15 921/1444/20 923/1437/97 -f 919/1439/21 918/1452/12 926/1440/95 -f 917/1442/26 916/1436/15 928/1438/96 -f 921/1444/20 915/1450/13 929/1445/100 -f 920/1446/16 919/1439/21 925/1441/94 -f 922/1448/27 920/1446/16 924/1447/99 -f 915/1450/13 922/1720/27 908/1451/73 -f 918/1452/12 917/1442/26 927/1443/98 -f 927/1443/98 928/1721/96 931/1461/104 -f 925/1463/94 926/1722/95 933/1464/103 -f 931/1461/104 928/1721/96 923/1466/97 -f 933/1464/103 926/1722/95 927/1443/98 -f 935/1454/102 924/1453/99 925/1463/94 -f 923/1466/97 929/1457/100 930/1459/101 -f 936/1467/105 930/1459/101 914/1460/91 -f 910/1469/87 934/1465/106 933/1464/103 -f 912/1432/92 932/1462/69 931/1461/104 -f 931/1461/104 936/1467/105 907/1468/93 -f 909/1456/88 935/1454/102 934/1465/106 -f 933/1464/103 932/1462/69 912/1432/92 -f 940/1472/127 948/1485/71 947/1473/27 -f 938/1475/129 946/1486/73 945/1476/9 -f 937/1478/130 945/1723/9 952/1479/67 -f 943/1481/15 951/1487/26 950/1482/69 -f 941/1484/133 949/1488/10 948/1485/71 -f 939/1474/128 947/1473/27 946/1486/73 -f 944/1480/131 952/1479/67 951/1487/26 -f 942/1483/132 950/1482/69 949/1488/10 -f 939/1474/128 955/1497/16 956/1489/134 -f 953/1490/135 954/1501/138 938/1475/129 -f 959/1492/136 953/1503/135 937/1493/130 -f 940/1472/127 956/1489/134 957/1495/137 -f 938/1475/129 954/1501/138 955/1497/16 -f 941/1496/133 957/1495/137 958/1498/139 -f 953/1490/135 960/1724/141 961/1500/140 -f 959/1492/136 966/1509/146 960/1502/141 -f 963/1504/142 964/1506/143 957/1495/137 -f 954/1501/138 961/1500/140 962/1505/144 -f 964/1506/143 965/1508/145 958/1498/139 -f 962/1505/144 963/1504/142 956/1489/134 -f 967/1510/93 974/1513/91 966/1511/146 -f 974/1513/91 968/1725/73 960/1514/141 -f 973/1515/90 967/1510/93 943/1512/15 -f 971/1517/89 972/1520/92 964/1518/143 -f 969/1519/88 970/1521/87 962/1505/144 -f 972/1520/92 973/1515/90 965/1516/145 -f 970/1521/87 971/1517/89 963/1504/142 -f 968/1522/73 969/1519/88 961/1500/140 -f 985/1524/132 977/1535/69 978/1525/10 -f 983/1527/131 975/1537/67 976/1528/26 -f 988/1530/128 980/1540/27 981/1531/73 -f 986/1526/133 978/1525/10 979/1533/71 -f 984/1529/15 976/1528/26 977/1535/69 -f 990/1536/130 982/1726/9 975/1537/67 -f 989/1532/129 981/1531/73 982/1538/9 -f 987/1534/127 979/1533/71 980/1540/27 -f 992/1541/15 997/1549/20 999/1542/97 -f 995/1544/21 994/1557/12 1002/1545/95 -f 993/1547/26 992/1541/15 1004/1543/96 -f 997/1549/20 991/1555/13 1005/1550/100 -f 996/1551/16 995/1544/21 1001/1546/94 -f 998/1553/27 996/1551/16 1000/1552/99 -f 991/1555/13 998/1727/27 968/1556/73 -f 994/1557/12 993/1547/26 1003/1548/98 -f 1003/1548/98 1004/1571/96 1007/1566/104 -f 1010/1568/106 1001/1573/94 1002/1569/95 -f 1004/1571/96 999/1574/97 1012/1572/105 -f 1009/1570/103 1002/1569/95 1003/1548/98 -f 1011/1559/102 1000/1558/99 1001/1573/94 -f 999/1574/97 1005/1562/100 1006/1564/101 -f 1012/1572/105 1006/1564/101 974/1565/91 -f 1010/1568/106 1009/1570/103 971/1576/89 -f 972/1520/92 1008/1567/69 1007/1566/104 -f 1007/1566/104 1012/1572/105 967/1575/93 -f 969/1561/88 1011/1559/102 1010/1568/106 -f 971/1576/89 1009/1570/103 1008/1567/69 -f 988/1530/128 1015/1597/16 1016/1579/134 -f 1013/1581/135 1014/1589/138 989/1582/129 -f 1019/1584/136 1013/1594/135 990/1585/130 -f 987/1580/127 1016/1579/134 1017/1587/137 -f 1014/1589/138 1015/1597/16 988/1530/128 -f 986/1588/133 1017/1587/137 1018/1590/139 -f 1013/1581/135 1020/1728/141 1021/1592/140 -f 1019/1584/136 1026/1601/146 1020/1593/141 -f 1023/1595/142 1024/1598/143 1017/1587/137 -f 1014/1589/138 1021/1592/140 1022/1596/144 -f 1024/1598/143 1025/1600/145 1018/1590/139 -f 1022/1596/144 1023/1595/142 1016/1579/134 -f 1027/1602/93 1034/1605/91 1026/1603/146 -f 1034/1605/91 1028/1729/73 1020/1606/141 -f 1033/1607/90 1027/1602/93 984/1604/15 -f 1031/1609/89 1032/1614/92 1024/1610/143 -f 1029/1612/88 1030/1615/87 1022/1596/144 -f 1032/1614/92 1033/1607/90 1025/1608/145 -f 1030/1615/87 1031/1609/89 1023/1611/142 -f 1028/1616/73 1029/1612/88 1021/1613/140 -f 1036/1618/15 1041/1626/20 1043/1619/97 -f 1039/1621/21 1038/1634/12 1046/1622/95 -f 1037/1624/26 1036/1618/15 1048/1620/96 -f 1041/1626/20 1035/1632/13 1049/1627/100 -f 1040/1628/16 1039/1621/21 1045/1623/94 -f 1042/1630/27 1040/1628/16 1044/1629/99 -f 1035/1632/13 1042/1730/27 1028/1633/73 -f 1038/1634/12 1037/1624/26 1047/1625/98 -f 1047/1625/98 1048/1648/96 1051/1643/104 -f 1045/1645/94 1046/1650/95 1053/1646/103 -f 1048/1648/96 1043/1651/97 1056/1649/105 -f 1046/1650/95 1047/1625/98 1052/1644/69 -f 1055/1636/102 1044/1635/99 1045/1645/94 -f 1043/1651/97 1049/1639/100 1050/1641/101 -f 1027/1652/93 1056/1649/105 1050/1641/101 -f 1054/1647/106 1053/1646/103 1031/1653/89 -f 1032/1614/92 1052/1644/69 1051/1643/104 -f 1051/1643/104 1056/1649/105 1027/1652/93 -f 1029/1638/88 1055/1636/102 1054/1647/106 -f 1053/1646/103 1052/1644/69 1032/1614/92 +f 587/1019/64 588/1042/63 604/1034/74 +f 586/1036/65 602/1044/78 601/1037/75 +f 585/1039/66 601/1694/75 607/1040/76 +f 588/1042/63 589/1045/72 605/1043/77 +f 586/1036/65 587/1019/64 603/1035/13 +f 589/1045/72 590/1054/70 606/1046/79 +f 601/1037/75 602/1044/78 609/1047/80 +f 607/1040/76 601/1694/75 608/1049/81 +f 605/1043/77 612/1053/84 611/1051/83 +f 602/1044/78 603/1035/13 610/1052/85 +f 606/1046/79 613/1056/86 612/1053/84 +f 604/1034/74 611/1051/83 610/1052/85 +f 614/1057/82 622/1061/88 615/1058/87 +f 608/1060/81 616/1695/73 622/1061/88 +f 591/1059/12 615/1058/87 621/1062/89 +f 612/1064/84 620/1069/92 619/1065/90 +f 610/1052/85 618/1070/93 617/1067/91 +f 613/1063/86 621/1062/89 620/1069/92 +f 611/1066/83 619/1065/90 618/1070/93 +f 609/1068/80 617/1067/91 616/1071/73 +f 626/1073/10 625/1084/69 633/1074/70 +f 624/1076/26 623/1085/67 631/1077/68 +f 629/1079/73 628/1089/27 636/1080/64 +f 627/1082/71 626/1073/10 634/1075/72 +f 625/1084/69 624/1076/26 632/1078/12 +f 623/1085/67 630/1696/9 638/1086/66 +f 630/1087/9 629/1079/73 637/1081/65 +f 628/1089/27 627/1082/71 635/1083/63 +f 647/1090/94 645/1099/21 640/1091/12 +f 650/1093/96 642/1106/15 643/1094/20 +f 652/1092/95 640/1091/12 641/1096/26 +f 653/1098/99 639/1105/16 645/1099/21 +f 649/1095/97 643/1094/20 644/1100/13 +f 648/1101/100 644/1100/13 646/1102/27 +f 616/1104/73 646/1697/27 639/1105/16 +f 651/1097/98 641/1096/26 642/1106/15 +f 655/1115/103 652/1121/95 651/1097/98 +f 658/1117/105 657/1122/104 650/1118/96 +f 660/1120/106 647/1123/94 652/1121/95 +f 657/1122/104 656/1116/69 651/1097/98 +f 659/1109/101 658/1117/105 649/1119/97 +f 654/1112/102 653/1111/99 647/1123/94 +f 622/1114/88 654/1112/102 660/1120/106 +f 619/1125/90 657/1122/104 658/1117/105 +f 620/1069/92 621/1127/89 655/1115/103 +f 615/1124/87 660/1120/106 655/1115/103 +f 618/1126/93 658/1117/105 659/1109/101 +f 619/1125/90 620/1069/92 656/1116/69 +f 636/1080/64 635/1136/63 664/1128/74 +f 637/1130/65 662/1138/78 661/1131/75 +f 638/1133/66 661/1698/75 667/1134/76 +f 635/1136/63 634/1139/72 665/1137/77 +f 636/1080/64 663/1129/13 662/1138/78 +f 634/1139/72 633/1148/70 666/1140/79 +f 661/1131/75 662/1138/78 669/1141/80 +f 667/1134/76 661/1698/75 668/1143/81 +f 665/1137/77 672/1147/84 671/1145/83 +f 662/1138/78 663/1129/13 670/1146/85 +f 666/1140/79 673/1150/86 672/1147/84 +f 664/1128/74 671/1145/83 670/1146/85 +f 674/1151/82 682/1155/88 675/1152/87 +f 668/1154/81 676/1699/73 682/1155/88 +f 632/1153/12 675/1152/87 681/1156/89 +f 672/1158/84 680/1163/92 679/1159/90 +f 670/1146/85 678/1164/93 677/1161/91 +f 673/1157/86 681/1156/89 680/1163/92 +f 671/1160/83 679/1159/90 678/1164/93 +f 669/1162/80 677/1161/91 676/1165/73 +f 691/1167/94 689/1176/21 684/1168/12 +f 694/1170/96 686/1183/15 687/1171/20 +f 696/1169/95 684/1168/12 685/1173/26 +f 697/1175/99 683/1182/16 689/1176/21 +f 693/1172/97 687/1171/20 688/1177/13 +f 692/1178/100 688/1177/13 690/1179/27 +f 676/1181/73 690/1700/27 683/1182/16 +f 695/1174/98 685/1173/26 686/1183/15 +f 699/1192/103 696/1198/95 695/1174/98 +f 701/1194/104 694/1199/96 693/1195/97 +f 704/1197/106 691/1200/94 696/1198/95 +f 700/1193/69 695/1174/98 694/1199/96 +f 703/1186/101 702/1196/105 693/1195/97 +f 698/1189/102 697/1188/99 691/1200/94 +f 675/1201/87 682/1191/88 698/1189/102 +f 679/1202/90 701/1194/104 702/1196/105 +f 680/1163/92 681/1204/89 699/1192/103 +f 675/1201/87 704/1197/106 699/1192/103 +f 678/1203/93 702/1196/105 703/1186/101 +f 680/1163/92 700/1193/69 701/1194/104 +f 720/1205/13 714/1221/27 705/1206/27 +f 718/1208/15 719/1217/20 711/1209/20 +f 716/1211/12 717/1701/26 709/1212/26 +f 713/1214/16 715/1220/21 707/1215/21 +f 719/1217/20 720/1205/13 712/1207/13 +f 717/1218/26 718/1208/15 710/1210/15 +f 715/1220/21 716/1211/12 708/1213/12 +f 714/1221/27 713/1214/16 706/1216/16 +f 733/1222/107 734/1702/108 462/819/108 +f 734/1223/108 735/1703/109 463/821/109 +f 735/1224/109 736/1704/147 464/824/110 +f 464/824/110 736/1705/147 721/1225/111 +f 721/1226/111 722/1706/114 450/826/113 +f 722/1227/114 723/1707/115 451/828/115 +f 451/828/115 723/1708/115 724/1228/116 +f 452/814/116 724/1709/116 725/1229/117 +f 453/816/117 725/1710/117 726/1230/118 +f 454/818/119 726/1711/118 727/1231/120 +f 455/820/120 727/1712/120 728/1232/121 +f 728/1233/121 729/1713/122 457/1234/122 +f 457/825/122 729/1714/122 730/1235/123 +f 730/1236/123 731/1715/124 459/813/124 +f 731/1237/124 732/1716/126 460/815/125 +f 732/1238/126 733/1717/107 461/817/107 +f 784/1239/13 778/1255/27 769/1240/27 +f 782/1242/15 783/1251/20 775/1243/20 +f 780/1245/12 781/1718/26 773/1246/26 +f 777/1248/16 779/1254/21 771/1249/21 +f 783/1251/20 784/1239/13 776/1241/13 +f 781/1252/26 782/1242/15 774/1244/15 +f 779/1254/21 780/1245/12 772/1247/12 +f 778/1255/27 777/1248/16 770/1250/16 +f 800/1256/13 794/1272/27 785/1257/27 +f 798/1259/15 799/1268/20 791/1260/20 +f 796/1262/12 797/1719/26 789/1263/26 +f 793/1265/16 795/1271/21 787/1266/21 +f 799/1268/20 800/1256/13 792/1258/13 +f 797/1269/26 798/1259/15 790/1261/15 +f 795/1271/21 796/1262/12 788/1264/12 +f 794/1272/27 793/1265/16 786/1267/16 +f 816/1273/13 810/1289/27 801/1274/27 +f 814/1276/15 815/1285/20 807/1277/20 +f 812/1279/12 813/1720/26 805/1280/26 +f 809/1282/16 811/1288/21 803/1283/21 +f 815/1285/20 816/1273/13 808/1275/13 +f 813/1286/26 814/1276/15 806/1278/15 +f 811/1288/21 812/1279/12 804/1281/12 +f 810/1289/27 809/1282/16 802/1284/16 +f 820/1290/127 828/1303/71 827/1291/27 +f 818/1293/129 826/1304/73 825/1294/9 +f 817/1296/130 825/1721/9 832/1297/67 +f 823/1299/15 831/1305/26 830/1300/69 +f 821/1302/133 829/1306/10 828/1303/71 +f 819/1292/128 827/1291/27 826/1304/73 +f 824/1298/131 832/1297/67 831/1305/26 +f 822/1301/132 830/1300/69 829/1306/10 +f 819/1292/128 835/1324/16 836/1307/134 +f 833/1309/135 834/1317/138 818/1310/129 +f 839/1312/136 833/1322/135 817/1313/130 +f 820/1308/127 836/1307/134 837/1315/137 +f 834/1317/138 835/1324/16 819/1292/128 +f 821/1316/133 837/1315/137 838/1318/139 +f 833/1309/135 840/1722/141 841/1320/140 +f 839/1312/136 846/1329/146 840/1321/141 +f 843/1323/142 844/1325/143 837/1315/137 +f 841/1320/140 842/1326/144 835/1324/16 +f 844/1325/143 845/1328/145 838/1318/139 +f 842/1326/144 843/1323/142 836/1307/134 +f 847/1330/93 854/1333/91 846/1331/146 +f 854/1333/91 848/1723/73 840/1334/141 +f 853/1335/90 847/1330/93 823/1332/15 +f 851/1337/89 852/1342/92 844/1338/143 +f 849/1340/88 850/1343/87 842/1326/144 +f 852/1342/92 853/1335/90 845/1336/145 +f 850/1343/87 851/1337/89 843/1339/142 +f 848/1344/73 849/1340/88 841/1341/140 +f 865/1346/132 857/1357/69 858/1347/10 +f 863/1349/131 855/1359/67 856/1350/26 +f 868/1352/128 860/1362/27 861/1353/73 +f 866/1348/133 858/1347/10 859/1355/71 +f 864/1351/15 856/1350/26 857/1357/69 +f 870/1358/130 862/1724/9 855/1359/67 +f 869/1354/129 861/1353/73 862/1360/9 +f 867/1356/127 859/1355/71 860/1362/27 +f 872/1363/15 877/1371/20 879/1364/97 +f 875/1366/21 874/1379/12 882/1367/95 +f 873/1369/26 872/1363/15 884/1365/96 +f 877/1371/20 871/1377/13 885/1372/100 +f 876/1373/16 875/1366/21 881/1368/94 +f 878/1375/27 876/1373/16 880/1374/99 +f 871/1377/13 878/1725/27 848/1378/73 +f 874/1379/12 873/1369/26 883/1370/98 +f 883/1370/98 884/1393/96 887/1388/104 +f 890/1390/106 881/1395/94 882/1391/95 +f 884/1393/96 879/1396/97 892/1394/105 +f 889/1392/103 882/1391/95 883/1370/98 +f 891/1381/102 880/1380/99 881/1395/94 +f 879/1396/97 885/1384/100 886/1386/101 +f 892/1394/105 886/1386/101 854/1387/91 +f 850/1398/87 890/1390/106 889/1392/103 +f 888/1389/69 887/1388/104 853/1400/90 +f 887/1388/104 892/1394/105 847/1397/93 +f 849/1383/88 891/1381/102 890/1390/106 +f 889/1392/103 888/1389/69 852/1342/92 +f 895/1401/16 896/1418/134 867/1402/127 +f 870/1403/130 893/1413/135 894/1404/138 +f 899/1406/136 893/1416/135 870/1407/130 +f 867/1402/127 896/1418/134 897/1409/137 +f 894/1404/138 895/1401/16 868/1352/128 +f 866/1410/133 897/1409/137 898/1411/139 +f 893/1413/135 900/1726/141 901/1414/140 +f 899/1406/136 906/1423/146 900/1415/141 +f 903/1417/142 904/1420/143 897/1409/137 +f 894/1404/138 901/1414/140 902/1419/144 +f 904/1420/143 905/1422/145 898/1411/139 +f 902/1419/144 903/1417/142 896/1418/134 +f 907/1424/93 914/1427/91 906/1425/146 +f 914/1427/91 908/1727/73 900/1428/141 +f 913/1429/90 907/1424/93 864/1426/15 +f 911/1431/89 912/1436/92 904/1432/143 +f 909/1434/88 910/1437/87 902/1419/144 +f 912/1436/92 913/1429/90 905/1430/145 +f 910/1437/87 911/1431/89 903/1433/142 +f 908/1438/73 909/1434/88 901/1435/140 +f 916/1440/15 921/1448/20 923/1441/97 +f 919/1443/21 918/1456/12 926/1444/95 +f 917/1446/26 916/1440/15 928/1442/96 +f 921/1448/20 915/1454/13 929/1449/100 +f 920/1450/16 919/1443/21 925/1445/94 +f 922/1452/27 920/1450/16 924/1451/99 +f 915/1454/13 922/1728/27 908/1455/73 +f 918/1456/12 917/1446/26 927/1447/98 +f 927/1447/98 928/1729/96 931/1465/104 +f 925/1467/94 926/1730/95 933/1468/103 +f 931/1465/104 928/1729/96 923/1470/97 +f 933/1468/103 926/1730/95 927/1447/98 +f 935/1458/102 924/1457/99 925/1467/94 +f 923/1470/97 929/1461/100 930/1463/101 +f 936/1471/105 930/1463/101 914/1464/91 +f 910/1473/87 934/1469/106 933/1468/103 +f 912/1436/92 932/1466/69 931/1465/104 +f 931/1465/104 936/1471/105 907/1472/93 +f 909/1460/88 935/1458/102 934/1469/106 +f 933/1468/103 932/1466/69 912/1436/92 +f 940/1476/127 948/1489/71 947/1477/27 +f 938/1479/129 946/1490/73 945/1480/9 +f 937/1482/130 945/1731/9 952/1483/67 +f 943/1485/15 951/1491/26 950/1486/69 +f 941/1488/133 949/1492/10 948/1489/71 +f 939/1478/128 947/1477/27 946/1490/73 +f 944/1484/131 952/1483/67 951/1491/26 +f 942/1487/132 950/1486/69 949/1492/10 +f 939/1478/128 955/1503/16 956/1493/134 +f 953/1495/135 954/1507/138 938/1496/129 +f 959/1498/136 953/1509/135 937/1499/130 +f 940/1494/127 956/1493/134 957/1501/137 +f 938/1496/129 954/1507/138 955/1503/16 +f 941/1502/133 957/1501/137 958/1504/139 +f 953/1495/135 960/1732/141 961/1506/140 +f 959/1498/136 966/1515/146 960/1508/141 +f 963/1510/142 964/1512/143 957/1501/137 +f 954/1507/138 961/1506/140 962/1511/144 +f 964/1512/143 965/1514/145 958/1504/139 +f 962/1511/144 963/1510/142 956/1493/134 +f 967/1516/93 974/1519/91 966/1517/146 +f 974/1519/91 968/1733/73 960/1520/141 +f 973/1521/90 967/1516/93 943/1518/15 +f 971/1523/89 972/1528/92 964/1524/143 +f 969/1526/88 970/1529/87 962/1511/144 +f 972/1528/92 973/1521/90 965/1522/145 +f 970/1529/87 971/1523/89 963/1525/142 +f 968/1530/73 969/1526/88 961/1527/140 +f 985/1532/132 977/1543/69 978/1533/10 +f 983/1535/131 975/1545/67 976/1536/26 +f 988/1538/128 980/1548/27 981/1539/73 +f 986/1534/133 978/1533/10 979/1541/71 +f 984/1537/15 976/1536/26 977/1543/69 +f 990/1544/130 982/1734/9 975/1545/67 +f 989/1540/129 981/1539/73 982/1546/9 +f 987/1542/127 979/1541/71 980/1548/27 +f 992/1549/15 997/1557/20 999/1550/97 +f 995/1552/21 994/1565/12 1002/1553/95 +f 993/1555/26 992/1549/15 1004/1551/96 +f 997/1557/20 991/1563/13 1005/1558/100 +f 996/1559/16 995/1552/21 1001/1554/94 +f 998/1561/27 996/1559/16 1000/1560/99 +f 991/1563/13 998/1735/27 968/1564/73 +f 994/1565/12 993/1555/26 1003/1556/98 +f 1003/1556/98 1004/1579/96 1007/1574/104 +f 1010/1576/106 1001/1581/94 1002/1577/95 +f 1004/1579/96 999/1582/97 1012/1580/105 +f 1009/1578/103 1002/1577/95 1003/1556/98 +f 1011/1567/102 1000/1566/99 1001/1581/94 +f 999/1582/97 1005/1570/100 1006/1572/101 +f 1012/1580/105 1006/1572/101 974/1573/91 +f 1010/1576/106 1009/1578/103 971/1584/89 +f 972/1528/92 1008/1575/69 1007/1574/104 +f 1007/1574/104 1012/1580/105 967/1583/93 +f 969/1569/88 1011/1567/102 1010/1576/106 +f 971/1584/89 1009/1578/103 1008/1575/69 +f 988/1538/128 1015/1605/16 1016/1587/134 +f 1013/1589/135 1014/1597/138 989/1590/129 +f 1019/1592/136 1013/1602/135 990/1593/130 +f 987/1588/127 1016/1587/134 1017/1595/137 +f 1014/1597/138 1015/1605/16 988/1538/128 +f 986/1596/133 1017/1595/137 1018/1598/139 +f 1013/1589/135 1020/1736/141 1021/1600/140 +f 1019/1592/136 1026/1609/146 1020/1601/141 +f 1023/1603/142 1024/1606/143 1017/1595/137 +f 1014/1597/138 1021/1600/140 1022/1604/144 +f 1024/1606/143 1025/1608/145 1018/1598/139 +f 1022/1604/144 1023/1603/142 1016/1587/134 +f 1027/1610/93 1034/1613/91 1026/1611/146 +f 1034/1613/91 1028/1737/73 1020/1614/141 +f 1033/1615/90 1027/1610/93 984/1612/15 +f 1031/1617/89 1032/1622/92 1024/1618/143 +f 1029/1620/88 1030/1623/87 1022/1604/144 +f 1032/1622/92 1033/1615/90 1025/1616/145 +f 1030/1623/87 1031/1617/89 1023/1619/142 +f 1028/1624/73 1029/1620/88 1021/1621/140 +f 1036/1626/15 1041/1634/20 1043/1627/97 +f 1039/1629/21 1038/1642/12 1046/1630/95 +f 1037/1632/26 1036/1626/15 1048/1628/96 +f 1041/1634/20 1035/1640/13 1049/1635/100 +f 1040/1636/16 1039/1629/21 1045/1631/94 +f 1042/1638/27 1040/1636/16 1044/1637/99 +f 1035/1640/13 1042/1738/27 1028/1641/73 +f 1038/1642/12 1037/1632/26 1047/1633/98 +f 1047/1633/98 1048/1656/96 1051/1651/104 +f 1045/1653/94 1046/1658/95 1053/1654/103 +f 1048/1656/96 1043/1659/97 1056/1657/105 +f 1046/1658/95 1047/1633/98 1052/1652/69 +f 1055/1644/102 1044/1643/99 1045/1653/94 +f 1043/1659/97 1049/1647/100 1050/1649/101 +f 1027/1660/93 1056/1657/105 1050/1649/101 +f 1054/1655/106 1053/1654/103 1031/1661/89 +f 1032/1622/92 1052/1652/69 1051/1651/104 +f 1051/1651/104 1056/1657/105 1027/1660/93 +f 1029/1646/88 1055/1644/102 1054/1655/106 +f 1053/1654/103 1052/1652/69 1032/1622/92 o SuspensionBackCenter v 0.000000 4.000000 -7.750007 v -0.191342 3.961939 -7.750007 @@ -4707,6 +4715,38 @@ v 0.000000 3.125000 -9.500008 v 0.265164 3.234835 -9.500008 v 0.375000 3.500000 -9.500008 v 0.265164 3.765165 -9.500008 +v 0.000000 4.000000 -7.750007 +v -0.191342 3.961939 -7.750007 +v -0.353554 3.853553 -7.750007 +v -0.461940 3.691341 -7.750007 +v -0.500000 3.500000 -7.750008 +v -0.461940 3.308658 -7.750008 +v -0.353554 3.146446 -7.750008 +v -0.191342 3.038060 -7.750008 +v 0.000000 3.000000 -7.750008 +v 0.191341 3.038060 -7.750008 +v 0.353553 3.146446 -7.750008 +v 0.461940 3.308658 -7.750008 +v 0.500000 3.500000 -7.750008 +v 0.461940 3.691341 -7.750007 +v 0.353553 3.853553 -7.750007 +v 0.191341 3.961939 -7.750007 +v 0.000000 4.000000 -9.500008 +v -0.191342 3.961939 -9.500008 +v -0.353554 3.853553 -9.500008 +v -0.461940 3.691341 -9.500008 +v -0.500000 3.500000 -9.500008 +v -0.461940 3.308658 -9.500008 +v -0.353554 3.146446 -9.500008 +v -0.191342 3.038060 -9.500008 +v 0.000000 3.000000 -9.500008 +v 0.191341 3.038060 -9.500008 +v 0.353553 3.146446 -9.500008 +v 0.461940 3.308658 -9.500008 +v 0.500000 3.500000 -9.500008 +v 0.461940 3.691341 -9.500008 +v 0.353553 3.853553 -9.500008 +v 0.191341 3.961939 -9.500008 vt 0.851119 0.458140 vt 0.827883 0.465116 vt 0.827022 0.458140 @@ -4756,9 +4796,43 @@ vt 0.838210 0.502326 vt 0.814114 0.502326 vt 0.838210 0.493023 vt 0.838210 0.474419 +vt 0.827883 0.465116 +vt 0.851119 0.458140 +vt 0.827022 0.458140 +vt 0.821859 0.416279 +vt 0.845095 0.409302 +vt 0.820998 0.409302 +vt 0.844234 0.402326 +vt 0.820138 0.402326 +vt 0.814974 0.360465 +vt 0.838210 0.353488 +vt 0.814114 0.353488 +vt 0.822719 0.423256 +vt 0.845955 0.416279 +vt 0.815835 0.367442 +vt 0.839071 0.360465 +vt 0.823580 0.430233 +vt 0.846816 0.423256 +vt 0.816695 0.374419 +vt 0.839931 0.367442 +vt 0.824441 0.437209 +vt 0.847676 0.430233 +vt 0.817556 0.381395 +vt 0.840792 0.374419 +vt 0.825301 0.444186 +vt 0.848537 0.437209 +vt 0.842513 0.388372 +vt 0.841652 0.381395 +vt 0.826162 0.451163 +vt 0.849398 0.444186 +vt 0.819277 0.395349 +vt 0.818417 0.388372 +vt 0.850258 0.451163 +vt 0.843373 0.395349 vt 0.851979 0.465116 vt 0.841652 0.381395 vt 0.838210 0.539535 +vt 0.851979 0.465116 vn -0.3827 -0.9239 0.0000 vn 0.0000 -1.0000 0.0000 vn 0.0000 1.0000 0.0000 @@ -4776,54 +4850,86 @@ vn 0.9239 0.3827 0.0000 vn -0.7071 -0.7071 0.0000 vn 0.7071 0.7071 0.0000 s 1 -f 1080/1731/148 1065/1732/149 1064/1733/148 -f 1073/1734/150 1058/1735/151 1057/1736/150 -f 1088/1737/152 1057/1736/150 1072/1738/152 -f 1081/1739/149 1066/1740/153 1065/1741/149 -f 1074/1742/151 1059/1743/154 1058/1735/151 -f 1082/1744/153 1067/1745/155 1066/1740/153 -f 1075/1746/154 1060/1747/156 1059/1743/154 -f 1083/1748/155 1068/1749/157 1067/1745/155 -f 1076/1750/156 1061/1751/158 1060/1747/156 -f 1084/1752/157 1069/1753/159 1068/1749/157 -f 1077/1754/158 1062/1755/160 1061/1751/158 -f 1069/1753/159 1086/1756/161 1070/1757/161 -f 1078/1758/160 1063/1759/162 1062/1755/160 -f 1086/1756/161 1071/1760/163 1070/1757/161 -f 1079/1761/162 1064/1733/148 1063/1759/162 -f 1087/1762/163 1072/1738/152 1071/1760/163 -f 1100/1763/162 1093/1764/149 1092/1765/162 -f 1098/1766/154 1091/1767/158 1090/1768/154 -f 1103/1769/159 1096/1770/163 1095/1771/159 -f 1101/1772/149 1094/1773/155 1093/1774/149 -f 1099/1775/158 1092/1765/162 1091/1767/158 -f 1097/1776/150 1090/1768/154 1089/1777/150 -f 1104/1778/163 1089/1777/150 1096/1770/163 -f 1102/1779/155 1095/1771/159 1094/1773/155 -f 1080/1731/148 1081/1780/149 1065/1732/149 -f 1073/1734/150 1074/1742/151 1058/1735/151 -f 1088/1737/152 1073/1734/150 1057/1736/150 -f 1081/1739/149 1082/1744/153 1066/1740/153 -f 1074/1742/151 1075/1746/154 1059/1743/154 -f 1082/1744/153 1083/1748/155 1067/1745/155 -f 1075/1746/154 1076/1750/156 1060/1747/156 -f 1083/1748/155 1084/1752/157 1068/1749/157 -f 1076/1750/156 1077/1754/158 1061/1751/158 -f 1084/1752/157 1085/1781/159 1069/1753/159 -f 1077/1754/158 1078/1758/160 1062/1755/160 -f 1069/1753/159 1085/1781/159 1086/1756/161 -f 1078/1758/160 1079/1761/162 1063/1759/162 -f 1086/1756/161 1087/1762/163 1071/1760/163 -f 1079/1761/162 1080/1731/148 1064/1733/148 -f 1087/1762/163 1088/1737/152 1072/1738/152 -f 1100/1763/162 1101/1782/149 1093/1764/149 -f 1098/1766/154 1099/1775/158 1091/1767/158 -f 1103/1769/159 1104/1778/163 1096/1770/163 -f 1101/1772/149 1102/1779/155 1094/1773/155 -f 1099/1775/158 1100/1763/162 1092/1765/162 -f 1097/1776/150 1098/1766/154 1090/1768/154 -f 1104/1778/163 1097/1776/150 1089/1777/150 -f 1102/1779/155 1103/1769/159 1095/1771/159 +f 1080/1739/148 1065/1740/149 1064/1741/148 +f 1073/1742/150 1058/1743/151 1057/1744/150 +f 1088/1745/152 1057/1744/150 1072/1746/152 +f 1081/1747/149 1066/1748/153 1065/1749/149 +f 1074/1750/151 1059/1751/154 1058/1743/151 +f 1082/1752/153 1067/1753/155 1066/1748/153 +f 1075/1754/154 1060/1755/156 1059/1751/154 +f 1083/1756/155 1068/1757/157 1067/1753/155 +f 1076/1758/156 1061/1759/158 1060/1755/156 +f 1084/1760/157 1069/1761/159 1068/1757/157 +f 1077/1762/158 1062/1763/160 1061/1759/158 +f 1069/1761/159 1086/1764/161 1070/1765/161 +f 1078/1766/160 1063/1767/162 1062/1763/160 +f 1086/1764/161 1071/1768/163 1070/1765/161 +f 1079/1769/162 1064/1741/148 1063/1767/162 +f 1087/1770/163 1072/1746/152 1071/1768/163 +f 1100/1771/162 1093/1772/149 1092/1773/162 +f 1098/1774/154 1091/1775/158 1090/1776/154 +f 1103/1777/159 1096/1778/163 1095/1779/159 +f 1101/1780/149 1094/1781/155 1093/1782/149 +f 1099/1783/158 1092/1773/162 1091/1775/158 +f 1097/1784/150 1090/1776/154 1089/1785/150 +f 1104/1786/163 1089/1785/150 1096/1778/163 +f 1102/1787/155 1095/1779/159 1094/1781/155 +f 1113/1788/150 1128/1789/152 1112/1790/152 +f 1106/1791/153 1121/1792/149 1105/1793/149 +f 1105/1793/149 1136/1794/148 1120/1795/148 +f 1114/1796/151 1129/1797/150 1113/1798/150 +f 1107/1799/155 1122/1800/153 1106/1791/153 +f 1115/1801/154 1130/1802/151 1114/1796/151 +f 1108/1803/157 1123/1804/155 1107/1799/155 +f 1116/1805/156 1131/1806/154 1115/1801/154 +f 1109/1807/159 1124/1808/157 1108/1803/157 +f 1117/1809/158 1132/1810/156 1116/1805/156 +f 1110/1811/161 1125/1812/159 1109/1807/159 +f 1117/1809/158 1134/1813/160 1133/1814/158 +f 1111/1815/163 1126/1816/161 1110/1811/161 +f 1119/1817/162 1134/1813/160 1118/1818/160 +f 1112/1790/152 1127/1819/163 1111/1815/163 +f 1120/1795/148 1135/1820/162 1119/1817/162 +f 1080/1739/148 1081/1821/149 1065/1740/149 +f 1073/1742/150 1074/1750/151 1058/1743/151 +f 1088/1745/152 1073/1742/150 1057/1744/150 +f 1081/1747/149 1082/1752/153 1066/1748/153 +f 1074/1750/151 1075/1754/154 1059/1751/154 +f 1082/1752/153 1083/1756/155 1067/1753/155 +f 1075/1754/154 1076/1758/156 1060/1755/156 +f 1083/1756/155 1084/1760/157 1068/1757/157 +f 1076/1758/156 1077/1762/158 1061/1759/158 +f 1084/1760/157 1085/1822/159 1069/1761/159 +f 1077/1762/158 1078/1766/160 1062/1763/160 +f 1069/1761/159 1085/1822/159 1086/1764/161 +f 1078/1766/160 1079/1769/162 1063/1767/162 +f 1086/1764/161 1087/1770/163 1071/1768/163 +f 1079/1769/162 1080/1739/148 1064/1741/148 +f 1087/1770/163 1088/1745/152 1072/1746/152 +f 1100/1771/162 1101/1823/149 1093/1772/149 +f 1098/1774/154 1099/1783/158 1091/1775/158 +f 1103/1777/159 1104/1786/163 1096/1778/163 +f 1101/1780/149 1102/1787/155 1094/1781/155 +f 1099/1783/158 1100/1771/162 1092/1773/162 +f 1097/1784/150 1098/1774/154 1090/1776/154 +f 1104/1786/163 1097/1784/150 1089/1785/150 +f 1102/1787/155 1103/1777/159 1095/1779/159 +f 1113/1788/150 1129/1824/150 1128/1789/152 +f 1106/1791/153 1122/1800/153 1121/1792/149 +f 1105/1793/149 1121/1792/149 1136/1794/148 +f 1114/1796/151 1130/1802/151 1129/1797/150 +f 1107/1799/155 1123/1804/155 1122/1800/153 +f 1115/1801/154 1131/1806/154 1130/1802/151 +f 1108/1803/157 1124/1808/157 1123/1804/155 +f 1116/1805/156 1132/1810/156 1131/1806/154 +f 1109/1807/159 1125/1812/159 1124/1808/157 +f 1117/1809/158 1133/1814/158 1132/1810/156 +f 1110/1811/161 1126/1816/161 1125/1812/159 +f 1117/1809/158 1118/1818/160 1134/1813/160 +f 1111/1815/163 1127/1819/163 1126/1816/161 +f 1119/1817/162 1135/1820/162 1134/1813/160 +f 1112/1790/152 1128/1789/152 1127/1819/163 +f 1120/1795/148 1136/1794/148 1135/1820/162 o SuspensionBackOuter v 1.750000 5.499998 -7.750008 v 1.573223 5.426775 -7.750008 @@ -4953,6 +5059,70 @@ v 1.750000 1.374998 -9.000008 v 2.015165 1.484833 -9.000008 v 2.125000 1.749998 -9.000008 v 2.015165 2.015163 -9.000008 +v 1.750000 5.624999 -7.750007 +v 1.484835 5.515163 -7.750007 +v 1.375000 5.249998 -7.750007 +v 1.484835 4.984833 -7.750007 +v 1.750000 4.874998 -7.750007 +v 2.015165 4.984833 -7.750007 +v 2.125000 5.249998 -7.750007 +v 2.015165 5.515163 -7.750007 +v 1.750000 5.624999 -9.000008 +v 1.484835 5.515163 -9.000008 +v 1.375000 5.249998 -9.000008 +v 1.484835 4.984833 -9.000008 +v 1.750000 4.874998 -9.000008 +v 2.015165 4.984833 -9.000008 +v 2.125000 5.249998 -9.000008 +v 2.015165 5.515163 -9.000008 +v -1.750000 5.624999 -7.750007 +v -2.015165 5.515163 -7.750007 +v -2.125000 5.249998 -7.750007 +v -2.015165 4.984833 -7.750007 +v -1.750000 4.874998 -7.750007 +v -1.484835 4.984833 -7.750007 +v -1.375000 5.249998 -7.750007 +v -1.484835 5.515163 -7.750007 +v -1.750000 5.624999 -9.000008 +v -2.015165 5.515163 -9.000008 +v -2.125000 5.249998 -9.000008 +v -2.015165 4.984833 -9.000008 +v -1.750000 4.874998 -9.000008 +v -1.484835 4.984833 -9.000008 +v -1.375000 5.249998 -9.000008 +v -1.484835 5.515163 -9.000008 +v -1.750000 2.124999 -7.750007 +v -2.015165 2.015163 -7.750007 +v -2.125000 1.749998 -7.750007 +v -2.015165 1.484833 -7.750007 +v -1.750000 1.374998 -7.750007 +v -1.484835 1.484833 -7.750007 +v -1.375000 1.749998 -7.750007 +v -1.484835 2.015163 -7.750007 +v -1.750000 2.124999 -9.000008 +v -2.015165 2.015163 -9.000008 +v -2.125000 1.749998 -9.000008 +v -2.015165 1.484833 -9.000008 +v -1.750000 1.374998 -9.000008 +v -1.484835 1.484833 -9.000008 +v -1.375000 1.749998 -9.000008 +v -1.484835 2.015163 -9.000008 +v 1.750000 2.124999 -7.750007 +v 1.484835 2.015163 -7.750007 +v 1.375000 1.749998 -7.750007 +v 1.484835 1.484833 -7.750007 +v 1.750000 1.374998 -7.750007 +v 2.015165 1.484833 -7.750007 +v 2.125000 1.749998 -7.750007 +v 2.015165 2.015163 -7.750007 +v 1.750000 2.124999 -9.000008 +v 1.484835 2.015163 -9.000008 +v 1.375000 1.749998 -9.000008 +v 1.484835 1.484833 -9.000008 +v 1.750000 1.374998 -9.000008 +v 2.015165 1.484833 -9.000008 +v 2.125000 1.749998 -9.000008 +v 2.015165 2.015163 -9.000008 vt 0.793460 0.825581 vt 0.776248 0.832558 vt 0.776248 0.825581 @@ -5089,6 +5259,74 @@ vt 0.799484 0.781395 vt 0.783133 0.790698 vt 0.797762 0.762791 vt 0.795181 0.734884 +vt 0.777108 0.725581 +vt 0.793460 0.716279 +vt 0.776248 0.716279 +vt 0.782272 0.781395 +vt 0.798623 0.772093 +vt 0.781411 0.772093 +vt 0.780551 0.762791 +vt 0.796902 0.753488 +vt 0.779690 0.753488 +vt 0.796041 0.744186 +vt 0.778830 0.744186 +vt 0.777969 0.734884 +vt 0.794320 0.725581 +vt 0.783133 0.790698 +vt 0.799484 0.781395 +vt 0.797762 0.762791 +vt 0.795181 0.734884 +vt 0.777108 0.725581 +vt 0.793460 0.716279 +vt 0.776248 0.716279 +vt 0.782272 0.781395 +vt 0.798623 0.772093 +vt 0.781411 0.772093 +vt 0.780551 0.762791 +vt 0.796902 0.753488 +vt 0.779690 0.753488 +vt 0.796041 0.744186 +vt 0.778830 0.744186 +vt 0.777969 0.734884 +vt 0.794320 0.725581 +vt 0.783133 0.790698 +vt 0.799484 0.781395 +vt 0.797762 0.762791 +vt 0.795181 0.734884 +vt 0.777108 0.725581 +vt 0.793460 0.716279 +vt 0.776248 0.716279 +vt 0.782272 0.781395 +vt 0.798623 0.772093 +vt 0.781411 0.772093 +vt 0.780551 0.762791 +vt 0.796902 0.753488 +vt 0.779690 0.753488 +vt 0.796041 0.744186 +vt 0.778830 0.744186 +vt 0.777969 0.734884 +vt 0.794320 0.725581 +vt 0.783133 0.790698 +vt 0.799484 0.781395 +vt 0.797762 0.762791 +vt 0.795181 0.734884 +vt 0.777108 0.725581 +vt 0.793460 0.716279 +vt 0.776248 0.716279 +vt 0.782272 0.781395 +vt 0.798623 0.772093 +vt 0.781411 0.772093 +vt 0.780551 0.762791 +vt 0.796902 0.753488 +vt 0.779690 0.753488 +vt 0.796041 0.744186 +vt 0.778830 0.744186 +vt 0.777969 0.734884 +vt 0.794320 0.725581 +vt 0.783133 0.790698 +vt 0.799484 0.781395 +vt 0.797762 0.762791 +vt 0.795181 0.734884 vt 0.793460 0.846512 vt 0.800344 0.790698 vt 0.793460 0.846512 @@ -5097,6 +5335,10 @@ vt 0.793460 0.846512 vt 0.800344 0.790698 vt 0.793460 0.846512 vt 0.800344 0.790698 +vt 0.800344 0.790698 +vt 0.800344 0.790698 +vt 0.800344 0.790698 +vt 0.800344 0.790698 vn -0.7071 0.7071 0.0000 vn -1.0000 0.0000 0.0000 vn 1.0000 0.0000 0.0000 @@ -5106,134 +5348,198 @@ vn 0.7071 -0.7071 0.0000 vn -0.7071 -0.7071 0.0000 vn 0.0000 1.0000 0.0000 s 1 -f 1114/1783/164 1107/1784/165 1106/1785/164 -f 1119/1786/166 1112/1787/167 1111/1788/166 -f 1117/1789/168 1110/1790/169 1109/1791/168 -f 1115/1792/165 1108/1793/170 1107/1784/165 -f 1113/1794/171 1106/1785/164 1105/1795/171 -f 1120/1796/167 1105/1795/171 1112/1787/167 -f 1118/1797/169 1111/1788/166 1110/1790/169 -f 1116/1798/170 1109/1799/168 1108/1793/170 -f 1133/1800/168 1126/1801/169 1125/1802/168 -f 1131/1803/165 1124/1804/170 1123/1805/165 -f 1129/1806/171 1122/1807/164 1121/1808/171 -f 1136/1809/167 1121/1808/171 1128/1810/167 -f 1134/1811/169 1127/1812/166 1126/1801/169 -f 1132/1813/170 1125/1814/168 1124/1804/170 -f 1130/1815/164 1123/1805/165 1122/1807/164 -f 1135/1816/166 1128/1810/167 1127/1812/166 -f 1146/1817/164 1139/1818/165 1138/1819/164 -f 1151/1820/166 1144/1821/167 1143/1822/166 -f 1149/1823/168 1142/1824/169 1141/1825/168 -f 1147/1826/165 1140/1827/170 1139/1818/165 -f 1145/1828/171 1138/1819/164 1137/1829/171 -f 1152/1830/167 1137/1829/171 1144/1821/167 -f 1150/1831/169 1143/1822/166 1142/1824/169 -f 1148/1832/170 1141/1833/168 1140/1827/170 -f 1165/1834/168 1158/1835/169 1157/1836/168 -f 1163/1837/165 1156/1838/170 1155/1839/165 -f 1161/1840/171 1154/1841/164 1153/1842/171 -f 1168/1843/167 1153/1842/171 1160/1844/167 -f 1166/1845/169 1159/1846/166 1158/1835/169 -f 1164/1847/170 1157/1848/168 1156/1838/170 -f 1162/1849/164 1155/1839/165 1154/1841/164 -f 1167/1850/166 1160/1844/167 1159/1846/166 -f 1178/1851/164 1171/1852/165 1170/1853/164 -f 1183/1854/166 1176/1855/167 1175/1856/166 -f 1181/1857/168 1174/1858/169 1173/1859/168 -f 1179/1860/165 1172/1861/170 1171/1852/165 -f 1177/1862/171 1170/1853/164 1169/1863/171 -f 1184/1864/167 1169/1863/171 1176/1855/167 -f 1182/1865/169 1175/1856/166 1174/1858/169 -f 1180/1866/170 1173/1867/168 1172/1861/170 -f 1197/1868/168 1190/1869/169 1189/1870/168 -f 1195/1871/165 1188/1872/170 1187/1873/165 -f 1193/1874/171 1186/1875/164 1185/1876/171 -f 1200/1877/167 1185/1876/171 1192/1878/167 -f 1198/1879/169 1191/1880/166 1190/1869/169 -f 1196/1881/170 1189/1882/168 1188/1872/170 -f 1194/1883/164 1187/1873/165 1186/1875/164 -f 1199/1884/166 1192/1878/167 1191/1880/166 -f 1210/1885/164 1203/1886/165 1202/1887/164 -f 1215/1888/166 1208/1889/167 1207/1890/166 -f 1213/1891/168 1206/1892/169 1205/1893/168 -f 1211/1894/165 1204/1895/170 1203/1886/165 -f 1209/1896/171 1202/1887/164 1201/1897/171 -f 1216/1898/167 1201/1897/171 1208/1889/167 -f 1214/1899/169 1207/1890/166 1206/1892/169 -f 1212/1900/170 1205/1901/168 1204/1895/170 -f 1229/1902/168 1222/1903/169 1221/1904/168 -f 1227/1905/165 1220/1906/170 1219/1907/165 -f 1225/1908/171 1218/1909/164 1217/1910/171 -f 1232/1911/167 1217/1910/171 1224/1912/167 -f 1230/1913/169 1223/1914/166 1222/1903/169 -f 1228/1915/170 1221/1916/168 1220/1906/170 -f 1226/1917/164 1219/1907/165 1218/1909/164 -f 1231/1918/166 1224/1912/167 1223/1914/166 -f 1114/1783/164 1115/1792/165 1107/1784/165 -f 1119/1786/166 1120/1796/167 1112/1787/167 -f 1117/1789/168 1118/1797/169 1110/1790/169 -f 1115/1792/165 1116/1798/170 1108/1793/170 -f 1113/1794/171 1114/1783/164 1106/1785/164 -f 1120/1796/167 1113/1794/171 1105/1795/171 -f 1118/1797/169 1119/1786/166 1111/1788/166 -f 1116/1798/170 1117/1919/168 1109/1799/168 -f 1133/1800/168 1134/1811/169 1126/1801/169 -f 1131/1803/165 1132/1813/170 1124/1804/170 -f 1129/1806/171 1130/1815/164 1122/1807/164 -f 1136/1809/167 1129/1806/171 1121/1808/171 -f 1134/1811/169 1135/1816/166 1127/1812/166 -f 1132/1813/170 1133/1920/168 1125/1814/168 -f 1130/1815/164 1131/1803/165 1123/1805/165 -f 1135/1816/166 1136/1809/167 1128/1810/167 -f 1146/1817/164 1147/1826/165 1139/1818/165 -f 1151/1820/166 1152/1830/167 1144/1821/167 -f 1149/1823/168 1150/1831/169 1142/1824/169 -f 1147/1826/165 1148/1832/170 1140/1827/170 -f 1145/1828/171 1146/1817/164 1138/1819/164 -f 1152/1830/167 1145/1828/171 1137/1829/171 -f 1150/1831/169 1151/1820/166 1143/1822/166 -f 1148/1832/170 1149/1921/168 1141/1833/168 -f 1165/1834/168 1166/1845/169 1158/1835/169 -f 1163/1837/165 1164/1847/170 1156/1838/170 -f 1161/1840/171 1162/1849/164 1154/1841/164 -f 1168/1843/167 1161/1840/171 1153/1842/171 -f 1166/1845/169 1167/1850/166 1159/1846/166 -f 1164/1847/170 1165/1922/168 1157/1848/168 -f 1162/1849/164 1163/1837/165 1155/1839/165 -f 1167/1850/166 1168/1843/167 1160/1844/167 -f 1178/1851/164 1179/1860/165 1171/1852/165 -f 1183/1854/166 1184/1864/167 1176/1855/167 -f 1181/1857/168 1182/1865/169 1174/1858/169 -f 1179/1860/165 1180/1866/170 1172/1861/170 -f 1177/1862/171 1178/1851/164 1170/1853/164 -f 1184/1864/167 1177/1862/171 1169/1863/171 -f 1182/1865/169 1183/1854/166 1175/1856/166 -f 1180/1866/170 1181/1923/168 1173/1867/168 -f 1197/1868/168 1198/1879/169 1190/1869/169 -f 1195/1871/165 1196/1881/170 1188/1872/170 -f 1193/1874/171 1194/1883/164 1186/1875/164 -f 1200/1877/167 1193/1874/171 1185/1876/171 -f 1198/1879/169 1199/1884/166 1191/1880/166 -f 1196/1881/170 1197/1924/168 1189/1882/168 -f 1194/1883/164 1195/1871/165 1187/1873/165 -f 1199/1884/166 1200/1877/167 1192/1878/167 -f 1210/1885/164 1211/1894/165 1203/1886/165 -f 1215/1888/166 1216/1898/167 1208/1889/167 -f 1213/1891/168 1214/1899/169 1206/1892/169 -f 1211/1894/165 1212/1900/170 1204/1895/170 -f 1209/1896/171 1210/1885/164 1202/1887/164 -f 1216/1898/167 1209/1896/171 1201/1897/171 -f 1214/1899/169 1215/1888/166 1207/1890/166 -f 1212/1900/170 1213/1925/168 1205/1901/168 -f 1229/1902/168 1230/1913/169 1222/1903/169 -f 1227/1905/165 1228/1915/170 1220/1906/170 -f 1225/1908/171 1226/1917/164 1218/1909/164 -f 1232/1911/167 1225/1908/171 1217/1910/171 -f 1230/1913/169 1231/1918/166 1223/1914/166 -f 1228/1915/170 1229/1926/168 1221/1916/168 -f 1226/1917/164 1227/1905/165 1219/1907/165 -f 1231/1918/166 1232/1911/167 1224/1912/167 +f 1146/1825/164 1139/1826/165 1138/1827/164 +f 1151/1828/166 1144/1829/167 1143/1830/166 +f 1149/1831/168 1142/1832/169 1141/1833/168 +f 1147/1834/165 1140/1835/170 1139/1826/165 +f 1145/1836/171 1138/1827/164 1137/1837/171 +f 1152/1838/167 1137/1837/171 1144/1829/167 +f 1150/1839/169 1143/1830/166 1142/1832/169 +f 1148/1840/170 1141/1841/168 1140/1835/170 +f 1165/1842/168 1158/1843/169 1157/1844/168 +f 1163/1845/165 1156/1846/170 1155/1847/165 +f 1161/1848/171 1154/1849/164 1153/1850/171 +f 1168/1851/167 1153/1850/171 1160/1852/167 +f 1166/1853/169 1159/1854/166 1158/1843/169 +f 1164/1855/170 1157/1856/168 1156/1846/170 +f 1162/1857/164 1155/1847/165 1154/1849/164 +f 1167/1858/166 1160/1852/167 1159/1854/166 +f 1178/1859/164 1171/1860/165 1170/1861/164 +f 1183/1862/166 1176/1863/167 1175/1864/166 +f 1181/1865/168 1174/1866/169 1173/1867/168 +f 1179/1868/165 1172/1869/170 1171/1860/165 +f 1177/1870/171 1170/1861/164 1169/1871/171 +f 1184/1872/167 1169/1871/171 1176/1863/167 +f 1182/1873/169 1175/1864/166 1174/1866/169 +f 1180/1874/170 1173/1875/168 1172/1869/170 +f 1197/1876/168 1190/1877/169 1189/1878/168 +f 1195/1879/165 1188/1880/170 1187/1881/165 +f 1193/1882/171 1186/1883/164 1185/1884/171 +f 1200/1885/167 1185/1884/171 1192/1886/167 +f 1198/1887/169 1191/1888/166 1190/1877/169 +f 1196/1889/170 1189/1890/168 1188/1880/170 +f 1194/1891/164 1187/1881/165 1186/1883/164 +f 1199/1892/166 1192/1886/167 1191/1888/166 +f 1210/1893/164 1203/1894/165 1202/1895/164 +f 1215/1896/166 1208/1897/167 1207/1898/166 +f 1213/1899/168 1206/1900/169 1205/1901/168 +f 1211/1902/165 1204/1903/170 1203/1894/165 +f 1209/1904/171 1202/1895/164 1201/1905/171 +f 1216/1906/167 1201/1905/171 1208/1897/167 +f 1214/1907/169 1207/1898/166 1206/1900/169 +f 1212/1908/170 1205/1909/168 1204/1903/170 +f 1229/1910/168 1222/1911/169 1221/1912/168 +f 1227/1913/165 1220/1914/170 1219/1915/165 +f 1225/1916/171 1218/1917/164 1217/1918/171 +f 1232/1919/167 1217/1918/171 1224/1920/167 +f 1230/1921/169 1223/1922/166 1222/1911/169 +f 1228/1923/170 1221/1924/168 1220/1914/170 +f 1226/1925/164 1219/1915/165 1218/1917/164 +f 1231/1926/166 1224/1920/167 1223/1922/166 +f 1242/1927/164 1235/1928/165 1234/1929/164 +f 1247/1930/166 1240/1931/167 1239/1932/166 +f 1245/1933/168 1238/1934/169 1237/1935/168 +f 1243/1936/165 1236/1937/170 1235/1928/165 +f 1241/1938/171 1234/1929/164 1233/1939/171 +f 1248/1940/167 1233/1939/171 1240/1931/167 +f 1246/1941/169 1239/1932/166 1238/1934/169 +f 1244/1942/170 1237/1943/168 1236/1937/170 +f 1261/1944/168 1254/1945/169 1253/1946/168 +f 1259/1947/165 1252/1948/170 1251/1949/165 +f 1257/1950/171 1250/1951/164 1249/1952/171 +f 1264/1953/167 1249/1952/171 1256/1954/167 +f 1262/1955/169 1255/1956/166 1254/1945/169 +f 1260/1957/170 1253/1958/168 1252/1948/170 +f 1258/1959/164 1251/1949/165 1250/1951/164 +f 1263/1960/166 1256/1954/167 1255/1956/166 +f 1270/1961/164 1277/1962/171 1269/1963/171 +f 1268/1964/167 1275/1965/166 1267/1966/166 +f 1266/1967/169 1273/1968/168 1265/1969/168 +f 1265/1969/168 1280/1970/170 1272/1971/170 +f 1271/1972/165 1278/1973/164 1270/1961/164 +f 1269/1974/171 1276/1975/167 1268/1964/167 +f 1267/1966/166 1274/1976/169 1266/1967/169 +f 1272/1971/170 1279/1977/165 1271/1972/165 +f 1286/1978/164 1293/1979/171 1285/1980/171 +f 1284/1981/167 1291/1982/166 1283/1983/166 +f 1282/1984/169 1289/1985/168 1281/1986/168 +f 1281/1986/168 1296/1987/170 1288/1988/170 +f 1287/1989/165 1294/1990/164 1286/1978/164 +f 1285/1991/171 1292/1992/167 1284/1981/167 +f 1283/1983/166 1290/1993/169 1282/1984/169 +f 1288/1988/170 1295/1994/165 1287/1989/165 +f 1302/1995/164 1309/1996/171 1301/1997/171 +f 1300/1998/167 1307/1999/166 1299/2000/166 +f 1298/2001/169 1305/2002/168 1297/2003/168 +f 1297/2003/168 1312/2004/170 1304/2005/170 +f 1303/2006/165 1310/2007/164 1302/1995/164 +f 1301/2008/171 1308/2009/167 1300/1998/167 +f 1299/2000/166 1306/2010/169 1298/2001/169 +f 1304/2005/170 1311/2011/165 1303/2006/165 +f 1318/2012/164 1325/2013/171 1317/2014/171 +f 1316/2015/167 1323/2016/166 1315/2017/166 +f 1314/2018/169 1321/2019/168 1313/2020/168 +f 1313/2020/168 1328/2021/170 1320/2022/170 +f 1319/2023/165 1326/2024/164 1318/2012/164 +f 1317/2025/171 1324/2026/167 1316/2015/167 +f 1315/2017/166 1322/2027/169 1314/2018/169 +f 1320/2022/170 1327/2028/165 1319/2023/165 +f 1146/1825/164 1147/1834/165 1139/1826/165 +f 1151/1828/166 1152/1838/167 1144/1829/167 +f 1149/1831/168 1150/1839/169 1142/1832/169 +f 1147/1834/165 1148/1840/170 1140/1835/170 +f 1145/1836/171 1146/1825/164 1138/1827/164 +f 1152/1838/167 1145/1836/171 1137/1837/171 +f 1150/1839/169 1151/1828/166 1143/1830/166 +f 1148/1840/170 1149/2029/168 1141/1841/168 +f 1165/1842/168 1166/1853/169 1158/1843/169 +f 1163/1845/165 1164/1855/170 1156/1846/170 +f 1161/1848/171 1162/1857/164 1154/1849/164 +f 1168/1851/167 1161/1848/171 1153/1850/171 +f 1166/1853/169 1167/1858/166 1159/1854/166 +f 1164/1855/170 1165/2030/168 1157/1856/168 +f 1162/1857/164 1163/1845/165 1155/1847/165 +f 1167/1858/166 1168/1851/167 1160/1852/167 +f 1178/1859/164 1179/1868/165 1171/1860/165 +f 1183/1862/166 1184/1872/167 1176/1863/167 +f 1181/1865/168 1182/1873/169 1174/1866/169 +f 1179/1868/165 1180/1874/170 1172/1869/170 +f 1177/1870/171 1178/1859/164 1170/1861/164 +f 1184/1872/167 1177/1870/171 1169/1871/171 +f 1182/1873/169 1183/1862/166 1175/1864/166 +f 1180/1874/170 1181/2031/168 1173/1875/168 +f 1197/1876/168 1198/1887/169 1190/1877/169 +f 1195/1879/165 1196/1889/170 1188/1880/170 +f 1193/1882/171 1194/1891/164 1186/1883/164 +f 1200/1885/167 1193/1882/171 1185/1884/171 +f 1198/1887/169 1199/1892/166 1191/1888/166 +f 1196/1889/170 1197/2032/168 1189/1890/168 +f 1194/1891/164 1195/1879/165 1187/1881/165 +f 1199/1892/166 1200/1885/167 1192/1886/167 +f 1210/1893/164 1211/1902/165 1203/1894/165 +f 1215/1896/166 1216/1906/167 1208/1897/167 +f 1213/1899/168 1214/1907/169 1206/1900/169 +f 1211/1902/165 1212/1908/170 1204/1903/170 +f 1209/1904/171 1210/1893/164 1202/1895/164 +f 1216/1906/167 1209/1904/171 1201/1905/171 +f 1214/1907/169 1215/1896/166 1207/1898/166 +f 1212/1908/170 1213/2033/168 1205/1909/168 +f 1229/1910/168 1230/1921/169 1222/1911/169 +f 1227/1913/165 1228/1923/170 1220/1914/170 +f 1225/1916/171 1226/1925/164 1218/1917/164 +f 1232/1919/167 1225/1916/171 1217/1918/171 +f 1230/1921/169 1231/1926/166 1223/1922/166 +f 1228/1923/170 1229/2034/168 1221/1924/168 +f 1226/1925/164 1227/1913/165 1219/1915/165 +f 1231/1926/166 1232/1919/167 1224/1920/167 +f 1242/1927/164 1243/1936/165 1235/1928/165 +f 1247/1930/166 1248/1940/167 1240/1931/167 +f 1245/1933/168 1246/1941/169 1238/1934/169 +f 1243/1936/165 1244/1942/170 1236/1937/170 +f 1241/1938/171 1242/1927/164 1234/1929/164 +f 1248/1940/167 1241/1938/171 1233/1939/171 +f 1246/1941/169 1247/1930/166 1239/1932/166 +f 1244/1942/170 1245/2035/168 1237/1943/168 +f 1261/1944/168 1262/1955/169 1254/1945/169 +f 1259/1947/165 1260/1957/170 1252/1948/170 +f 1257/1950/171 1258/1959/164 1250/1951/164 +f 1264/1953/167 1257/1950/171 1249/1952/171 +f 1262/1955/169 1263/1960/166 1255/1956/166 +f 1260/1957/170 1261/2036/168 1253/1958/168 +f 1258/1959/164 1259/1947/165 1251/1949/165 +f 1263/1960/166 1264/1953/167 1256/1954/167 +f 1270/1961/164 1278/1973/164 1277/1962/171 +f 1268/1964/167 1276/1975/167 1275/1965/166 +f 1266/1967/169 1274/1976/169 1273/1968/168 +f 1265/1969/168 1273/1968/168 1280/1970/170 +f 1271/1972/165 1279/1977/165 1278/1973/164 +f 1269/1974/171 1277/2037/171 1276/1975/167 +f 1267/1966/166 1275/1965/166 1274/1976/169 +f 1272/1971/170 1280/1970/170 1279/1977/165 +f 1286/1978/164 1294/1990/164 1293/1979/171 +f 1284/1981/167 1292/1992/167 1291/1982/166 +f 1282/1984/169 1290/1993/169 1289/1985/168 +f 1281/1986/168 1289/1985/168 1296/1987/170 +f 1287/1989/165 1295/1994/165 1294/1990/164 +f 1285/1991/171 1293/2038/171 1292/1992/167 +f 1283/1983/166 1291/1982/166 1290/1993/169 +f 1288/1988/170 1296/1987/170 1295/1994/165 +f 1302/1995/164 1310/2007/164 1309/1996/171 +f 1300/1998/167 1308/2009/167 1307/1999/166 +f 1298/2001/169 1306/2010/169 1305/2002/168 +f 1297/2003/168 1305/2002/168 1312/2004/170 +f 1303/2006/165 1311/2011/165 1310/2007/164 +f 1301/2008/171 1309/2039/171 1308/2009/167 +f 1299/2000/166 1307/1999/166 1306/2010/169 +f 1304/2005/170 1312/2004/170 1311/2011/165 +f 1318/2012/164 1326/2024/164 1325/2013/171 +f 1316/2015/167 1324/2026/167 1323/2016/166 +f 1314/2018/169 1322/2027/169 1321/2019/168 +f 1313/2020/168 1321/2019/168 1328/2021/170 +f 1319/2023/165 1327/2028/165 1326/2024/164 +f 1317/2025/171 1325/2040/171 1324/2026/167 +f 1315/2017/166 1323/2016/166 1322/2027/169 +f 1320/2022/170 1328/2021/170 1327/2028/165 o SuspensionLeft v -1.937497 6.687504 6.437500 v -1.937497 6.820086 6.382583 @@ -5363,6 +5669,70 @@ v -2.624997 0.312492 6.437500 v -2.624997 0.445075 6.382583 v -2.624997 0.499992 6.250000 v -2.624997 0.445075 6.117417 +v -1.937497 6.687504 6.437500 +v -1.937497 6.820086 6.382583 +v -1.937497 6.875004 6.250000 +v -1.937497 6.820086 6.117417 +v -1.937497 6.687504 6.062500 +v -1.937497 6.554921 6.117417 +v -1.937497 6.500004 6.250000 +v -1.937497 6.554921 6.382583 +v -2.624997 6.687504 6.437500 +v -2.624997 6.820086 6.382583 +v -2.624997 6.875004 6.250000 +v -2.624997 6.820086 6.117417 +v -2.624997 6.687504 6.062500 +v -2.624997 6.554921 6.117417 +v -2.624997 6.500004 6.250000 +v -2.624997 6.554921 6.382583 +v -1.937497 6.687504 7.937500 +v -1.937497 6.820086 7.882583 +v -1.937497 6.875004 7.750000 +v -1.937497 6.820086 7.617417 +v -1.937497 6.687504 7.562500 +v -1.937497 6.554921 7.617417 +v -1.937497 6.500004 7.750000 +v -1.937497 6.554921 7.882583 +v -2.624997 6.687504 7.937500 +v -2.624997 6.820086 7.882583 +v -2.624997 6.875004 7.750000 +v -2.624997 6.820086 7.617417 +v -2.624997 6.687504 7.562500 +v -2.624997 6.554921 7.617417 +v -2.624997 6.500004 7.750000 +v -2.624997 6.554921 7.882583 +v -1.937497 0.312492 7.562500 +v -1.937497 0.179910 7.617417 +v -1.937497 0.124992 7.750000 +v -1.937497 0.179910 7.882583 +v -1.937497 0.312492 7.937500 +v -1.937497 0.445075 7.882583 +v -1.937497 0.499992 7.750000 +v -1.937497 0.445075 7.617417 +v -2.624997 0.312492 7.562500 +v -2.624997 0.179910 7.617417 +v -2.624997 0.124992 7.750000 +v -2.624997 0.179910 7.882583 +v -2.624997 0.312492 7.937500 +v -2.624997 0.445075 7.882583 +v -2.624997 0.499992 7.750000 +v -2.624997 0.445075 7.617417 +v -1.937497 0.312492 6.062500 +v -1.937497 0.179910 6.117417 +v -1.937497 0.124992 6.250000 +v -1.937497 0.179910 6.382583 +v -1.937497 0.312492 6.437500 +v -1.937497 0.445075 6.382583 +v -1.937497 0.499992 6.250000 +v -1.937497 0.445075 6.117417 +v -2.624997 0.312492 6.062500 +v -2.624997 0.179910 6.117417 +v -2.624997 0.124992 6.250000 +v -2.624997 0.179910 6.382583 +v -2.624997 0.312492 6.437500 +v -2.624997 0.445075 6.382583 +v -2.624997 0.499992 6.250000 +v -2.624997 0.445075 6.117417 vt 0.837349 0.637209 vt 0.846816 0.641860 vt 0.837349 0.641860 @@ -5499,6 +5869,74 @@ vt 0.833907 0.651163 vt 0.822719 0.641860 vt 0.833046 0.646512 vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 vt 0.830465 0.632558 vt 0.846816 0.632558 vt 0.846816 0.632558 @@ -5507,6 +5945,10 @@ vt 0.830465 0.632558 vt 0.846816 0.632558 vt 0.846816 0.632558 vt 0.830465 0.632558 +vt 0.830465 0.632558 +vt 0.830465 0.632558 +vt 0.830465 0.632558 +vt 0.830465 0.632558 vn 0.0000 -0.7071 -0.7071 vn 0.0000 0.0000 -1.0000 vn 0.0000 -1.0000 -0.0000 @@ -5516,134 +5958,198 @@ vn 0.0000 0.7071 0.7071 vn 0.0000 1.0000 -0.0000 vn 0.0000 0.7071 -0.7071 s 1 -f 1246/1927/172 1261/1928/173 1245/1929/173 -f 1239/1930/174 1254/1931/172 1238/1932/172 -f 1247/1933/174 1262/1934/172 1246/1927/172 -f 1240/1935/175 1255/1936/174 1239/1937/174 -f 1248/1938/175 1263/1939/174 1247/1940/174 -f 1233/1941/176 1256/1942/175 1240/1935/175 -f 1234/1943/177 1249/1944/176 1233/1941/176 -f 1241/1945/176 1264/1946/175 1248/1938/175 -f 1242/1947/177 1257/1948/176 1241/1945/176 -f 1235/1949/178 1250/1950/177 1234/1943/177 -f 1243/1951/178 1258/1952/177 1242/1947/177 -f 1236/1953/179 1251/1954/178 1235/1949/178 -f 1244/1955/179 1259/1956/178 1243/1951/178 -f 1237/1957/173 1252/1958/179 1236/1953/179 -f 1245/1929/173 1260/1959/179 1244/1955/179 -f 1238/1932/172 1253/1960/173 1237/1957/173 -f 1270/1961/172 1277/1962/173 1269/1963/173 -f 1271/1964/174 1278/1965/172 1270/1961/172 -f 1272/1966/175 1279/1967/174 1271/1968/174 -f 1265/1969/176 1280/1970/175 1272/1966/175 -f 1266/1971/177 1273/1972/176 1265/1969/176 -f 1267/1973/178 1274/1974/177 1266/1971/177 -f 1268/1975/179 1275/1976/178 1267/1973/178 -f 1269/1963/173 1276/1977/179 1268/1975/179 -f 1287/1978/174 1294/1979/172 1286/1980/172 -f 1288/1981/175 1295/1982/174 1287/1983/174 -f 1281/1984/176 1296/1985/175 1288/1981/175 -f 1282/1986/177 1289/1987/176 1281/1984/176 -f 1283/1988/178 1290/1989/177 1282/1986/177 -f 1284/1990/179 1291/1991/178 1283/1988/178 -f 1285/1992/173 1292/1993/179 1284/1990/179 -f 1286/1980/172 1293/1994/173 1285/1992/173 -f 1310/1995/177 1325/1996/176 1309/1997/176 -f 1303/1998/178 1318/1999/177 1302/2000/177 -f 1311/2001/178 1326/2002/177 1310/1995/177 -f 1304/2003/179 1319/2004/178 1303/2005/178 -f 1312/2006/179 1327/2007/178 1311/2008/178 -f 1297/2009/173 1320/2010/179 1304/2003/179 -f 1298/2011/172 1313/2012/173 1297/2009/173 -f 1305/2013/173 1328/2014/179 1312/2006/179 -f 1306/2015/172 1321/2016/173 1305/2013/173 -f 1299/2017/174 1314/2018/172 1298/2011/172 -f 1307/2019/174 1322/2020/172 1306/2015/172 -f 1300/2021/175 1315/2022/174 1299/2017/174 -f 1308/2023/175 1323/2024/174 1307/2019/174 -f 1301/2025/176 1316/2026/175 1300/2021/175 -f 1309/1997/176 1324/2027/175 1308/2023/175 -f 1302/2000/177 1317/2028/176 1301/2025/176 -f 1334/2029/177 1341/2030/176 1333/2031/176 -f 1335/2032/178 1342/2033/177 1334/2029/177 -f 1336/2034/179 1343/2035/178 1335/2036/178 -f 1329/2037/173 1344/2038/179 1336/2034/179 -f 1330/2039/172 1337/2040/173 1329/2037/173 -f 1331/2041/174 1338/2042/172 1330/2039/172 -f 1332/2043/175 1339/2044/174 1331/2041/174 -f 1333/2031/176 1340/2045/175 1332/2043/175 -f 1351/2046/178 1358/2047/177 1350/2048/177 -f 1352/2049/179 1359/2050/178 1351/2051/178 -f 1345/2052/173 1360/2053/179 1352/2049/179 -f 1346/2054/172 1353/2055/173 1345/2052/173 -f 1347/2056/174 1354/2057/172 1346/2054/172 -f 1348/2058/175 1355/2059/174 1347/2056/174 -f 1349/2060/176 1356/2061/175 1348/2058/175 -f 1350/2048/177 1357/2062/176 1349/2060/176 -f 1246/1927/172 1262/1934/172 1261/1928/173 -f 1239/1930/174 1255/2063/174 1254/1931/172 -f 1247/1933/174 1263/2064/174 1262/1934/172 -f 1240/1935/175 1256/1942/175 1255/1936/174 -f 1248/1938/175 1264/1946/175 1263/1939/174 -f 1233/1941/176 1249/1944/176 1256/1942/175 -f 1234/1943/177 1250/1950/177 1249/1944/176 -f 1241/1945/176 1257/1948/176 1264/1946/175 -f 1242/1947/177 1258/1952/177 1257/1948/176 -f 1235/1949/178 1251/1954/178 1250/1950/177 -f 1243/1951/178 1259/1956/178 1258/1952/177 -f 1236/1953/179 1252/1958/179 1251/1954/178 -f 1244/1955/179 1260/1959/179 1259/1956/178 -f 1237/1957/173 1253/1960/173 1252/1958/179 -f 1245/1929/173 1261/1928/173 1260/1959/179 -f 1238/1932/172 1254/1931/172 1253/1960/173 -f 1270/1961/172 1278/1965/172 1277/1962/173 -f 1271/1964/174 1279/2065/174 1278/1965/172 -f 1272/1966/175 1280/1970/175 1279/1967/174 -f 1265/1969/176 1273/1972/176 1280/1970/175 -f 1266/1971/177 1274/1974/177 1273/1972/176 -f 1267/1973/178 1275/1976/178 1274/1974/177 -f 1268/1975/179 1276/1977/179 1275/1976/178 -f 1269/1963/173 1277/1962/173 1276/1977/179 -f 1287/1978/174 1295/2066/174 1294/1979/172 -f 1288/1981/175 1296/1985/175 1295/1982/174 -f 1281/1984/176 1289/1987/176 1296/1985/175 -f 1282/1986/177 1290/1989/177 1289/1987/176 -f 1283/1988/178 1291/1991/178 1290/1989/177 -f 1284/1990/179 1292/1993/179 1291/1991/178 -f 1285/1992/173 1293/1994/173 1292/1993/179 -f 1286/1980/172 1294/1979/172 1293/1994/173 -f 1310/1995/177 1326/2002/177 1325/1996/176 -f 1303/1998/178 1319/2067/178 1318/1999/177 -f 1311/2001/178 1327/2068/178 1326/2002/177 -f 1304/2003/179 1320/2010/179 1319/2004/178 -f 1312/2006/179 1328/2014/179 1327/2007/178 -f 1297/2009/173 1313/2012/173 1320/2010/179 -f 1298/2011/172 1314/2018/172 1313/2012/173 -f 1305/2013/173 1321/2016/173 1328/2014/179 -f 1306/2015/172 1322/2020/172 1321/2016/173 -f 1299/2017/174 1315/2022/174 1314/2018/172 -f 1307/2019/174 1323/2024/174 1322/2020/172 -f 1300/2021/175 1316/2026/175 1315/2022/174 -f 1308/2023/175 1324/2027/175 1323/2024/174 -f 1301/2025/176 1317/2028/176 1316/2026/175 -f 1309/1997/176 1325/1996/176 1324/2027/175 -f 1302/2000/177 1318/1999/177 1317/2028/176 -f 1334/2029/177 1342/2033/177 1341/2030/176 -f 1335/2032/178 1343/2069/178 1342/2033/177 -f 1336/2034/179 1344/2038/179 1343/2035/178 -f 1329/2037/173 1337/2040/173 1344/2038/179 -f 1330/2039/172 1338/2042/172 1337/2040/173 -f 1331/2041/174 1339/2044/174 1338/2042/172 -f 1332/2043/175 1340/2045/175 1339/2044/174 -f 1333/2031/176 1341/2030/176 1340/2045/175 -f 1351/2046/178 1359/2070/178 1358/2047/177 -f 1352/2049/179 1360/2053/179 1359/2050/178 -f 1345/2052/173 1353/2055/173 1360/2053/179 -f 1346/2054/172 1354/2057/172 1353/2055/173 -f 1347/2056/174 1355/2059/174 1354/2057/172 -f 1348/2058/175 1356/2061/175 1355/2059/174 -f 1349/2060/176 1357/2062/176 1356/2061/175 -f 1350/2048/177 1358/2047/177 1357/2062/176 +f 1342/2041/172 1357/2042/173 1341/2043/173 +f 1335/2044/174 1350/2045/172 1334/2046/172 +f 1343/2047/174 1358/2048/172 1342/2041/172 +f 1336/2049/175 1351/2050/174 1335/2051/174 +f 1344/2052/175 1359/2053/174 1343/2054/174 +f 1329/2055/176 1352/2056/175 1336/2049/175 +f 1330/2057/177 1345/2058/176 1329/2055/176 +f 1337/2059/176 1360/2060/175 1344/2052/175 +f 1338/2061/177 1353/2062/176 1337/2059/176 +f 1331/2063/178 1346/2064/177 1330/2057/177 +f 1339/2065/178 1354/2066/177 1338/2061/177 +f 1332/2067/179 1347/2068/178 1331/2063/178 +f 1340/2069/179 1355/2070/178 1339/2065/178 +f 1333/2071/173 1348/2072/179 1332/2067/179 +f 1341/2043/173 1356/2073/179 1340/2069/179 +f 1334/2046/172 1349/2074/173 1333/2071/173 +f 1366/2075/172 1373/2076/173 1365/2077/173 +f 1367/2078/174 1374/2079/172 1366/2075/172 +f 1368/2080/175 1375/2081/174 1367/2082/174 +f 1361/2083/176 1376/2084/175 1368/2080/175 +f 1362/2085/177 1369/2086/176 1361/2083/176 +f 1363/2087/178 1370/2088/177 1362/2085/177 +f 1364/2089/179 1371/2090/178 1363/2087/178 +f 1365/2077/173 1372/2091/179 1364/2089/179 +f 1383/2092/174 1390/2093/172 1382/2094/172 +f 1384/2095/175 1391/2096/174 1383/2097/174 +f 1377/2098/176 1392/2099/175 1384/2095/175 +f 1378/2100/177 1385/2101/176 1377/2098/176 +f 1379/2102/178 1386/2103/177 1378/2100/177 +f 1380/2104/179 1387/2105/178 1379/2102/178 +f 1381/2106/173 1388/2107/179 1380/2104/179 +f 1382/2094/172 1389/2108/173 1381/2106/173 +f 1406/2109/177 1421/2110/176 1405/2111/176 +f 1399/2112/178 1414/2113/177 1398/2114/177 +f 1407/2115/178 1422/2116/177 1406/2109/177 +f 1400/2117/179 1415/2118/178 1399/2119/178 +f 1408/2120/179 1423/2121/178 1407/2122/178 +f 1393/2123/173 1416/2124/179 1400/2117/179 +f 1394/2125/172 1409/2126/173 1393/2123/173 +f 1401/2127/173 1424/2128/179 1408/2120/179 +f 1402/2129/172 1417/2130/173 1401/2127/173 +f 1395/2131/174 1410/2132/172 1394/2125/172 +f 1403/2133/174 1418/2134/172 1402/2129/172 +f 1396/2135/175 1411/2136/174 1395/2131/174 +f 1404/2137/175 1419/2138/174 1403/2133/174 +f 1397/2139/176 1412/2140/175 1396/2135/175 +f 1405/2111/176 1420/2141/175 1404/2137/175 +f 1398/2114/177 1413/2142/176 1397/2139/176 +f 1430/2143/177 1437/2144/176 1429/2145/176 +f 1431/2146/178 1438/2147/177 1430/2143/177 +f 1432/2148/179 1439/2149/178 1431/2150/178 +f 1425/2151/173 1440/2152/179 1432/2148/179 +f 1426/2153/172 1433/2154/173 1425/2151/173 +f 1427/2155/174 1434/2156/172 1426/2153/172 +f 1428/2157/175 1435/2158/174 1427/2155/174 +f 1429/2145/176 1436/2159/175 1428/2157/175 +f 1447/2160/178 1454/2161/177 1446/2162/177 +f 1448/2163/179 1455/2164/178 1447/2165/178 +f 1441/2166/173 1456/2167/179 1448/2163/179 +f 1442/2168/172 1449/2169/173 1441/2166/173 +f 1443/2170/174 1450/2171/172 1442/2168/172 +f 1444/2172/175 1451/2173/174 1443/2170/174 +f 1445/2174/176 1452/2175/175 1444/2172/175 +f 1446/2162/177 1453/2176/176 1445/2174/176 +f 1470/2177/177 1463/2178/178 1462/2179/177 +f 1471/2180/178 1464/2181/179 1463/2182/178 +f 1472/2183/179 1457/2184/173 1464/2181/179 +f 1465/2185/173 1458/2186/172 1457/2184/173 +f 1466/2187/172 1459/2188/174 1458/2186/172 +f 1467/2189/174 1460/2190/175 1459/2188/174 +f 1468/2191/175 1461/2192/176 1460/2190/175 +f 1469/2193/176 1462/2179/177 1461/2192/176 +f 1486/2194/177 1479/2195/178 1478/2196/177 +f 1487/2197/178 1480/2198/179 1479/2199/178 +f 1488/2200/179 1473/2201/173 1480/2198/179 +f 1481/2202/173 1474/2203/172 1473/2201/173 +f 1482/2204/172 1475/2205/174 1474/2203/172 +f 1483/2206/174 1476/2207/175 1475/2205/174 +f 1484/2208/175 1477/2209/176 1476/2207/175 +f 1485/2210/176 1478/2196/177 1477/2209/176 +f 1502/2211/172 1495/2212/174 1494/2213/172 +f 1503/2214/174 1496/2215/175 1495/2216/174 +f 1504/2217/175 1489/2218/176 1496/2215/175 +f 1497/2219/176 1490/2220/177 1489/2218/176 +f 1498/2221/177 1491/2222/178 1490/2220/177 +f 1499/2223/178 1492/2224/179 1491/2222/178 +f 1500/2225/179 1493/2226/173 1492/2224/179 +f 1501/2227/173 1494/2213/172 1493/2226/173 +f 1518/2228/172 1511/2229/174 1510/2230/172 +f 1519/2231/174 1512/2232/175 1511/2233/174 +f 1520/2234/175 1505/2235/176 1512/2232/175 +f 1513/2236/176 1506/2237/177 1505/2235/176 +f 1514/2238/177 1507/2239/178 1506/2237/177 +f 1515/2240/178 1508/2241/179 1507/2239/178 +f 1516/2242/179 1509/2243/173 1508/2241/179 +f 1517/2244/173 1510/2230/172 1509/2243/173 +f 1342/2041/172 1358/2048/172 1357/2042/173 +f 1335/2044/174 1351/2245/174 1350/2045/172 +f 1343/2047/174 1359/2246/174 1358/2048/172 +f 1336/2049/175 1352/2056/175 1351/2050/174 +f 1344/2052/175 1360/2060/175 1359/2053/174 +f 1329/2055/176 1345/2058/176 1352/2056/175 +f 1330/2057/177 1346/2064/177 1345/2058/176 +f 1337/2059/176 1353/2062/176 1360/2060/175 +f 1338/2061/177 1354/2066/177 1353/2062/176 +f 1331/2063/178 1347/2068/178 1346/2064/177 +f 1339/2065/178 1355/2070/178 1354/2066/177 +f 1332/2067/179 1348/2072/179 1347/2068/178 +f 1340/2069/179 1356/2073/179 1355/2070/178 +f 1333/2071/173 1349/2074/173 1348/2072/179 +f 1341/2043/173 1357/2042/173 1356/2073/179 +f 1334/2046/172 1350/2045/172 1349/2074/173 +f 1366/2075/172 1374/2079/172 1373/2076/173 +f 1367/2078/174 1375/2247/174 1374/2079/172 +f 1368/2080/175 1376/2084/175 1375/2081/174 +f 1361/2083/176 1369/2086/176 1376/2084/175 +f 1362/2085/177 1370/2088/177 1369/2086/176 +f 1363/2087/178 1371/2090/178 1370/2088/177 +f 1364/2089/179 1372/2091/179 1371/2090/178 +f 1365/2077/173 1373/2076/173 1372/2091/179 +f 1383/2092/174 1391/2248/174 1390/2093/172 +f 1384/2095/175 1392/2099/175 1391/2096/174 +f 1377/2098/176 1385/2101/176 1392/2099/175 +f 1378/2100/177 1386/2103/177 1385/2101/176 +f 1379/2102/178 1387/2105/178 1386/2103/177 +f 1380/2104/179 1388/2107/179 1387/2105/178 +f 1381/2106/173 1389/2108/173 1388/2107/179 +f 1382/2094/172 1390/2093/172 1389/2108/173 +f 1406/2109/177 1422/2116/177 1421/2110/176 +f 1399/2112/178 1415/2249/178 1414/2113/177 +f 1407/2115/178 1423/2250/178 1422/2116/177 +f 1400/2117/179 1416/2124/179 1415/2118/178 +f 1408/2120/179 1424/2128/179 1423/2121/178 +f 1393/2123/173 1409/2126/173 1416/2124/179 +f 1394/2125/172 1410/2132/172 1409/2126/173 +f 1401/2127/173 1417/2130/173 1424/2128/179 +f 1402/2129/172 1418/2134/172 1417/2130/173 +f 1395/2131/174 1411/2136/174 1410/2132/172 +f 1403/2133/174 1419/2138/174 1418/2134/172 +f 1396/2135/175 1412/2140/175 1411/2136/174 +f 1404/2137/175 1420/2141/175 1419/2138/174 +f 1397/2139/176 1413/2142/176 1412/2140/175 +f 1405/2111/176 1421/2110/176 1420/2141/175 +f 1398/2114/177 1414/2113/177 1413/2142/176 +f 1430/2143/177 1438/2147/177 1437/2144/176 +f 1431/2146/178 1439/2251/178 1438/2147/177 +f 1432/2148/179 1440/2152/179 1439/2149/178 +f 1425/2151/173 1433/2154/173 1440/2152/179 +f 1426/2153/172 1434/2156/172 1433/2154/173 +f 1427/2155/174 1435/2158/174 1434/2156/172 +f 1428/2157/175 1436/2159/175 1435/2158/174 +f 1429/2145/176 1437/2144/176 1436/2159/175 +f 1447/2160/178 1455/2252/178 1454/2161/177 +f 1448/2163/179 1456/2167/179 1455/2164/178 +f 1441/2166/173 1449/2169/173 1456/2167/179 +f 1442/2168/172 1450/2171/172 1449/2169/173 +f 1443/2170/174 1451/2173/174 1450/2171/172 +f 1444/2172/175 1452/2175/175 1451/2173/174 +f 1445/2174/176 1453/2176/176 1452/2175/175 +f 1446/2162/177 1454/2161/177 1453/2176/176 +f 1470/2177/177 1471/2253/178 1463/2178/178 +f 1471/2180/178 1472/2183/179 1464/2181/179 +f 1472/2183/179 1465/2185/173 1457/2184/173 +f 1465/2185/173 1466/2187/172 1458/2186/172 +f 1466/2187/172 1467/2189/174 1459/2188/174 +f 1467/2189/174 1468/2191/175 1460/2190/175 +f 1468/2191/175 1469/2193/176 1461/2192/176 +f 1469/2193/176 1470/2177/177 1462/2179/177 +f 1486/2194/177 1487/2254/178 1479/2195/178 +f 1487/2197/178 1488/2200/179 1480/2198/179 +f 1488/2200/179 1481/2202/173 1473/2201/173 +f 1481/2202/173 1482/2204/172 1474/2203/172 +f 1482/2204/172 1483/2206/174 1475/2205/174 +f 1483/2206/174 1484/2208/175 1476/2207/175 +f 1484/2208/175 1485/2210/176 1477/2209/176 +f 1485/2210/176 1486/2194/177 1478/2196/177 +f 1502/2211/172 1503/2255/174 1495/2212/174 +f 1503/2214/174 1504/2217/175 1496/2215/175 +f 1504/2217/175 1497/2219/176 1489/2218/176 +f 1497/2219/176 1498/2221/177 1490/2220/177 +f 1498/2221/177 1499/2223/178 1491/2222/178 +f 1499/2223/178 1500/2225/179 1492/2224/179 +f 1500/2225/179 1501/2227/173 1493/2226/173 +f 1501/2227/173 1502/2211/172 1494/2213/172 +f 1518/2228/172 1519/2256/174 1511/2229/174 +f 1519/2231/174 1520/2234/175 1512/2232/175 +f 1520/2234/175 1513/2236/176 1505/2235/176 +f 1513/2236/176 1514/2238/177 1506/2237/177 +f 1514/2238/177 1515/2240/178 1507/2239/178 +f 1515/2240/178 1516/2242/179 1508/2241/179 +f 1516/2242/179 1517/2244/173 1509/2243/173 +f 1517/2244/173 1518/2228/172 1510/2230/172 o SuspensionRight v 1.937497 6.687504 7.562500 v 1.937497 6.820086 7.617417 @@ -5773,6 +6279,70 @@ v 2.624997 0.312492 7.562500 v 2.624997 0.445075 7.617417 v 2.624997 0.499992 7.750000 v 2.624997 0.445075 7.882583 +v 1.937497 6.687504 7.562500 +v 1.937497 6.820086 7.617417 +v 1.937497 6.875004 7.750000 +v 1.937497 6.820086 7.882583 +v 1.937497 6.687504 7.937500 +v 1.937497 6.554921 7.882583 +v 1.937497 6.500004 7.750000 +v 1.937497 6.554921 7.617417 +v 2.624997 6.687504 7.562500 +v 2.624997 6.820086 7.617417 +v 2.624997 6.875004 7.750000 +v 2.624997 6.820086 7.882583 +v 2.624997 6.687504 7.937500 +v 2.624997 6.554921 7.882583 +v 2.624997 6.500004 7.750000 +v 2.624997 6.554921 7.617417 +v 1.937497 6.687504 6.062500 +v 1.937497 6.820086 6.117417 +v 1.937497 6.875004 6.250000 +v 1.937497 6.820086 6.382583 +v 1.937497 6.687504 6.437500 +v 1.937497 6.554921 6.382583 +v 1.937497 6.500004 6.250000 +v 1.937497 6.554921 6.117417 +v 2.624997 6.687504 6.062500 +v 2.624997 6.820086 6.117417 +v 2.624997 6.875004 6.250000 +v 2.624997 6.820086 6.382583 +v 2.624997 6.687504 6.437500 +v 2.624997 6.554921 6.382583 +v 2.624997 6.500004 6.250000 +v 2.624997 6.554921 6.117417 +v 1.937497 0.312492 6.437500 +v 1.937497 0.179910 6.382583 +v 1.937497 0.124992 6.250000 +v 1.937497 0.179910 6.117417 +v 1.937497 0.312492 6.062500 +v 1.937497 0.445075 6.117417 +v 1.937497 0.499992 6.250000 +v 1.937497 0.445075 6.382583 +v 2.624997 0.312492 6.437500 +v 2.624997 0.179910 6.382583 +v 2.624997 0.124992 6.250000 +v 2.624997 0.179910 6.117417 +v 2.624997 0.312492 6.062500 +v 2.624997 0.445075 6.117417 +v 2.624997 0.499992 6.250000 +v 2.624997 0.445075 6.382583 +v 1.937497 0.312492 7.937500 +v 1.937497 0.179910 7.882583 +v 1.937497 0.124992 7.750000 +v 1.937497 0.179910 7.617417 +v 1.937497 0.312492 7.562500 +v 1.937497 0.445075 7.617417 +v 1.937497 0.499992 7.750000 +v 1.937497 0.445075 7.882583 +v 2.624997 0.312492 7.937500 +v 2.624997 0.179910 7.882583 +v 2.624997 0.124992 7.750000 +v 2.624997 0.179910 7.617417 +v 2.624997 0.312492 7.562500 +v 2.624997 0.445075 7.617417 +v 2.624997 0.499992 7.750000 +v 2.624997 0.445075 7.882583 vt 0.837349 0.637209 vt 0.846816 0.641860 vt 0.837349 0.641860 @@ -5909,6 +6479,74 @@ vt 0.833907 0.651163 vt 0.822719 0.641860 vt 0.833046 0.646512 vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 vt 0.830465 0.632558 vt 0.846816 0.632558 vt 0.846816 0.632558 @@ -5917,6 +6555,10 @@ vt 0.830465 0.632558 vt 0.846816 0.632558 vt 0.846816 0.632558 vt 0.830465 0.632558 +vt 0.830465 0.632558 +vt 0.830465 0.632558 +vt 0.830465 0.632558 +vt 0.830465 0.632558 vn 0.0000 -0.7071 0.7071 vn 0.0000 0.0000 1.0000 vn 0.0000 -1.0000 0.0000 @@ -5926,134 +6568,198 @@ vn 0.0000 0.7071 -0.7071 vn 0.0000 1.0000 0.0000 vn 0.0000 0.7071 0.7071 s 1 -f 1374/2071/180 1389/2072/181 1373/2073/181 -f 1367/2074/182 1382/2075/180 1366/2076/180 -f 1375/2077/182 1390/2078/180 1374/2071/180 -f 1368/2079/183 1383/2080/182 1367/2081/182 -f 1376/2082/183 1391/2083/182 1375/2084/182 -f 1361/2085/184 1384/2086/183 1368/2079/183 -f 1362/2087/185 1377/2088/184 1361/2085/184 -f 1369/2089/184 1392/2090/183 1376/2082/183 -f 1370/2091/185 1385/2092/184 1369/2089/184 -f 1363/2093/186 1378/2094/185 1362/2087/185 -f 1371/2095/186 1386/2096/185 1370/2091/185 -f 1364/2097/187 1379/2098/186 1363/2093/186 -f 1372/2099/187 1387/2100/186 1371/2095/186 -f 1365/2101/181 1380/2102/187 1364/2097/187 -f 1373/2073/181 1388/2103/187 1372/2099/187 -f 1366/2076/180 1381/2104/181 1365/2101/181 -f 1398/2105/180 1405/2106/181 1397/2107/181 -f 1399/2108/182 1406/2109/180 1398/2105/180 -f 1400/2110/183 1407/2111/182 1399/2112/182 -f 1393/2113/184 1408/2114/183 1400/2110/183 -f 1394/2115/185 1401/2116/184 1393/2113/184 -f 1395/2117/186 1402/2118/185 1394/2115/185 -f 1396/2119/187 1403/2120/186 1395/2117/186 -f 1397/2107/181 1404/2121/187 1396/2119/187 -f 1415/2122/182 1422/2123/180 1414/2124/180 -f 1416/2125/183 1423/2126/182 1415/2127/182 -f 1409/2128/184 1424/2129/183 1416/2125/183 -f 1410/2130/185 1417/2131/184 1409/2128/184 -f 1411/2132/186 1418/2133/185 1410/2130/185 -f 1412/2134/187 1419/2135/186 1411/2132/186 -f 1413/2136/181 1420/2137/187 1412/2134/187 -f 1414/2124/180 1421/2138/181 1413/2136/181 -f 1438/2139/185 1453/2140/184 1437/2141/184 -f 1431/2142/186 1446/2143/185 1430/2144/185 -f 1439/2145/186 1454/2146/185 1438/2139/185 -f 1432/2147/187 1447/2148/186 1431/2149/186 -f 1440/2150/187 1455/2151/186 1439/2152/186 -f 1425/2153/181 1448/2154/187 1432/2147/187 -f 1426/2155/180 1441/2156/181 1425/2153/181 -f 1433/2157/181 1456/2158/187 1440/2150/187 -f 1434/2159/180 1449/2160/181 1433/2157/181 -f 1427/2161/182 1442/2162/180 1426/2155/180 -f 1435/2163/182 1450/2164/180 1434/2159/180 -f 1428/2165/183 1443/2166/182 1427/2161/182 -f 1436/2167/183 1451/2168/182 1435/2163/182 -f 1429/2169/184 1444/2170/183 1428/2165/183 -f 1437/2141/184 1452/2171/183 1436/2167/183 -f 1430/2144/185 1445/2172/184 1429/2169/184 -f 1462/2173/185 1469/2174/184 1461/2175/184 -f 1463/2176/186 1470/2177/185 1462/2173/185 -f 1464/2178/187 1471/2179/186 1463/2180/186 -f 1457/2181/181 1472/2182/187 1464/2178/187 -f 1458/2183/180 1465/2184/181 1457/2181/181 -f 1459/2185/182 1466/2186/180 1458/2183/180 -f 1460/2187/183 1467/2188/182 1459/2185/182 -f 1461/2175/184 1468/2189/183 1460/2187/183 -f 1479/2190/186 1486/2191/185 1478/2192/185 -f 1480/2193/187 1487/2194/186 1479/2195/186 -f 1473/2196/181 1488/2197/187 1480/2193/187 -f 1474/2198/180 1481/2199/181 1473/2196/181 -f 1475/2200/182 1482/2201/180 1474/2198/180 -f 1476/2202/183 1483/2203/182 1475/2200/182 -f 1477/2204/184 1484/2205/183 1476/2202/183 -f 1478/2192/185 1485/2206/184 1477/2204/184 -f 1374/2071/180 1390/2078/180 1389/2072/181 -f 1367/2074/182 1383/2207/182 1382/2075/180 -f 1375/2077/182 1391/2208/182 1390/2078/180 -f 1368/2079/183 1384/2086/183 1383/2080/182 -f 1376/2082/183 1392/2090/183 1391/2083/182 -f 1361/2085/184 1377/2088/184 1384/2086/183 -f 1362/2087/185 1378/2094/185 1377/2088/184 -f 1369/2089/184 1385/2092/184 1392/2090/183 -f 1370/2091/185 1386/2096/185 1385/2092/184 -f 1363/2093/186 1379/2098/186 1378/2094/185 -f 1371/2095/186 1387/2100/186 1386/2096/185 -f 1364/2097/187 1380/2102/187 1379/2098/186 -f 1372/2099/187 1388/2103/187 1387/2100/186 -f 1365/2101/181 1381/2104/181 1380/2102/187 -f 1373/2073/181 1389/2072/181 1388/2103/187 -f 1366/2076/180 1382/2075/180 1381/2104/181 -f 1398/2105/180 1406/2109/180 1405/2106/181 -f 1399/2108/182 1407/2209/182 1406/2109/180 -f 1400/2110/183 1408/2114/183 1407/2111/182 -f 1393/2113/184 1401/2116/184 1408/2114/183 -f 1394/2115/185 1402/2118/185 1401/2116/184 -f 1395/2117/186 1403/2120/186 1402/2118/185 -f 1396/2119/187 1404/2121/187 1403/2120/186 -f 1397/2107/181 1405/2106/181 1404/2121/187 -f 1415/2122/182 1423/2210/182 1422/2123/180 -f 1416/2125/183 1424/2129/183 1423/2126/182 -f 1409/2128/184 1417/2131/184 1424/2129/183 -f 1410/2130/185 1418/2133/185 1417/2131/184 -f 1411/2132/186 1419/2135/186 1418/2133/185 -f 1412/2134/187 1420/2137/187 1419/2135/186 -f 1413/2136/181 1421/2138/181 1420/2137/187 -f 1414/2124/180 1422/2123/180 1421/2138/181 -f 1438/2139/185 1454/2146/185 1453/2140/184 -f 1431/2142/186 1447/2211/186 1446/2143/185 -f 1439/2145/186 1455/2212/186 1454/2146/185 -f 1432/2147/187 1448/2154/187 1447/2148/186 -f 1440/2150/187 1456/2158/187 1455/2151/186 -f 1425/2153/181 1441/2156/181 1448/2154/187 -f 1426/2155/180 1442/2162/180 1441/2156/181 -f 1433/2157/181 1449/2160/181 1456/2158/187 -f 1434/2159/180 1450/2164/180 1449/2160/181 -f 1427/2161/182 1443/2166/182 1442/2162/180 -f 1435/2163/182 1451/2168/182 1450/2164/180 -f 1428/2165/183 1444/2170/183 1443/2166/182 -f 1436/2167/183 1452/2171/183 1451/2168/182 -f 1429/2169/184 1445/2172/184 1444/2170/183 -f 1437/2141/184 1453/2140/184 1452/2171/183 -f 1430/2144/185 1446/2143/185 1445/2172/184 -f 1462/2173/185 1470/2177/185 1469/2174/184 -f 1463/2176/186 1471/2213/186 1470/2177/185 -f 1464/2178/187 1472/2182/187 1471/2179/186 -f 1457/2181/181 1465/2184/181 1472/2182/187 -f 1458/2183/180 1466/2186/180 1465/2184/181 -f 1459/2185/182 1467/2188/182 1466/2186/180 -f 1460/2187/183 1468/2189/183 1467/2188/182 -f 1461/2175/184 1469/2174/184 1468/2189/183 -f 1479/2190/186 1487/2214/186 1486/2191/185 -f 1480/2193/187 1488/2197/187 1487/2194/186 -f 1473/2196/181 1481/2199/181 1488/2197/187 -f 1474/2198/180 1482/2201/180 1481/2199/181 -f 1475/2200/182 1483/2203/182 1482/2201/180 -f 1476/2202/183 1484/2205/183 1483/2203/182 -f 1477/2204/184 1485/2206/184 1484/2205/183 -f 1478/2192/185 1486/2191/185 1485/2206/184 +f 1534/2257/180 1549/2258/181 1533/2259/181 +f 1527/2260/182 1542/2261/180 1526/2262/180 +f 1535/2263/182 1550/2264/180 1534/2257/180 +f 1528/2265/183 1543/2266/182 1527/2267/182 +f 1536/2268/183 1551/2269/182 1535/2270/182 +f 1521/2271/184 1544/2272/183 1528/2265/183 +f 1522/2273/185 1537/2274/184 1521/2271/184 +f 1529/2275/184 1552/2276/183 1536/2268/183 +f 1530/2277/185 1545/2278/184 1529/2275/184 +f 1523/2279/186 1538/2280/185 1522/2273/185 +f 1531/2281/186 1546/2282/185 1530/2277/185 +f 1524/2283/187 1539/2284/186 1523/2279/186 +f 1532/2285/187 1547/2286/186 1531/2281/186 +f 1525/2287/181 1540/2288/187 1524/2283/187 +f 1533/2259/181 1548/2289/187 1532/2285/187 +f 1526/2262/180 1541/2290/181 1525/2287/181 +f 1558/2291/180 1565/2292/181 1557/2293/181 +f 1559/2294/182 1566/2295/180 1558/2291/180 +f 1560/2296/183 1567/2297/182 1559/2298/182 +f 1553/2299/184 1568/2300/183 1560/2296/183 +f 1554/2301/185 1561/2302/184 1553/2299/184 +f 1555/2303/186 1562/2304/185 1554/2301/185 +f 1556/2305/187 1563/2306/186 1555/2303/186 +f 1557/2293/181 1564/2307/187 1556/2305/187 +f 1575/2308/182 1582/2309/180 1574/2310/180 +f 1576/2311/183 1583/2312/182 1575/2313/182 +f 1569/2314/184 1584/2315/183 1576/2311/183 +f 1570/2316/185 1577/2317/184 1569/2314/184 +f 1571/2318/186 1578/2319/185 1570/2316/185 +f 1572/2320/187 1579/2321/186 1571/2318/186 +f 1573/2322/181 1580/2323/187 1572/2320/187 +f 1574/2310/180 1581/2324/181 1573/2322/181 +f 1598/2325/185 1613/2326/184 1597/2327/184 +f 1591/2328/186 1606/2329/185 1590/2330/185 +f 1599/2331/186 1614/2332/185 1598/2325/185 +f 1592/2333/187 1607/2334/186 1591/2335/186 +f 1600/2336/187 1615/2337/186 1599/2338/186 +f 1585/2339/181 1608/2340/187 1592/2333/187 +f 1586/2341/180 1601/2342/181 1585/2339/181 +f 1593/2343/181 1616/2344/187 1600/2336/187 +f 1594/2345/180 1609/2346/181 1593/2343/181 +f 1587/2347/182 1602/2348/180 1586/2341/180 +f 1595/2349/182 1610/2350/180 1594/2345/180 +f 1588/2351/183 1603/2352/182 1587/2347/182 +f 1596/2353/183 1611/2354/182 1595/2349/182 +f 1589/2355/184 1604/2356/183 1588/2351/183 +f 1597/2327/184 1612/2357/183 1596/2353/183 +f 1590/2330/185 1605/2358/184 1589/2355/184 +f 1622/2359/185 1629/2360/184 1621/2361/184 +f 1623/2362/186 1630/2363/185 1622/2359/185 +f 1624/2364/187 1631/2365/186 1623/2366/186 +f 1617/2367/181 1632/2368/187 1624/2364/187 +f 1618/2369/180 1625/2370/181 1617/2367/181 +f 1619/2371/182 1626/2372/180 1618/2369/180 +f 1620/2373/183 1627/2374/182 1619/2371/182 +f 1621/2361/184 1628/2375/183 1620/2373/183 +f 1639/2376/186 1646/2377/185 1638/2378/185 +f 1640/2379/187 1647/2380/186 1639/2381/186 +f 1633/2382/181 1648/2383/187 1640/2379/187 +f 1634/2384/180 1641/2385/181 1633/2382/181 +f 1635/2386/182 1642/2387/180 1634/2384/180 +f 1636/2388/183 1643/2389/182 1635/2386/182 +f 1637/2390/184 1644/2391/183 1636/2388/183 +f 1638/2378/185 1645/2392/184 1637/2390/184 +f 1662/2393/185 1655/2394/186 1654/2395/185 +f 1663/2396/186 1656/2397/187 1655/2398/186 +f 1664/2399/187 1649/2400/181 1656/2397/187 +f 1657/2401/181 1650/2402/180 1649/2400/181 +f 1658/2403/180 1651/2404/182 1650/2402/180 +f 1659/2405/182 1652/2406/183 1651/2404/182 +f 1660/2407/183 1653/2408/184 1652/2406/183 +f 1661/2409/184 1654/2395/185 1653/2408/184 +f 1678/2410/185 1671/2411/186 1670/2412/185 +f 1679/2413/186 1672/2414/187 1671/2415/186 +f 1680/2416/187 1665/2417/181 1672/2414/187 +f 1673/2418/181 1666/2419/180 1665/2417/181 +f 1674/2420/180 1667/2421/182 1666/2419/180 +f 1675/2422/182 1668/2423/183 1667/2421/182 +f 1676/2424/183 1669/2425/184 1668/2423/183 +f 1677/2426/184 1670/2412/185 1669/2425/184 +f 1694/2427/180 1687/2428/182 1686/2429/180 +f 1695/2430/182 1688/2431/183 1687/2432/182 +f 1696/2433/183 1681/2434/184 1688/2431/183 +f 1689/2435/184 1682/2436/185 1681/2434/184 +f 1690/2437/185 1683/2438/186 1682/2436/185 +f 1691/2439/186 1684/2440/187 1683/2438/186 +f 1692/2441/187 1685/2442/181 1684/2440/187 +f 1693/2443/181 1686/2429/180 1685/2442/181 +f 1710/2444/180 1703/2445/182 1702/2446/180 +f 1711/2447/182 1704/2448/183 1703/2449/182 +f 1712/2450/183 1697/2451/184 1704/2448/183 +f 1705/2452/184 1698/2453/185 1697/2451/184 +f 1706/2454/185 1699/2455/186 1698/2453/185 +f 1707/2456/186 1700/2457/187 1699/2455/186 +f 1708/2458/187 1701/2459/181 1700/2457/187 +f 1709/2460/181 1702/2446/180 1701/2459/181 +f 1534/2257/180 1550/2264/180 1549/2258/181 +f 1527/2260/182 1543/2461/182 1542/2261/180 +f 1535/2263/182 1551/2462/182 1550/2264/180 +f 1528/2265/183 1544/2272/183 1543/2266/182 +f 1536/2268/183 1552/2276/183 1551/2269/182 +f 1521/2271/184 1537/2274/184 1544/2272/183 +f 1522/2273/185 1538/2280/185 1537/2274/184 +f 1529/2275/184 1545/2278/184 1552/2276/183 +f 1530/2277/185 1546/2282/185 1545/2278/184 +f 1523/2279/186 1539/2284/186 1538/2280/185 +f 1531/2281/186 1547/2286/186 1546/2282/185 +f 1524/2283/187 1540/2288/187 1539/2284/186 +f 1532/2285/187 1548/2289/187 1547/2286/186 +f 1525/2287/181 1541/2290/181 1540/2288/187 +f 1533/2259/181 1549/2258/181 1548/2289/187 +f 1526/2262/180 1542/2261/180 1541/2290/181 +f 1558/2291/180 1566/2295/180 1565/2292/181 +f 1559/2294/182 1567/2463/182 1566/2295/180 +f 1560/2296/183 1568/2300/183 1567/2297/182 +f 1553/2299/184 1561/2302/184 1568/2300/183 +f 1554/2301/185 1562/2304/185 1561/2302/184 +f 1555/2303/186 1563/2306/186 1562/2304/185 +f 1556/2305/187 1564/2307/187 1563/2306/186 +f 1557/2293/181 1565/2292/181 1564/2307/187 +f 1575/2308/182 1583/2464/182 1582/2309/180 +f 1576/2311/183 1584/2315/183 1583/2312/182 +f 1569/2314/184 1577/2317/184 1584/2315/183 +f 1570/2316/185 1578/2319/185 1577/2317/184 +f 1571/2318/186 1579/2321/186 1578/2319/185 +f 1572/2320/187 1580/2323/187 1579/2321/186 +f 1573/2322/181 1581/2324/181 1580/2323/187 +f 1574/2310/180 1582/2309/180 1581/2324/181 +f 1598/2325/185 1614/2332/185 1613/2326/184 +f 1591/2328/186 1607/2465/186 1606/2329/185 +f 1599/2331/186 1615/2466/186 1614/2332/185 +f 1592/2333/187 1608/2340/187 1607/2334/186 +f 1600/2336/187 1616/2344/187 1615/2337/186 +f 1585/2339/181 1601/2342/181 1608/2340/187 +f 1586/2341/180 1602/2348/180 1601/2342/181 +f 1593/2343/181 1609/2346/181 1616/2344/187 +f 1594/2345/180 1610/2350/180 1609/2346/181 +f 1587/2347/182 1603/2352/182 1602/2348/180 +f 1595/2349/182 1611/2354/182 1610/2350/180 +f 1588/2351/183 1604/2356/183 1603/2352/182 +f 1596/2353/183 1612/2357/183 1611/2354/182 +f 1589/2355/184 1605/2358/184 1604/2356/183 +f 1597/2327/184 1613/2326/184 1612/2357/183 +f 1590/2330/185 1606/2329/185 1605/2358/184 +f 1622/2359/185 1630/2363/185 1629/2360/184 +f 1623/2362/186 1631/2467/186 1630/2363/185 +f 1624/2364/187 1632/2368/187 1631/2365/186 +f 1617/2367/181 1625/2370/181 1632/2368/187 +f 1618/2369/180 1626/2372/180 1625/2370/181 +f 1619/2371/182 1627/2374/182 1626/2372/180 +f 1620/2373/183 1628/2375/183 1627/2374/182 +f 1621/2361/184 1629/2360/184 1628/2375/183 +f 1639/2376/186 1647/2468/186 1646/2377/185 +f 1640/2379/187 1648/2383/187 1647/2380/186 +f 1633/2382/181 1641/2385/181 1648/2383/187 +f 1634/2384/180 1642/2387/180 1641/2385/181 +f 1635/2386/182 1643/2389/182 1642/2387/180 +f 1636/2388/183 1644/2391/183 1643/2389/182 +f 1637/2390/184 1645/2392/184 1644/2391/183 +f 1638/2378/185 1646/2377/185 1645/2392/184 +f 1662/2393/185 1663/2469/186 1655/2394/186 +f 1663/2396/186 1664/2399/187 1656/2397/187 +f 1664/2399/187 1657/2401/181 1649/2400/181 +f 1657/2401/181 1658/2403/180 1650/2402/180 +f 1658/2403/180 1659/2405/182 1651/2404/182 +f 1659/2405/182 1660/2407/183 1652/2406/183 +f 1660/2407/183 1661/2409/184 1653/2408/184 +f 1661/2409/184 1662/2393/185 1654/2395/185 +f 1678/2410/185 1679/2470/186 1671/2411/186 +f 1679/2413/186 1680/2416/187 1672/2414/187 +f 1680/2416/187 1673/2418/181 1665/2417/181 +f 1673/2418/181 1674/2420/180 1666/2419/180 +f 1674/2420/180 1675/2422/182 1667/2421/182 +f 1675/2422/182 1676/2424/183 1668/2423/183 +f 1676/2424/183 1677/2426/184 1669/2425/184 +f 1677/2426/184 1678/2410/185 1670/2412/185 +f 1694/2427/180 1695/2471/182 1687/2428/182 +f 1695/2430/182 1696/2433/183 1688/2431/183 +f 1696/2433/183 1689/2435/184 1681/2434/184 +f 1689/2435/184 1690/2437/185 1682/2436/185 +f 1690/2437/185 1691/2439/186 1683/2438/186 +f 1691/2439/186 1692/2441/187 1684/2440/187 +f 1692/2441/187 1693/2443/181 1685/2442/181 +f 1693/2443/181 1694/2427/180 1686/2429/180 +f 1710/2444/180 1711/2472/182 1703/2445/182 +f 1711/2447/182 1712/2450/183 1704/2448/183 +f 1712/2450/183 1705/2452/184 1697/2451/184 +f 1705/2452/184 1706/2454/185 1698/2453/185 +f 1706/2454/185 1707/2456/186 1699/2455/186 +f 1707/2456/186 1708/2458/187 1700/2457/187 +f 1708/2458/187 1709/2460/181 1701/2459/181 +f 1709/2460/181 1710/2444/180 1702/2446/180 o SuspensionBottom v -3.187505 1.562501 6.437500 v -3.320088 1.562501 6.382583 @@ -6183,6 +6889,70 @@ v 3.187506 0.875000 6.437500 v 3.054923 0.875000 6.382583 v 3.000006 0.875000 6.250000 v 3.054923 0.875000 6.117417 +v -3.187505 1.562501 6.437500 +v -3.320088 1.562501 6.382583 +v -3.375005 1.562501 6.250000 +v -3.320088 1.562501 6.117417 +v -3.187505 1.562501 6.062500 +v -3.054923 1.562501 6.117417 +v -3.000005 1.562501 6.250000 +v -3.054923 1.562501 6.382583 +v -3.187506 0.875001 6.437500 +v -3.320087 0.875001 6.382583 +v -3.375006 0.875001 6.250000 +v -3.320087 0.875001 6.117417 +v -3.187506 0.875001 6.062500 +v -3.054923 0.875001 6.117417 +v -3.000006 0.875001 6.250000 +v -3.054923 0.875001 6.382583 +v -3.187505 1.562501 7.937500 +v -3.320088 1.562501 7.882583 +v -3.375005 1.562501 7.750000 +v -3.320088 1.562501 7.617417 +v -3.187505 1.562501 7.562500 +v -3.054923 1.562501 7.617417 +v -3.000005 1.562501 7.750000 +v -3.054923 1.562501 7.882583 +v -3.187506 0.875001 7.937500 +v -3.320087 0.875001 7.882583 +v -3.375006 0.875001 7.750000 +v -3.320087 0.875001 7.617417 +v -3.187506 0.875001 7.562500 +v -3.054923 0.875001 7.617417 +v -3.000006 0.875001 7.750000 +v -3.054923 0.875001 7.882583 +v 3.187506 1.562501 7.562500 +v 3.320088 1.562501 7.617417 +v 3.375006 1.562501 7.750000 +v 3.320088 1.562501 7.882583 +v 3.187506 1.562501 7.937500 +v 3.054923 1.562501 7.882583 +v 3.000006 1.562501 7.750000 +v 3.054923 1.562501 7.617417 +v 3.187506 0.875000 7.562500 +v 3.320088 0.875000 7.617417 +v 3.375006 0.875000 7.750000 +v 3.320088 0.875000 7.882583 +v 3.187506 0.875000 7.937500 +v 3.054923 0.875000 7.882583 +v 3.000006 0.875000 7.750000 +v 3.054923 0.875000 7.617417 +v 3.187506 1.562501 6.062500 +v 3.320088 1.562501 6.117417 +v 3.375006 1.562501 6.250000 +v 3.320088 1.562501 6.382583 +v 3.187506 1.562501 6.437500 +v 3.054923 1.562501 6.382583 +v 3.000006 1.562501 6.250000 +v 3.054923 1.562501 6.117417 +v 3.187506 0.875000 6.062500 +v 3.320088 0.875000 6.117417 +v 3.375006 0.875000 6.250000 +v 3.320088 0.875000 6.382583 +v 3.187506 0.875000 6.437500 +v 3.054923 0.875000 6.382583 +v 3.000006 0.875000 6.250000 +v 3.054923 0.875000 6.117417 vt 0.837349 0.641860 vt 0.846816 0.637209 vt 0.846816 0.641860 @@ -6319,6 +7089,72 @@ vt 0.833907 0.651163 vt 0.822719 0.641860 vt 0.833046 0.646512 vt 0.832186 0.641860 +vt 0.821859 0.637209 +vt 0.830465 0.632558 +vt 0.820998 0.632558 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833046 0.646512 +vt 0.823580 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 vt 0.820998 0.632558 vt 0.846816 0.632558 vt 0.846816 0.632558 @@ -6327,6 +7163,12 @@ vt 0.830465 0.632558 vt 0.846816 0.632558 vt 0.846816 0.632558 vt 0.830465 0.632558 +vt 0.831325 0.637209 +vt 0.833907 0.651163 +vt 0.830465 0.632558 +vt 0.832186 0.641860 +vt 0.830465 0.632558 +vt 0.830465 0.632558 vn -0.0000 -0.0000 -1.0000 vn 0.7071 -0.0000 -0.7071 vn 1.0000 -0.0000 -0.0000 @@ -6336,134 +7178,198 @@ vn -0.7071 0.0000 0.7071 vn -1.0000 0.0000 -0.0000 vn -0.7071 0.0000 -0.7071 s 1 -f 1501/2215/188 1518/2216/189 1517/2217/188 -f 1494/2218/189 1511/2219/190 1510/2220/189 -f 1503/2221/190 1518/2216/189 1502/2222/189 -f 1496/2223/191 1511/2224/190 1495/2225/190 -f 1504/2226/191 1519/2227/190 1503/2228/190 -f 1489/2229/192 1512/2230/191 1496/2223/191 -f 1490/2231/193 1505/2232/192 1489/2229/192 -f 1497/2233/192 1520/2234/191 1504/2226/191 -f 1498/2235/193 1513/2236/192 1497/2233/192 -f 1491/2237/194 1506/2238/193 1490/2231/193 -f 1499/2239/194 1514/2240/193 1498/2235/193 -f 1491/2237/194 1508/2241/195 1507/2242/194 -f 1500/2243/195 1515/2244/194 1499/2239/194 -f 1493/2245/188 1508/2241/195 1492/2246/195 -f 1501/2215/188 1516/2247/195 1500/2243/195 -f 1494/2218/189 1509/2248/188 1493/2245/188 -f 1525/2249/188 1534/2250/189 1533/2251/188 -f 1527/2252/190 1534/2250/189 1526/2253/189 -f 1528/2254/191 1535/2255/190 1527/2256/190 -f 1521/2257/192 1536/2258/191 1528/2254/191 -f 1522/2259/193 1529/2260/192 1521/2257/192 -f 1523/2261/194 1530/2262/193 1522/2259/193 -f 1524/2263/195 1531/2264/194 1523/2261/194 -f 1525/2249/188 1532/2265/195 1524/2263/195 -f 1543/2266/190 1550/2267/189 1542/2268/189 -f 1544/2269/191 1551/2270/190 1543/2271/190 -f 1537/2272/192 1552/2273/191 1544/2269/191 -f 1538/2274/193 1545/2275/192 1537/2272/192 -f 1539/2276/194 1546/2277/193 1538/2274/193 -f 1540/2278/195 1547/2279/194 1539/2276/194 -f 1541/2280/188 1548/2281/195 1540/2278/195 -f 1542/2268/189 1549/2282/188 1541/2280/188 -f 1566/2283/193 1581/2284/192 1565/2285/192 -f 1559/2286/194 1574/2287/193 1558/2288/193 -f 1567/2289/194 1582/2290/193 1566/2283/193 -f 1560/2291/195 1575/2292/194 1559/2293/194 -f 1568/2294/195 1583/2295/194 1567/2296/194 -f 1553/2297/188 1576/2298/195 1560/2291/195 -f 1554/2299/189 1569/2300/188 1553/2297/188 -f 1561/2301/188 1584/2302/195 1568/2294/195 -f 1562/2303/189 1577/2304/188 1561/2301/188 -f 1555/2305/190 1570/2306/189 1554/2299/189 -f 1563/2307/190 1578/2308/189 1562/2303/189 -f 1556/2309/191 1571/2310/190 1555/2305/190 -f 1564/2311/191 1579/2312/190 1563/2307/190 -f 1557/2313/192 1572/2314/191 1556/2309/191 -f 1565/2285/192 1580/2315/191 1564/2311/191 -f 1558/2288/193 1573/2316/192 1557/2313/192 -f 1590/2317/193 1597/2318/192 1589/2319/192 -f 1591/2320/194 1598/2321/193 1590/2317/193 -f 1592/2322/195 1599/2323/194 1591/2324/194 -f 1585/2325/188 1600/2326/195 1592/2322/195 -f 1586/2327/189 1593/2328/188 1585/2325/188 -f 1587/2329/190 1594/2330/189 1586/2327/189 -f 1588/2331/191 1595/2332/190 1587/2329/190 -f 1589/2319/192 1596/2333/191 1588/2331/191 -f 1607/2334/194 1614/2335/193 1606/2336/193 -f 1608/2337/195 1615/2338/194 1607/2339/194 -f 1601/2340/188 1616/2341/195 1608/2337/195 -f 1602/2342/189 1609/2343/188 1601/2340/188 -f 1603/2344/190 1610/2345/189 1602/2342/189 -f 1604/2346/191 1611/2347/190 1603/2344/190 -f 1605/2348/192 1612/2349/191 1604/2346/191 -f 1606/2336/193 1613/2350/192 1605/2348/192 -f 1501/2215/188 1502/2222/189 1518/2216/189 -f 1494/2218/189 1495/2351/190 1511/2219/190 -f 1503/2221/190 1519/2352/190 1518/2216/189 -f 1496/2223/191 1512/2230/191 1511/2224/190 -f 1504/2226/191 1520/2234/191 1519/2227/190 -f 1489/2229/192 1505/2232/192 1512/2230/191 -f 1490/2231/193 1506/2238/193 1505/2232/192 -f 1497/2233/192 1513/2236/192 1520/2234/191 -f 1498/2235/193 1514/2240/193 1513/2236/192 -f 1491/2237/194 1507/2242/194 1506/2238/193 -f 1499/2239/194 1515/2244/194 1514/2240/193 -f 1491/2237/194 1492/2246/195 1508/2241/195 -f 1500/2243/195 1516/2247/195 1515/2244/194 -f 1493/2245/188 1509/2248/188 1508/2241/195 -f 1501/2215/188 1517/2217/188 1516/2247/195 -f 1494/2218/189 1510/2220/189 1509/2248/188 -f 1525/2249/188 1526/2253/189 1534/2250/189 -f 1527/2252/190 1535/2353/190 1534/2250/189 -f 1528/2254/191 1536/2258/191 1535/2255/190 -f 1521/2257/192 1529/2260/192 1536/2258/191 -f 1522/2259/193 1530/2262/193 1529/2260/192 -f 1523/2261/194 1531/2264/194 1530/2262/193 -f 1524/2263/195 1532/2265/195 1531/2264/194 -f 1525/2249/188 1533/2251/188 1532/2265/195 -f 1543/2266/190 1551/2354/190 1550/2267/189 -f 1544/2269/191 1552/2273/191 1551/2270/190 -f 1537/2272/192 1545/2275/192 1552/2273/191 -f 1538/2274/193 1546/2277/193 1545/2275/192 -f 1539/2276/194 1547/2279/194 1546/2277/193 -f 1540/2278/195 1548/2281/195 1547/2279/194 -f 1541/2280/188 1549/2282/188 1548/2281/195 -f 1542/2268/189 1550/2267/189 1549/2282/188 -f 1566/2283/193 1582/2290/193 1581/2284/192 -f 1559/2286/194 1575/2355/194 1574/2287/193 -f 1567/2289/194 1583/2356/194 1582/2290/193 -f 1560/2291/195 1576/2298/195 1575/2292/194 -f 1568/2294/195 1584/2302/195 1583/2295/194 -f 1553/2297/188 1569/2300/188 1576/2298/195 -f 1554/2299/189 1570/2306/189 1569/2300/188 -f 1561/2301/188 1577/2304/188 1584/2302/195 -f 1562/2303/189 1578/2308/189 1577/2304/188 -f 1555/2305/190 1571/2310/190 1570/2306/189 -f 1563/2307/190 1579/2312/190 1578/2308/189 -f 1556/2309/191 1572/2314/191 1571/2310/190 -f 1564/2311/191 1580/2315/191 1579/2312/190 -f 1557/2313/192 1573/2316/192 1572/2314/191 -f 1565/2285/192 1581/2284/192 1580/2315/191 -f 1558/2288/193 1574/2287/193 1573/2316/192 -f 1590/2317/193 1598/2321/193 1597/2318/192 -f 1591/2320/194 1599/2357/194 1598/2321/193 -f 1592/2322/195 1600/2326/195 1599/2323/194 -f 1585/2325/188 1593/2328/188 1600/2326/195 -f 1586/2327/189 1594/2330/189 1593/2328/188 -f 1587/2329/190 1595/2332/190 1594/2330/189 -f 1588/2331/191 1596/2333/191 1595/2332/190 -f 1589/2319/192 1597/2318/192 1596/2333/191 -f 1607/2334/194 1615/2358/194 1614/2335/193 -f 1608/2337/195 1616/2341/195 1615/2338/194 -f 1601/2340/188 1609/2343/188 1616/2341/195 -f 1602/2342/189 1610/2345/189 1609/2343/188 -f 1603/2344/190 1611/2347/190 1610/2345/189 -f 1604/2346/191 1612/2349/191 1611/2347/190 -f 1605/2348/192 1613/2350/192 1612/2349/191 -f 1606/2336/193 1614/2335/193 1613/2350/192 +f 1725/2473/188 1742/2474/189 1741/2475/188 +f 1718/2476/189 1735/2477/190 1734/2478/189 +f 1727/2479/190 1742/2474/189 1726/2480/189 +f 1720/2481/191 1735/2482/190 1719/2483/190 +f 1728/2484/191 1743/2485/190 1727/2486/190 +f 1713/2487/192 1736/2488/191 1720/2481/191 +f 1714/2489/193 1729/2490/192 1713/2487/192 +f 1721/2491/192 1744/2492/191 1728/2484/191 +f 1722/2493/193 1737/2494/192 1721/2491/192 +f 1715/2495/194 1730/2496/193 1714/2489/193 +f 1723/2497/194 1738/2498/193 1722/2493/193 +f 1715/2495/194 1732/2499/195 1731/2500/194 +f 1724/2501/195 1739/2502/194 1723/2497/194 +f 1717/2503/188 1732/2499/195 1716/2504/195 +f 1725/2473/188 1740/2505/195 1724/2501/195 +f 1718/2476/189 1733/2506/188 1717/2503/188 +f 1749/2507/188 1758/2508/189 1757/2509/188 +f 1751/2510/190 1758/2508/189 1750/2511/189 +f 1752/2512/191 1759/2513/190 1751/2514/190 +f 1745/2515/192 1760/2516/191 1752/2512/191 +f 1746/2517/193 1753/2518/192 1745/2515/192 +f 1747/2519/194 1754/2520/193 1746/2517/193 +f 1748/2521/195 1755/2522/194 1747/2519/194 +f 1749/2507/188 1756/2523/195 1748/2521/195 +f 1767/2524/190 1774/2525/189 1766/2526/189 +f 1768/2527/191 1775/2528/190 1767/2529/190 +f 1761/2530/192 1776/2531/191 1768/2527/191 +f 1762/2532/193 1769/2533/192 1761/2530/192 +f 1763/2534/194 1770/2535/193 1762/2532/193 +f 1764/2536/195 1771/2537/194 1763/2534/194 +f 1765/2538/188 1772/2539/195 1764/2536/195 +f 1766/2526/189 1773/2540/188 1765/2538/188 +f 1790/2541/193 1805/2542/192 1789/2543/192 +f 1783/2544/194 1798/2545/193 1782/2546/193 +f 1791/2547/194 1806/2548/193 1790/2541/193 +f 1784/2549/195 1799/2550/194 1783/2551/194 +f 1792/2552/195 1807/2553/194 1791/2554/194 +f 1777/2555/188 1800/2556/195 1784/2549/195 +f 1778/2557/189 1793/2558/188 1777/2555/188 +f 1785/2559/188 1808/2560/195 1792/2552/195 +f 1786/2561/189 1801/2562/188 1785/2559/188 +f 1779/2563/190 1794/2564/189 1778/2557/189 +f 1787/2565/190 1802/2566/189 1786/2561/189 +f 1780/2567/191 1795/2568/190 1779/2563/190 +f 1788/2569/191 1803/2570/190 1787/2565/190 +f 1781/2571/192 1796/2572/191 1780/2567/191 +f 1789/2543/192 1804/2573/191 1788/2569/191 +f 1782/2546/193 1797/2574/192 1781/2571/192 +f 1814/2575/193 1821/2576/192 1813/2577/192 +f 1815/2578/194 1822/2579/193 1814/2575/193 +f 1816/2580/195 1823/2581/194 1815/2582/194 +f 1809/2583/188 1824/2584/195 1816/2580/195 +f 1810/2585/189 1817/2586/188 1809/2583/188 +f 1811/2587/190 1818/2588/189 1810/2585/189 +f 1812/2589/191 1819/2590/190 1811/2587/190 +f 1813/2577/192 1820/2591/191 1812/2589/191 +f 1831/2592/194 1838/2593/193 1830/2594/193 +f 1832/2595/195 1839/2596/194 1831/2597/194 +f 1825/2598/188 1840/2599/195 1832/2595/195 +f 1826/2600/189 1833/2601/188 1825/2598/188 +f 1827/2602/190 1834/2603/189 1826/2600/189 +f 1828/2604/191 1835/2605/190 1827/2602/190 +f 1829/2606/192 1836/2607/191 1828/2604/191 +f 1830/2594/193 1837/2608/192 1829/2606/192 +f 1846/2609/193 1855/2610/194 1847/2611/194 +f 1855/2612/194 1848/2613/195 1847/2614/194 +f 1856/2615/195 1841/2616/188 1848/2613/195 +f 1849/2617/188 1842/2618/189 1841/2616/188 +f 1850/2619/189 1843/2620/190 1842/2618/189 +f 1843/2620/190 1852/2621/191 1844/2622/191 +f 1852/2621/191 1845/2623/192 1844/2622/191 +f 1853/2624/192 1846/2609/193 1845/2623/192 +f 1870/2625/193 1863/2626/194 1862/2627/193 +f 1871/2628/194 1864/2629/195 1863/2630/194 +f 1872/2631/195 1857/2632/188 1864/2629/195 +f 1865/2633/188 1858/2634/189 1857/2632/188 +f 1866/2635/189 1859/2636/190 1858/2634/189 +f 1867/2637/190 1860/2638/191 1859/2636/190 +f 1868/2639/191 1861/2640/192 1860/2638/191 +f 1861/2640/192 1870/2625/193 1862/2627/193 +f 1886/2641/189 1879/2642/190 1878/2643/189 +f 1887/2644/190 1880/2645/191 1879/2646/190 +f 1888/2647/191 1873/2648/192 1880/2645/191 +f 1881/2649/192 1874/2650/193 1873/2648/192 +f 1882/2651/193 1875/2652/194 1874/2650/193 +f 1883/2653/194 1876/2654/195 1875/2652/194 +f 1884/2655/195 1877/2656/188 1876/2654/195 +f 1885/2657/188 1878/2643/189 1877/2656/188 +f 1902/2658/189 1895/2659/190 1894/2660/189 +f 1903/2661/190 1896/2662/191 1895/2663/190 +f 1904/2664/191 1889/2665/192 1896/2662/191 +f 1897/2666/192 1890/2667/193 1889/2665/192 +f 1898/2668/193 1891/2669/194 1890/2667/193 +f 1899/2670/194 1892/2671/195 1891/2669/194 +f 1900/2672/195 1893/2673/188 1892/2671/195 +f 1901/2674/188 1894/2660/189 1893/2673/188 +f 1725/2473/188 1726/2480/189 1742/2474/189 +f 1718/2476/189 1719/2675/190 1735/2477/190 +f 1727/2479/190 1743/2676/190 1742/2474/189 +f 1720/2481/191 1736/2488/191 1735/2482/190 +f 1728/2484/191 1744/2492/191 1743/2485/190 +f 1713/2487/192 1729/2490/192 1736/2488/191 +f 1714/2489/193 1730/2496/193 1729/2490/192 +f 1721/2491/192 1737/2494/192 1744/2492/191 +f 1722/2493/193 1738/2498/193 1737/2494/192 +f 1715/2495/194 1731/2500/194 1730/2496/193 +f 1723/2497/194 1739/2502/194 1738/2498/193 +f 1715/2495/194 1716/2504/195 1732/2499/195 +f 1724/2501/195 1740/2505/195 1739/2502/194 +f 1717/2503/188 1733/2506/188 1732/2499/195 +f 1725/2473/188 1741/2475/188 1740/2505/195 +f 1718/2476/189 1734/2478/189 1733/2506/188 +f 1749/2507/188 1750/2511/189 1758/2508/189 +f 1751/2510/190 1759/2677/190 1758/2508/189 +f 1752/2512/191 1760/2516/191 1759/2513/190 +f 1745/2515/192 1753/2518/192 1760/2516/191 +f 1746/2517/193 1754/2520/193 1753/2518/192 +f 1747/2519/194 1755/2522/194 1754/2520/193 +f 1748/2521/195 1756/2523/195 1755/2522/194 +f 1749/2507/188 1757/2509/188 1756/2523/195 +f 1767/2524/190 1775/2678/190 1774/2525/189 +f 1768/2527/191 1776/2531/191 1775/2528/190 +f 1761/2530/192 1769/2533/192 1776/2531/191 +f 1762/2532/193 1770/2535/193 1769/2533/192 +f 1763/2534/194 1771/2537/194 1770/2535/193 +f 1764/2536/195 1772/2539/195 1771/2537/194 +f 1765/2538/188 1773/2540/188 1772/2539/195 +f 1766/2526/189 1774/2525/189 1773/2540/188 +f 1790/2541/193 1806/2548/193 1805/2542/192 +f 1783/2544/194 1799/2679/194 1798/2545/193 +f 1791/2547/194 1807/2680/194 1806/2548/193 +f 1784/2549/195 1800/2556/195 1799/2550/194 +f 1792/2552/195 1808/2560/195 1807/2553/194 +f 1777/2555/188 1793/2558/188 1800/2556/195 +f 1778/2557/189 1794/2564/189 1793/2558/188 +f 1785/2559/188 1801/2562/188 1808/2560/195 +f 1786/2561/189 1802/2566/189 1801/2562/188 +f 1779/2563/190 1795/2568/190 1794/2564/189 +f 1787/2565/190 1803/2570/190 1802/2566/189 +f 1780/2567/191 1796/2572/191 1795/2568/190 +f 1788/2569/191 1804/2573/191 1803/2570/190 +f 1781/2571/192 1797/2574/192 1796/2572/191 +f 1789/2543/192 1805/2542/192 1804/2573/191 +f 1782/2546/193 1798/2545/193 1797/2574/192 +f 1814/2575/193 1822/2579/193 1821/2576/192 +f 1815/2578/194 1823/2681/194 1822/2579/193 +f 1816/2580/195 1824/2584/195 1823/2581/194 +f 1809/2583/188 1817/2586/188 1824/2584/195 +f 1810/2585/189 1818/2588/189 1817/2586/188 +f 1811/2587/190 1819/2590/190 1818/2588/189 +f 1812/2589/191 1820/2591/191 1819/2590/190 +f 1813/2577/192 1821/2576/192 1820/2591/191 +f 1831/2592/194 1839/2682/194 1838/2593/193 +f 1832/2595/195 1840/2599/195 1839/2596/194 +f 1825/2598/188 1833/2601/188 1840/2599/195 +f 1826/2600/189 1834/2603/189 1833/2601/188 +f 1827/2602/190 1835/2605/190 1834/2603/189 +f 1828/2604/191 1836/2607/191 1835/2605/190 +f 1829/2606/192 1837/2608/192 1836/2607/191 +f 1830/2594/193 1838/2593/193 1837/2608/192 +f 1846/2609/193 1854/2683/193 1855/2610/194 +f 1855/2612/194 1856/2615/195 1848/2613/195 +f 1856/2615/195 1849/2617/188 1841/2616/188 +f 1849/2617/188 1850/2619/189 1842/2618/189 +f 1850/2619/189 1851/2684/190 1843/2620/190 +f 1843/2620/190 1851/2684/190 1852/2621/191 +f 1852/2621/191 1853/2624/192 1845/2623/192 +f 1853/2624/192 1854/2683/193 1846/2609/193 +f 1870/2625/193 1871/2685/194 1863/2626/194 +f 1871/2628/194 1872/2631/195 1864/2629/195 +f 1872/2631/195 1865/2633/188 1857/2632/188 +f 1865/2633/188 1866/2635/189 1858/2634/189 +f 1866/2635/189 1867/2637/190 1859/2636/190 +f 1867/2637/190 1868/2639/191 1860/2638/191 +f 1868/2639/191 1869/2686/192 1861/2640/192 +f 1861/2640/192 1869/2686/192 1870/2625/193 +f 1886/2641/189 1887/2687/190 1879/2642/190 +f 1887/2644/190 1888/2647/191 1880/2645/191 +f 1888/2647/191 1881/2649/192 1873/2648/192 +f 1881/2649/192 1882/2651/193 1874/2650/193 +f 1882/2651/193 1883/2653/194 1875/2652/194 +f 1883/2653/194 1884/2655/195 1876/2654/195 +f 1884/2655/195 1885/2657/188 1877/2656/188 +f 1885/2657/188 1886/2641/189 1878/2643/189 +f 1902/2658/189 1903/2688/190 1895/2659/190 +f 1903/2661/190 1904/2664/191 1896/2662/191 +f 1904/2664/191 1897/2666/192 1889/2665/192 +f 1897/2666/192 1898/2668/193 1890/2667/193 +f 1898/2668/193 1899/2670/194 1891/2669/194 +f 1899/2670/194 1900/2672/195 1892/2671/195 +f 1900/2672/195 1901/2674/188 1893/2673/188 +f 1901/2674/188 1902/2658/189 1894/2660/189 o SuspensionTop v -3.187505 5.437495 7.562500 v -3.320088 5.437495 7.617417 @@ -6593,6 +7499,70 @@ v 3.187507 6.124994 7.562500 v 3.054924 6.124994 7.617417 v 3.000007 6.124994 7.750000 v 3.054924 6.124994 7.882583 +v -3.187505 5.437495 7.562500 +v -3.320088 5.437495 7.617417 +v -3.375005 5.437495 7.750000 +v -3.320088 5.437495 7.882583 +v -3.187505 5.437495 7.937500 +v -3.054923 5.437495 7.882583 +v -3.000005 5.437495 7.750000 +v -3.054923 5.437495 7.617417 +v -3.187505 6.124996 7.562500 +v -3.320088 6.124996 7.617417 +v -3.375005 6.124996 7.750000 +v -3.320088 6.124996 7.882583 +v -3.187505 6.124996 7.937500 +v -3.054923 6.124996 7.882583 +v -3.000005 6.124996 7.750000 +v -3.054923 6.124996 7.617417 +v -3.187505 5.437495 6.062500 +v -3.320088 5.437495 6.117417 +v -3.375005 5.437495 6.250000 +v -3.320088 5.437495 6.382583 +v -3.187505 5.437495 6.437500 +v -3.054923 5.437495 6.382583 +v -3.000005 5.437495 6.250000 +v -3.054923 5.437495 6.117417 +v -3.187505 6.124996 6.062500 +v -3.320088 6.124996 6.117417 +v -3.375005 6.124996 6.250000 +v -3.320088 6.124996 6.382583 +v -3.187505 6.124996 6.437500 +v -3.054923 6.124996 6.382583 +v -3.000005 6.124996 6.250000 +v -3.054923 6.124996 6.117417 +v 3.187506 5.437495 6.437500 +v 3.320088 5.437495 6.382583 +v 3.375006 5.437495 6.250000 +v 3.320088 5.437495 6.117417 +v 3.187506 5.437495 6.062500 +v 3.054923 5.437495 6.117417 +v 3.000006 5.437495 6.250000 +v 3.054923 5.437495 6.382583 +v 3.187507 6.124994 6.437500 +v 3.320088 6.124994 6.382583 +v 3.375007 6.124994 6.250000 +v 3.320088 6.124994 6.117417 +v 3.187507 6.124994 6.062500 +v 3.054924 6.124994 6.117417 +v 3.000007 6.124994 6.250000 +v 3.054924 6.124994 6.382583 +v 3.187506 5.437495 7.937500 +v 3.320088 5.437495 7.882583 +v 3.375006 5.437495 7.750000 +v 3.320088 5.437495 7.617417 +v 3.187506 5.437495 7.562500 +v 3.054923 5.437495 7.617417 +v 3.000006 5.437495 7.750000 +v 3.054923 5.437495 7.882583 +v 3.187507 6.124994 7.937500 +v 3.320088 6.124994 7.882583 +v 3.375007 6.124994 7.750000 +v 3.320088 6.124994 7.617417 +v 3.187507 6.124994 7.562500 +v 3.054924 6.124994 7.617417 +v 3.000007 6.124994 7.750000 +v 3.054924 6.124994 7.882583 vt 0.837349 0.637209 vt 0.846816 0.641860 vt 0.837349 0.641860 @@ -6729,6 +7699,73 @@ vt 0.833907 0.651163 vt 0.822719 0.641860 vt 0.823580 0.646512 vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.831325 0.637209 +vt 0.820998 0.632558 +vt 0.821859 0.637209 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833907 0.651163 +vt 0.823580 0.646512 +vt 0.833046 0.646512 +vt 0.822719 0.641860 +vt 0.832186 0.641860 +vt 0.821859 0.637209 +vt 0.830465 0.632558 +vt 0.820998 0.632558 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833046 0.646512 +vt 0.823580 0.646512 +vt 0.832186 0.641860 +vt 0.822719 0.641860 +vt 0.831325 0.637209 +vt 0.821859 0.637209 +vt 0.830465 0.632558 +vt 0.820998 0.632558 +vt 0.837349 0.669767 +vt 0.827022 0.665116 +vt 0.827883 0.669767 +vt 0.836489 0.665116 +vt 0.826162 0.660465 +vt 0.835628 0.660465 +vt 0.825301 0.655814 +vt 0.834768 0.655814 +vt 0.824441 0.651163 +vt 0.833046 0.646512 +vt 0.823580 0.646512 +vt 0.822719 0.641860 +vt 0.831325 0.637209 vt 0.830465 0.632558 vt 0.846816 0.632558 vt 0.846816 0.632558 @@ -6737,6 +7774,11 @@ vt 0.820998 0.632558 vt 0.837349 0.632558 vt 0.837349 0.632558 vt 0.820998 0.632558 +vt 0.830465 0.632558 +vt 0.830465 0.632558 +vt 0.833907 0.651163 +vt 0.833907 0.651163 +vt 0.832186 0.641860 vn 0.7071 0.0000 0.7071 vn -0.0000 0.0000 1.0000 vn 1.0000 0.0000 0.0000 @@ -6746,134 +7788,198 @@ vn -0.7071 0.0000 -0.7071 vn -1.0000 0.0000 0.0000 vn -0.7071 0.0000 0.7071 s 1 -f 1630/2359/196 1645/2360/197 1629/2361/197 -f 1623/2362/198 1638/2363/196 1622/2364/196 -f 1631/2365/198 1646/2366/196 1630/2359/196 -f 1624/2367/199 1639/2368/198 1623/2369/198 -f 1632/2370/199 1647/2371/198 1631/2372/198 -f 1617/2373/200 1640/2374/199 1624/2367/199 -f 1618/2375/201 1633/2376/200 1617/2373/200 -f 1625/2377/200 1648/2378/199 1632/2370/199 -f 1626/2379/201 1641/2380/200 1625/2377/200 -f 1619/2381/202 1634/2382/201 1618/2375/201 -f 1627/2383/202 1642/2384/201 1626/2379/201 -f 1620/2385/203 1635/2386/202 1619/2381/202 -f 1628/2387/203 1643/2388/202 1627/2383/202 -f 1621/2389/197 1636/2390/203 1620/2385/203 -f 1629/2361/197 1644/2391/203 1628/2387/203 -f 1622/2364/196 1637/2392/197 1621/2389/197 -f 1654/2393/196 1661/2394/197 1653/2395/197 -f 1655/2396/198 1662/2397/196 1654/2393/196 -f 1656/2398/199 1663/2399/198 1655/2400/198 -f 1649/2401/200 1664/2402/199 1656/2398/199 -f 1650/2403/201 1657/2404/200 1649/2401/200 -f 1651/2405/202 1658/2406/201 1650/2403/201 -f 1652/2407/203 1659/2408/202 1651/2405/202 -f 1653/2395/197 1660/2409/203 1652/2407/203 -f 1671/2410/198 1678/2411/196 1670/2412/196 -f 1672/2413/199 1679/2414/198 1671/2415/198 -f 1665/2416/200 1680/2417/199 1672/2413/199 -f 1666/2418/201 1673/2419/200 1665/2416/200 -f 1667/2420/202 1674/2421/201 1666/2418/201 -f 1668/2422/203 1675/2423/202 1667/2420/202 -f 1669/2424/197 1676/2425/203 1668/2422/203 -f 1670/2412/196 1677/2426/197 1669/2424/197 -f 1693/2427/200 1710/2428/201 1709/2429/200 -f 1686/2430/201 1703/2431/202 1702/2432/201 -f 1694/2433/201 1711/2434/202 1710/2428/201 -f 1688/2435/203 1703/2436/202 1687/2437/202 -f 1696/2438/203 1711/2439/202 1695/2440/202 -f 1681/2441/197 1704/2442/203 1688/2435/203 -f 1682/2443/196 1697/2444/197 1681/2441/197 -f 1689/2445/197 1712/2446/203 1696/2438/203 -f 1690/2447/196 1705/2448/197 1689/2445/197 -f 1683/2449/198 1698/2450/196 1682/2443/196 -f 1691/2451/198 1706/2452/196 1690/2447/196 -f 1683/2449/198 1700/2453/199 1699/2454/198 -f 1692/2455/199 1707/2456/198 1691/2451/198 -f 1684/2457/199 1701/2458/200 1700/2453/199 -f 1692/2455/199 1709/2429/200 1708/2459/199 -f 1685/2460/200 1702/2432/201 1701/2458/200 -f 1717/2461/200 1726/2462/201 1725/2463/200 -f 1718/2464/201 1727/2465/202 1726/2462/201 -f 1720/2466/203 1727/2467/202 1719/2468/202 -f 1713/2469/197 1728/2470/203 1720/2466/203 -f 1714/2471/196 1721/2472/197 1713/2469/197 -f 1715/2473/198 1722/2474/196 1714/2471/196 -f 1715/2473/198 1724/2475/199 1723/2476/198 -f 1716/2477/199 1725/2463/200 1724/2475/199 -f 1734/2478/201 1743/2479/202 1742/2480/201 -f 1736/2481/203 1743/2482/202 1735/2483/202 -f 1729/2484/197 1744/2485/203 1736/2481/203 -f 1730/2486/196 1737/2487/197 1729/2484/197 -f 1731/2488/198 1738/2489/196 1730/2486/196 -f 1731/2488/198 1740/2490/199 1739/2491/198 -f 1733/2492/200 1740/2490/199 1732/2493/199 -f 1733/2492/200 1742/2480/201 1741/2494/200 -f 1630/2359/196 1646/2366/196 1645/2360/197 -f 1623/2362/198 1639/2495/198 1638/2363/196 -f 1631/2365/198 1647/2496/198 1646/2366/196 -f 1624/2367/199 1640/2374/199 1639/2368/198 -f 1632/2370/199 1648/2378/199 1647/2371/198 -f 1617/2373/200 1633/2376/200 1640/2374/199 -f 1618/2375/201 1634/2382/201 1633/2376/200 -f 1625/2377/200 1641/2380/200 1648/2378/199 -f 1626/2379/201 1642/2384/201 1641/2380/200 -f 1619/2381/202 1635/2386/202 1634/2382/201 -f 1627/2383/202 1643/2388/202 1642/2384/201 -f 1620/2385/203 1636/2390/203 1635/2386/202 -f 1628/2387/203 1644/2391/203 1643/2388/202 -f 1621/2389/197 1637/2392/197 1636/2390/203 -f 1629/2361/197 1645/2360/197 1644/2391/203 -f 1622/2364/196 1638/2363/196 1637/2392/197 -f 1654/2393/196 1662/2397/196 1661/2394/197 -f 1655/2396/198 1663/2497/198 1662/2397/196 -f 1656/2398/199 1664/2402/199 1663/2399/198 -f 1649/2401/200 1657/2404/200 1664/2402/199 -f 1650/2403/201 1658/2406/201 1657/2404/200 -f 1651/2405/202 1659/2408/202 1658/2406/201 -f 1652/2407/203 1660/2409/203 1659/2408/202 -f 1653/2395/197 1661/2394/197 1660/2409/203 -f 1671/2410/198 1679/2498/198 1678/2411/196 -f 1672/2413/199 1680/2417/199 1679/2414/198 -f 1665/2416/200 1673/2419/200 1680/2417/199 -f 1666/2418/201 1674/2421/201 1673/2419/200 -f 1667/2420/202 1675/2423/202 1674/2421/201 -f 1668/2422/203 1676/2425/203 1675/2423/202 -f 1669/2424/197 1677/2426/197 1676/2425/203 -f 1670/2412/196 1678/2411/196 1677/2426/197 -f 1693/2427/200 1694/2433/201 1710/2428/201 -f 1686/2430/201 1687/2499/202 1703/2431/202 -f 1694/2433/201 1695/2500/202 1711/2434/202 -f 1688/2435/203 1704/2442/203 1703/2436/202 -f 1696/2438/203 1712/2446/203 1711/2439/202 -f 1681/2441/197 1697/2444/197 1704/2442/203 -f 1682/2443/196 1698/2450/196 1697/2444/197 -f 1689/2445/197 1705/2448/197 1712/2446/203 -f 1690/2447/196 1706/2452/196 1705/2448/197 -f 1683/2449/198 1699/2454/198 1698/2450/196 -f 1691/2451/198 1707/2456/198 1706/2452/196 -f 1683/2449/198 1684/2457/199 1700/2453/199 -f 1692/2455/199 1708/2459/199 1707/2456/198 -f 1684/2457/199 1685/2460/200 1701/2458/200 -f 1692/2455/199 1693/2427/200 1709/2429/200 -f 1685/2460/200 1686/2430/201 1702/2432/201 -f 1717/2461/200 1718/2464/201 1726/2462/201 -f 1718/2464/201 1719/2501/202 1727/2465/202 -f 1720/2466/203 1728/2470/203 1727/2467/202 -f 1713/2469/197 1721/2472/197 1728/2470/203 -f 1714/2471/196 1722/2474/196 1721/2472/197 -f 1715/2473/198 1723/2476/198 1722/2474/196 -f 1715/2473/198 1716/2477/199 1724/2475/199 -f 1716/2477/199 1717/2461/200 1725/2463/200 -f 1734/2478/201 1735/2502/202 1743/2479/202 -f 1736/2481/203 1744/2485/203 1743/2482/202 -f 1729/2484/197 1737/2487/197 1744/2485/203 -f 1730/2486/196 1738/2489/196 1737/2487/197 -f 1731/2488/198 1739/2491/198 1738/2489/196 -f 1731/2488/198 1732/2493/199 1740/2490/199 -f 1733/2492/200 1741/2494/200 1740/2490/199 -f 1733/2492/200 1734/2478/201 1742/2480/201 +f 1918/2689/196 1933/2690/197 1917/2691/197 +f 1911/2692/198 1926/2693/196 1910/2694/196 +f 1919/2695/198 1934/2696/196 1918/2689/196 +f 1912/2697/199 1927/2698/198 1911/2699/198 +f 1920/2700/199 1935/2701/198 1919/2702/198 +f 1905/2703/200 1928/2704/199 1912/2697/199 +f 1906/2705/201 1921/2706/200 1905/2703/200 +f 1913/2707/200 1936/2708/199 1920/2700/199 +f 1914/2709/201 1929/2710/200 1913/2707/200 +f 1907/2711/202 1922/2712/201 1906/2705/201 +f 1915/2713/202 1930/2714/201 1914/2709/201 +f 1908/2715/203 1923/2716/202 1907/2711/202 +f 1916/2717/203 1931/2718/202 1915/2713/202 +f 1909/2719/197 1924/2720/203 1908/2715/203 +f 1917/2691/197 1932/2721/203 1916/2717/203 +f 1910/2694/196 1925/2722/197 1909/2719/197 +f 1942/2723/196 1949/2724/197 1941/2725/197 +f 1943/2726/198 1950/2727/196 1942/2723/196 +f 1944/2728/199 1951/2729/198 1943/2730/198 +f 1937/2731/200 1952/2732/199 1944/2728/199 +f 1938/2733/201 1945/2734/200 1937/2731/200 +f 1939/2735/202 1946/2736/201 1938/2733/201 +f 1940/2737/203 1947/2738/202 1939/2735/202 +f 1941/2725/197 1948/2739/203 1940/2737/203 +f 1959/2740/198 1966/2741/196 1958/2742/196 +f 1960/2743/199 1967/2744/198 1959/2745/198 +f 1953/2746/200 1968/2747/199 1960/2743/199 +f 1954/2748/201 1961/2749/200 1953/2746/200 +f 1955/2750/202 1962/2751/201 1954/2748/201 +f 1956/2752/203 1963/2753/202 1955/2750/202 +f 1957/2754/197 1964/2755/203 1956/2752/203 +f 1958/2742/196 1965/2756/197 1957/2754/197 +f 1981/2757/200 1998/2758/201 1997/2759/200 +f 1974/2760/201 1991/2761/202 1990/2762/201 +f 1982/2763/201 1999/2764/202 1998/2758/201 +f 1976/2765/203 1991/2766/202 1975/2767/202 +f 1984/2768/203 1999/2769/202 1983/2770/202 +f 1969/2771/197 1992/2772/203 1976/2765/203 +f 1970/2773/196 1985/2774/197 1969/2771/197 +f 1977/2775/197 2000/2776/203 1984/2768/203 +f 1978/2777/196 1993/2778/197 1977/2775/197 +f 1971/2779/198 1986/2780/196 1970/2773/196 +f 1979/2781/198 1994/2782/196 1978/2777/196 +f 1971/2779/198 1988/2783/199 1987/2784/198 +f 1980/2785/199 1995/2786/198 1979/2781/198 +f 1972/2787/199 1989/2788/200 1988/2783/199 +f 1980/2785/199 1997/2759/200 1996/2789/199 +f 1973/2790/200 1990/2762/201 1989/2788/200 +f 2005/2791/200 2014/2792/201 2013/2793/200 +f 2006/2794/201 2015/2795/202 2014/2792/201 +f 2008/2796/203 2015/2797/202 2007/2798/202 +f 2001/2799/197 2016/2800/203 2008/2796/203 +f 2002/2801/196 2009/2802/197 2001/2799/197 +f 2003/2803/198 2010/2804/196 2002/2801/196 +f 2003/2803/198 2012/2805/199 2011/2806/198 +f 2004/2807/199 2013/2793/200 2012/2805/199 +f 2022/2808/201 2031/2809/202 2030/2810/201 +f 2024/2811/203 2031/2812/202 2023/2813/202 +f 2017/2814/197 2032/2815/203 2024/2811/203 +f 2018/2816/196 2025/2817/197 2017/2814/197 +f 2019/2818/198 2026/2819/196 2018/2816/196 +f 2019/2818/198 2028/2820/199 2027/2821/198 +f 2021/2822/200 2028/2820/199 2020/2823/199 +f 2021/2822/200 2030/2810/201 2029/2824/200 +f 2046/2825/201 2039/2826/202 2038/2827/201 +f 2047/2828/202 2040/2829/203 2039/2830/202 +f 2048/2831/203 2033/2832/197 2040/2829/203 +f 2041/2833/197 2034/2834/196 2033/2832/197 +f 2042/2835/196 2035/2836/198 2034/2834/196 +f 2043/2837/198 2036/2838/199 2035/2836/198 +f 2044/2839/199 2037/2840/200 2036/2838/199 +f 2045/2841/200 2038/2827/201 2037/2840/200 +f 2062/2842/201 2055/2843/202 2054/2844/201 +f 2063/2845/202 2056/2846/203 2055/2847/202 +f 2064/2848/203 2049/2849/197 2056/2846/203 +f 2057/2850/197 2050/2851/196 2049/2849/197 +f 2058/2852/196 2051/2853/198 2050/2851/196 +f 2059/2854/198 2052/2855/199 2051/2853/198 +f 2060/2856/199 2053/2857/200 2052/2855/199 +f 2061/2858/200 2054/2844/201 2053/2857/200 +f 2070/2859/196 2079/2860/198 2071/2861/198 +f 2079/2862/198 2072/2863/199 2071/2864/198 +f 2080/2865/199 2065/2866/200 2072/2863/199 +f 2073/2867/200 2066/2868/201 2065/2866/200 +f 2074/2869/201 2067/2870/202 2066/2868/201 +f 2067/2870/202 2076/2871/203 2068/2872/203 +f 2068/2872/203 2077/2873/197 2069/2874/197 +f 2069/2874/197 2078/2875/196 2070/2859/196 +f 2086/2876/196 2095/2877/198 2087/2878/198 +f 2095/2879/198 2088/2880/199 2087/2881/198 +f 2096/2882/199 2081/2883/200 2088/2880/199 +f 2089/2884/200 2082/2885/201 2081/2883/200 +f 2090/2886/201 2083/2887/202 2082/2885/201 +f 2083/2887/202 2092/2888/203 2084/2889/203 +f 2092/2888/203 2085/2890/197 2084/2889/203 +f 2085/2890/197 2094/2891/196 2086/2876/196 +f 1918/2689/196 1934/2696/196 1933/2690/197 +f 1911/2692/198 1927/2892/198 1926/2693/196 +f 1919/2695/198 1935/2893/198 1934/2696/196 +f 1912/2697/199 1928/2704/199 1927/2698/198 +f 1920/2700/199 1936/2708/199 1935/2701/198 +f 1905/2703/200 1921/2706/200 1928/2704/199 +f 1906/2705/201 1922/2712/201 1921/2706/200 +f 1913/2707/200 1929/2710/200 1936/2708/199 +f 1914/2709/201 1930/2714/201 1929/2710/200 +f 1907/2711/202 1923/2716/202 1922/2712/201 +f 1915/2713/202 1931/2718/202 1930/2714/201 +f 1908/2715/203 1924/2720/203 1923/2716/202 +f 1916/2717/203 1932/2721/203 1931/2718/202 +f 1909/2719/197 1925/2722/197 1924/2720/203 +f 1917/2691/197 1933/2690/197 1932/2721/203 +f 1910/2694/196 1926/2693/196 1925/2722/197 +f 1942/2723/196 1950/2727/196 1949/2724/197 +f 1943/2726/198 1951/2894/198 1950/2727/196 +f 1944/2728/199 1952/2732/199 1951/2729/198 +f 1937/2731/200 1945/2734/200 1952/2732/199 +f 1938/2733/201 1946/2736/201 1945/2734/200 +f 1939/2735/202 1947/2738/202 1946/2736/201 +f 1940/2737/203 1948/2739/203 1947/2738/202 +f 1941/2725/197 1949/2724/197 1948/2739/203 +f 1959/2740/198 1967/2895/198 1966/2741/196 +f 1960/2743/199 1968/2747/199 1967/2744/198 +f 1953/2746/200 1961/2749/200 1968/2747/199 +f 1954/2748/201 1962/2751/201 1961/2749/200 +f 1955/2750/202 1963/2753/202 1962/2751/201 +f 1956/2752/203 1964/2755/203 1963/2753/202 +f 1957/2754/197 1965/2756/197 1964/2755/203 +f 1958/2742/196 1966/2741/196 1965/2756/197 +f 1981/2757/200 1982/2763/201 1998/2758/201 +f 1974/2760/201 1975/2896/202 1991/2761/202 +f 1982/2763/201 1983/2897/202 1999/2764/202 +f 1976/2765/203 1992/2772/203 1991/2766/202 +f 1984/2768/203 2000/2776/203 1999/2769/202 +f 1969/2771/197 1985/2774/197 1992/2772/203 +f 1970/2773/196 1986/2780/196 1985/2774/197 +f 1977/2775/197 1993/2778/197 2000/2776/203 +f 1978/2777/196 1994/2782/196 1993/2778/197 +f 1971/2779/198 1987/2784/198 1986/2780/196 +f 1979/2781/198 1995/2786/198 1994/2782/196 +f 1971/2779/198 1972/2787/199 1988/2783/199 +f 1980/2785/199 1996/2789/199 1995/2786/198 +f 1972/2787/199 1973/2790/200 1989/2788/200 +f 1980/2785/199 1981/2757/200 1997/2759/200 +f 1973/2790/200 1974/2760/201 1990/2762/201 +f 2005/2791/200 2006/2794/201 2014/2792/201 +f 2006/2794/201 2007/2898/202 2015/2795/202 +f 2008/2796/203 2016/2800/203 2015/2797/202 +f 2001/2799/197 2009/2802/197 2016/2800/203 +f 2002/2801/196 2010/2804/196 2009/2802/197 +f 2003/2803/198 2011/2806/198 2010/2804/196 +f 2003/2803/198 2004/2807/199 2012/2805/199 +f 2004/2807/199 2005/2791/200 2013/2793/200 +f 2022/2808/201 2023/2899/202 2031/2809/202 +f 2024/2811/203 2032/2815/203 2031/2812/202 +f 2017/2814/197 2025/2817/197 2032/2815/203 +f 2018/2816/196 2026/2819/196 2025/2817/197 +f 2019/2818/198 2027/2821/198 2026/2819/196 +f 2019/2818/198 2020/2823/199 2028/2820/199 +f 2021/2822/200 2029/2824/200 2028/2820/199 +f 2021/2822/200 2022/2808/201 2030/2810/201 +f 2046/2825/201 2047/2900/202 2039/2826/202 +f 2047/2828/202 2048/2831/203 2040/2829/203 +f 2048/2831/203 2041/2833/197 2033/2832/197 +f 2041/2833/197 2042/2835/196 2034/2834/196 +f 2042/2835/196 2043/2837/198 2035/2836/198 +f 2043/2837/198 2044/2839/199 2036/2838/199 +f 2044/2839/199 2045/2841/200 2037/2840/200 +f 2045/2841/200 2046/2825/201 2038/2827/201 +f 2062/2842/201 2063/2901/202 2055/2843/202 +f 2063/2845/202 2064/2848/203 2056/2846/203 +f 2064/2848/203 2057/2850/197 2049/2849/197 +f 2057/2850/197 2058/2852/196 2050/2851/196 +f 2058/2852/196 2059/2854/198 2051/2853/198 +f 2059/2854/198 2060/2856/199 2052/2855/199 +f 2060/2856/199 2061/2858/200 2053/2857/200 +f 2061/2858/200 2062/2842/201 2054/2844/201 +f 2070/2859/196 2078/2875/196 2079/2860/198 +f 2079/2862/198 2080/2865/199 2072/2863/199 +f 2080/2865/199 2073/2867/200 2065/2866/200 +f 2073/2867/200 2074/2869/201 2066/2868/201 +f 2074/2869/201 2075/2902/202 2067/2870/202 +f 2067/2870/202 2075/2902/202 2076/2871/203 +f 2068/2872/203 2076/2871/203 2077/2873/197 +f 2069/2874/197 2077/2873/197 2078/2875/196 +f 2086/2876/196 2094/2891/196 2095/2877/198 +f 2095/2879/198 2096/2882/199 2088/2880/199 +f 2096/2882/199 2089/2884/200 2081/2883/200 +f 2089/2884/200 2090/2886/201 2082/2885/201 +f 2090/2886/201 2091/2903/202 2083/2887/202 +f 2083/2887/202 2091/2903/202 2092/2888/203 +f 2092/2888/203 2093/2904/197 2085/2890/197 +f 2085/2890/197 2093/2904/197 2094/2891/196 o SuspensionCoverBack v -0.500000 6.500000 -4.000000 v -0.676777 6.426777 -4.000000 @@ -6939,6 +8045,38 @@ v 0.750000 6.312500 -5.500000 v 0.882583 6.367417 -5.500000 v 0.937500 6.500000 -5.500000 v 0.882583 6.632583 -5.500000 +v -0.500000 6.500000 -4.000000 +v -0.676777 6.426777 -4.000000 +v -0.750000 6.250000 -4.000000 +v -0.676777 6.073223 -4.000000 +v -0.500000 6.000000 -4.000000 +v -0.323223 6.073223 -4.000000 +v -0.250000 6.250000 -4.000000 +v -0.323223 6.426777 -4.000000 +v 0.500000 6.500000 -4.000000 +v 0.323223 6.426777 -4.000000 +v 0.250000 6.250000 -4.000000 +v 0.323223 6.073223 -4.000000 +v 0.500000 6.000000 -4.000000 +v 0.676777 6.073223 -4.000000 +v 0.750000 6.250000 -4.000000 +v 0.676777 6.426777 -4.000000 +v -0.750000 6.750000 -5.500000 +v -0.926777 6.676777 -5.500000 +v -1.000000 6.500000 -5.500000 +v -0.926777 6.323223 -5.500000 +v -0.750000 6.250000 -5.500000 +v -0.573223 6.323223 -5.500000 +v -0.500000 6.500000 -5.500000 +v -0.573223 6.676777 -5.500000 +v 0.750000 6.750000 -5.500000 +v 0.573223 6.676777 -5.500000 +v 0.500000 6.500000 -5.500000 +v 0.573223 6.323223 -5.500000 +v 0.750000 6.250000 -5.500000 +v 0.926777 6.323223 -5.500000 +v 1.000000 6.500000 -5.500000 +v 0.926777 6.676777 -5.500000 vt 0.873494 0.509302 vt 0.853701 0.516279 vt 0.852840 0.509302 @@ -7003,6 +8141,40 @@ vt 0.877797 0.544186 vt 0.857143 0.544186 vt 0.851979 0.502326 vt 0.872633 0.576744 +vt 0.853701 0.516279 +vt 0.873494 0.509302 +vt 0.852840 0.509302 +vt 0.858864 0.558140 +vt 0.878657 0.551163 +vt 0.858003 0.551163 +vt 0.854561 0.523256 +vt 0.874355 0.516279 +vt 0.852840 0.509302 +vt 0.872633 0.502326 +vt 0.851979 0.502326 +vt 0.855422 0.530233 +vt 0.875215 0.523256 +vt 0.853701 0.516279 +vt 0.873494 0.509302 +vt 0.854561 0.523256 +vt 0.874355 0.516279 +vt 0.876076 0.530233 +vt 0.875215 0.523256 +vt 0.856282 0.537209 +vt 0.876076 0.530233 +vt 0.877797 0.544186 +vt 0.876936 0.537209 +vt 0.857143 0.544186 +vt 0.878657 0.551163 +vt 0.855422 0.530233 +vt 0.876936 0.537209 +vt 0.858003 0.551163 +vt 0.879518 0.558140 +vt 0.856282 0.537209 +vt 0.877797 0.544186 +vt 0.851979 0.502326 +vt 0.872633 0.502326 +vt 0.857143 0.544186 vt 0.879518 0.558140 vt 0.872633 0.581395 vt 0.875215 0.523256 @@ -7011,6 +8183,8 @@ vt 0.876936 0.537209 vt 0.872633 0.595349 vt 0.872633 0.572093 vt 0.872633 0.502326 +vt 0.879518 0.558140 +vt 0.858864 0.558140 vn 0.6882 -0.6882 -0.2294 vn 0.9847 -0.0369 -0.1703 vn -0.6882 -0.6882 -0.2294 @@ -7040,70 +8214,102 @@ vn 0.0369 -0.9847 -0.1703 vn -0.9866 0.0416 -0.1575 vn -0.9847 -0.0369 -0.1703 s 1 -f 1782/2503/204 1751/2504/205 1750/2505/204 -f 1796/2506/206 1765/2507/207 1764/2508/206 -f 1783/2509/208 1752/2510/209 1751/2504/205 -f 1797/2511/210 1766/2512/211 1765/2513/207 -f 1784/2514/212 1745/2515/213 1752/2510/209 -f 1798/2516/214 1767/2517/215 1766/2512/211 -f 1785/2518/216 1754/2519/217 1753/2520/213 -f 1799/2521/218 1768/2522/219 1767/2517/215 -f 1754/2519/217 1787/2523/220 1755/2524/221 -f 1768/2522/219 1793/2525/222 1761/2526/223 -f 1755/2524/221 1788/2527/224 1756/2528/225 -f 1769/2529/223 1802/2530/226 1770/2531/227 -f 1756/2528/225 1789/2532/228 1757/2533/229 -f 1770/2531/227 1803/2534/230 1771/2535/231 -f 1757/2536/229 1790/2537/204 1758/2538/204 -f 1771/2535/231 1804/2539/206 1772/2540/206 -f 1790/2537/204 1759/2541/205 1758/2538/204 -f 1777/2542/216 1746/2543/217 1745/2515/213 -f 1804/2539/206 1773/2544/207 1772/2540/206 -f 1791/2545/208 1760/2546/209 1759/2541/205 -f 1746/2543/217 1779/2547/220 1747/2548/221 -f 1805/2549/210 1774/2550/211 1773/2551/207 -f 1792/2552/212 1753/2520/213 1760/2546/209 -f 1747/2548/221 1780/2553/224 1748/2554/225 -f 1806/2555/214 1775/2556/215 1774/2550/211 -f 1761/2526/223 1794/2557/226 1762/2558/227 -f 1748/2554/225 1781/2559/228 1749/2560/229 -f 1807/2561/218 1776/2562/219 1775/2556/215 -f 1762/2558/227 1795/2563/230 1763/2564/231 -f 1749/2565/229 1782/2503/204 1750/2505/204 -f 1776/2562/219 1801/2566/222 1769/2529/223 -f 1763/2564/231 1796/2506/206 1764/2508/206 -f 1782/2503/204 1783/2509/208 1751/2504/205 -f 1796/2506/206 1797/2567/210 1765/2507/207 -f 1783/2509/208 1784/2514/212 1752/2510/209 -f 1797/2511/210 1798/2516/214 1766/2512/211 -f 1784/2514/212 1777/2542/216 1745/2515/213 -f 1798/2516/214 1799/2521/218 1767/2517/215 -f 1785/2518/216 1786/2568/217 1754/2519/217 -f 1799/2521/218 1800/2569/219 1768/2522/219 -f 1754/2519/217 1786/2568/217 1787/2523/220 -f 1768/2522/219 1800/2569/219 1793/2525/222 -f 1755/2524/221 1787/2523/220 1788/2527/224 -f 1769/2529/223 1801/2566/222 1802/2530/226 -f 1756/2528/225 1788/2527/224 1789/2532/228 -f 1770/2531/227 1802/2530/226 1803/2534/230 -f 1757/2536/229 1789/2570/228 1790/2537/204 -f 1771/2535/231 1803/2534/230 1804/2539/206 -f 1790/2537/204 1791/2545/208 1759/2541/205 -f 1777/2542/216 1778/2571/217 1746/2543/217 -f 1804/2539/206 1805/2572/210 1773/2544/207 -f 1791/2545/208 1792/2552/212 1760/2546/209 -f 1746/2543/217 1778/2571/217 1779/2547/220 -f 1805/2549/210 1806/2555/214 1774/2550/211 -f 1792/2552/212 1785/2518/216 1753/2520/213 -f 1747/2548/221 1779/2547/220 1780/2553/224 -f 1806/2555/214 1807/2561/218 1775/2556/215 -f 1761/2526/223 1793/2525/222 1794/2557/226 -f 1748/2554/225 1780/2553/224 1781/2559/228 -f 1807/2561/218 1808/2573/219 1776/2562/219 -f 1762/2558/227 1794/2557/226 1795/2563/230 -f 1749/2565/229 1781/2574/228 1782/2503/204 -f 1776/2562/219 1808/2573/219 1801/2566/222 -f 1763/2564/231 1795/2563/230 1796/2506/206 +f 2134/2905/204 2103/2906/205 2102/2907/204 +f 2148/2908/206 2117/2909/207 2116/2910/206 +f 2135/2911/208 2104/2912/209 2103/2906/205 +f 2149/2913/210 2118/2914/211 2117/2915/207 +f 2136/2916/212 2097/2917/213 2104/2912/209 +f 2150/2918/214 2119/2919/215 2118/2914/211 +f 2137/2920/216 2106/2921/217 2105/2922/213 +f 2151/2923/218 2120/2924/219 2119/2919/215 +f 2106/2921/217 2139/2925/220 2107/2926/221 +f 2120/2924/219 2145/2927/222 2113/2928/223 +f 2107/2926/221 2140/2929/224 2108/2930/225 +f 2121/2931/223 2154/2932/226 2122/2933/227 +f 2108/2930/225 2141/2934/228 2109/2935/229 +f 2122/2933/227 2155/2936/230 2123/2937/231 +f 2109/2938/229 2142/2939/204 2110/2940/204 +f 2123/2937/231 2156/2941/206 2124/2942/206 +f 2142/2939/204 2111/2943/205 2110/2940/204 +f 2129/2944/216 2098/2945/217 2097/2917/213 +f 2156/2941/206 2125/2946/207 2124/2942/206 +f 2143/2947/208 2112/2948/209 2111/2943/205 +f 2098/2945/217 2131/2949/220 2099/2950/221 +f 2157/2951/210 2126/2952/211 2125/2953/207 +f 2144/2954/212 2105/2922/213 2112/2948/209 +f 2099/2950/221 2132/2955/224 2100/2956/225 +f 2158/2957/214 2127/2958/215 2126/2952/211 +f 2113/2928/223 2146/2959/226 2114/2960/227 +f 2100/2956/225 2133/2961/228 2101/2962/229 +f 2159/2963/218 2128/2964/219 2127/2958/215 +f 2114/2960/227 2147/2965/230 2115/2966/231 +f 2101/2967/229 2134/2905/204 2102/2907/204 +f 2128/2964/219 2153/2968/222 2121/2931/223 +f 2115/2966/231 2148/2908/206 2116/2910/206 +f 2167/2969/220 2182/2970/217 2166/2971/217 +f 2173/2972/222 2188/2973/219 2172/2974/219 +f 2168/2975/224 2183/2976/221 2167/2969/220 +f 2174/2977/226 2189/2978/223 2173/2979/222 +f 2161/2980/228 2184/2981/225 2168/2975/224 +f 2175/2982/230 2190/2983/227 2174/2977/226 +f 2176/2984/206 2191/2985/231 2175/2982/230 +f 2176/2984/206 2185/2986/207 2192/2987/206 +f 2162/2988/204 2177/2989/229 2161/2980/228 +f 2162/2988/204 2179/2990/205 2178/2991/204 +f 2163/2992/208 2180/2993/209 2179/2990/205 +f 2169/2994/210 2186/2995/211 2185/2986/207 +f 2164/2996/212 2181/2997/213 2180/2993/209 +f 2170/2998/214 2187/2999/215 2186/2995/211 +f 2165/3000/216 2182/2970/217 2181/3001/213 +f 2171/3002/218 2188/2973/219 2187/2999/215 +f 2134/2905/204 2135/2911/208 2103/2906/205 +f 2148/2908/206 2149/3003/210 2117/2909/207 +f 2135/2911/208 2136/2916/212 2104/2912/209 +f 2149/2913/210 2150/2918/214 2118/2914/211 +f 2136/2916/212 2129/2944/216 2097/2917/213 +f 2150/2918/214 2151/2923/218 2119/2919/215 +f 2137/2920/216 2138/3004/217 2106/2921/217 +f 2151/2923/218 2152/3005/219 2120/2924/219 +f 2106/2921/217 2138/3004/217 2139/2925/220 +f 2120/2924/219 2152/3005/219 2145/2927/222 +f 2107/2926/221 2139/2925/220 2140/2929/224 +f 2121/2931/223 2153/2968/222 2154/2932/226 +f 2108/2930/225 2140/2929/224 2141/2934/228 +f 2122/2933/227 2154/2932/226 2155/2936/230 +f 2109/2938/229 2141/3006/228 2142/2939/204 +f 2123/2937/231 2155/2936/230 2156/2941/206 +f 2142/2939/204 2143/2947/208 2111/2943/205 +f 2129/2944/216 2130/3007/217 2098/2945/217 +f 2156/2941/206 2157/3008/210 2125/2946/207 +f 2143/2947/208 2144/2954/212 2112/2948/209 +f 2098/2945/217 2130/3007/217 2131/2949/220 +f 2157/2951/210 2158/2957/214 2126/2952/211 +f 2144/2954/212 2137/2920/216 2105/2922/213 +f 2099/2950/221 2131/2949/220 2132/2955/224 +f 2158/2957/214 2159/2963/218 2127/2958/215 +f 2113/2928/223 2145/2927/222 2146/2959/226 +f 2100/2956/225 2132/2955/224 2133/2961/228 +f 2159/2963/218 2160/3009/219 2128/2964/219 +f 2114/2960/227 2146/2959/226 2147/2965/230 +f 2101/2967/229 2133/3010/228 2134/2905/204 +f 2128/2964/219 2160/3009/219 2153/2968/222 +f 2115/2966/231 2147/2965/230 2148/2908/206 +f 2167/2969/220 2183/2976/221 2182/2970/217 +f 2173/2972/222 2189/3011/223 2188/2973/219 +f 2168/2975/224 2184/2981/225 2183/2976/221 +f 2174/2977/226 2190/2983/227 2189/2978/223 +f 2161/2980/228 2177/2989/229 2184/2981/225 +f 2175/2982/230 2191/2985/231 2190/2983/227 +f 2176/2984/206 2192/2987/206 2191/2985/231 +f 2176/2984/206 2169/2994/210 2185/2986/207 +f 2162/2988/204 2178/2991/204 2177/2989/229 +f 2162/2988/204 2163/2992/208 2179/2990/205 +f 2163/2992/208 2164/2996/212 2180/2993/209 +f 2169/2994/210 2170/2998/214 2186/2995/211 +f 2164/2996/212 2165/3012/216 2181/2997/213 +f 2170/2998/214 2171/3002/218 2187/2999/215 +f 2165/3000/216 2166/2971/217 2182/2970/217 +f 2171/3002/218 2172/2974/219 2188/2973/219 o Server4 v 3.375000 1.000000 -8.875000 v 2.625000 1.000000 -8.875000 @@ -7131,16 +8337,16 @@ vn 0.0000 0.0000 1.0000 vn 1.0000 0.0000 0.0000 vn -1.0000 0.0000 0.0000 s off -f 1815/2575/232 1813/2576/232 1814/2577/232 -f 1810/2578/233 1816/2579/233 1809/2580/233 -f 1811/2581/234 1814/2577/234 1812/2582/234 -f 1809/2583/235 1815/2575/235 1811/2584/235 -f 1812/2585/236 1813/2576/236 1810/2586/236 -f 1815/2575/232 1816/2579/232 1813/2576/232 -f 1810/2578/233 1813/2576/233 1816/2579/233 -f 1811/2581/234 1815/2575/234 1814/2577/234 -f 1809/2583/235 1816/2579/235 1815/2575/235 -f 1812/2585/236 1814/2577/236 1813/2576/236 +f 2199/3013/232 2197/3014/232 2198/3015/232 +f 2194/3016/233 2200/3017/233 2193/3018/233 +f 2195/3019/234 2198/3015/234 2196/3020/234 +f 2193/3021/235 2199/3013/235 2195/3022/235 +f 2196/3023/236 2197/3014/236 2194/3024/236 +f 2199/3013/232 2200/3017/232 2197/3014/232 +f 2194/3016/233 2197/3014/233 2200/3017/233 +f 2195/3019/234 2199/3013/234 2198/3015/234 +f 2193/3021/235 2200/3017/235 2199/3013/235 +f 2196/3023/236 2198/3015/236 2197/3014/236 o Server3 v 3.375000 1.312500 -8.875000 v 2.625000 1.312500 -8.875000 @@ -7171,18 +8377,18 @@ vn 1.0000 0.0000 0.0000 vn -1.0000 0.0000 0.0000 vn 0.0000 -1.0000 0.0000 s off -f 1823/2587/237 1821/2588/237 1822/2589/237 -f 1818/2590/238 1824/2591/238 1817/2592/238 -f 1819/2593/239 1822/2589/239 1820/2594/239 -f 1817/2595/240 1823/2587/240 1819/2596/240 -f 1820/2597/241 1821/2588/241 1818/2598/241 -f 1819/2596/242 1818/2599/242 1817/2595/242 -f 1823/2587/237 1824/2591/237 1821/2588/237 -f 1818/2590/238 1821/2588/238 1824/2591/238 -f 1819/2593/239 1823/2587/239 1822/2589/239 -f 1817/2595/240 1824/2591/240 1823/2587/240 -f 1820/2597/241 1822/2589/241 1821/2588/241 -f 1819/2596/242 1820/2600/242 1818/2599/242 +f 2207/3025/237 2205/3026/237 2206/3027/237 +f 2202/3028/238 2208/3029/238 2201/3030/238 +f 2203/3031/239 2206/3027/239 2204/3032/239 +f 2201/3033/240 2207/3025/240 2203/3034/240 +f 2204/3035/241 2205/3026/241 2202/3036/241 +f 2203/3034/242 2202/3037/242 2201/3033/242 +f 2207/3025/237 2208/3029/237 2205/3026/237 +f 2202/3028/238 2205/3026/238 2208/3029/238 +f 2203/3031/239 2207/3025/239 2206/3027/239 +f 2201/3033/240 2208/3029/240 2207/3025/240 +f 2204/3035/241 2206/3027/241 2205/3026/241 +f 2203/3034/242 2204/3038/242 2202/3037/242 o Server2 v 3.375000 1.625000 -8.875000 v 2.625000 1.625000 -8.875000 @@ -7213,18 +8419,18 @@ vn 1.0000 0.0000 0.0000 vn -1.0000 0.0000 0.0000 vn 0.0000 -1.0000 0.0000 s off -f 1831/2601/243 1829/2602/243 1830/2603/243 -f 1826/2604/244 1832/2605/244 1825/2606/244 -f 1827/2607/245 1830/2603/245 1828/2608/245 -f 1825/2609/246 1831/2601/246 1827/2610/246 -f 1828/2611/247 1829/2602/247 1826/2612/247 -f 1827/2610/248 1826/2613/248 1825/2609/248 -f 1831/2601/243 1832/2605/243 1829/2602/243 -f 1826/2604/244 1829/2602/244 1832/2605/244 -f 1827/2607/245 1831/2601/245 1830/2603/245 -f 1825/2609/246 1832/2605/246 1831/2601/246 -f 1828/2611/247 1830/2603/247 1829/2602/247 -f 1827/2610/248 1828/2614/248 1826/2613/248 +f 2215/3039/243 2213/3040/243 2214/3041/243 +f 2210/3042/244 2216/3043/244 2209/3044/244 +f 2211/3045/245 2214/3041/245 2212/3046/245 +f 2209/3047/246 2215/3039/246 2211/3048/246 +f 2212/3049/247 2213/3040/247 2210/3050/247 +f 2211/3048/248 2210/3051/248 2209/3047/248 +f 2215/3039/243 2216/3043/243 2213/3040/243 +f 2210/3042/244 2213/3040/244 2216/3043/244 +f 2211/3045/245 2215/3039/245 2214/3041/245 +f 2209/3047/246 2216/3043/246 2215/3039/246 +f 2212/3049/247 2214/3041/247 2213/3040/247 +f 2211/3048/248 2212/3052/248 2210/3051/248 o Server1 v 3.375000 1.937500 -8.875000 v 2.625000 1.937500 -8.875000 @@ -7255,18 +8461,18 @@ vn 1.0000 0.0000 0.0000 vn -1.0000 0.0000 0.0000 vn 0.0000 -1.0000 0.0000 s off -f 1839/2615/249 1837/2616/249 1838/2617/249 -f 1834/2618/250 1840/2619/250 1833/2620/250 -f 1835/2621/251 1838/2617/251 1836/2622/251 -f 1833/2623/252 1839/2615/252 1835/2624/252 -f 1836/2625/253 1837/2616/253 1834/2626/253 -f 1835/2624/254 1834/2627/254 1833/2623/254 -f 1839/2615/249 1840/2619/249 1837/2616/249 -f 1834/2618/250 1837/2616/250 1840/2619/250 -f 1835/2621/251 1839/2615/251 1838/2617/251 -f 1833/2623/252 1840/2619/252 1839/2615/252 -f 1836/2625/253 1838/2617/253 1837/2616/253 -f 1835/2624/254 1836/2628/254 1834/2627/254 +f 2223/3053/249 2221/3054/249 2222/3055/249 +f 2218/3056/250 2224/3057/250 2217/3058/250 +f 2219/3059/251 2222/3055/251 2220/3060/251 +f 2217/3061/252 2223/3053/252 2219/3062/252 +f 2220/3063/253 2221/3054/253 2218/3064/253 +f 2219/3062/254 2218/3065/254 2217/3061/254 +f 2223/3053/249 2224/3057/249 2221/3054/249 +f 2218/3056/250 2221/3054/250 2224/3057/250 +f 2219/3059/251 2223/3053/251 2222/3055/251 +f 2217/3061/252 2224/3057/252 2223/3053/252 +f 2220/3063/253 2222/3055/253 2221/3054/253 +f 2219/3062/254 2220/3066/254 2218/3065/254 o Monitor v 2.625000 1.250000 -7.875000 v 2.625000 1.250000 -7.125000 @@ -7319,32 +8525,32 @@ vn 0.0000 0.0000 -1.0000 vn 0.0000 0.0000 1.0000 vn 1.0000 0.0000 0.0000 s off -f 1841/2629/255 1845/2630/255 1842/2631/255 -f 1847/2632/256 1843/2633/256 1844/2634/256 -f 1842/2635/257 1843/2633/257 1841/2636/257 -f 1841/2637/258 1848/2638/258 1846/2639/258 -f 1845/2630/259 1844/2634/259 1842/2631/259 -f 1849/2640/260 1846/2641/260 1850/2642/260 -f 1852/2643/260 1847/2632/260 1851/2644/260 -f 1850/2645/260 1848/2638/260 1852/2646/260 -f 1851/2647/260 1845/2630/260 1849/2648/260 -f 1850/2642/256 1853/2649/256 1849/2640/256 -f 1852/2646/259 1854/2650/259 1850/2645/259 -f 1851/2644/255 1856/2651/255 1852/2643/255 -f 1849/2648/258 1855/2652/258 1851/2647/258 -f 1841/2629/255 1846/2641/255 1845/2630/255 -f 1847/2632/256 1848/2638/256 1843/2633/256 -f 1842/2635/257 1844/2634/257 1843/2633/257 -f 1841/2637/258 1843/2633/258 1848/2638/258 -f 1845/2630/259 1847/2632/259 1844/2634/259 -f 1849/2640/260 1845/2630/260 1846/2641/260 -f 1852/2643/260 1848/2638/260 1847/2632/260 -f 1850/2645/260 1846/2639/260 1848/2638/260 -f 1851/2647/260 1847/2632/260 1845/2630/260 -f 1850/2642/256 1854/2653/256 1853/2649/256 -f 1852/2646/259 1856/2654/259 1854/2650/259 -f 1851/2644/255 1855/2655/255 1856/2651/255 -f 1849/2648/258 1853/2656/258 1855/2652/258 +f 2225/3067/255 2229/3068/255 2226/3069/255 +f 2231/3070/256 2227/3071/256 2228/3072/256 +f 2226/3073/257 2227/3071/257 2225/3074/257 +f 2225/3075/258 2232/3076/258 2230/3077/258 +f 2229/3068/259 2228/3072/259 2226/3069/259 +f 2233/3078/260 2230/3079/260 2234/3080/260 +f 2236/3081/260 2231/3070/260 2235/3082/260 +f 2234/3083/260 2232/3076/260 2236/3084/260 +f 2235/3085/260 2229/3068/260 2233/3086/260 +f 2234/3080/256 2237/3087/256 2233/3078/256 +f 2236/3084/259 2238/3088/259 2234/3083/259 +f 2235/3082/255 2240/3089/255 2236/3081/255 +f 2233/3086/258 2239/3090/258 2235/3085/258 +f 2225/3067/255 2230/3079/255 2229/3068/255 +f 2231/3070/256 2232/3076/256 2227/3071/256 +f 2226/3073/257 2228/3072/257 2227/3071/257 +f 2225/3075/258 2227/3071/258 2232/3076/258 +f 2229/3068/259 2231/3070/259 2228/3072/259 +f 2233/3078/260 2229/3068/260 2230/3079/260 +f 2236/3081/260 2232/3076/260 2231/3070/260 +f 2234/3083/260 2230/3077/260 2232/3076/260 +f 2235/3085/260 2231/3070/260 2229/3068/260 +f 2234/3080/256 2238/3091/256 2237/3087/256 +f 2236/3084/259 2240/3092/259 2238/3088/259 +f 2235/3082/255 2239/3093/255 2240/3089/255 +f 2233/3086/258 2237/3094/258 2239/3090/258 o Screen v 3.312500 1.312500 -7.187500 v 3.312500 1.312500 -7.812500 @@ -7371,16 +8577,16 @@ vn 0.9428 0.2357 0.2357 vn 0.9428 0.2357 -0.2357 vn 0.9428 -0.2357 0.2357 s 1 -f 1862/2657/261 1863/2658/262 1861/2659/263 -f 1861/2659/263 1858/2660/264 1862/2657/261 -f 1864/2661/265 1859/2662/266 1863/2658/262 -f 1862/2657/261 1860/2663/267 1864/2661/265 -f 1863/2658/262 1857/2664/268 1861/2659/263 -f 1862/2657/261 1864/2661/265 1863/2658/262 -f 1861/2659/263 1857/2664/268 1858/2660/264 -f 1864/2661/265 1860/2663/267 1859/2662/266 -f 1862/2657/261 1858/2660/264 1860/2663/267 -f 1863/2658/262 1859/2662/266 1857/2664/268 +f 2246/3095/261 2247/3096/262 2245/3097/263 +f 2245/3097/263 2242/3098/264 2246/3095/261 +f 2248/3099/265 2243/3100/266 2247/3096/262 +f 2246/3095/261 2244/3101/267 2248/3099/265 +f 2247/3096/262 2241/3102/268 2245/3097/263 +f 2246/3095/261 2248/3099/265 2247/3096/262 +f 2245/3097/263 2241/3102/268 2242/3098/264 +f 2248/3099/265 2244/3101/267 2243/3100/266 +f 2246/3095/261 2242/3098/264 2244/3101/267 +f 2247/3096/262 2243/3100/266 2241/3102/268 o SuspensionCoverFront v -0.500000 6.500000 0.500000 v -0.676777 6.426777 0.500000 @@ -7446,6 +8652,38 @@ v 1.000000 6.312500 3.500000 v 1.132583 6.367417 3.500000 v 1.187500 6.500000 3.500000 v 1.132583 6.632583 3.500000 +v -0.500000 6.500000 0.500000 +v -0.676777 6.426777 0.500000 +v -0.750000 6.250000 0.500000 +v -0.676777 6.073223 0.500000 +v -0.500000 6.000000 0.500000 +v -0.323223 6.073223 0.500000 +v -0.250000 6.250000 0.500000 +v -0.323223 6.426777 0.500000 +v -1.000000 6.750000 3.500000 +v -1.176777 6.676777 3.500000 +v -1.250000 6.500000 3.500000 +v -1.176777 6.323223 3.500000 +v -1.000000 6.250000 3.500000 +v -0.823223 6.323223 3.500000 +v -0.750000 6.500000 3.500000 +v -0.823223 6.676777 3.500000 +v 0.500000 6.500000 0.500000 +v 0.323223 6.426777 0.500000 +v 0.250000 6.250000 0.500000 +v 0.323223 6.073223 0.500000 +v 0.500000 6.000000 0.500000 +v 0.676777 6.073223 0.500000 +v 0.750000 6.250000 0.500000 +v 0.676777 6.426777 0.500000 +v 1.000000 6.750000 3.500000 +v 0.823223 6.676777 3.500000 +v 0.750000 6.500000 3.500000 +v 0.823223 6.323223 3.500000 +v 1.000000 6.250000 3.500000 +v 1.176777 6.323223 3.500000 +v 1.250000 6.500000 3.500000 +v 1.176777 6.676777 3.500000 vt 0.847676 0.560465 vt 0.805508 0.553488 vt 0.846816 0.553488 @@ -7514,10 +8752,46 @@ vt 0.845095 0.600000 vt 0.803787 0.595349 vt 0.845095 0.595349 vt 0.803787 0.600000 +vt 0.805508 0.553488 +vt 0.847676 0.560465 +vt 0.846816 0.553488 +vt 0.806368 0.560465 +vt 0.848537 0.567442 +vt 0.807229 0.567442 +vt 0.849398 0.574419 +vt 0.808950 0.581395 +vt 0.850258 0.581395 +vt 0.809811 0.588372 +vt 0.851119 0.588372 +vt 0.810671 0.595349 +vt 0.851979 0.595349 +vt 0.845095 0.539535 +vt 0.804647 0.546512 +vt 0.845955 0.546512 +vt 0.805508 0.553488 +vt 0.847676 0.560465 +vt 0.846816 0.553488 +vt 0.807229 0.567442 +vt 0.848537 0.567442 +vt 0.808089 0.574419 +vt 0.849398 0.574419 +vt 0.808950 0.581395 +vt 0.850258 0.581395 +vt 0.809811 0.588372 +vt 0.851119 0.588372 +vt 0.851979 0.595349 +vt 0.803787 0.539535 +vt 0.845955 0.546512 +vt 0.845095 0.539535 +vt 0.804647 0.546512 vt 0.851979 0.595349 vt 0.845095 0.632558 vt 0.810671 0.595349 vt 0.803787 0.632558 +vt 0.808089 0.574419 +vt 0.803787 0.539535 +vt 0.806368 0.560465 +vt 0.810671 0.595349 vn 0.7343 0.6756 0.0661 vn 0.9865 0.0209 0.1627 vn 0.9860 -0.0186 0.1659 @@ -7551,70 +8825,102 @@ vn 0.6749 -0.7362 -0.0511 vn 0.0411 -0.9962 0.0762 vn 0.7343 -0.6756 -0.0661 s 1 -f 1872/2665/269 1887/2666/270 1871/2667/271 -f 1880/2668/269 1895/2669/270 1879/2670/271 -f 1865/2671/272 1888/2672/273 1872/2665/269 -f 1866/2673/274 1881/2674/275 1865/2671/272 -f 1873/2675/272 1896/2676/273 1880/2668/269 -f 1874/2677/274 1889/2678/275 1873/2675/272 -f 1866/2673/274 1883/2679/276 1882/2680/277 -f 1874/2677/274 1891/2681/276 1890/2682/277 -f 1867/2683/278 1884/2684/279 1883/2679/276 -f 1875/2685/278 1892/2686/279 1891/2681/276 -f 1868/2687/280 1885/2688/281 1884/2684/279 -f 1876/2689/280 1893/2690/281 1892/2686/279 -f 1869/2691/282 1886/2692/283 1885/2693/281 -f 1877/2694/282 1894/2695/283 1893/2696/281 -f 1871/2667/271 1886/2692/283 1870/2697/284 -f 1879/2670/271 1894/2695/283 1878/2698/284 -f 1904/2699/285 1911/2700/286 1903/2701/287 -f 1904/2699/285 1905/2702/288 1912/2703/289 -f 1897/2704/290 1906/2705/291 1905/2702/288 -f 1898/2706/292 1907/2707/293 1906/2705/291 -f 1899/2708/294 1908/2709/295 1907/2707/293 -f 1901/2710/296 1908/2709/295 1900/2711/297 -f 1902/2712/298 1909/2713/299 1901/2714/296 -f 1903/2701/287 1910/2715/300 1902/2712/298 -f 1920/2716/285 1927/2717/286 1919/2718/287 -f 1920/2716/285 1921/2719/288 1928/2720/289 -f 1913/2721/290 1922/2722/291 1921/2719/288 -f 1914/2723/292 1923/2724/293 1922/2722/291 -f 1915/2725/294 1924/2726/295 1923/2724/293 -f 1917/2727/296 1924/2726/295 1916/2728/297 -f 1918/2729/298 1925/2730/299 1917/2731/296 -f 1919/2718/287 1926/2732/300 1918/2729/298 -f 1872/2665/269 1888/2672/273 1887/2666/270 -f 1880/2668/269 1896/2676/273 1895/2669/270 -f 1865/2671/272 1881/2674/275 1888/2672/273 -f 1866/2673/274 1882/2680/277 1881/2674/275 -f 1873/2675/272 1889/2678/275 1896/2676/273 -f 1874/2677/274 1890/2682/277 1889/2678/275 -f 1866/2673/274 1867/2683/278 1883/2679/276 -f 1874/2677/274 1875/2685/278 1891/2681/276 -f 1867/2683/278 1868/2687/280 1884/2684/279 -f 1875/2685/278 1876/2689/280 1892/2686/279 -f 1868/2687/280 1869/2733/282 1885/2688/281 -f 1876/2689/280 1877/2734/282 1893/2690/281 -f 1869/2691/282 1870/2697/284 1886/2692/283 -f 1877/2694/282 1878/2698/284 1894/2695/283 -f 1871/2667/271 1887/2666/270 1886/2692/283 -f 1879/2670/271 1895/2669/270 1894/2695/283 -f 1904/2699/285 1912/2703/289 1911/2700/286 -f 1904/2699/285 1897/2704/290 1905/2702/288 -f 1897/2704/290 1898/2706/292 1906/2705/291 -f 1898/2706/292 1899/2708/294 1907/2707/293 -f 1899/2708/294 1900/2711/297 1908/2709/295 -f 1901/2710/296 1909/2735/299 1908/2709/295 -f 1902/2712/298 1910/2715/300 1909/2713/299 -f 1903/2701/287 1911/2700/286 1910/2715/300 -f 1920/2716/285 1928/2720/289 1927/2717/286 -f 1920/2716/285 1913/2721/290 1921/2719/288 -f 1913/2721/290 1914/2723/292 1922/2722/291 -f 1914/2723/292 1915/2725/294 1923/2724/293 -f 1915/2725/294 1916/2728/297 1924/2726/295 -f 1917/2727/296 1925/2736/299 1924/2726/295 -f 1918/2729/298 1926/2732/300 1925/2730/299 -f 1919/2718/287 1927/2717/286 1926/2732/300 +f 2256/3103/269 2271/3104/270 2255/3105/271 +f 2264/3106/269 2279/3107/270 2263/3108/271 +f 2249/3109/272 2272/3110/273 2256/3103/269 +f 2250/3111/274 2265/3112/275 2249/3109/272 +f 2257/3113/272 2280/3114/273 2264/3106/269 +f 2258/3115/274 2273/3116/275 2257/3113/272 +f 2250/3111/274 2267/3117/276 2266/3118/277 +f 2258/3115/274 2275/3119/276 2274/3120/277 +f 2251/3121/278 2268/3122/279 2267/3117/276 +f 2259/3123/278 2276/3124/279 2275/3119/276 +f 2252/3125/280 2269/3126/281 2268/3122/279 +f 2260/3127/280 2277/3128/281 2276/3124/279 +f 2253/3129/282 2270/3130/283 2269/3131/281 +f 2261/3132/282 2278/3133/283 2277/3134/281 +f 2255/3105/271 2270/3130/283 2254/3135/284 +f 2263/3108/271 2278/3133/283 2262/3136/284 +f 2288/3137/285 2295/3138/286 2287/3139/287 +f 2288/3137/285 2289/3140/288 2296/3141/289 +f 2281/3142/290 2290/3143/291 2289/3140/288 +f 2282/3144/292 2291/3145/293 2290/3143/291 +f 2283/3146/294 2292/3147/295 2291/3145/293 +f 2285/3148/296 2292/3147/295 2284/3149/297 +f 2286/3150/298 2293/3151/299 2285/3152/296 +f 2287/3139/287 2294/3153/300 2286/3150/298 +f 2304/3154/285 2311/3155/286 2303/3156/287 +f 2304/3154/285 2305/3157/288 2312/3158/289 +f 2297/3159/290 2306/3160/291 2305/3157/288 +f 2298/3161/292 2307/3162/293 2306/3160/291 +f 2299/3163/294 2308/3164/295 2307/3162/293 +f 2301/3165/296 2308/3164/295 2300/3166/297 +f 2302/3167/298 2309/3168/299 2301/3169/296 +f 2303/3156/287 2310/3170/300 2302/3167/298 +f 2327/3171/278 2320/3172/279 2319/3173/276 +f 2328/3174/280 2313/3175/281 2320/3172/279 +f 2321/3176/282 2314/3177/283 2313/3175/281 +f 2314/3177/283 2323/3178/271 2315/3179/270 +f 2315/3179/270 2324/3180/269 2316/3181/273 +f 2316/3181/273 2325/3182/272 2317/3183/275 +f 2317/3184/275 2326/3185/274 2318/3186/277 +f 2326/3185/274 2319/3173/276 2318/3186/277 +f 2343/3187/294 2336/3188/295 2335/3189/293 +f 2336/3188/295 2337/3190/296 2329/3191/299 +f 2329/3191/299 2338/3192/298 2330/3193/300 +f 2330/3193/300 2339/3194/287 2331/3195/286 +f 2331/3195/286 2340/3196/285 2332/3197/289 +f 2340/3196/285 2333/3198/288 2332/3197/289 +f 2341/3199/290 2334/3200/291 2333/3201/288 +f 2342/3202/292 2335/3189/293 2334/3200/291 +f 2256/3103/269 2272/3110/273 2271/3104/270 +f 2264/3106/269 2280/3114/273 2279/3107/270 +f 2249/3109/272 2265/3112/275 2272/3110/273 +f 2250/3111/274 2266/3118/277 2265/3112/275 +f 2257/3113/272 2273/3116/275 2280/3114/273 +f 2258/3115/274 2274/3120/277 2273/3116/275 +f 2250/3111/274 2251/3121/278 2267/3117/276 +f 2258/3115/274 2259/3123/278 2275/3119/276 +f 2251/3121/278 2252/3125/280 2268/3122/279 +f 2259/3123/278 2260/3127/280 2276/3124/279 +f 2252/3125/280 2253/3203/282 2269/3126/281 +f 2260/3127/280 2261/3204/282 2277/3128/281 +f 2253/3129/282 2254/3135/284 2270/3130/283 +f 2261/3132/282 2262/3136/284 2278/3133/283 +f 2255/3105/271 2271/3104/270 2270/3130/283 +f 2263/3108/271 2279/3107/270 2278/3133/283 +f 2288/3137/285 2296/3141/289 2295/3138/286 +f 2288/3137/285 2281/3142/290 2289/3140/288 +f 2281/3142/290 2282/3144/292 2290/3143/291 +f 2282/3144/292 2283/3146/294 2291/3145/293 +f 2283/3146/294 2284/3149/297 2292/3147/295 +f 2285/3148/296 2293/3205/299 2292/3147/295 +f 2286/3150/298 2294/3153/300 2293/3151/299 +f 2287/3139/287 2295/3138/286 2294/3153/300 +f 2304/3154/285 2312/3158/289 2311/3155/286 +f 2304/3154/285 2297/3159/290 2305/3157/288 +f 2297/3159/290 2298/3161/292 2306/3160/291 +f 2298/3161/292 2299/3163/294 2307/3162/293 +f 2299/3163/294 2300/3166/297 2308/3164/295 +f 2301/3165/296 2309/3206/299 2308/3164/295 +f 2302/3167/298 2310/3170/300 2309/3168/299 +f 2303/3156/287 2311/3155/286 2310/3170/300 +f 2327/3171/278 2328/3174/280 2320/3172/279 +f 2328/3174/280 2321/3176/282 2313/3175/281 +f 2321/3176/282 2322/3207/284 2314/3177/283 +f 2314/3177/283 2322/3207/284 2323/3178/271 +f 2315/3179/270 2323/3178/271 2324/3180/269 +f 2316/3181/273 2324/3180/269 2325/3182/272 +f 2317/3184/275 2325/3208/272 2326/3185/274 +f 2326/3185/274 2327/3171/278 2319/3173/276 +f 2343/3187/294 2344/3209/297 2336/3188/295 +f 2336/3188/295 2344/3209/297 2337/3190/296 +f 2329/3191/299 2337/3190/296 2338/3192/298 +f 2330/3193/300 2338/3192/298 2339/3194/287 +f 2331/3195/286 2339/3194/287 2340/3196/285 +f 2340/3196/285 2341/3210/290 2333/3198/288 +f 2341/3199/290 2342/3202/292 2334/3200/291 +f 2342/3202/292 2343/3187/294 2335/3189/293 o Cover v -1.000000 6.500000 0.500000 v 1.000000 6.500000 0.500000 @@ -7679,34 +8985,34 @@ vn 0.4082 -0.4082 0.8165 vn -0.4082 0.4082 -0.8165 vn 0.4082 0.4082 -0.8165 s off -f 1930/2737/301 1931/2738/301 1929/2739/301 -f 1933/2740/302 1935/2741/302 1934/2742/302 -f 1933/2740/303 1938/2743/303 1937/2744/303 -f 1936/2745/304 1939/2746/304 1935/2741/304 -f 1932/2747/305 1933/2748/305 1931/2738/305 -f 1929/2739/306 1935/2741/306 1930/2737/306 -f 1932/2747/307 1941/2749/307 1942/2750/307 -f 1931/2738/308 1943/2751/308 1929/2739/308 -f 1930/2752/309 1935/2753/309 1941/2749/309 -f 1929/2754/310 1943/2751/310 1934/2755/310 -f 1943/2751/304 1937/2756/304 1938/2757/304 -f 1931/2758/311 1933/2759/311 1944/2760/311 -f 1942/2750/303 1939/2761/303 1940/2762/303 -f 1932/2763/312 1942/2750/312 1936/2764/312 -f 1934/2755/313 1943/2751/313 1938/2757/313 -f 1941/2749/314 1935/2753/314 1939/2761/314 -f 1936/2764/315 1942/2750/315 1940/2762/315 -f 1944/2760/316 1933/2759/316 1937/2756/316 -f 1930/2737/301 1932/2747/301 1931/2738/301 -f 1933/2740/302 1936/2745/302 1935/2741/302 -f 1933/2740/303 1934/2742/303 1938/2743/303 -f 1936/2745/304 1940/2765/304 1939/2746/304 -f 1932/2747/305 1936/2766/305 1933/2748/305 -f 1929/2739/306 1934/2742/306 1935/2741/306 -f 1932/2747/307 1930/2737/307 1941/2749/307 -f 1931/2738/308 1944/2760/308 1943/2751/308 -f 1943/2751/304 1944/2760/304 1937/2756/304 -f 1942/2750/303 1941/2749/303 1939/2761/303 +f 2346/3211/301 2347/3212/301 2345/3213/301 +f 2349/3214/302 2351/3215/302 2350/3216/302 +f 2349/3214/303 2354/3217/303 2353/3218/303 +f 2352/3219/304 2355/3220/304 2351/3215/304 +f 2348/3221/305 2349/3222/305 2347/3212/305 +f 2345/3213/306 2351/3215/306 2346/3211/306 +f 2348/3221/307 2357/3223/307 2358/3224/307 +f 2347/3212/308 2359/3225/308 2345/3213/308 +f 2346/3226/309 2351/3227/309 2357/3223/309 +f 2345/3228/310 2359/3225/310 2350/3229/310 +f 2359/3225/304 2353/3230/304 2354/3231/304 +f 2347/3232/311 2349/3233/311 2360/3234/311 +f 2358/3224/303 2355/3235/303 2356/3236/303 +f 2348/3237/312 2358/3224/312 2352/3238/312 +f 2350/3229/313 2359/3225/313 2354/3231/313 +f 2357/3223/314 2351/3227/314 2355/3235/314 +f 2352/3238/315 2358/3224/315 2356/3236/315 +f 2360/3234/316 2349/3233/316 2353/3230/316 +f 2346/3211/301 2348/3221/301 2347/3212/301 +f 2349/3214/302 2352/3219/302 2351/3215/302 +f 2349/3214/303 2350/3216/303 2354/3217/303 +f 2352/3219/304 2356/3239/304 2355/3220/304 +f 2348/3221/305 2352/3240/305 2349/3222/305 +f 2345/3213/306 2350/3216/306 2351/3215/306 +f 2348/3221/307 2346/3211/307 2357/3223/307 +f 2347/3212/308 2360/3234/308 2359/3225/308 +f 2359/3225/304 2360/3234/304 2353/3230/304 +f 2358/3224/303 2357/3223/303 2355/3235/303 o Piston v 0.000000 4.999998 0.499994 v -0.574025 4.885818 0.499994 @@ -7889,103 +9195,103 @@ vn -0.0000 -1.0000 0.0000 vn 0.3827 -0.9239 0.0000 vn 0.7071 -0.7071 0.0000 s off -f 1959/2767/317 1974/2768/317 1958/2769/317 -f 1960/2770/317 1975/2771/317 1959/2772/317 -f 1945/2773/317 1976/2774/317 1960/2775/317 -f 1946/2776/317 1961/2777/317 1945/2778/317 -f 1946/2779/317 1963/2780/317 1962/2781/317 -f 1947/2782/317 1964/2783/317 1963/2780/317 -f 1948/2784/317 1965/2785/317 1964/2783/317 -f 1949/2786/317 1966/2787/317 1965/2785/317 -f 1950/2788/317 1967/2789/317 1966/2787/317 -f 1952/2790/317 1967/2789/317 1951/2791/317 -f 1952/2792/317 1969/2793/317 1968/2794/317 -f 1954/2795/317 1969/2796/317 1953/2797/317 -f 1955/2798/317 1970/2799/317 1954/2800/317 -f 1956/2801/317 1971/2802/317 1955/2803/317 -f 1957/2804/317 1972/2805/317 1956/2806/317 -f 1957/2807/317 1974/2768/317 1973/2808/317 -f 2006/2809/318 1991/2810/318 1990/2811/318 -f 2007/2812/318 1992/2813/318 1991/2814/318 -f 2008/2815/318 1978/2816/318 1992/2817/318 -f 1994/2818/318 1977/2819/318 1978/2820/318 -f 1977/2821/318 1995/2822/318 1979/2823/318 -f 1979/2824/318 1996/2825/318 1980/2826/318 -f 1996/2825/318 1981/2827/318 1980/2828/318 -f 1981/2829/318 1998/2830/318 1982/2831/318 -f 1982/2832/318 1999/2833/318 1983/2834/318 -f 1999/2833/318 1984/2835/318 1983/2836/318 -f 1984/2837/318 2001/2838/318 1985/2839/318 -f 2001/2840/318 1986/2841/318 1985/2842/318 -f 2002/2843/318 1987/2844/318 1986/2845/318 -f 2003/2846/318 1988/2847/318 1987/2848/318 -f 2004/2849/318 1989/2850/318 1988/2851/318 -f 1989/2852/318 2006/2809/318 1990/2853/318 -f 1959/2767/317 1975/2771/317 1974/2768/317 -f 1960/2770/317 1976/2774/317 1975/2771/317 -f 1945/2773/317 1961/2777/317 1976/2774/317 -f 1946/2776/317 1962/2781/317 1961/2777/317 -f 1946/2779/317 1947/2854/317 1963/2780/317 -f 1947/2782/317 1948/2855/317 1964/2783/317 -f 1948/2784/317 1949/2856/317 1965/2785/317 -f 1949/2786/317 1950/2857/317 1966/2787/317 -f 1950/2788/317 1951/2858/317 1967/2789/317 -f 1952/2790/317 1968/2794/317 1967/2789/317 -f 1952/2792/317 1953/2859/317 1969/2793/317 -f 1954/2795/317 1970/2799/317 1969/2796/317 -f 1955/2798/317 1971/2802/317 1970/2799/317 -f 1956/2801/317 1972/2805/317 1971/2802/317 -f 1957/2804/317 1973/2808/317 1972/2805/317 -f 1957/2807/317 1958/2860/317 1974/2768/317 -f 2006/2809/318 2007/2812/318 1991/2810/318 -f 2007/2812/318 2008/2815/318 1992/2813/318 -f 2008/2815/318 1994/2818/318 1978/2816/318 -f 1994/2818/318 1993/2861/318 1977/2819/318 -f 1977/2821/318 1993/2861/318 1995/2822/318 -f 1979/2824/318 1995/2822/318 1996/2825/318 -f 1996/2825/318 1997/2862/318 1981/2827/318 -f 1981/2829/318 1997/2862/318 1998/2830/318 -f 1982/2832/318 1998/2830/318 1999/2833/318 -f 1999/2833/318 2000/2863/318 1984/2835/318 -f 1984/2837/318 2000/2863/318 2001/2838/318 -f 2001/2840/318 2002/2843/318 1986/2841/318 -f 2002/2843/318 2003/2846/318 1987/2844/318 -f 2003/2846/318 2004/2849/318 1988/2847/318 -f 2004/2849/318 2005/2864/318 1989/2850/318 -f 1989/2852/318 2005/2864/318 2006/2809/318 +f 2375/3241/317 2390/3242/317 2374/3243/317 +f 2376/3244/317 2391/3245/317 2375/3246/317 +f 2361/3247/317 2392/3248/317 2376/3249/317 +f 2362/3250/317 2377/3251/317 2361/3252/317 +f 2362/3253/317 2379/3254/317 2378/3255/317 +f 2363/3256/317 2380/3257/317 2379/3254/317 +f 2364/3258/317 2381/3259/317 2380/3257/317 +f 2365/3260/317 2382/3261/317 2381/3259/317 +f 2366/3262/317 2383/3263/317 2382/3261/317 +f 2368/3264/317 2383/3263/317 2367/3265/317 +f 2368/3266/317 2385/3267/317 2384/3268/317 +f 2370/3269/317 2385/3270/317 2369/3271/317 +f 2371/3272/317 2386/3273/317 2370/3274/317 +f 2372/3275/317 2387/3276/317 2371/3277/317 +f 2373/3278/317 2388/3279/317 2372/3280/317 +f 2373/3281/317 2390/3242/317 2389/3282/317 +f 2422/3283/318 2407/3284/318 2406/3285/318 +f 2423/3286/318 2408/3287/318 2407/3288/318 +f 2424/3289/318 2394/3290/318 2408/3291/318 +f 2410/3292/318 2393/3293/318 2394/3294/318 +f 2393/3295/318 2411/3296/318 2395/3297/318 +f 2395/3298/318 2412/3299/318 2396/3300/318 +f 2412/3299/318 2397/3301/318 2396/3302/318 +f 2397/3303/318 2414/3304/318 2398/3305/318 +f 2398/3306/318 2415/3307/318 2399/3308/318 +f 2415/3307/318 2400/3309/318 2399/3310/318 +f 2400/3311/318 2417/3312/318 2401/3313/318 +f 2417/3314/318 2402/3315/318 2401/3316/318 +f 2418/3317/318 2403/3318/318 2402/3319/318 +f 2419/3320/318 2404/3321/318 2403/3322/318 +f 2420/3323/318 2405/3324/318 2404/3325/318 +f 2405/3326/318 2422/3283/318 2406/3327/318 +f 2375/3241/317 2391/3245/317 2390/3242/317 +f 2376/3244/317 2392/3248/317 2391/3245/317 +f 2361/3247/317 2377/3251/317 2392/3248/317 +f 2362/3250/317 2378/3255/317 2377/3251/317 +f 2362/3253/317 2363/3328/317 2379/3254/317 +f 2363/3256/317 2364/3329/317 2380/3257/317 +f 2364/3258/317 2365/3330/317 2381/3259/317 +f 2365/3260/317 2366/3331/317 2382/3261/317 +f 2366/3262/317 2367/3332/317 2383/3263/317 +f 2368/3264/317 2384/3268/317 2383/3263/317 +f 2368/3266/317 2369/3333/317 2385/3267/317 +f 2370/3269/317 2386/3273/317 2385/3270/317 +f 2371/3272/317 2387/3276/317 2386/3273/317 +f 2372/3275/317 2388/3279/317 2387/3276/317 +f 2373/3278/317 2389/3282/317 2388/3279/317 +f 2373/3281/317 2374/3334/317 2390/3242/317 +f 2422/3283/318 2423/3286/318 2407/3284/318 +f 2423/3286/318 2424/3289/318 2408/3287/318 +f 2424/3289/318 2410/3292/318 2394/3290/318 +f 2410/3292/318 2409/3335/318 2393/3293/318 +f 2393/3295/318 2409/3335/318 2411/3296/318 +f 2395/3298/318 2411/3296/318 2412/3299/318 +f 2412/3299/318 2413/3336/318 2397/3301/318 +f 2397/3303/318 2413/3336/318 2414/3304/318 +f 2398/3306/318 2414/3304/318 2415/3307/318 +f 2415/3307/318 2416/3337/318 2400/3309/318 +f 2400/3311/318 2416/3337/318 2417/3312/318 +f 2417/3314/318 2418/3317/318 2402/3315/318 +f 2418/3317/318 2419/3320/318 2403/3318/318 +f 2419/3320/318 2420/3323/318 2404/3321/318 +f 2420/3323/318 2421/3338/318 2405/3324/318 +f 2405/3326/318 2421/3338/318 2422/3283/318 s 1 -f 1973/2808/319 2004/2849/320 1972/2805/320 -f 1974/2768/321 2005/2864/319 1973/2808/319 -f 1975/2771/322 2006/2809/321 1974/2768/321 -f 1962/2781/323 1994/2818/324 1961/2777/324 -f 1976/2774/325 2007/2812/322 1975/2771/322 -f 1963/2780/326 1993/2861/323 1962/2781/323 -f 1961/2777/324 2008/2815/325 1976/2774/325 -f 1964/2783/327 1995/2822/326 1963/2780/326 -f 1965/2785/328 1996/2825/327 1964/2783/327 -f 1966/2787/329 1997/2862/328 1965/2785/328 -f 1967/2789/330 1998/2830/329 1966/2787/329 -f 1968/2794/331 1999/2833/330 1967/2789/330 -f 1969/2793/332 2000/2863/331 1968/2794/331 -f 1970/2799/333 2001/2840/332 1969/2796/332 -f 1971/2802/334 2002/2843/333 1970/2799/333 -f 1972/2805/320 2003/2846/334 1971/2802/334 -f 1973/2808/319 2005/2864/319 2004/2849/320 -f 1974/2768/321 2006/2809/321 2005/2864/319 -f 1975/2771/322 2007/2812/322 2006/2809/321 -f 1962/2781/323 1993/2861/323 1994/2818/324 -f 1976/2774/325 2008/2815/325 2007/2812/322 -f 1963/2780/326 1995/2822/326 1993/2861/323 -f 1961/2777/324 1994/2818/324 2008/2815/325 -f 1964/2783/327 1996/2825/327 1995/2822/326 -f 1965/2785/328 1997/2862/328 1996/2825/327 -f 1966/2787/329 1998/2830/329 1997/2862/328 -f 1967/2789/330 1999/2833/330 1998/2830/329 -f 1968/2794/331 2000/2863/331 1999/2833/330 -f 1969/2793/332 2001/2838/332 2000/2863/331 -f 1970/2799/333 2002/2843/333 2001/2840/332 -f 1971/2802/334 2003/2846/334 2002/2843/333 -f 1972/2805/320 2004/2849/320 2003/2846/334 +f 2389/3282/319 2420/3323/320 2388/3279/320 +f 2390/3242/321 2421/3338/319 2389/3282/319 +f 2391/3245/322 2422/3283/321 2390/3242/321 +f 2378/3255/323 2410/3292/324 2377/3251/324 +f 2392/3248/325 2423/3286/322 2391/3245/322 +f 2379/3254/326 2409/3335/323 2378/3255/323 +f 2377/3251/324 2424/3289/325 2392/3248/325 +f 2380/3257/327 2411/3296/326 2379/3254/326 +f 2381/3259/328 2412/3299/327 2380/3257/327 +f 2382/3261/329 2413/3336/328 2381/3259/328 +f 2383/3263/330 2414/3304/329 2382/3261/329 +f 2384/3268/331 2415/3307/330 2383/3263/330 +f 2385/3267/332 2416/3337/331 2384/3268/331 +f 2386/3273/333 2417/3314/332 2385/3270/332 +f 2387/3276/334 2418/3317/333 2386/3273/333 +f 2388/3279/320 2419/3320/334 2387/3276/334 +f 2389/3282/319 2421/3338/319 2420/3323/320 +f 2390/3242/321 2422/3283/321 2421/3338/319 +f 2391/3245/322 2423/3286/322 2422/3283/321 +f 2378/3255/323 2409/3335/323 2410/3292/324 +f 2392/3248/325 2424/3289/325 2423/3286/322 +f 2379/3254/326 2411/3296/326 2409/3335/323 +f 2377/3251/324 2410/3292/324 2424/3289/325 +f 2380/3257/327 2412/3299/327 2411/3296/326 +f 2381/3259/328 2413/3336/328 2412/3299/327 +f 2382/3261/329 2414/3304/329 2413/3336/328 +f 2383/3263/330 2415/3307/330 2414/3304/329 +f 2384/3268/331 2416/3337/331 2415/3307/330 +f 2385/3267/332 2417/3312/332 2416/3337/331 +f 2386/3273/333 2418/3317/333 2417/3314/332 +f 2387/3276/334 2419/3320/334 2418/3317/333 +f 2388/3279/320 2420/3323/320 2419/3320/334 o Flap v -0.750000 6.812501 8.750000 v 0.750000 6.812501 8.750000 @@ -8049,30 +9355,30 @@ vn -0.9965 0.0000 -0.0830 vn 0.9965 -0.0000 -0.0830 vn 0.0000 -0.9965 -0.0830 s off -f 2011/2865/335 2010/2866/335 2009/2867/335 -f 2014/2868/336 2009/2867/336 2010/2866/336 -f 2011/2865/337 2014/2869/337 2012/2870/337 -f 2010/2866/338 2012/2870/338 2014/2871/338 -f 2009/2867/339 2013/2872/339 2011/2865/339 -f 2017/2873/340 2030/2874/340 2029/2875/340 -f 2017/2873/341 2027/2876/341 2015/2877/341 -f 2018/2878/342 2028/2879/342 2030/2874/342 -f 2026/2880/343 2021/2881/343 2025/2882/343 -f 2025/2882/342 2019/2883/342 2023/2884/342 -f 2026/2885/341 2020/2886/341 2022/2887/341 -f 2024/2888/340 2019/2883/340 2020/2886/340 -f 2016/2889/343 2027/2890/343 2028/2879/343 -f 2011/2865/335 2012/2870/335 2010/2866/335 -f 2014/2868/336 2013/2891/336 2009/2867/336 -f 2011/2865/337 2013/2892/337 2014/2869/337 -f 2017/2873/340 2018/2878/340 2030/2874/340 -f 2017/2873/341 2029/2875/341 2027/2876/341 -f 2018/2878/342 2016/2889/342 2028/2879/342 -f 2026/2880/343 2022/2893/343 2021/2881/343 -f 2025/2882/342 2021/2881/342 2019/2883/342 -f 2026/2885/341 2024/2888/341 2020/2886/341 -f 2024/2888/340 2023/2884/340 2019/2883/340 -f 2016/2889/343 2015/2894/343 2027/2890/343 +f 2427/3339/335 2426/3340/335 2425/3341/335 +f 2430/3342/336 2425/3341/336 2426/3340/336 +f 2427/3339/337 2430/3343/337 2428/3344/337 +f 2426/3340/338 2428/3344/338 2430/3345/338 +f 2425/3341/339 2429/3346/339 2427/3339/339 +f 2433/3347/340 2446/3348/340 2445/3349/340 +f 2433/3347/341 2443/3350/341 2431/3351/341 +f 2434/3352/342 2444/3353/342 2446/3348/342 +f 2442/3354/343 2437/3355/343 2441/3356/343 +f 2441/3356/342 2435/3357/342 2439/3358/342 +f 2442/3359/341 2436/3360/341 2438/3361/341 +f 2440/3362/340 2435/3357/340 2436/3360/340 +f 2432/3363/343 2443/3364/343 2444/3353/343 +f 2427/3339/335 2428/3344/335 2426/3340/335 +f 2430/3342/336 2429/3365/336 2425/3341/336 +f 2427/3339/337 2429/3366/337 2430/3343/337 +f 2433/3347/340 2434/3352/340 2446/3348/340 +f 2433/3347/341 2445/3349/341 2443/3350/341 +f 2434/3352/342 2432/3363/342 2444/3353/342 +f 2442/3354/343 2438/3367/343 2437/3355/343 +f 2441/3356/342 2437/3355/342 2435/3357/342 +f 2442/3359/341 2440/3362/341 2436/3360/341 +f 2440/3362/340 2439/3358/340 2435/3357/340 +f 2432/3363/343 2431/3368/343 2443/3364/343 o TurbineBack v -0.562500 3.249998 -5.250007 v 0.562500 3.249998 -5.250007 @@ -8285,87 +9591,87 @@ vn -0.6906 -0.6906 0.2146 vn -0.6906 0.6906 -0.2146 vn -0.6906 0.6906 0.2146 s off -f 2053/2895/344 2045/2896/344 2043/2897/344 -f 2047/2898/345 2037/2899/345 2034/2900/345 -f 2045/2901/344 2048/2902/344 2042/2903/344 -f 2051/2904/345 2035/2905/345 2037/2906/345 -f 2057/2907/344 2041/2908/344 2039/2909/344 -f 2055/2910/345 2031/2911/345 2033/2912/345 -f 2038/2913/345 2059/2914/345 2032/2915/345 -f 2062/2916/344 2046/2917/344 2040/2918/344 -f 2064/2919/345 2033/2920/345 2035/2921/345 -f 2066/2922/344 2043/2923/344 2041/2924/344 -f 2069/2925/344 2044/2926/344 2046/2927/344 -f 2067/2928/345 2038/2929/345 2036/2930/345 -f 2067/2928/346 2036/2931/346 2046/2932/346 -f 2073/2933/344 2040/2934/344 2042/2935/344 -f 2060/2936/347 2040/2937/347 2072/2938/347 -f 2071/2939/345 2034/2940/345 2032/2941/345 -f 2042/2942/348 2071/2939/348 2032/2943/348 -f 2047/2898/349 2045/2944/349 2052/2945/349 -f 2077/2946/344 2039/2947/344 2044/2948/344 -f 2051/2904/350 2043/2949/350 2065/2950/350 -f 2031/2951/345 2078/2952/345 2036/2953/345 -f 2044/2954/351 2075/2955/351 2031/2956/351 -f 2055/2910/352 2039/2957/352 2076/2958/352 -f 2056/2959/353 2064/2919/353 2041/2960/353 -f 2054/2961/354 2066/2922/354 2041/2962/354 -f 2050/2963/355 2053/2895/355 2043/2964/355 -f 2049/2965/356 2045/2966/356 2074/2967/356 -f 2059/2914/357 2073/2933/357 2042/2968/357 -f 2062/2916/358 2040/2969/358 2070/2970/358 -f 2036/2971/359 2078/2952/359 2046/2972/359 -f 2058/2973/360 2077/2946/360 2044/2974/360 -f 2039/2975/361 2033/2976/361 2063/2977/361 -f 2042/2968/362 2032/2978/362 2059/2914/362 -f 2074/2967/363 2045/2966/363 2034/2979/363 -f 2043/2964/364 2037/2980/364 2050/2963/364 -f 2041/2962/365 2035/2981/365 2054/2961/365 -f 2063/2977/366 2057/2907/366 2039/2975/366 -f 2044/2974/367 2031/2982/367 2058/2973/367 -f 2046/2972/368 2078/2952/368 2069/2925/368 -f 2070/2970/369 2040/2969/369 2038/2983/369 -f 2040/2937/370 2060/2936/370 2038/2984/370 -f 2071/2939/371 2042/2942/371 2048/2902/371 -f 2045/2944/372 2047/2898/372 2034/2985/372 -f 2043/2949/373 2051/2904/373 2037/2986/373 -f 2041/2960/374 2064/2919/374 2035/2987/374 -f 2039/2957/375 2055/2910/375 2033/2988/375 -f 2075/2955/376 2044/2954/376 2068/2989/376 -f 2046/2932/377 2061/2990/377 2067/2928/377 -f 2053/2895/344 2052/2945/344 2045/2896/344 -f 2047/2898/345 2050/2963/345 2037/2899/345 -f 2045/2901/344 2049/2965/344 2048/2902/344 -f 2051/2904/345 2054/2961/345 2035/2905/345 -f 2057/2907/344 2056/2959/344 2041/2908/344 -f 2055/2910/345 2058/2973/345 2031/2911/345 -f 2038/2913/345 2060/2936/345 2059/2914/345 -f 2062/2916/344 2061/2990/344 2046/2917/344 -f 2064/2919/345 2063/2977/345 2033/2920/345 -f 2066/2922/344 2065/2950/344 2043/2923/344 -f 2069/2925/344 2068/2989/344 2044/2926/344 -f 2067/2928/345 2070/2970/345 2038/2929/345 -f 2073/2933/344 2072/2938/344 2040/2934/344 -f 2071/2939/345 2074/2967/345 2034/2940/345 -f 2077/2946/344 2076/2958/344 2039/2947/344 -f 2031/2951/345 2075/2955/345 2078/2952/345 +f 2469/3369/344 2461/3370/344 2459/3371/344 +f 2463/3372/345 2453/3373/345 2450/3374/345 +f 2461/3375/344 2464/3376/344 2458/3377/344 +f 2467/3378/345 2451/3379/345 2453/3380/345 +f 2473/3381/344 2457/3382/344 2455/3383/344 +f 2471/3384/345 2447/3385/345 2449/3386/345 +f 2454/3387/345 2475/3388/345 2448/3389/345 +f 2478/3390/344 2462/3391/344 2456/3392/344 +f 2480/3393/345 2449/3394/345 2451/3395/345 +f 2482/3396/344 2459/3397/344 2457/3398/344 +f 2485/3399/344 2460/3400/344 2462/3401/344 +f 2483/3402/345 2454/3403/345 2452/3404/345 +f 2483/3402/346 2452/3405/346 2462/3406/346 +f 2489/3407/344 2456/3408/344 2458/3409/344 +f 2476/3410/347 2456/3411/347 2488/3412/347 +f 2487/3413/345 2450/3414/345 2448/3415/345 +f 2458/3416/348 2487/3413/348 2448/3417/348 +f 2463/3372/349 2461/3418/349 2468/3419/349 +f 2493/3420/344 2455/3421/344 2460/3422/344 +f 2467/3378/350 2459/3423/350 2481/3424/350 +f 2447/3425/345 2494/3426/345 2452/3427/345 +f 2460/3428/351 2491/3429/351 2447/3430/351 +f 2471/3384/352 2455/3431/352 2492/3432/352 +f 2472/3433/353 2480/3393/353 2457/3434/353 +f 2470/3435/354 2482/3396/354 2457/3436/354 +f 2466/3437/355 2469/3369/355 2459/3438/355 +f 2465/3439/356 2461/3440/356 2490/3441/356 +f 2475/3388/357 2489/3407/357 2458/3442/357 +f 2478/3390/358 2456/3443/358 2486/3444/358 +f 2452/3445/359 2494/3426/359 2462/3446/359 +f 2474/3447/360 2493/3420/360 2460/3448/360 +f 2455/3449/361 2449/3450/361 2479/3451/361 +f 2458/3442/362 2448/3452/362 2475/3388/362 +f 2490/3441/363 2461/3440/363 2450/3453/363 +f 2459/3438/364 2453/3454/364 2466/3437/364 +f 2457/3436/365 2451/3455/365 2470/3435/365 +f 2479/3451/366 2473/3381/366 2455/3449/366 +f 2460/3448/367 2447/3456/367 2474/3447/367 +f 2462/3446/368 2494/3426/368 2485/3399/368 +f 2486/3444/369 2456/3443/369 2454/3457/369 +f 2456/3411/370 2476/3410/370 2454/3458/370 +f 2487/3413/371 2458/3416/371 2464/3376/371 +f 2461/3418/372 2463/3372/372 2450/3459/372 +f 2459/3423/373 2467/3378/373 2453/3460/373 +f 2457/3434/374 2480/3393/374 2451/3461/374 +f 2455/3431/375 2471/3384/375 2449/3462/375 +f 2491/3429/376 2460/3428/376 2484/3463/376 +f 2462/3406/377 2477/3464/377 2483/3402/377 +f 2469/3369/344 2468/3419/344 2461/3370/344 +f 2463/3372/345 2466/3437/345 2453/3373/345 +f 2461/3375/344 2465/3439/344 2464/3376/344 +f 2467/3378/345 2470/3435/345 2451/3379/345 +f 2473/3381/344 2472/3433/344 2457/3382/344 +f 2471/3384/345 2474/3447/345 2447/3385/345 +f 2454/3387/345 2476/3410/345 2475/3388/345 +f 2478/3390/344 2477/3464/344 2462/3391/344 +f 2480/3393/345 2479/3451/345 2449/3394/345 +f 2482/3396/344 2481/3424/344 2459/3397/344 +f 2485/3399/344 2484/3463/344 2460/3400/344 +f 2483/3402/345 2486/3444/345 2454/3403/345 +f 2489/3407/344 2488/3412/344 2456/3408/344 +f 2487/3413/345 2490/3441/345 2450/3414/345 +f 2493/3420/344 2492/3432/344 2455/3421/344 +f 2447/3425/345 2491/3429/345 2494/3426/345 s 1 -f 2051/2904/378 2065/2950/379 2054/2961/380 -f 2047/2898/381 2052/2945/382 2050/2963/383 -f 2049/2965/384 2074/2967/385 2048/2902/386 -f 2060/2936/387 2072/2938/388 2059/2914/389 -f 2067/2928/390 2061/2990/391 2070/2970/392 -f 2069/2925/393 2078/2952/394 2068/2989/395 -f 2055/2910/396 2076/2958/397 2058/2973/398 -f 2057/2907/399 2063/2977/400 2056/2959/401 -f 2050/2963/383 2052/2945/382 2053/2895/402 -f 2048/2902/386 2074/2967/385 2071/2939/403 -f 2059/2914/389 2072/2938/388 2073/2933/404 -f 2070/2970/392 2061/2990/391 2062/2916/405 -f 2068/2989/395 2078/2952/394 2075/2955/406 -f 2058/2973/398 2076/2958/397 2077/2946/407 -f 2056/2959/401 2063/2977/400 2064/2919/408 -f 2054/2961/380 2065/2950/379 2066/2922/409 +f 2467/3378/378 2481/3424/379 2470/3435/380 +f 2463/3372/381 2468/3419/382 2466/3437/383 +f 2465/3439/384 2490/3441/385 2464/3376/386 +f 2476/3410/387 2488/3412/388 2475/3388/389 +f 2483/3402/390 2477/3464/391 2486/3444/392 +f 2485/3399/393 2494/3426/394 2484/3463/395 +f 2471/3384/396 2492/3432/397 2474/3447/398 +f 2473/3381/399 2479/3451/400 2472/3433/401 +f 2466/3437/383 2468/3419/382 2469/3369/402 +f 2464/3376/386 2490/3441/385 2487/3413/403 +f 2475/3388/389 2488/3412/388 2489/3407/404 +f 2486/3444/392 2477/3464/391 2478/3390/405 +f 2484/3463/395 2494/3426/394 2491/3429/406 +f 2474/3447/398 2492/3432/397 2493/3420/407 +f 2472/3433/401 2479/3451/400 2480/3393/408 +f 2470/3435/380 2481/3424/379 2482/3396/409 o TurbineFront v -0.562500 3.249998 -4.250007 v 0.562500 3.249998 -4.250007 @@ -8578,87 +9884,87 @@ vn -0.6906 -0.6906 0.2146 vn -0.6906 0.6906 -0.2146 vn -0.6906 0.6906 0.2146 s off -f 2101/2991/410 2093/2992/410 2091/2993/410 -f 2095/2994/411 2085/2995/411 2082/2996/411 -f 2093/2997/410 2096/2998/410 2090/2999/410 -f 2099/3000/411 2083/3001/411 2085/3002/411 -f 2105/3003/410 2089/3004/410 2087/3005/410 -f 2103/3006/411 2079/3007/411 2081/3008/411 -f 2086/3009/411 2107/3010/411 2080/3011/411 -f 2110/3012/410 2094/3013/410 2088/3014/410 -f 2112/3015/411 2081/3016/411 2083/3017/411 -f 2089/3018/410 2113/3019/410 2091/3020/410 -f 2117/3021/410 2092/3022/410 2094/3023/410 -f 2115/3024/411 2086/3025/411 2084/3026/411 -f 2115/3024/412 2084/3027/412 2094/3028/412 -f 2121/3029/410 2088/3030/410 2090/3031/410 -f 2108/3032/413 2088/3033/413 2120/3034/413 -f 2119/3035/411 2082/3036/411 2080/3037/411 -f 2090/3038/414 2119/3035/414 2080/3039/414 -f 2095/2994/415 2093/3040/415 2100/3041/415 -f 2125/3042/410 2087/3043/410 2092/3044/410 -f 2099/3000/416 2091/3045/416 2113/3019/416 -f 2079/3046/411 2126/3047/411 2084/3048/411 -f 2092/3049/417 2123/3050/417 2079/3051/417 -f 2103/3006/418 2087/3052/418 2124/3053/418 -f 2104/3054/419 2112/3015/419 2089/3055/419 -f 2102/3056/420 2114/3057/420 2089/3058/420 -f 2098/3059/421 2101/2991/421 2091/3060/421 -f 2097/3061/422 2093/3062/422 2122/3063/422 -f 2107/3010/423 2121/3029/423 2090/3064/423 -f 2110/3012/424 2088/3065/424 2118/3066/424 -f 2084/3067/425 2126/3047/425 2094/3068/425 -f 2106/3069/426 2125/3042/426 2092/3070/426 -f 2087/3071/427 2111/3072/427 2105/3003/427 -f 2091/3045/428 2099/3000/428 2085/3073/428 -f 2089/3055/429 2112/3015/429 2083/3074/429 -f 2087/3052/430 2103/3006/430 2081/3075/430 -f 2123/3050/431 2092/3049/431 2116/3076/431 -f 2094/3028/432 2109/3077/432 2115/3024/432 -f 2088/3033/433 2108/3032/433 2086/3078/433 -f 2119/3035/434 2090/3038/434 2096/2998/434 -f 2093/3040/435 2095/2994/435 2082/3079/435 -f 2091/3060/436 2085/3080/436 2098/3059/436 -f 2122/3063/437 2093/3062/437 2082/3081/437 -f 2090/3064/438 2080/3082/438 2107/3010/438 -f 2118/3066/439 2088/3065/439 2086/3083/439 -f 2094/3068/440 2126/3047/440 2117/3021/440 -f 2092/3070/441 2079/3084/441 2106/3069/441 -f 2111/3072/442 2087/3071/442 2081/3085/442 -f 2089/3058/443 2083/3086/443 2102/3056/443 -f 2101/2991/410 2100/3041/410 2093/2992/410 -f 2095/2994/411 2098/3059/411 2085/2995/411 -f 2093/2997/410 2097/3061/410 2096/2998/410 -f 2099/3000/411 2102/3056/411 2083/3001/411 -f 2105/3003/410 2104/3054/410 2089/3004/410 -f 2103/3006/411 2106/3069/411 2079/3007/411 -f 2086/3009/411 2108/3032/411 2107/3010/411 -f 2110/3012/410 2109/3077/410 2094/3013/410 -f 2112/3015/411 2111/3072/411 2081/3016/411 -f 2089/3018/410 2114/3057/410 2113/3019/410 -f 2117/3021/410 2116/3076/410 2092/3022/410 -f 2115/3024/411 2118/3066/411 2086/3025/411 -f 2121/3029/410 2120/3034/410 2088/3030/410 -f 2119/3035/411 2122/3063/411 2082/3036/411 -f 2125/3042/410 2124/3053/410 2087/3043/410 -f 2079/3046/411 2123/3050/411 2126/3047/411 +f 2517/3465/410 2509/3466/410 2507/3467/410 +f 2511/3468/411 2501/3469/411 2498/3470/411 +f 2509/3471/410 2512/3472/410 2506/3473/410 +f 2515/3474/411 2499/3475/411 2501/3476/411 +f 2521/3477/410 2505/3478/410 2503/3479/410 +f 2519/3480/411 2495/3481/411 2497/3482/411 +f 2502/3483/411 2523/3484/411 2496/3485/411 +f 2526/3486/410 2510/3487/410 2504/3488/410 +f 2528/3489/411 2497/3490/411 2499/3491/411 +f 2505/3492/410 2529/3493/410 2507/3494/410 +f 2533/3495/410 2508/3496/410 2510/3497/410 +f 2531/3498/411 2502/3499/411 2500/3500/411 +f 2531/3498/412 2500/3501/412 2510/3502/412 +f 2537/3503/410 2504/3504/410 2506/3505/410 +f 2524/3506/413 2504/3507/413 2536/3508/413 +f 2535/3509/411 2498/3510/411 2496/3511/411 +f 2506/3512/414 2535/3509/414 2496/3513/414 +f 2511/3468/415 2509/3514/415 2516/3515/415 +f 2541/3516/410 2503/3517/410 2508/3518/410 +f 2515/3474/416 2507/3519/416 2529/3493/416 +f 2495/3520/411 2542/3521/411 2500/3522/411 +f 2508/3523/417 2539/3524/417 2495/3525/417 +f 2519/3480/418 2503/3526/418 2540/3527/418 +f 2520/3528/419 2528/3489/419 2505/3529/419 +f 2518/3530/420 2530/3531/420 2505/3532/420 +f 2514/3533/421 2517/3465/421 2507/3534/421 +f 2513/3535/422 2509/3536/422 2538/3537/422 +f 2523/3484/423 2537/3503/423 2506/3538/423 +f 2526/3486/424 2504/3539/424 2534/3540/424 +f 2500/3541/425 2542/3521/425 2510/3542/425 +f 2522/3543/426 2541/3516/426 2508/3544/426 +f 2503/3545/427 2527/3546/427 2521/3477/427 +f 2507/3519/428 2515/3474/428 2501/3547/428 +f 2505/3529/429 2528/3489/429 2499/3548/429 +f 2503/3526/430 2519/3480/430 2497/3549/430 +f 2539/3524/431 2508/3523/431 2532/3550/431 +f 2510/3502/432 2525/3551/432 2531/3498/432 +f 2504/3507/433 2524/3506/433 2502/3552/433 +f 2535/3509/434 2506/3512/434 2512/3472/434 +f 2509/3514/435 2511/3468/435 2498/3553/435 +f 2507/3534/436 2501/3554/436 2514/3533/436 +f 2538/3537/437 2509/3536/437 2498/3555/437 +f 2506/3538/438 2496/3556/438 2523/3484/438 +f 2534/3540/439 2504/3539/439 2502/3557/439 +f 2510/3542/440 2542/3521/440 2533/3495/440 +f 2508/3544/441 2495/3558/441 2522/3543/441 +f 2527/3546/442 2503/3545/442 2497/3559/442 +f 2505/3532/443 2499/3560/443 2518/3530/443 +f 2517/3465/410 2516/3515/410 2509/3466/410 +f 2511/3468/411 2514/3533/411 2501/3469/411 +f 2509/3471/410 2513/3535/410 2512/3472/410 +f 2515/3474/411 2518/3530/411 2499/3475/411 +f 2521/3477/410 2520/3528/410 2505/3478/410 +f 2519/3480/411 2522/3543/411 2495/3481/411 +f 2502/3483/411 2524/3506/411 2523/3484/411 +f 2526/3486/410 2525/3551/410 2510/3487/410 +f 2528/3489/411 2527/3546/411 2497/3490/411 +f 2505/3492/410 2530/3531/410 2529/3493/410 +f 2533/3495/410 2532/3550/410 2508/3496/410 +f 2531/3498/411 2534/3540/411 2502/3499/411 +f 2537/3503/410 2536/3508/410 2504/3504/410 +f 2535/3509/411 2538/3537/411 2498/3510/411 +f 2541/3516/410 2540/3527/410 2503/3517/410 +f 2495/3520/411 2539/3524/411 2542/3521/411 s 1 -f 2099/3000/444 2113/3019/445 2102/3056/446 -f 2095/2994/447 2100/3041/448 2098/3059/449 -f 2097/3061/450 2122/3063/451 2096/2998/452 -f 2108/3032/453 2120/3034/454 2107/3010/455 -f 2115/3024/456 2109/3077/457 2118/3066/458 -f 2117/3021/459 2126/3047/460 2116/3076/461 -f 2103/3006/462 2124/3053/463 2106/3069/464 -f 2105/3003/465 2111/3072/466 2104/3054/467 -f 2098/3059/449 2100/3041/448 2101/2991/468 -f 2096/2998/452 2122/3063/451 2119/3035/469 -f 2107/3010/455 2120/3034/454 2121/3029/470 -f 2118/3066/458 2109/3077/457 2110/3012/471 -f 2116/3076/461 2126/3047/460 2123/3050/472 -f 2106/3069/464 2124/3053/463 2125/3042/473 -f 2104/3054/467 2111/3072/466 2112/3015/474 -f 2102/3056/446 2113/3019/445 2114/3057/475 +f 2515/3474/444 2529/3493/445 2518/3530/446 +f 2511/3468/447 2516/3515/448 2514/3533/449 +f 2513/3535/450 2538/3537/451 2512/3472/452 +f 2524/3506/453 2536/3508/454 2523/3484/455 +f 2531/3498/456 2525/3551/457 2534/3540/458 +f 2533/3495/459 2542/3521/460 2532/3550/461 +f 2519/3480/462 2540/3527/463 2522/3543/464 +f 2521/3477/465 2527/3546/466 2520/3528/467 +f 2514/3533/449 2516/3515/448 2517/3465/468 +f 2512/3472/452 2538/3537/451 2535/3509/469 +f 2523/3484/455 2536/3508/454 2537/3503/470 +f 2534/3540/458 2525/3551/457 2526/3486/471 +f 2532/3550/461 2542/3521/460 2539/3524/472 +f 2522/3543/464 2540/3527/463 2541/3516/473 +f 2520/3528/467 2527/3546/466 2528/3489/474 +f 2518/3530/446 2529/3493/445 2530/3531/475 o Rotor v -0.562500 3.249998 -1.250006 v 0.562500 3.249998 -1.250006 @@ -8815,86 +10121,86 @@ vn -1.0000 0.0000 0.0000 vn 0.0000 -1.0000 0.0000 vn -0.7071 -0.7071 0.0000 s off -f 2144/3087/476 2146/3088/476 2143/3089/476 -f 2144/3087/477 2130/3090/477 2138/3091/477 -f 2141/3092/478 2144/3087/478 2138/3093/478 -f 2146/3088/479 2141/3094/479 2133/3095/479 -f 2143/3089/480 2133/3096/480 2130/3097/480 -f 2148/3098/481 2150/3099/481 2147/3100/481 -f 2148/3098/482 2133/3101/482 2141/3102/482 -f 2149/3103/478 2141/3104/478 2139/3105/478 -f 2150/3099/483 2139/3106/483 2131/3107/483 -f 2147/3100/480 2131/3108/480 2133/3109/480 -f 2152/3110/483 2154/3111/483 2151/3112/483 -f 2152/3110/481 2129/3113/481 2137/3114/481 -f 2153/3115/478 2137/3116/478 2135/3117/478 -f 2154/3111/484 2135/3118/484 2127/3119/484 -f 2151/3112/480 2127/3120/480 2129/3121/480 -f 2156/3122/477 2158/3123/477 2155/3124/477 -f 2134/3125/480 2155/3124/480 2128/3126/480 -f 2157/3127/485 2134/3128/485 2142/3129/485 -f 2158/3123/478 2142/3130/478 2136/3131/478 -f 2155/3124/476 2136/3132/476 2128/3133/476 -f 2160/3134/479 2162/3135/479 2159/3136/479 -f 2160/3134/480 2129/3137/480 2131/3138/480 -f 2161/3139/476 2131/3140/476 2139/3141/476 -f 2137/3142/478 2161/3139/478 2139/3143/478 -f 2159/3136/485 2137/3144/485 2129/3145/485 -f 2164/3146/484 2166/3147/484 2163/3148/484 -f 2164/3146/483 2132/3149/483 2140/3150/483 -f 2165/3151/478 2140/3152/478 2142/3153/478 -f 2166/3147/482 2142/3154/482 2134/3155/482 -f 2163/3148/480 2134/3156/480 2132/3157/480 -f 2168/3158/482 2170/3159/482 2167/3160/482 -f 2168/3158/484 2128/3161/484 2136/3162/484 -f 2169/3163/478 2136/3164/478 2138/3165/478 -f 2170/3159/481 2138/3166/481 2130/3167/481 -f 2167/3160/480 2130/3168/480 2128/3169/480 -f 2172/3170/485 2174/3171/485 2171/3172/485 -f 2172/3170/479 2127/3173/479 2135/3174/479 -f 2173/3175/478 2135/3176/478 2140/3177/478 -f 2174/3171/477 2140/3178/477 2132/3179/477 -f 2127/3180/480 2174/3171/480 2132/3181/480 -f 2144/3087/476 2145/3182/476 2146/3088/476 -f 2144/3087/477 2143/3089/477 2130/3090/477 -f 2141/3092/478 2145/3182/478 2144/3087/478 -f 2146/3088/479 2145/3182/479 2141/3094/479 -f 2143/3089/480 2146/3088/480 2133/3096/480 -f 2148/3098/481 2149/3103/481 2150/3099/481 -f 2148/3098/482 2147/3100/482 2133/3101/482 -f 2149/3103/478 2148/3098/478 2141/3104/478 -f 2150/3099/483 2149/3103/483 2139/3106/483 -f 2147/3100/480 2150/3099/480 2131/3108/480 -f 2152/3110/483 2153/3115/483 2154/3111/483 -f 2152/3110/481 2151/3112/481 2129/3113/481 -f 2153/3115/478 2152/3110/478 2137/3116/478 -f 2154/3111/484 2153/3115/484 2135/3118/484 -f 2151/3112/480 2154/3111/480 2127/3120/480 -f 2156/3122/477 2157/3127/477 2158/3123/477 -f 2134/3125/480 2156/3122/480 2155/3124/480 -f 2157/3127/485 2156/3122/485 2134/3128/485 -f 2158/3123/478 2157/3127/478 2142/3130/478 -f 2155/3124/476 2158/3123/476 2136/3132/476 -f 2160/3134/479 2161/3139/479 2162/3135/479 -f 2160/3134/480 2159/3136/480 2129/3137/480 -f 2161/3139/476 2160/3134/476 2131/3140/476 -f 2137/3142/478 2162/3135/478 2161/3139/478 -f 2159/3136/485 2162/3135/485 2137/3144/485 -f 2164/3146/484 2165/3151/484 2166/3147/484 -f 2164/3146/483 2163/3148/483 2132/3149/483 -f 2165/3151/478 2164/3146/478 2140/3152/478 -f 2166/3147/482 2165/3151/482 2142/3154/482 -f 2163/3148/480 2166/3147/480 2134/3156/480 -f 2168/3158/482 2169/3163/482 2170/3159/482 -f 2168/3158/484 2167/3160/484 2128/3161/484 -f 2169/3163/478 2168/3158/478 2136/3164/478 -f 2170/3159/481 2169/3163/481 2138/3166/481 -f 2167/3160/480 2170/3159/480 2130/3168/480 -f 2172/3170/485 2173/3175/485 2174/3171/485 -f 2172/3170/479 2171/3172/479 2127/3173/479 -f 2173/3175/478 2172/3170/478 2135/3176/478 -f 2174/3171/477 2173/3175/477 2140/3178/477 -f 2127/3180/480 2171/3172/480 2174/3171/480 +f 2560/3561/476 2562/3562/476 2559/3563/476 +f 2560/3561/477 2546/3564/477 2554/3565/477 +f 2557/3566/478 2560/3561/478 2554/3567/478 +f 2562/3562/479 2557/3568/479 2549/3569/479 +f 2559/3563/480 2549/3570/480 2546/3571/480 +f 2564/3572/481 2566/3573/481 2563/3574/481 +f 2564/3572/482 2549/3575/482 2557/3576/482 +f 2565/3577/478 2557/3578/478 2555/3579/478 +f 2566/3573/483 2555/3580/483 2547/3581/483 +f 2563/3574/480 2547/3582/480 2549/3583/480 +f 2568/3584/483 2570/3585/483 2567/3586/483 +f 2568/3584/481 2545/3587/481 2553/3588/481 +f 2569/3589/478 2553/3590/478 2551/3591/478 +f 2570/3585/484 2551/3592/484 2543/3593/484 +f 2567/3586/480 2543/3594/480 2545/3595/480 +f 2572/3596/477 2574/3597/477 2571/3598/477 +f 2550/3599/480 2571/3598/480 2544/3600/480 +f 2573/3601/485 2550/3602/485 2558/3603/485 +f 2574/3597/478 2558/3604/478 2552/3605/478 +f 2571/3598/476 2552/3606/476 2544/3607/476 +f 2576/3608/479 2578/3609/479 2575/3610/479 +f 2576/3608/480 2545/3611/480 2547/3612/480 +f 2577/3613/476 2547/3614/476 2555/3615/476 +f 2553/3616/478 2577/3613/478 2555/3617/478 +f 2575/3610/485 2553/3618/485 2545/3619/485 +f 2580/3620/484 2582/3621/484 2579/3622/484 +f 2580/3620/483 2548/3623/483 2556/3624/483 +f 2581/3625/478 2556/3626/478 2558/3627/478 +f 2582/3621/482 2558/3628/482 2550/3629/482 +f 2579/3622/480 2550/3630/480 2548/3631/480 +f 2584/3632/482 2586/3633/482 2583/3634/482 +f 2584/3632/484 2544/3635/484 2552/3636/484 +f 2585/3637/478 2552/3638/478 2554/3639/478 +f 2586/3633/481 2554/3640/481 2546/3641/481 +f 2583/3634/480 2546/3642/480 2544/3643/480 +f 2588/3644/485 2590/3645/485 2587/3646/485 +f 2588/3644/479 2543/3647/479 2551/3648/479 +f 2589/3649/478 2551/3650/478 2556/3651/478 +f 2590/3645/477 2556/3652/477 2548/3653/477 +f 2543/3654/480 2590/3645/480 2548/3655/480 +f 2560/3561/476 2561/3656/476 2562/3562/476 +f 2560/3561/477 2559/3563/477 2546/3564/477 +f 2557/3566/478 2561/3656/478 2560/3561/478 +f 2562/3562/479 2561/3656/479 2557/3568/479 +f 2559/3563/480 2562/3562/480 2549/3570/480 +f 2564/3572/481 2565/3577/481 2566/3573/481 +f 2564/3572/482 2563/3574/482 2549/3575/482 +f 2565/3577/478 2564/3572/478 2557/3578/478 +f 2566/3573/483 2565/3577/483 2555/3580/483 +f 2563/3574/480 2566/3573/480 2547/3582/480 +f 2568/3584/483 2569/3589/483 2570/3585/483 +f 2568/3584/481 2567/3586/481 2545/3587/481 +f 2569/3589/478 2568/3584/478 2553/3590/478 +f 2570/3585/484 2569/3589/484 2551/3592/484 +f 2567/3586/480 2570/3585/480 2543/3594/480 +f 2572/3596/477 2573/3601/477 2574/3597/477 +f 2550/3599/480 2572/3596/480 2571/3598/480 +f 2573/3601/485 2572/3596/485 2550/3602/485 +f 2574/3597/478 2573/3601/478 2558/3604/478 +f 2571/3598/476 2574/3597/476 2552/3606/476 +f 2576/3608/479 2577/3613/479 2578/3609/479 +f 2576/3608/480 2575/3610/480 2545/3611/480 +f 2577/3613/476 2576/3608/476 2547/3614/476 +f 2553/3616/478 2578/3609/478 2577/3613/478 +f 2575/3610/485 2578/3609/485 2553/3618/485 +f 2580/3620/484 2581/3625/484 2582/3621/484 +f 2580/3620/483 2579/3622/483 2548/3623/483 +f 2581/3625/478 2580/3620/478 2556/3626/478 +f 2582/3621/482 2581/3625/482 2558/3628/482 +f 2579/3622/480 2582/3621/480 2550/3630/480 +f 2584/3632/482 2585/3637/482 2586/3633/482 +f 2584/3632/484 2583/3634/484 2544/3635/484 +f 2585/3637/478 2584/3632/478 2552/3638/478 +f 2586/3633/481 2585/3637/481 2554/3640/481 +f 2583/3634/480 2586/3633/480 2546/3642/480 +f 2588/3644/485 2589/3649/485 2590/3645/485 +f 2588/3644/479 2587/3646/479 2543/3647/479 +f 2589/3649/478 2588/3644/478 2551/3650/478 +f 2590/3645/477 2589/3649/477 2556/3652/477 +f 2543/3654/480 2587/3646/480 2590/3645/480 o ShroudV v -1.437500 0.374996 5.500000 v 1.437500 0.374996 5.500000 @@ -9143,126 +10449,126 @@ vn -0.7071 0.7071 0.0000 vn 1.0000 0.0000 0.0000 vn -1.0000 0.0000 0.0000 s off -f 2191/3183/486 2177/3184/486 2192/3185/486 -f 2194/3186/487 2176/3187/487 2193/3188/487 -f 2201/3189/487 2196/3190/487 2188/3191/487 -f 2183/3192/488 2201/3193/488 2197/3194/488 -f 2196/3190/489 2183/3195/489 2195/3196/489 -f 2198/3197/490 2201/3198/490 2202/3199/490 -f 2189/3200/491 2185/3201/491 2187/3202/491 -f 2193/3188/488 2180/3203/488 2191/3183/488 -f 2189/3200/492 2188/3191/492 2190/3204/492 -f 2188/3191/493 2195/3196/493 2190/3204/493 -f 2192/3185/490 2193/3188/490 2191/3183/490 -f 2187/3202/487 2201/3205/487 2188/3191/487 -f 2192/3185/489 2200/3206/489 2194/3186/489 -f 2190/3204/486 2198/3197/486 2189/3200/486 -f 2177/3184/492 2176/3207/492 2175/3208/492 -f 2179/3209/491 2204/3210/491 2180/3203/491 -f 2204/3211/493 2176/3212/493 2178/3213/493 -f 2176/3214/487 2179/3209/487 2193/3188/487 -f 2180/3203/486 2178/3213/486 2191/3183/486 -f 2199/3215/493 2206/3216/493 2200/3206/493 -f 2206/3217/491 2177/3218/491 2175/3219/491 -f 2200/3206/487 2175/3220/487 2194/3186/487 -f 2177/3218/486 2199/3215/486 2192/3185/486 -f 2195/3196/486 2197/3194/486 2190/3204/486 -f 2186/3221/488 2181/3222/488 2185/3201/488 -f 2181/3223/489 2198/3224/489 2202/3225/489 -f 2185/3201/487 2202/3226/487 2187/3202/487 -f 2198/3224/486 2186/3221/486 2189/3200/486 -f 2209/3227/494 2208/3228/494 2207/3229/494 -f 2213/3230/487 2210/3231/487 2209/3232/487 -f 2207/3233/486 2212/3234/486 2211/3235/486 -f 2212/3234/492 2210/3231/492 2214/3236/492 -f 2217/3237/494 2216/3238/494 2215/3239/494 -f 2221/3240/487 2218/3241/487 2217/3242/487 -f 2215/3243/486 2220/3244/486 2219/3245/486 -f 2220/3244/492 2218/3241/492 2222/3246/492 -f 2225/3247/495 2224/3248/495 2223/3249/495 -f 2229/3250/486 2226/3251/486 2225/3252/486 -f 2223/3253/487 2228/3254/487 2227/3255/487 -f 2228/3254/492 2226/3251/492 2230/3256/492 -f 2233/3257/495 2232/3258/495 2231/3259/495 -f 2237/3260/486 2234/3261/486 2233/3262/486 -f 2231/3263/487 2236/3264/487 2235/3265/487 -f 2236/3264/492 2234/3261/492 2238/3266/492 -f 2241/3267/495 2240/3268/495 2239/3269/495 -f 2245/3270/487 2242/3271/487 2241/3272/487 -f 2239/3273/486 2244/3274/486 2243/3275/486 -f 2244/3274/490 2242/3271/490 2246/3276/490 -f 2249/3277/495 2248/3278/495 2247/3279/495 -f 2253/3280/487 2250/3281/487 2249/3282/487 -f 2247/3283/486 2252/3284/486 2251/3285/486 -f 2252/3284/490 2250/3281/490 2254/3286/490 -f 2257/3287/494 2256/3288/494 2255/3289/494 -f 2261/3290/486 2258/3291/486 2257/3292/486 -f 2255/3293/487 2260/3294/487 2259/3295/487 -f 2260/3294/490 2258/3291/490 2262/3296/490 -f 2265/3297/494 2264/3298/494 2263/3299/494 -f 2269/3300/486 2266/3301/486 2265/3302/486 -f 2263/3303/487 2268/3304/487 2267/3305/487 -f 2268/3304/490 2266/3301/490 2270/3306/490 -f 2191/3183/486 2178/3307/486 2177/3184/486 -f 2194/3186/487 2175/3308/487 2176/3187/487 -f 2201/3189/487 2184/3309/487 2196/3190/487 -f 2183/3192/488 2184/3310/488 2201/3193/488 -f 2196/3190/489 2184/3311/489 2183/3195/489 -f 2198/3197/490 2197/3312/490 2201/3198/490 -f 2189/3200/491 2186/3221/491 2185/3201/491 -f 2193/3188/488 2179/3209/488 2180/3203/488 -f 2189/3200/492 2187/3202/492 2188/3191/492 -f 2188/3191/493 2196/3190/493 2195/3196/493 -f 2192/3185/490 2194/3186/490 2193/3188/490 -f 2187/3202/487 2202/3313/487 2201/3205/487 -f 2192/3185/489 2199/3215/489 2200/3206/489 -f 2190/3204/486 2197/3312/486 2198/3197/486 -f 2177/3184/492 2178/3307/492 2176/3207/492 -f 2179/3209/491 2203/3314/491 2204/3210/491 -f 2204/3211/493 2203/3315/493 2176/3212/493 -f 2176/3214/487 2203/3316/487 2179/3209/487 -f 2180/3203/486 2204/3211/486 2178/3213/486 -f 2199/3215/493 2205/3317/493 2206/3216/493 -f 2206/3217/491 2205/3318/491 2177/3218/491 -f 2200/3206/487 2206/3319/487 2175/3220/487 -f 2177/3218/486 2205/3318/486 2199/3215/486 -f 2195/3196/486 2183/3192/486 2197/3194/486 -f 2186/3221/488 2182/3320/488 2181/3222/488 -f 2181/3223/489 2182/3321/489 2198/3224/489 -f 2185/3201/487 2181/3322/487 2202/3226/487 -f 2198/3224/486 2182/3321/486 2186/3221/486 -f 2209/3227/494 2210/3231/494 2208/3228/494 -f 2213/3230/487 2214/3236/487 2210/3231/487 -f 2207/3233/486 2208/3228/486 2212/3234/486 -f 2212/3234/492 2208/3228/492 2210/3231/492 -f 2217/3237/494 2218/3241/494 2216/3238/494 -f 2221/3240/487 2222/3246/487 2218/3241/487 -f 2215/3243/486 2216/3238/486 2220/3244/486 -f 2220/3244/492 2216/3238/492 2218/3241/492 -f 2225/3247/495 2226/3251/495 2224/3248/495 -f 2229/3250/486 2230/3256/486 2226/3251/486 -f 2223/3253/487 2224/3248/487 2228/3254/487 -f 2228/3254/492 2224/3248/492 2226/3251/492 -f 2233/3257/495 2234/3261/495 2232/3258/495 -f 2237/3260/486 2238/3266/486 2234/3261/486 -f 2231/3263/487 2232/3258/487 2236/3264/487 -f 2236/3264/492 2232/3258/492 2234/3261/492 -f 2241/3267/495 2242/3271/495 2240/3268/495 -f 2245/3270/487 2246/3276/487 2242/3271/487 -f 2239/3273/486 2240/3268/486 2244/3274/486 -f 2244/3274/490 2240/3268/490 2242/3271/490 -f 2249/3277/495 2250/3281/495 2248/3278/495 -f 2253/3280/487 2254/3286/487 2250/3281/487 -f 2247/3283/486 2248/3278/486 2252/3284/486 -f 2252/3284/490 2248/3278/490 2250/3281/490 -f 2257/3287/494 2258/3291/494 2256/3288/494 -f 2261/3290/486 2262/3296/486 2258/3291/486 -f 2255/3293/487 2256/3288/487 2260/3294/487 -f 2260/3294/490 2256/3288/490 2258/3291/490 -f 2265/3297/494 2266/3301/494 2264/3298/494 -f 2269/3300/486 2270/3306/486 2266/3301/486 -f 2263/3303/487 2264/3298/487 2268/3304/487 -f 2268/3304/490 2264/3298/490 2266/3301/490 +f 2607/3657/486 2593/3658/486 2608/3659/486 +f 2610/3660/487 2592/3661/487 2609/3662/487 +f 2617/3663/487 2612/3664/487 2604/3665/487 +f 2599/3666/488 2617/3667/488 2613/3668/488 +f 2612/3664/489 2599/3669/489 2611/3670/489 +f 2614/3671/490 2617/3672/490 2618/3673/490 +f 2605/3674/491 2601/3675/491 2603/3676/491 +f 2609/3662/488 2596/3677/488 2607/3657/488 +f 2605/3674/492 2604/3665/492 2606/3678/492 +f 2604/3665/493 2611/3670/493 2606/3678/493 +f 2608/3659/490 2609/3662/490 2607/3657/490 +f 2603/3676/487 2617/3679/487 2604/3665/487 +f 2608/3659/489 2616/3680/489 2610/3660/489 +f 2606/3678/486 2614/3671/486 2605/3674/486 +f 2593/3658/492 2592/3681/492 2591/3682/492 +f 2595/3683/491 2620/3684/491 2596/3677/491 +f 2620/3685/493 2592/3686/493 2594/3687/493 +f 2592/3688/487 2595/3683/487 2609/3662/487 +f 2596/3677/486 2594/3687/486 2607/3657/486 +f 2615/3689/493 2622/3690/493 2616/3680/493 +f 2622/3691/491 2593/3692/491 2591/3693/491 +f 2616/3680/487 2591/3694/487 2610/3660/487 +f 2593/3692/486 2615/3689/486 2608/3659/486 +f 2611/3670/486 2613/3668/486 2606/3678/486 +f 2602/3695/488 2597/3696/488 2601/3675/488 +f 2597/3697/489 2614/3698/489 2618/3699/489 +f 2601/3675/487 2618/3700/487 2603/3676/487 +f 2614/3698/486 2602/3695/486 2605/3674/486 +f 2625/3701/494 2624/3702/494 2623/3703/494 +f 2629/3704/487 2626/3705/487 2625/3706/487 +f 2623/3707/486 2628/3708/486 2627/3709/486 +f 2628/3708/492 2626/3705/492 2630/3710/492 +f 2633/3711/494 2632/3712/494 2631/3713/494 +f 2637/3714/487 2634/3715/487 2633/3716/487 +f 2631/3717/486 2636/3718/486 2635/3719/486 +f 2636/3718/492 2634/3715/492 2638/3720/492 +f 2641/3721/495 2640/3722/495 2639/3723/495 +f 2645/3724/486 2642/3725/486 2641/3726/486 +f 2639/3727/487 2644/3728/487 2643/3729/487 +f 2644/3728/492 2642/3725/492 2646/3730/492 +f 2649/3731/495 2648/3732/495 2647/3733/495 +f 2653/3734/486 2650/3735/486 2649/3736/486 +f 2647/3737/487 2652/3738/487 2651/3739/487 +f 2652/3738/492 2650/3735/492 2654/3740/492 +f 2657/3741/495 2656/3742/495 2655/3743/495 +f 2661/3744/487 2658/3745/487 2657/3746/487 +f 2655/3747/486 2660/3748/486 2659/3749/486 +f 2660/3748/490 2658/3745/490 2662/3750/490 +f 2665/3751/495 2664/3752/495 2663/3753/495 +f 2669/3754/487 2666/3755/487 2665/3756/487 +f 2663/3757/486 2668/3758/486 2667/3759/486 +f 2668/3758/490 2666/3755/490 2670/3760/490 +f 2673/3761/494 2672/3762/494 2671/3763/494 +f 2677/3764/486 2674/3765/486 2673/3766/486 +f 2671/3767/487 2676/3768/487 2675/3769/487 +f 2676/3768/490 2674/3765/490 2678/3770/490 +f 2681/3771/494 2680/3772/494 2679/3773/494 +f 2685/3774/486 2682/3775/486 2681/3776/486 +f 2679/3777/487 2684/3778/487 2683/3779/487 +f 2684/3778/490 2682/3775/490 2686/3780/490 +f 2607/3657/486 2594/3781/486 2593/3658/486 +f 2610/3660/487 2591/3782/487 2592/3661/487 +f 2617/3663/487 2600/3783/487 2612/3664/487 +f 2599/3666/488 2600/3784/488 2617/3667/488 +f 2612/3664/489 2600/3785/489 2599/3669/489 +f 2614/3671/490 2613/3786/490 2617/3672/490 +f 2605/3674/491 2602/3695/491 2601/3675/491 +f 2609/3662/488 2595/3683/488 2596/3677/488 +f 2605/3674/492 2603/3676/492 2604/3665/492 +f 2604/3665/493 2612/3664/493 2611/3670/493 +f 2608/3659/490 2610/3660/490 2609/3662/490 +f 2603/3676/487 2618/3787/487 2617/3679/487 +f 2608/3659/489 2615/3689/489 2616/3680/489 +f 2606/3678/486 2613/3786/486 2614/3671/486 +f 2593/3658/492 2594/3781/492 2592/3681/492 +f 2595/3683/491 2619/3788/491 2620/3684/491 +f 2620/3685/493 2619/3789/493 2592/3686/493 +f 2592/3688/487 2619/3790/487 2595/3683/487 +f 2596/3677/486 2620/3685/486 2594/3687/486 +f 2615/3689/493 2621/3791/493 2622/3690/493 +f 2622/3691/491 2621/3792/491 2593/3692/491 +f 2616/3680/487 2622/3793/487 2591/3694/487 +f 2593/3692/486 2621/3792/486 2615/3689/486 +f 2611/3670/486 2599/3666/486 2613/3668/486 +f 2602/3695/488 2598/3794/488 2597/3696/488 +f 2597/3697/489 2598/3795/489 2614/3698/489 +f 2601/3675/487 2597/3796/487 2618/3700/487 +f 2614/3698/486 2598/3795/486 2602/3695/486 +f 2625/3701/494 2626/3705/494 2624/3702/494 +f 2629/3704/487 2630/3710/487 2626/3705/487 +f 2623/3707/486 2624/3702/486 2628/3708/486 +f 2628/3708/492 2624/3702/492 2626/3705/492 +f 2633/3711/494 2634/3715/494 2632/3712/494 +f 2637/3714/487 2638/3720/487 2634/3715/487 +f 2631/3717/486 2632/3712/486 2636/3718/486 +f 2636/3718/492 2632/3712/492 2634/3715/492 +f 2641/3721/495 2642/3725/495 2640/3722/495 +f 2645/3724/486 2646/3730/486 2642/3725/486 +f 2639/3727/487 2640/3722/487 2644/3728/487 +f 2644/3728/492 2640/3722/492 2642/3725/492 +f 2649/3731/495 2650/3735/495 2648/3732/495 +f 2653/3734/486 2654/3740/486 2650/3735/486 +f 2647/3737/487 2648/3732/487 2652/3738/487 +f 2652/3738/492 2648/3732/492 2650/3735/492 +f 2657/3741/495 2658/3745/495 2656/3742/495 +f 2661/3744/487 2662/3750/487 2658/3745/487 +f 2655/3747/486 2656/3742/486 2660/3748/486 +f 2660/3748/490 2656/3742/490 2658/3745/490 +f 2665/3751/495 2666/3755/495 2664/3752/495 +f 2669/3754/487 2670/3760/487 2666/3755/487 +f 2663/3757/486 2664/3752/486 2668/3758/486 +f 2668/3758/490 2664/3752/490 2666/3755/490 +f 2673/3761/494 2674/3765/494 2672/3762/494 +f 2677/3764/486 2678/3770/486 2674/3765/486 +f 2671/3767/487 2672/3762/487 2676/3768/487 +f 2676/3768/490 2672/3762/490 2674/3765/490 +f 2681/3771/494 2682/3775/494 2680/3772/494 +f 2685/3774/486 2686/3780/486 2682/3775/486 +f 2679/3777/487 2680/3772/487 2684/3778/487 +f 2684/3778/490 2680/3772/490 2682/3775/490 o ShroudH v 2.562502 1.499998 8.500000 v 2.562502 1.499998 5.500000 @@ -9511,126 +10817,126 @@ vn 0.7071 0.7071 0.0000 vn 0.0000 1.0000 0.0000 vn 0.0000 -1.0000 0.0000 s off -f 2287/3323/496 2276/3324/496 2288/3325/496 -f 2290/3326/497 2277/3327/497 2289/3328/497 -f 2297/3329/497 2292/3330/497 2284/3331/497 -f 2279/3332/498 2297/3333/498 2293/3334/498 -f 2292/3330/499 2279/3335/499 2291/3336/499 -f 2294/3337/500 2297/3338/500 2298/3339/500 -f 2285/3340/501 2281/3341/501 2283/3342/501 -f 2289/3328/498 2273/3343/498 2287/3323/498 -f 2285/3340/502 2284/3331/502 2286/3344/502 -f 2284/3331/503 2291/3336/503 2286/3344/503 -f 2288/3325/500 2289/3328/500 2287/3323/500 -f 2283/3342/497 2297/3345/497 2284/3331/497 -f 2288/3325/499 2296/3346/499 2290/3326/499 -f 2286/3344/496 2294/3337/496 2285/3340/496 -f 2276/3324/502 2277/3347/502 2278/3348/502 -f 2274/3349/501 2300/3350/501 2273/3343/501 -f 2300/3351/503 2277/3352/503 2275/3353/503 -f 2277/3354/497 2274/3349/497 2289/3328/497 -f 2273/3343/496 2275/3353/496 2287/3323/496 -f 2295/3355/503 2302/3356/503 2296/3346/503 -f 2302/3357/501 2276/3358/501 2278/3359/501 -f 2296/3346/497 2278/3360/497 2290/3326/497 -f 2276/3358/496 2295/3355/496 2288/3325/496 -f 2291/3336/496 2293/3334/496 2286/3344/496 -f 2282/3361/498 2272/3362/498 2281/3341/498 -f 2272/3363/499 2294/3364/499 2298/3365/499 -f 2281/3341/497 2298/3366/497 2283/3342/497 -f 2294/3364/496 2282/3361/496 2285/3340/496 -f 2305/3367/504 2304/3368/504 2303/3369/504 -f 2309/3370/497 2306/3371/497 2305/3372/497 -f 2303/3373/496 2308/3374/496 2307/3375/496 -f 2308/3374/500 2306/3371/500 2310/3376/500 -f 2313/3377/504 2312/3378/504 2311/3379/504 -f 2317/3380/497 2314/3381/497 2313/3382/497 -f 2311/3383/496 2316/3384/496 2315/3385/496 -f 2316/3384/500 2314/3381/500 2318/3386/500 -f 2321/3387/505 2320/3388/505 2319/3389/505 -f 2325/3390/496 2322/3391/496 2321/3392/496 -f 2319/3393/497 2324/3394/497 2323/3395/497 -f 2324/3394/500 2322/3391/500 2326/3396/500 -f 2329/3397/505 2328/3398/505 2327/3399/505 -f 2333/3400/496 2330/3401/496 2329/3402/496 -f 2327/3403/497 2332/3404/497 2331/3405/497 -f 2332/3404/500 2330/3401/500 2334/3406/500 -f 2337/3407/505 2336/3408/505 2335/3409/505 -f 2341/3410/497 2338/3411/497 2337/3412/497 -f 2335/3413/496 2340/3414/496 2339/3415/496 -f 2340/3414/502 2338/3411/502 2342/3416/502 -f 2345/3417/505 2344/3418/505 2343/3419/505 -f 2349/3420/497 2346/3421/497 2345/3422/497 -f 2343/3423/496 2348/3424/496 2347/3425/496 -f 2348/3424/502 2346/3421/502 2350/3426/502 -f 2353/3427/504 2352/3428/504 2351/3429/504 -f 2357/3430/496 2354/3431/496 2353/3432/496 -f 2351/3433/497 2356/3434/497 2355/3435/497 -f 2356/3434/502 2354/3431/502 2358/3436/502 -f 2361/3437/504 2360/3438/504 2359/3439/504 -f 2365/3440/496 2362/3441/496 2361/3442/496 -f 2359/3443/497 2364/3444/497 2363/3445/497 -f 2364/3444/502 2362/3441/502 2366/3446/502 -f 2287/3323/496 2275/3447/496 2276/3324/496 -f 2290/3326/497 2278/3448/497 2277/3327/497 -f 2297/3329/497 2280/3449/497 2292/3330/497 -f 2279/3332/498 2280/3450/498 2297/3333/498 -f 2292/3330/499 2280/3451/499 2279/3335/499 -f 2294/3337/500 2293/3452/500 2297/3338/500 -f 2285/3340/501 2282/3361/501 2281/3341/501 -f 2289/3328/498 2274/3349/498 2273/3343/498 -f 2285/3340/502 2283/3342/502 2284/3331/502 -f 2284/3331/503 2292/3330/503 2291/3336/503 -f 2288/3325/500 2290/3326/500 2289/3328/500 -f 2283/3342/497 2298/3453/497 2297/3345/497 -f 2288/3325/499 2295/3355/499 2296/3346/499 -f 2286/3344/496 2293/3452/496 2294/3337/496 -f 2276/3324/502 2275/3447/502 2277/3347/502 -f 2274/3349/501 2299/3454/501 2300/3350/501 -f 2300/3351/503 2299/3455/503 2277/3352/503 -f 2277/3354/497 2299/3456/497 2274/3349/497 -f 2273/3343/496 2300/3351/496 2275/3353/496 -f 2295/3355/503 2301/3457/503 2302/3356/503 -f 2302/3357/501 2301/3458/501 2276/3358/501 -f 2296/3346/497 2302/3459/497 2278/3360/497 -f 2276/3358/496 2301/3458/496 2295/3355/496 -f 2291/3336/496 2279/3332/496 2293/3334/496 -f 2282/3361/498 2271/3460/498 2272/3362/498 -f 2272/3363/499 2271/3461/499 2294/3364/499 -f 2281/3341/497 2272/3462/497 2298/3366/497 -f 2294/3364/496 2271/3461/496 2282/3361/496 -f 2305/3367/504 2306/3371/504 2304/3368/504 -f 2309/3370/497 2310/3376/497 2306/3371/497 -f 2303/3373/496 2304/3368/496 2308/3374/496 -f 2308/3374/500 2304/3368/500 2306/3371/500 -f 2313/3377/504 2314/3381/504 2312/3378/504 -f 2317/3380/497 2318/3386/497 2314/3381/497 -f 2311/3383/496 2312/3378/496 2316/3384/496 -f 2316/3384/500 2312/3378/500 2314/3381/500 -f 2321/3387/505 2322/3391/505 2320/3388/505 -f 2325/3390/496 2326/3396/496 2322/3391/496 -f 2319/3393/497 2320/3388/497 2324/3394/497 -f 2324/3394/500 2320/3388/500 2322/3391/500 -f 2329/3397/505 2330/3401/505 2328/3398/505 -f 2333/3400/496 2334/3406/496 2330/3401/496 -f 2327/3403/497 2328/3398/497 2332/3404/497 -f 2332/3404/500 2328/3398/500 2330/3401/500 -f 2337/3407/505 2338/3411/505 2336/3408/505 -f 2341/3410/497 2342/3416/497 2338/3411/497 -f 2335/3413/496 2336/3408/496 2340/3414/496 -f 2340/3414/502 2336/3408/502 2338/3411/502 -f 2345/3417/505 2346/3421/505 2344/3418/505 -f 2349/3420/497 2350/3426/497 2346/3421/497 -f 2343/3423/496 2344/3418/496 2348/3424/496 -f 2348/3424/502 2344/3418/502 2346/3421/502 -f 2353/3427/504 2354/3431/504 2352/3428/504 -f 2357/3430/496 2358/3436/496 2354/3431/496 -f 2351/3433/497 2352/3428/497 2356/3434/497 -f 2356/3434/502 2352/3428/502 2354/3431/502 -f 2361/3437/504 2362/3441/504 2360/3438/504 -f 2365/3440/496 2366/3446/496 2362/3441/496 -f 2359/3443/497 2360/3438/497 2364/3444/497 -f 2364/3444/502 2360/3438/502 2362/3441/502 +f 2703/3797/496 2692/3798/496 2704/3799/496 +f 2706/3800/497 2693/3801/497 2705/3802/497 +f 2713/3803/497 2708/3804/497 2700/3805/497 +f 2695/3806/498 2713/3807/498 2709/3808/498 +f 2708/3804/499 2695/3809/499 2707/3810/499 +f 2710/3811/500 2713/3812/500 2714/3813/500 +f 2701/3814/501 2697/3815/501 2699/3816/501 +f 2705/3802/498 2689/3817/498 2703/3797/498 +f 2701/3814/502 2700/3805/502 2702/3818/502 +f 2700/3805/503 2707/3810/503 2702/3818/503 +f 2704/3799/500 2705/3802/500 2703/3797/500 +f 2699/3816/497 2713/3819/497 2700/3805/497 +f 2704/3799/499 2712/3820/499 2706/3800/499 +f 2702/3818/496 2710/3811/496 2701/3814/496 +f 2692/3798/502 2693/3821/502 2694/3822/502 +f 2690/3823/501 2716/3824/501 2689/3817/501 +f 2716/3825/503 2693/3826/503 2691/3827/503 +f 2693/3828/497 2690/3823/497 2705/3802/497 +f 2689/3817/496 2691/3827/496 2703/3797/496 +f 2711/3829/503 2718/3830/503 2712/3820/503 +f 2718/3831/501 2692/3832/501 2694/3833/501 +f 2712/3820/497 2694/3834/497 2706/3800/497 +f 2692/3832/496 2711/3829/496 2704/3799/496 +f 2707/3810/496 2709/3808/496 2702/3818/496 +f 2698/3835/498 2688/3836/498 2697/3815/498 +f 2688/3837/499 2710/3838/499 2714/3839/499 +f 2697/3815/497 2714/3840/497 2699/3816/497 +f 2710/3838/496 2698/3835/496 2701/3814/496 +f 2721/3841/504 2720/3842/504 2719/3843/504 +f 2725/3844/497 2722/3845/497 2721/3846/497 +f 2719/3847/496 2724/3848/496 2723/3849/496 +f 2724/3848/500 2722/3845/500 2726/3850/500 +f 2729/3851/504 2728/3852/504 2727/3853/504 +f 2733/3854/497 2730/3855/497 2729/3856/497 +f 2727/3857/496 2732/3858/496 2731/3859/496 +f 2732/3858/500 2730/3855/500 2734/3860/500 +f 2737/3861/505 2736/3862/505 2735/3863/505 +f 2741/3864/496 2738/3865/496 2737/3866/496 +f 2735/3867/497 2740/3868/497 2739/3869/497 +f 2740/3868/500 2738/3865/500 2742/3870/500 +f 2745/3871/505 2744/3872/505 2743/3873/505 +f 2749/3874/496 2746/3875/496 2745/3876/496 +f 2743/3877/497 2748/3878/497 2747/3879/497 +f 2748/3878/500 2746/3875/500 2750/3880/500 +f 2753/3881/505 2752/3882/505 2751/3883/505 +f 2757/3884/497 2754/3885/497 2753/3886/497 +f 2751/3887/496 2756/3888/496 2755/3889/496 +f 2756/3888/502 2754/3885/502 2758/3890/502 +f 2761/3891/505 2760/3892/505 2759/3893/505 +f 2765/3894/497 2762/3895/497 2761/3896/497 +f 2759/3897/496 2764/3898/496 2763/3899/496 +f 2764/3898/502 2762/3895/502 2766/3900/502 +f 2769/3901/504 2768/3902/504 2767/3903/504 +f 2773/3904/496 2770/3905/496 2769/3906/496 +f 2767/3907/497 2772/3908/497 2771/3909/497 +f 2772/3908/502 2770/3905/502 2774/3910/502 +f 2777/3911/504 2776/3912/504 2775/3913/504 +f 2781/3914/496 2778/3915/496 2777/3916/496 +f 2775/3917/497 2780/3918/497 2779/3919/497 +f 2780/3918/502 2778/3915/502 2782/3920/502 +f 2703/3797/496 2691/3921/496 2692/3798/496 +f 2706/3800/497 2694/3922/497 2693/3801/497 +f 2713/3803/497 2696/3923/497 2708/3804/497 +f 2695/3806/498 2696/3924/498 2713/3807/498 +f 2708/3804/499 2696/3925/499 2695/3809/499 +f 2710/3811/500 2709/3926/500 2713/3812/500 +f 2701/3814/501 2698/3835/501 2697/3815/501 +f 2705/3802/498 2690/3823/498 2689/3817/498 +f 2701/3814/502 2699/3816/502 2700/3805/502 +f 2700/3805/503 2708/3804/503 2707/3810/503 +f 2704/3799/500 2706/3800/500 2705/3802/500 +f 2699/3816/497 2714/3927/497 2713/3819/497 +f 2704/3799/499 2711/3829/499 2712/3820/499 +f 2702/3818/496 2709/3926/496 2710/3811/496 +f 2692/3798/502 2691/3921/502 2693/3821/502 +f 2690/3823/501 2715/3928/501 2716/3824/501 +f 2716/3825/503 2715/3929/503 2693/3826/503 +f 2693/3828/497 2715/3930/497 2690/3823/497 +f 2689/3817/496 2716/3825/496 2691/3827/496 +f 2711/3829/503 2717/3931/503 2718/3830/503 +f 2718/3831/501 2717/3932/501 2692/3832/501 +f 2712/3820/497 2718/3933/497 2694/3834/497 +f 2692/3832/496 2717/3932/496 2711/3829/496 +f 2707/3810/496 2695/3806/496 2709/3808/496 +f 2698/3835/498 2687/3934/498 2688/3836/498 +f 2688/3837/499 2687/3935/499 2710/3838/499 +f 2697/3815/497 2688/3936/497 2714/3840/497 +f 2710/3838/496 2687/3935/496 2698/3835/496 +f 2721/3841/504 2722/3845/504 2720/3842/504 +f 2725/3844/497 2726/3850/497 2722/3845/497 +f 2719/3847/496 2720/3842/496 2724/3848/496 +f 2724/3848/500 2720/3842/500 2722/3845/500 +f 2729/3851/504 2730/3855/504 2728/3852/504 +f 2733/3854/497 2734/3860/497 2730/3855/497 +f 2727/3857/496 2728/3852/496 2732/3858/496 +f 2732/3858/500 2728/3852/500 2730/3855/500 +f 2737/3861/505 2738/3865/505 2736/3862/505 +f 2741/3864/496 2742/3870/496 2738/3865/496 +f 2735/3867/497 2736/3862/497 2740/3868/497 +f 2740/3868/500 2736/3862/500 2738/3865/500 +f 2745/3871/505 2746/3875/505 2744/3872/505 +f 2749/3874/496 2750/3880/496 2746/3875/496 +f 2743/3877/497 2744/3872/497 2748/3878/497 +f 2748/3878/500 2744/3872/500 2746/3875/500 +f 2753/3881/505 2754/3885/505 2752/3882/505 +f 2757/3884/497 2758/3890/497 2754/3885/497 +f 2751/3887/496 2752/3882/496 2756/3888/496 +f 2756/3888/502 2752/3882/502 2754/3885/502 +f 2761/3891/505 2762/3895/505 2760/3892/505 +f 2765/3894/497 2766/3900/497 2762/3895/497 +f 2759/3897/496 2760/3892/496 2764/3898/496 +f 2764/3898/502 2760/3892/502 2762/3895/502 +f 2769/3901/504 2770/3905/504 2768/3902/504 +f 2773/3904/496 2774/3910/496 2770/3905/496 +f 2767/3907/497 2768/3902/497 2772/3908/497 +f 2772/3908/502 2768/3902/502 2770/3905/502 +f 2777/3911/504 2778/3915/504 2776/3912/504 +f 2781/3914/496 2782/3920/496 2778/3915/496 +f 2775/3917/497 2776/3912/497 2780/3918/497 +f 2780/3918/502 2776/3912/502 2778/3915/502 o Engine v 0.000000 6.499998 9.499993 v -1.148050 6.271637 9.499993 @@ -10264,327 +11570,327 @@ vn 0.8186 0.3391 -0.4636 vn 0.6531 0.2705 -0.7074 vn -0.0000 -0.0000 -1.0000 s off -f 2372/3463/506 2389/3464/506 2388/3465/506 -f 2374/3466/506 2389/3467/506 2373/3468/506 -f 2375/3469/506 2390/3470/506 2374/3466/506 -f 2376/3471/506 2391/3472/506 2375/3473/506 -f 2376/3471/506 2393/3474/506 2392/3475/506 -f 2378/3476/506 2393/3477/506 2377/3478/506 -f 2378/3476/506 2395/3479/506 2394/3480/506 -f 2380/3481/506 2395/3482/506 2379/3483/506 -f 2380/3481/506 2397/3484/506 2396/3485/506 -f 2382/3486/506 2397/3487/506 2381/3488/506 -f 2367/3489/506 2398/3490/506 2382/3486/506 -f 2368/3491/506 2383/3492/506 2367/3489/506 -f 2368/3491/506 2385/3493/506 2384/3494/506 -f 2370/3495/506 2385/3496/506 2369/3497/506 -f 2370/3495/506 2387/3498/506 2386/3499/506 -f 2372/3463/506 2387/3500/506 2371/3501/506 -f 2372/3463/506 2373/3468/506 2389/3464/506 -f 2374/3466/506 2390/3502/506 2389/3467/506 -f 2375/3469/506 2391/3503/506 2390/3470/506 -f 2376/3471/506 2392/3504/506 2391/3472/506 -f 2376/3471/506 2377/3478/506 2393/3474/506 -f 2378/3476/506 2394/3505/506 2393/3477/506 -f 2378/3476/506 2379/3483/506 2395/3479/506 -f 2380/3481/506 2396/3506/506 2395/3482/506 -f 2380/3481/506 2381/3488/506 2397/3484/506 -f 2382/3486/506 2398/3507/506 2397/3487/506 -f 2367/3489/506 2383/3508/506 2398/3490/506 -f 2368/3491/506 2384/3509/506 2383/3492/506 -f 2368/3491/506 2369/3497/506 2385/3493/506 -f 2370/3495/506 2386/3510/506 2385/3496/506 -f 2370/3495/506 2371/3501/506 2387/3498/506 -f 2372/3463/506 2388/3511/506 2387/3500/506 +f 2788/3937/506 2805/3938/506 2804/3939/506 +f 2790/3940/506 2805/3941/506 2789/3942/506 +f 2791/3943/506 2806/3944/506 2790/3940/506 +f 2792/3945/506 2807/3946/506 2791/3947/506 +f 2792/3945/506 2809/3948/506 2808/3949/506 +f 2794/3950/506 2809/3951/506 2793/3952/506 +f 2794/3950/506 2811/3953/506 2810/3954/506 +f 2796/3955/506 2811/3956/506 2795/3957/506 +f 2796/3955/506 2813/3958/506 2812/3959/506 +f 2798/3960/506 2813/3961/506 2797/3962/506 +f 2783/3963/506 2814/3964/506 2798/3960/506 +f 2784/3965/506 2799/3966/506 2783/3963/506 +f 2784/3965/506 2801/3967/506 2800/3968/506 +f 2786/3969/506 2801/3970/506 2785/3971/506 +f 2786/3969/506 2803/3972/506 2802/3973/506 +f 2788/3937/506 2803/3974/506 2787/3975/506 +f 2788/3937/506 2789/3942/506 2805/3938/506 +f 2790/3940/506 2806/3976/506 2805/3941/506 +f 2791/3943/506 2807/3977/506 2806/3944/506 +f 2792/3945/506 2808/3978/506 2807/3946/506 +f 2792/3945/506 2793/3952/506 2809/3948/506 +f 2794/3950/506 2810/3979/506 2809/3951/506 +f 2794/3950/506 2795/3957/506 2811/3953/506 +f 2796/3955/506 2812/3980/506 2811/3956/506 +f 2796/3955/506 2797/3962/506 2813/3958/506 +f 2798/3960/506 2814/3981/506 2813/3961/506 +f 2783/3963/506 2799/3982/506 2814/3964/506 +f 2784/3965/506 2800/3983/506 2799/3966/506 +f 2784/3965/506 2785/3971/506 2801/3967/506 +f 2786/3969/506 2802/3984/506 2801/3970/506 +f 2786/3969/506 2787/3975/506 2803/3972/506 +f 2788/3937/506 2804/3985/506 2803/3974/506 s 1 -f 2409/3512/507 2448/3513/508 2408/3514/509 -f 2425/3515/510 2448/3513/508 2449/3516/511 -f 2440/3517/512 2425/3518/510 2441/3519/513 -f 2404/3520/514 2441/3521/513 2405/3522/515 -f 2456/3523/516 2405/3524/515 2457/3525/517 -f 2420/3526/518 2457/3527/517 2421/3528/519 -f 2436/3529/520 2421/3530/519 2437/3531/521 -f 2412/3532/522 2437/3533/521 2413/3534/523 -f 2452/3535/524 2413/3536/523 2453/3537/525 -f 2428/3538/526 2453/3539/525 2429/3540/527 -f 2433/3541/528 2408/3542/509 2432/3543/529 -f 2433/3544/528 2416/3545/530 2417/3546/531 -f 2417/3547/531 2460/3548/532 2461/3549/533 -f 2400/3550/534 2460/3548/532 2399/3551/535 -f 2400/3552/534 2444/3553/536 2445/3554/537 -f 2429/3555/527 2444/3553/536 2428/3538/526 -f 2401/3556/538 2461/3557/533 2400/3550/534 -f 2463/3558/539 2401/3556/538 2402/3559/540 -f 2434/3560/541 2417/3546/531 2418/3561/542 -f 2419/3562/543 2434/3560/541 2418/3561/542 -f 2417/3547/531 2462/3563/544 2418/3564/542 -f 2418/3564/542 2463/3565/539 2419/3566/543 -f 2409/3567/507 2434/3568/541 2410/3569/545 -f 2410/3569/545 2435/3570/546 2411/3571/547 -f 2410/3572/545 2449/3573/511 2409/3512/507 -f 2411/3574/547 2450/3575/548 2410/3572/545 -f 2425/3515/510 2450/3576/548 2426/3577/549 -f 2427/3578/550 2450/3576/548 2451/3579/551 -f 2426/3580/549 2441/3519/513 2425/3518/510 -f 2427/3581/550 2442/3582/552 2426/3580/549 -f 2405/3522/515 2442/3583/552 2406/3584/553 -f 2406/3584/553 2443/3585/554 2407/3586/555 -f 2458/3587/556 2405/3524/515 2406/3588/553 -f 2407/3589/555 2458/3587/556 2406/3588/553 -f 2421/3528/519 2458/3590/556 2422/3591/557 -f 2422/3591/557 2459/3592/558 2423/3593/559 -f 2422/3594/557 2437/3531/521 2421/3530/519 -f 2423/3595/559 2438/3596/560 2422/3594/557 -f 2414/3597/561 2437/3533/521 2438/3598/560 -f 2415/3599/562 2438/3598/560 2439/3600/563 -f 2414/3601/561 2453/3537/525 2413/3536/523 -f 2415/3602/562 2454/3603/564 2414/3601/561 -f 2430/3604/565 2453/3539/525 2454/3605/564 -f 2431/3606/566 2454/3605/564 2455/3607/567 -f 2446/3608/568 2429/3555/527 2430/3609/565 -f 2431/3610/566 2446/3608/568 2430/3609/565 -f 2400/3552/534 2446/3611/568 2401/3612/538 -f 2401/3612/538 2447/3613/569 2402/3614/540 -f 2403/3615/506 2402/3614/540 2447/3613/569 -f 2447/3616/569 2431/3610/566 2403/3617/506 -f 2455/3607/567 2403/3618/506 2431/3606/566 -f 2455/3619/567 2415/3602/562 2403/3620/506 -f 2439/3600/563 2403/3621/506 2415/3599/562 -f 2439/3622/563 2423/3595/559 2403/3623/506 -f 2459/3592/558 2403/3624/506 2423/3593/559 -f 2459/3625/558 2407/3589/555 2403/3626/506 -f 2443/3585/554 2403/3627/506 2407/3586/555 -f 2443/3628/554 2427/3581/550 2403/3629/506 -f 2451/3579/551 2403/3630/506 2427/3578/550 -f 2451/3631/551 2411/3574/547 2403/3632/506 -f 2435/3570/546 2403/3633/506 2411/3571/547 -f 2403/3634/506 2463/3558/539 2402/3559/540 -f 2463/3565/539 2403/3635/506 2419/3566/543 -f 2435/3636/546 2419/3562/543 2403/3637/506 -f 2394/3638/570 2399/3551/535 2460/3548/532 -f 2396/3639/571 2399/3551/535 2395/3640/572 -f 2396/3639/571 2428/3538/526 2444/3553/536 -f 2452/3535/524 2397/3641/573 2398/3642/574 -f 2398/3642/574 2412/3532/522 2452/3535/524 -f 2436/3529/520 2383/3643/575 2384/3644/576 -f 2384/3644/576 2420/3526/518 2436/3529/520 -f 2456/3523/516 2385/3645/577 2386/3646/578 -f 2386/3646/578 2404/3520/514 2456/3523/516 -f 2440/3517/512 2387/3647/579 2388/3648/580 -f 2388/3648/580 2424/3649/581 2440/3517/512 -f 2448/3513/508 2389/3650/582 2390/3651/583 -f 2390/3651/583 2408/3514/509 2448/3513/508 -f 2432/3543/529 2391/3472/584 2392/3652/585 -f 2393/3653/586 2432/3543/529 2392/3652/585 -f 2394/3638/570 2416/3545/530 2393/3653/586 -f 2464/3654/587 2526/3655/588 2465/3656/589 -f 2466/3657/590 2526/3655/588 2527/3658/591 -f 2466/3657/590 2528/3659/592 2467/3660/593 -f 2509/3661/594 2465/3662/589 2510/3663/595 -f 2494/3664/596 2509/3661/594 2510/3665/595 -f 2517/3666/597 2494/3667/596 2518/3668/598 -f 2478/3669/599 2517/3666/597 2518/3670/598 -f 2502/3671/600 2477/3672/601 2478/3673/599 -f 2486/3674/602 2501/3675/603 2502/3676/600 -f 2522/3677/604 2485/3678/605 2486/3679/602 -f 2470/3680/606 2521/3681/607 2522/3682/604 -f 2506/3683/608 2469/3684/609 2470/3685/606 -f 2490/3686/610 2505/3687/611 2506/3688/608 -f 2513/3689/612 2490/3690/610 2514/3691/613 -f 2474/3692/614 2513/3689/612 2514/3693/613 -f 2497/3694/615 2474/3695/614 2498/3696/616 -f 2481/3697/617 2498/3698/616 2482/3699/618 -f 2526/3700/588 2481/3697/617 2482/3701/618 -f 2377/3478/577 2525/3702/619 2378/3476/578 -f 2378/3476/578 2464/3654/587 2379/3483/579 -f 2380/3481/580 2464/3654/587 2509/3661/594 -f 2380/3481/580 2493/3703/620 2381/3488/582 -f 2381/3488/582 2517/3666/597 2382/3486/583 -f 2382/3486/583 2477/3672/601 2367/3489/584 -f 2367/3489/584 2501/3675/603 2368/3491/585 -f 2368/3491/585 2485/3678/605 2369/3497/586 -f 2369/3497/586 2521/3681/607 2370/3495/570 -f 2370/3495/570 2469/3684/609 2371/3501/572 -f 2371/3501/572 2505/3687/611 2372/3463/571 -f 2372/3463/571 2489/3704/621 2373/3468/573 -f 2373/3468/573 2513/3689/612 2374/3466/574 -f 2374/3466/574 2473/3705/622 2375/3469/575 -f 2375/3473/575 2497/3694/615 2376/3471/576 -f 2497/3694/615 2377/3478/577 2376/3471/576 -f 2527/3706/591 2482/3701/618 2483/3707/623 -f 2528/3708/592 2483/3707/623 2484/3709/624 -f 2483/3710/623 2498/3698/616 2499/3711/625 -f 2484/3712/624 2499/3711/625 2500/3713/626 -f 2499/3714/625 2474/3695/614 2475/3715/627 -f 2476/3716/628 2499/3714/625 2475/3715/627 -f 2475/3717/627 2514/3693/613 2515/3718/629 -f 2476/3719/628 2515/3718/629 2516/3720/630 -f 2491/3721/631 2514/3691/613 2490/3690/610 -f 2516/3722/630 2491/3721/631 2492/3723/632 -f 2491/3724/631 2506/3688/608 2507/3725/633 -f 2492/3726/632 2507/3725/633 2508/3727/634 -f 2507/3728/633 2470/3685/606 2471/3729/635 -f 2508/3730/634 2471/3729/635 2472/3731/636 -f 2470/3680/606 2523/3732/637 2471/3733/635 -f 2472/3734/636 2523/3732/637 2524/3735/638 -f 2523/3736/637 2486/3679/602 2487/3737/639 -f 2524/3738/638 2487/3737/639 2488/3739/640 -f 2487/3740/639 2502/3676/600 2503/3741/641 -f 2488/3742/640 2503/3741/641 2504/3743/642 -f 2479/3744/643 2502/3671/600 2478/3673/599 -f 2480/3745/644 2503/3746/641 2479/3744/643 -f 2479/3747/643 2518/3670/598 2519/3748/645 -f 2480/3749/644 2519/3748/645 2520/3750/646 -f 2495/3751/647 2518/3668/598 2494/3667/596 -f 2496/3752/648 2519/3753/645 2495/3751/647 -f 2495/3754/647 2510/3665/595 2511/3755/649 -f 2496/3756/648 2511/3755/649 2512/3757/650 -f 2511/3758/649 2465/3662/589 2466/3759/590 -f 2512/3760/650 2466/3759/590 2467/3761/593 -f 2468/3762/651 2467/3660/593 2528/3659/592 -f 2528/3708/592 2484/3709/624 2468/3763/651 -f 2500/3713/626 2468/3764/651 2484/3712/624 -f 2500/3765/626 2476/3716/628 2468/3766/651 -f 2516/3720/630 2468/3767/651 2476/3719/628 -f 2516/3722/630 2492/3723/632 2468/3768/651 -f 2508/3727/634 2468/3769/651 2492/3726/632 -f 2508/3730/634 2472/3731/636 2468/3770/651 -f 2524/3735/638 2468/3771/651 2472/3734/636 -f 2524/3738/638 2488/3739/640 2468/3772/651 -f 2504/3743/642 2468/3773/651 2488/3742/640 -f 2504/3774/642 2480/3745/644 2468/3775/651 -f 2520/3750/646 2468/3776/651 2480/3749/644 -f 2520/3777/646 2496/3752/648 2468/3778/651 -f 2512/3757/650 2468/3779/651 2496/3756/648 -f 2468/3780/651 2512/3760/650 2467/3761/593 -f 2409/3512/507 2449/3573/511 2448/3513/508 -f 2425/3515/510 2424/3649/581 2448/3513/508 -f 2440/3517/512 2424/3649/581 2425/3518/510 -f 2404/3520/514 2440/3517/512 2441/3521/513 -f 2456/3523/516 2404/3520/514 2405/3524/515 -f 2420/3526/518 2456/3523/516 2457/3527/517 -f 2436/3529/520 2420/3526/518 2421/3530/519 -f 2412/3532/522 2436/3529/520 2437/3533/521 -f 2452/3535/524 2412/3532/522 2413/3536/523 -f 2428/3538/526 2452/3535/524 2453/3539/525 -f 2433/3541/528 2409/3567/507 2408/3542/509 -f 2433/3544/528 2432/3543/529 2416/3545/530 -f 2417/3547/531 2416/3545/530 2460/3548/532 -f 2400/3550/534 2461/3557/533 2460/3548/532 -f 2400/3552/534 2399/3551/535 2444/3553/536 -f 2429/3555/527 2445/3781/537 2444/3553/536 -f 2401/3556/538 2462/3782/544 2461/3557/533 -f 2463/3558/539 2462/3782/544 2401/3556/538 -f 2434/3560/541 2433/3544/528 2417/3546/531 -f 2419/3562/543 2435/3636/546 2434/3560/541 -f 2417/3547/531 2461/3549/533 2462/3563/544 -f 2418/3564/542 2462/3563/544 2463/3565/539 -f 2409/3567/507 2433/3541/528 2434/3568/541 -f 2410/3569/545 2434/3568/541 2435/3570/546 -f 2410/3572/545 2450/3575/548 2449/3573/511 -f 2411/3574/547 2451/3631/551 2450/3575/548 -f 2425/3515/510 2449/3516/511 2450/3576/548 -f 2427/3578/550 2426/3577/549 2450/3576/548 -f 2426/3580/549 2442/3582/552 2441/3519/513 -f 2427/3581/550 2443/3628/554 2442/3582/552 -f 2405/3522/515 2441/3521/513 2442/3583/552 -f 2406/3584/553 2442/3583/552 2443/3585/554 -f 2458/3587/556 2457/3525/517 2405/3524/515 -f 2407/3589/555 2459/3625/558 2458/3587/556 -f 2421/3528/519 2457/3527/517 2458/3590/556 -f 2422/3591/557 2458/3590/556 2459/3592/558 -f 2422/3594/557 2438/3596/560 2437/3531/521 -f 2423/3595/559 2439/3622/563 2438/3596/560 -f 2414/3597/561 2413/3534/523 2437/3533/521 -f 2415/3599/562 2414/3597/561 2438/3598/560 -f 2414/3601/561 2454/3603/564 2453/3537/525 -f 2415/3602/562 2455/3619/567 2454/3603/564 -f 2430/3604/565 2429/3540/527 2453/3539/525 -f 2431/3606/566 2430/3604/565 2454/3605/564 -f 2446/3608/568 2445/3781/537 2429/3555/527 -f 2431/3610/566 2447/3616/569 2446/3608/568 -f 2400/3552/534 2445/3554/537 2446/3611/568 -f 2401/3612/538 2446/3611/568 2447/3613/569 -f 2394/3638/570 2395/3640/572 2399/3551/535 -f 2396/3639/571 2444/3553/536 2399/3551/535 -f 2396/3639/571 2397/3641/573 2428/3538/526 -f 2452/3535/524 2428/3538/526 2397/3641/573 -f 2398/3642/574 2383/3643/575 2412/3532/522 -f 2436/3529/520 2412/3532/522 2383/3643/575 -f 2384/3644/576 2385/3645/577 2420/3526/518 -f 2456/3523/516 2420/3526/518 2385/3645/577 -f 2386/3646/578 2387/3647/579 2404/3520/514 -f 2440/3517/512 2404/3520/514 2387/3647/579 -f 2388/3648/580 2389/3650/582 2424/3649/581 -f 2448/3513/508 2424/3649/581 2389/3650/582 -f 2390/3651/583 2391/3783/584 2408/3514/509 -f 2432/3543/529 2408/3542/509 2391/3472/584 -f 2393/3653/586 2416/3545/530 2432/3543/529 -f 2394/3638/570 2460/3548/532 2416/3545/530 -f 2464/3654/587 2525/3702/619 2526/3655/588 -f 2466/3657/590 2465/3656/589 2526/3655/588 -f 2466/3657/590 2527/3658/591 2528/3659/592 -f 2509/3661/594 2464/3654/587 2465/3662/589 -f 2494/3664/596 2493/3703/620 2509/3661/594 -f 2517/3666/597 2493/3703/620 2494/3667/596 -f 2478/3669/599 2477/3672/601 2517/3666/597 -f 2502/3671/600 2501/3675/603 2477/3672/601 -f 2486/3674/602 2485/3678/605 2501/3675/603 -f 2522/3677/604 2521/3681/607 2485/3678/605 -f 2470/3680/606 2469/3684/609 2521/3681/607 -f 2506/3683/608 2505/3687/611 2469/3684/609 -f 2490/3686/610 2489/3704/621 2505/3687/611 -f 2513/3689/612 2489/3704/621 2490/3690/610 -f 2474/3692/614 2473/3705/622 2513/3689/612 -f 2497/3694/615 2473/3784/622 2474/3695/614 -f 2481/3697/617 2497/3694/615 2498/3698/616 -f 2526/3700/588 2525/3702/619 2481/3697/617 -f 2377/3478/577 2481/3697/617 2525/3702/619 -f 2378/3476/578 2525/3702/619 2464/3654/587 -f 2380/3481/580 2379/3483/579 2464/3654/587 -f 2380/3481/580 2509/3661/594 2493/3703/620 -f 2381/3488/582 2493/3703/620 2517/3666/597 -f 2382/3486/583 2517/3666/597 2477/3672/601 -f 2367/3489/584 2477/3672/601 2501/3675/603 -f 2368/3491/585 2501/3675/603 2485/3678/605 -f 2369/3497/586 2485/3678/605 2521/3681/607 -f 2370/3495/570 2521/3681/607 2469/3684/609 -f 2371/3501/572 2469/3684/609 2505/3687/611 -f 2372/3463/571 2505/3687/611 2489/3704/621 -f 2373/3468/573 2489/3704/621 2513/3689/612 -f 2374/3466/574 2513/3689/612 2473/3705/622 -f 2375/3473/575 2473/3784/622 2497/3694/615 -f 2497/3694/615 2481/3697/617 2377/3478/577 -f 2527/3706/591 2526/3700/588 2482/3701/618 -f 2528/3708/592 2527/3706/591 2483/3707/623 -f 2483/3710/623 2482/3699/618 2498/3698/616 -f 2484/3712/624 2483/3710/623 2499/3711/625 -f 2499/3714/625 2498/3696/616 2474/3695/614 -f 2476/3716/628 2500/3765/626 2499/3714/625 -f 2475/3717/627 2474/3692/614 2514/3693/613 -f 2476/3719/628 2475/3717/627 2515/3718/629 -f 2491/3721/631 2515/3785/629 2514/3691/613 -f 2516/3722/630 2515/3785/629 2491/3721/631 -f 2491/3724/631 2490/3686/610 2506/3688/608 -f 2492/3726/632 2491/3724/631 2507/3725/633 -f 2507/3728/633 2506/3683/608 2470/3685/606 -f 2508/3730/634 2507/3728/633 2471/3729/635 -f 2470/3680/606 2522/3682/604 2523/3732/637 -f 2472/3734/636 2471/3733/635 2523/3732/637 -f 2523/3736/637 2522/3677/604 2486/3679/602 -f 2524/3738/638 2523/3736/637 2487/3737/639 -f 2487/3740/639 2486/3674/602 2502/3676/600 -f 2488/3742/640 2487/3740/639 2503/3741/641 -f 2479/3744/643 2503/3746/641 2502/3671/600 -f 2480/3745/644 2504/3774/642 2503/3746/641 -f 2479/3747/643 2478/3669/599 2518/3670/598 -f 2480/3749/644 2479/3747/643 2519/3748/645 -f 2495/3751/647 2519/3753/645 2518/3668/598 -f 2496/3752/648 2520/3777/646 2519/3753/645 -f 2495/3754/647 2494/3664/596 2510/3665/595 -f 2496/3756/648 2495/3754/647 2511/3755/649 -f 2511/3758/649 2510/3663/595 2465/3662/589 -f 2512/3760/650 2511/3758/649 2466/3759/590 +f 2825/3986/507 2864/3987/508 2824/3988/509 +f 2841/3989/510 2864/3987/508 2865/3990/511 +f 2856/3991/512 2841/3992/510 2857/3993/513 +f 2820/3994/514 2857/3995/513 2821/3996/515 +f 2872/3997/516 2821/3998/515 2873/3999/517 +f 2836/4000/518 2873/4001/517 2837/4002/519 +f 2852/4003/520 2837/4004/519 2853/4005/521 +f 2828/4006/522 2853/4007/521 2829/4008/523 +f 2868/4009/524 2829/4010/523 2869/4011/525 +f 2844/4012/526 2869/4013/525 2845/4014/527 +f 2849/4015/528 2824/4016/509 2848/4017/529 +f 2849/4018/528 2832/4019/530 2833/4020/531 +f 2833/4021/531 2876/4022/532 2877/4023/533 +f 2816/4024/534 2876/4022/532 2815/4025/535 +f 2816/4026/534 2860/4027/536 2861/4028/537 +f 2845/4029/527 2860/4027/536 2844/4012/526 +f 2817/4030/538 2877/4031/533 2816/4024/534 +f 2879/4032/539 2817/4030/538 2818/4033/540 +f 2850/4034/541 2833/4020/531 2834/4035/542 +f 2835/4036/543 2850/4034/541 2834/4035/542 +f 2833/4021/531 2878/4037/544 2834/4038/542 +f 2834/4038/542 2879/4039/539 2835/4040/543 +f 2825/4041/507 2850/4042/541 2826/4043/545 +f 2826/4043/545 2851/4044/546 2827/4045/547 +f 2826/4046/545 2865/4047/511 2825/3986/507 +f 2827/4048/547 2866/4049/548 2826/4046/545 +f 2841/3989/510 2866/4050/548 2842/4051/549 +f 2843/4052/550 2866/4050/548 2867/4053/551 +f 2842/4054/549 2857/3993/513 2841/3992/510 +f 2843/4055/550 2858/4056/552 2842/4054/549 +f 2821/3996/515 2858/4057/552 2822/4058/553 +f 2822/4058/553 2859/4059/554 2823/4060/555 +f 2874/4061/556 2821/3998/515 2822/4062/553 +f 2823/4063/555 2874/4061/556 2822/4062/553 +f 2837/4002/519 2874/4064/556 2838/4065/557 +f 2838/4065/557 2875/4066/558 2839/4067/559 +f 2838/4068/557 2853/4005/521 2837/4004/519 +f 2839/4069/559 2854/4070/560 2838/4068/557 +f 2830/4071/561 2853/4007/521 2854/4072/560 +f 2831/4073/562 2854/4072/560 2855/4074/563 +f 2830/4075/561 2869/4011/525 2829/4010/523 +f 2831/4076/562 2870/4077/564 2830/4075/561 +f 2846/4078/565 2869/4013/525 2870/4079/564 +f 2847/4080/566 2870/4079/564 2871/4081/567 +f 2862/4082/568 2845/4029/527 2846/4083/565 +f 2847/4084/566 2862/4082/568 2846/4083/565 +f 2816/4026/534 2862/4085/568 2817/4086/538 +f 2817/4086/538 2863/4087/569 2818/4088/540 +f 2819/4089/506 2818/4088/540 2863/4087/569 +f 2863/4090/569 2847/4084/566 2819/4091/506 +f 2871/4081/567 2819/4092/506 2847/4080/566 +f 2871/4093/567 2831/4076/562 2819/4094/506 +f 2855/4074/563 2819/4095/506 2831/4073/562 +f 2855/4096/563 2839/4069/559 2819/4097/506 +f 2875/4066/558 2819/4098/506 2839/4067/559 +f 2875/4099/558 2823/4063/555 2819/4100/506 +f 2859/4059/554 2819/4101/506 2823/4060/555 +f 2859/4102/554 2843/4055/550 2819/4103/506 +f 2867/4053/551 2819/4104/506 2843/4052/550 +f 2867/4105/551 2827/4048/547 2819/4106/506 +f 2851/4044/546 2819/4107/506 2827/4045/547 +f 2819/4108/506 2879/4032/539 2818/4033/540 +f 2879/4039/539 2819/4109/506 2835/4040/543 +f 2851/4110/546 2835/4036/543 2819/4111/506 +f 2810/4112/570 2815/4025/535 2876/4022/532 +f 2812/4113/571 2815/4025/535 2811/4114/572 +f 2812/4113/571 2844/4012/526 2860/4027/536 +f 2868/4009/524 2813/4115/573 2814/4116/574 +f 2814/4116/574 2828/4006/522 2868/4009/524 +f 2852/4003/520 2799/4117/575 2800/4118/576 +f 2800/4118/576 2836/4000/518 2852/4003/520 +f 2872/3997/516 2801/4119/577 2802/4120/578 +f 2802/4120/578 2820/3994/514 2872/3997/516 +f 2856/3991/512 2803/4121/579 2804/4122/580 +f 2804/4122/580 2840/4123/581 2856/3991/512 +f 2864/3987/508 2805/4124/582 2806/4125/583 +f 2806/4125/583 2824/3988/509 2864/3987/508 +f 2848/4017/529 2807/3946/584 2808/4126/585 +f 2809/4127/586 2848/4017/529 2808/4126/585 +f 2810/4112/570 2832/4019/530 2809/4127/586 +f 2880/4128/587 2942/4129/588 2881/4130/589 +f 2882/4131/590 2942/4129/588 2943/4132/591 +f 2882/4131/590 2944/4133/592 2883/4134/593 +f 2925/4135/594 2881/4136/589 2926/4137/595 +f 2910/4138/596 2925/4135/594 2926/4139/595 +f 2933/4140/597 2910/4141/596 2934/4142/598 +f 2894/4143/599 2933/4140/597 2934/4144/598 +f 2918/4145/600 2893/4146/601 2894/4147/599 +f 2902/4148/602 2917/4149/603 2918/4150/600 +f 2938/4151/604 2901/4152/605 2902/4153/602 +f 2886/4154/606 2937/4155/607 2938/4156/604 +f 2922/4157/608 2885/4158/609 2886/4159/606 +f 2906/4160/610 2921/4161/611 2922/4162/608 +f 2929/4163/612 2906/4164/610 2930/4165/613 +f 2890/4166/614 2929/4163/612 2930/4167/613 +f 2913/4168/615 2890/4169/614 2914/4170/616 +f 2897/4171/617 2914/4172/616 2898/4173/618 +f 2942/4174/588 2897/4171/617 2898/4175/618 +f 2793/3952/577 2941/4176/619 2794/3950/578 +f 2794/3950/578 2880/4128/587 2795/3957/579 +f 2796/3955/580 2880/4128/587 2925/4135/594 +f 2796/3955/580 2909/4177/620 2797/3962/582 +f 2797/3962/582 2933/4140/597 2798/3960/583 +f 2798/3960/583 2893/4146/601 2783/3963/584 +f 2783/3963/584 2917/4149/603 2784/3965/585 +f 2784/3965/585 2901/4152/605 2785/3971/586 +f 2785/3971/586 2937/4155/607 2786/3969/570 +f 2786/3969/570 2885/4158/609 2787/3975/572 +f 2787/3975/572 2921/4161/611 2788/3937/571 +f 2788/3937/571 2905/4178/621 2789/3942/573 +f 2789/3942/573 2929/4163/612 2790/3940/574 +f 2790/3940/574 2889/4179/622 2791/3943/575 +f 2791/3947/575 2913/4168/615 2792/3945/576 +f 2913/4168/615 2793/3952/577 2792/3945/576 +f 2943/4180/591 2898/4175/618 2899/4181/623 +f 2944/4182/592 2899/4181/623 2900/4183/624 +f 2899/4184/623 2914/4172/616 2915/4185/625 +f 2900/4186/624 2915/4185/625 2916/4187/626 +f 2915/4188/625 2890/4169/614 2891/4189/627 +f 2892/4190/628 2915/4188/625 2891/4189/627 +f 2891/4191/627 2930/4167/613 2931/4192/629 +f 2892/4193/628 2931/4192/629 2932/4194/630 +f 2907/4195/631 2930/4165/613 2906/4164/610 +f 2932/4196/630 2907/4195/631 2908/4197/632 +f 2907/4198/631 2922/4162/608 2923/4199/633 +f 2908/4200/632 2923/4199/633 2924/4201/634 +f 2923/4202/633 2886/4159/606 2887/4203/635 +f 2924/4204/634 2887/4203/635 2888/4205/636 +f 2886/4154/606 2939/4206/637 2887/4207/635 +f 2888/4208/636 2939/4206/637 2940/4209/638 +f 2939/4210/637 2902/4153/602 2903/4211/639 +f 2940/4212/638 2903/4211/639 2904/4213/640 +f 2903/4214/639 2918/4150/600 2919/4215/641 +f 2904/4216/640 2919/4215/641 2920/4217/642 +f 2895/4218/643 2918/4145/600 2894/4147/599 +f 2896/4219/644 2919/4220/641 2895/4218/643 +f 2895/4221/643 2934/4144/598 2935/4222/645 +f 2896/4223/644 2935/4222/645 2936/4224/646 +f 2911/4225/647 2934/4142/598 2910/4141/596 +f 2912/4226/648 2935/4227/645 2911/4225/647 +f 2911/4228/647 2926/4139/595 2927/4229/649 +f 2912/4230/648 2927/4229/649 2928/4231/650 +f 2927/4232/649 2881/4136/589 2882/4233/590 +f 2928/4234/650 2882/4233/590 2883/4235/593 +f 2884/4236/651 2883/4134/593 2944/4133/592 +f 2944/4182/592 2900/4183/624 2884/4237/651 +f 2916/4187/626 2884/4238/651 2900/4186/624 +f 2916/4239/626 2892/4190/628 2884/4240/651 +f 2932/4194/630 2884/4241/651 2892/4193/628 +f 2932/4196/630 2908/4197/632 2884/4242/651 +f 2924/4201/634 2884/4243/651 2908/4200/632 +f 2924/4204/634 2888/4205/636 2884/4244/651 +f 2940/4209/638 2884/4245/651 2888/4208/636 +f 2940/4212/638 2904/4213/640 2884/4246/651 +f 2920/4217/642 2884/4247/651 2904/4216/640 +f 2920/4248/642 2896/4219/644 2884/4249/651 +f 2936/4224/646 2884/4250/651 2896/4223/644 +f 2936/4251/646 2912/4226/648 2884/4252/651 +f 2928/4231/650 2884/4253/651 2912/4230/648 +f 2884/4254/651 2928/4234/650 2883/4235/593 +f 2825/3986/507 2865/4047/511 2864/3987/508 +f 2841/3989/510 2840/4123/581 2864/3987/508 +f 2856/3991/512 2840/4123/581 2841/3992/510 +f 2820/3994/514 2856/3991/512 2857/3995/513 +f 2872/3997/516 2820/3994/514 2821/3998/515 +f 2836/4000/518 2872/3997/516 2873/4001/517 +f 2852/4003/520 2836/4000/518 2837/4004/519 +f 2828/4006/522 2852/4003/520 2853/4007/521 +f 2868/4009/524 2828/4006/522 2829/4010/523 +f 2844/4012/526 2868/4009/524 2869/4013/525 +f 2849/4015/528 2825/4041/507 2824/4016/509 +f 2849/4018/528 2848/4017/529 2832/4019/530 +f 2833/4021/531 2832/4019/530 2876/4022/532 +f 2816/4024/534 2877/4031/533 2876/4022/532 +f 2816/4026/534 2815/4025/535 2860/4027/536 +f 2845/4029/527 2861/4255/537 2860/4027/536 +f 2817/4030/538 2878/4256/544 2877/4031/533 +f 2879/4032/539 2878/4256/544 2817/4030/538 +f 2850/4034/541 2849/4018/528 2833/4020/531 +f 2835/4036/543 2851/4110/546 2850/4034/541 +f 2833/4021/531 2877/4023/533 2878/4037/544 +f 2834/4038/542 2878/4037/544 2879/4039/539 +f 2825/4041/507 2849/4015/528 2850/4042/541 +f 2826/4043/545 2850/4042/541 2851/4044/546 +f 2826/4046/545 2866/4049/548 2865/4047/511 +f 2827/4048/547 2867/4105/551 2866/4049/548 +f 2841/3989/510 2865/3990/511 2866/4050/548 +f 2843/4052/550 2842/4051/549 2866/4050/548 +f 2842/4054/549 2858/4056/552 2857/3993/513 +f 2843/4055/550 2859/4102/554 2858/4056/552 +f 2821/3996/515 2857/3995/513 2858/4057/552 +f 2822/4058/553 2858/4057/552 2859/4059/554 +f 2874/4061/556 2873/3999/517 2821/3998/515 +f 2823/4063/555 2875/4099/558 2874/4061/556 +f 2837/4002/519 2873/4001/517 2874/4064/556 +f 2838/4065/557 2874/4064/556 2875/4066/558 +f 2838/4068/557 2854/4070/560 2853/4005/521 +f 2839/4069/559 2855/4096/563 2854/4070/560 +f 2830/4071/561 2829/4008/523 2853/4007/521 +f 2831/4073/562 2830/4071/561 2854/4072/560 +f 2830/4075/561 2870/4077/564 2869/4011/525 +f 2831/4076/562 2871/4093/567 2870/4077/564 +f 2846/4078/565 2845/4014/527 2869/4013/525 +f 2847/4080/566 2846/4078/565 2870/4079/564 +f 2862/4082/568 2861/4255/537 2845/4029/527 +f 2847/4084/566 2863/4090/569 2862/4082/568 +f 2816/4026/534 2861/4028/537 2862/4085/568 +f 2817/4086/538 2862/4085/568 2863/4087/569 +f 2810/4112/570 2811/4114/572 2815/4025/535 +f 2812/4113/571 2860/4027/536 2815/4025/535 +f 2812/4113/571 2813/4115/573 2844/4012/526 +f 2868/4009/524 2844/4012/526 2813/4115/573 +f 2814/4116/574 2799/4117/575 2828/4006/522 +f 2852/4003/520 2828/4006/522 2799/4117/575 +f 2800/4118/576 2801/4119/577 2836/4000/518 +f 2872/3997/516 2836/4000/518 2801/4119/577 +f 2802/4120/578 2803/4121/579 2820/3994/514 +f 2856/3991/512 2820/3994/514 2803/4121/579 +f 2804/4122/580 2805/4124/582 2840/4123/581 +f 2864/3987/508 2840/4123/581 2805/4124/582 +f 2806/4125/583 2807/4257/584 2824/3988/509 +f 2848/4017/529 2824/4016/509 2807/3946/584 +f 2809/4127/586 2832/4019/530 2848/4017/529 +f 2810/4112/570 2876/4022/532 2832/4019/530 +f 2880/4128/587 2941/4176/619 2942/4129/588 +f 2882/4131/590 2881/4130/589 2942/4129/588 +f 2882/4131/590 2943/4132/591 2944/4133/592 +f 2925/4135/594 2880/4128/587 2881/4136/589 +f 2910/4138/596 2909/4177/620 2925/4135/594 +f 2933/4140/597 2909/4177/620 2910/4141/596 +f 2894/4143/599 2893/4146/601 2933/4140/597 +f 2918/4145/600 2917/4149/603 2893/4146/601 +f 2902/4148/602 2901/4152/605 2917/4149/603 +f 2938/4151/604 2937/4155/607 2901/4152/605 +f 2886/4154/606 2885/4158/609 2937/4155/607 +f 2922/4157/608 2921/4161/611 2885/4158/609 +f 2906/4160/610 2905/4178/621 2921/4161/611 +f 2929/4163/612 2905/4178/621 2906/4164/610 +f 2890/4166/614 2889/4179/622 2929/4163/612 +f 2913/4168/615 2889/4258/622 2890/4169/614 +f 2897/4171/617 2913/4168/615 2914/4172/616 +f 2942/4174/588 2941/4176/619 2897/4171/617 +f 2793/3952/577 2897/4171/617 2941/4176/619 +f 2794/3950/578 2941/4176/619 2880/4128/587 +f 2796/3955/580 2795/3957/579 2880/4128/587 +f 2796/3955/580 2925/4135/594 2909/4177/620 +f 2797/3962/582 2909/4177/620 2933/4140/597 +f 2798/3960/583 2933/4140/597 2893/4146/601 +f 2783/3963/584 2893/4146/601 2917/4149/603 +f 2784/3965/585 2917/4149/603 2901/4152/605 +f 2785/3971/586 2901/4152/605 2937/4155/607 +f 2786/3969/570 2937/4155/607 2885/4158/609 +f 2787/3975/572 2885/4158/609 2921/4161/611 +f 2788/3937/571 2921/4161/611 2905/4178/621 +f 2789/3942/573 2905/4178/621 2929/4163/612 +f 2790/3940/574 2929/4163/612 2889/4179/622 +f 2791/3947/575 2889/4258/622 2913/4168/615 +f 2913/4168/615 2897/4171/617 2793/3952/577 +f 2943/4180/591 2942/4174/588 2898/4175/618 +f 2944/4182/592 2943/4180/591 2899/4181/623 +f 2899/4184/623 2898/4173/618 2914/4172/616 +f 2900/4186/624 2899/4184/623 2915/4185/625 +f 2915/4188/625 2914/4170/616 2890/4169/614 +f 2892/4190/628 2916/4239/626 2915/4188/625 +f 2891/4191/627 2890/4166/614 2930/4167/613 +f 2892/4193/628 2891/4191/627 2931/4192/629 +f 2907/4195/631 2931/4259/629 2930/4165/613 +f 2932/4196/630 2931/4259/629 2907/4195/631 +f 2907/4198/631 2906/4160/610 2922/4162/608 +f 2908/4200/632 2907/4198/631 2923/4199/633 +f 2923/4202/633 2922/4157/608 2886/4159/606 +f 2924/4204/634 2923/4202/633 2887/4203/635 +f 2886/4154/606 2938/4156/604 2939/4206/637 +f 2888/4208/636 2887/4207/635 2939/4206/637 +f 2939/4210/637 2938/4151/604 2902/4153/602 +f 2940/4212/638 2939/4210/637 2903/4211/639 +f 2903/4214/639 2902/4148/602 2918/4150/600 +f 2904/4216/640 2903/4214/639 2919/4215/641 +f 2895/4218/643 2919/4220/641 2918/4145/600 +f 2896/4219/644 2920/4248/642 2919/4220/641 +f 2895/4221/643 2894/4143/599 2934/4144/598 +f 2896/4223/644 2895/4221/643 2935/4222/645 +f 2911/4225/647 2935/4227/645 2934/4142/598 +f 2912/4226/648 2936/4251/646 2935/4227/645 +f 2911/4228/647 2910/4138/596 2926/4139/595 +f 2912/4230/648 2911/4228/647 2927/4229/649 +f 2927/4232/649 2926/4137/595 2881/4136/589 +f 2928/4234/650 2927/4232/649 2882/4233/590 o Frame v -3.125000 4.499998 -5.500007 v -2.375000 4.499998 -5.500007 @@ -14468,2068 +15774,2068 @@ vn -0.1363 -0.6737 -0.7263 vn 0.1448 0.7194 0.6794 vn -0.1363 -0.6737 0.7263 s off -f 2533/3786/652 2529/3787/652 2534/3788/652 -f 2534/3788/653 2531/3789/653 2540/3790/653 -f 2540/3791/654 2532/3792/654 2539/3793/654 -f 2539/3794/655 2533/3795/655 2535/3796/655 -f 2535/3796/656 2534/3788/656 2538/3797/656 -f 2540/3798/653 2538/3797/653 2534/3799/653 -f 2541/3800/657 2537/3801/657 2542/3802/657 -f 2539/3793/655 2530/3803/655 2533/3786/655 -f 2540/3798/653 2537/3801/653 2538/3797/653 -f 2539/3794/655 2536/3804/655 2541/3805/655 -f 2536/3804/658 2538/3797/658 2537/3801/658 -f 2540/3806/659 2541/3805/659 2542/3807/659 -f 2544/3808/658 2545/3809/658 2543/3810/658 -f 2545/3811/660 2546/3812/660 2543/3813/660 -f 2544/3808/655 2548/3814/655 2545/3809/655 -f 2543/3813/654 2547/3815/654 2544/3808/654 -f 2549/3816/654 2552/3817/654 2550/3818/654 -f 2549/3819/653 2554/3820/653 2551/3821/653 -f 2552/3817/661 2553/3822/661 2550/3818/661 -f 2550/3823/658 2553/3824/658 2549/3819/658 -f 2548/3814/658 2552/3825/658 2546/3826/658 -f 2562/3827/662 2568/3828/662 2560/3829/662 -f 2569/3830/658 2562/3831/658 2561/3832/658 -f 2565/3833/663 2555/3834/663 2557/3835/663 -f 2558/3836/659 2565/3837/659 2557/3838/659 -f 2567/3839/664 2561/3840/664 2559/3841/664 -f 2568/3828/655 2556/3842/655 2560/3829/655 -f 2564/3843/665 2558/3844/665 2556/3842/665 -f 2563/3845/653 2559/3841/653 2555/3834/653 -f 2558/3846/654 2546/3812/654 2552/3817/654 -f 2546/3812/654 2555/3847/654 2547/3815/654 -f 2552/3817/654 2556/3848/654 2558/3846/654 -f 2548/3814/652 2566/3849/652 2554/3820/652 -f 2566/3849/652 2564/3850/652 2554/3820/652 -f 2565/3837/652 2548/3814/652 2563/3851/652 -f 2583/3852/659 2597/3853/659 2592/3854/659 -f 2573/3855/658 2574/3856/658 2575/3857/658 -f 2575/3857/658 2576/3858/658 2573/3855/658 -f 2574/3856/655 2597/3859/655 2584/3860/655 -f 2576/3858/658 2577/3861/658 2580/3862/658 -f 2593/3863/653 2589/3864/653 2578/3865/653 -f 2581/3866/659 2585/3867/659 2584/3868/659 -f 2587/3869/659 2585/3867/659 2581/3866/659 -f 2595/3870/652 2592/3854/652 2597/3853/652 -f 2587/3869/659 2588/3871/659 2586/3872/659 -f 2577/3861/660 2588/3873/660 2580/3874/660 -f 2627/3875/658 2620/3876/658 2619/3877/658 -f 2573/3855/653 2582/3878/653 2571/3879/653 -f 2575/3857/652 2586/3872/652 2577/3861/652 -f 2574/3880/661 2585/3867/661 2575/3857/661 -f 2579/3881/655 2587/3882/655 2576/3858/655 -f 2620/3883/662 2626/3884/662 2618/3885/662 -f 2576/3886/654 2581/3866/654 2573/3887/654 -f 2572/3888/655 2592/3889/655 2591/3890/655 -f 2588/3891/653 2596/3892/653 2580/3862/653 -f 2572/3888/658 2595/3893/658 2571/3879/658 -f 2595/3893/658 2573/3855/658 2571/3879/658 -f 2581/3866/659 2597/3853/659 2582/3894/659 -f 2598/3895/659 2587/3869/659 2590/3896/659 -f 2576/3858/658 2596/3892/658 2579/3881/658 -f 2598/3895/659 2589/3897/659 2594/3898/659 -f 2578/3865/658 2596/3892/658 2593/3863/658 -f 2594/3898/652 2596/3899/652 2598/3895/652 -f 2547/3815/655 2600/3900/655 2548/3814/655 -f 2600/3901/655 2599/3902/655 2601/3903/655 -f 2601/3903/666 2599/3904/666 2602/3905/666 -f 2604/3906/667 2605/3907/667 2603/3908/667 -f 2605/3907/653 2604/3909/653 2610/3910/653 -f 2602/3905/659 2605/3907/659 2609/3911/659 -f 2610/3912/653 2551/3821/653 2554/3820/653 -f 2607/3913/668 2612/3914/668 2609/3911/668 -f 2611/3915/669 2606/3916/669 2608/3917/669 -f 2600/3901/655 2606/3916/655 2611/3918/655 -f 2610/3910/653 2607/3913/653 2605/3907/653 -f 2609/3911/652 2611/3919/652 2608/3917/652 -f 2623/3920/663 2613/3921/663 2615/3922/663 -f 2616/3923/659 2623/3924/659 2615/3925/659 -f 2625/3926/664 2619/3927/664 2617/3928/664 -f 2626/3884/655 2614/3929/655 2618/3885/655 -f 2622/3930/665 2616/3931/665 2614/3929/665 -f 2621/3932/653 2617/3928/653 2613/3921/653 -f 2569/3830/652 2624/3933/652 2570/3934/652 -f 2616/3935/654 2561/3936/654 2562/3937/654 -f 2621/3938/652 2569/3830/652 2567/3939/652 -f 2561/3936/654 2613/3940/654 2559/3941/654 -f 2560/3942/654 2616/3935/654 2562/3937/654 -f 2624/3933/652 2568/3943/652 2570/3934/652 -f 2612/3944/658 2600/3900/658 2611/3945/658 -f 2627/3875/652 2610/3912/652 2628/3946/652 -f 2628/3946/652 2610/3912/652 2626/3947/652 -f 2627/3875/652 2625/3948/652 2600/3900/652 -f 2602/3905/654 2620/3949/654 2603/3908/654 -f 2620/3949/654 2604/3950/654 2603/3908/654 -f 2599/3951/654 2619/3952/654 2602/3905/654 -f 2599/3951/654 2547/3815/654 2559/3941/654 -f 2621/3938/652 2567/3939/652 2548/3814/652 -f 2604/3950/654 2618/3953/654 2614/3954/654 -f 2622/3955/652 2610/3912/652 2554/3820/652 -f 2633/3956/658 2632/3957/658 2629/3958/658 -f 2631/3959/659 2634/3960/659 2630/3961/659 -f 2632/3957/653 2635/3962/653 2631/3963/653 -f 2630/3961/655 2633/3956/655 2629/3958/655 -f 2641/3964/658 2640/3965/658 2637/3966/658 -f 2639/3967/659 2642/3968/659 2638/3969/659 -f 2640/3965/653 2643/3970/653 2639/3967/653 -f 2638/3971/655 2641/3964/655 2637/3966/655 -f 2642/3972/670 2647/3973/670 2641/3974/670 -f 2636/3975/671 2645/3976/671 2635/3977/671 -f 2646/3978/654 2648/3979/654 2645/3980/654 -f 2646/3978/658 2651/3981/658 2647/3982/658 -f 2648/3983/659 2649/3984/659 2645/3985/659 -f 2651/3981/652 2649/3984/652 2652/3986/652 -f 2647/3982/658 2644/3987/658 2641/3988/658 -f 2651/3981/660 2643/3970/660 2644/3989/660 -f 2652/3986/659 2642/3990/659 2643/3991/659 -f 2650/3992/658 2636/3993/658 2633/3994/658 -f 2634/3960/661 2650/3992/661 2633/3956/661 -f 2645/3985/659 2634/3995/659 2635/3996/659 -f 2659/3997/658 2660/3998/658 2653/3999/658 -f 2685/4000/658 2689/4001/658 2693/4002/658 -f 2679/4003/659 2675/4004/659 2671/4005/659 -f 2702/4006/658 2703/4007/658 2701/4008/658 -f 2703/4009/670 2704/4010/670 2701/4011/670 -f 2702/4006/653 2706/4012/653 2703/4009/653 -f 2701/4008/652 2705/4013/652 2702/4006/652 -f 2707/4014/652 2710/4015/652 2708/4016/652 -f 2707/4014/655 2712/4017/655 2709/4018/655 -f 2710/4019/671 2711/4020/671 2708/4021/671 -f 2708/4016/658 2711/4022/658 2707/4014/658 -f 2710/4015/658 2714/4023/658 2712/4024/658 -f 2706/4025/658 2715/4026/658 2704/4027/658 -f 2710/4015/660 2723/4028/660 2713/4029/660 -f 2704/4027/652 2718/4030/652 2705/4013/652 -f 2712/4017/655 2722/4031/655 2709/4018/655 -f 2715/4026/661 2719/4032/661 2704/4027/661 -f 2706/4012/671 2726/4033/671 2716/4034/671 -f 2709/4018/652 2721/4035/652 2710/4015/652 -f 2714/4036/670 2720/4037/670 2712/4017/670 -f 2705/4013/653 2717/4038/653 2706/4012/653 -f 2723/4028/659 2720/4039/659 2724/4040/659 -f 2718/4030/659 2719/4032/659 2717/4041/659 -f 2729/4042/670 2730/4043/670 2727/4044/670 -f 2728/4045/653 2732/4046/653 2729/4042/653 -f 2727/4047/652 2731/4048/652 2728/4045/652 -f 2733/4049/652 2736/4050/652 2734/4051/652 -f 2733/4049/655 2738/4052/655 2735/4053/655 -f 2736/4054/671 2737/4055/671 2734/4056/671 -f 2742/4057/658 2745/4058/658 2746/4059/658 -f 2740/4060/658 2739/4061/658 2741/4062/658 -f 2743/4063/652 2733/4049/652 2734/4051/652 -f 2744/4064/655 2737/4055/655 2733/4049/655 -f 2740/4060/652 2727/4047/652 2728/4045/652 -f 2739/4065/653 2728/4045/653 2729/4042/653 -f 2743/4063/660 2749/4066/660 2745/4058/660 -f 2737/4067/659 2749/4066/659 2734/4051/659 -f 2750/4068/670 2742/4069/670 2746/4070/670 -f 2751/4071/661 2741/4062/661 2747/4072/661 -f 2751/4071/659 2729/4073/659 2727/4047/659 -f 2739/4065/671 2752/4074/671 2748/4075/671 -f 2951/4076/659 2950/4077/659 2949/4078/659 -f 2955/4079/658 2953/4080/658 2954/4081/658 -f 2952/4082/655 2955/4079/655 2950/4077/655 -f 2951/4083/653 2954/4081/653 2953/4080/653 -f 2952/4084/655 2961/4085/655 2958/4086/655 -f 2950/4087/657 2954/4081/657 2949/4088/657 -f 2951/4083/653 2953/4080/653 2957/4089/653 -f 2956/4090/656 2957/4091/656 2953/4080/656 -f 2952/4082/655 2958/4092/655 2956/4090/655 -f 2951/4093/654 2959/4094/654 2952/4084/654 -f 2957/4091/653 2960/4095/653 2951/4096/653 -f 2958/4086/652 2962/4097/652 2957/4091/652 -f 2966/4098/652 2969/4099/652 2965/4100/652 -f 2963/4101/654 2968/4102/654 2964/4103/654 -f 2964/4103/655 2970/4104/655 2966/4098/655 -f 2965/4100/653 2967/4105/653 2963/4106/653 -f 2974/4107/652 2977/4108/652 2973/4109/652 -f 2971/4110/654 2976/4111/654 2972/4112/654 -f 2972/4112/655 2978/4113/655 2974/4107/655 -f 2973/4109/653 2975/4114/653 2971/4115/653 -f 2985/4116/652 2982/4117/652 2981/4118/652 -f 2984/4119/654 2979/4120/654 2980/4121/654 -f 2986/4122/655 2980/4121/655 2982/4117/655 -f 2983/4123/653 2981/4118/653 2979/4124/653 -f 2993/4125/652 2990/4126/652 2989/4127/652 -f 2992/4128/654 2987/4129/654 2988/4130/654 -f 2994/4131/655 2988/4130/655 2990/4126/655 -f 2991/4132/653 2989/4127/653 2987/4133/653 -f 3001/4134/652 2998/4135/652 2997/4136/652 -f 3000/4137/654 2995/4138/654 2996/4139/654 -f 3002/4140/655 2996/4139/655 2998/4135/655 -f 2999/4141/653 2997/4136/653 2995/4142/653 -f 3009/4143/652 3006/4144/652 3005/4145/652 -f 3008/4146/654 3003/4147/654 3004/4148/654 -f 3010/4149/655 3004/4148/655 3006/4144/655 -f 3007/4150/653 3005/4145/653 3003/4151/653 -f 3017/4152/652 3014/4153/652 3013/4154/652 -f 3016/4155/654 3011/4156/654 3012/4157/654 -f 3018/4158/655 3012/4157/655 3014/4153/655 -f 3015/4159/653 3013/4154/653 3011/4160/653 -f 3025/4161/652 3022/4162/652 3021/4163/652 -f 3024/4164/654 3019/4165/654 3020/4166/654 -f 3026/4167/655 3020/4166/655 3022/4162/655 -f 3023/4168/653 3021/4163/653 3019/4169/653 -f 3033/4170/652 3030/4171/652 3029/4172/652 -f 3032/4173/654 3027/4174/654 3028/4175/654 -f 3034/4176/655 3028/4175/655 3030/4171/655 -f 3031/4177/653 3029/4172/653 3027/4178/653 -f 3041/4179/652 3038/4180/652 3037/4181/652 -f 3040/4182/654 3035/4183/654 3036/4184/654 -f 3042/4185/655 3036/4184/655 3038/4180/655 -f 3039/4186/653 3037/4181/653 3035/4187/653 -f 3049/4188/652 3046/4189/652 3045/4190/652 -f 3048/4191/654 3043/4192/654 3044/4193/654 -f 3050/4194/655 3044/4193/655 3046/4189/655 -f 3047/4195/653 3045/4190/653 3043/4196/653 -f 3057/4197/652 3054/4198/652 3053/4199/652 -f 3056/4200/654 3051/4201/654 3052/4202/654 -f 3058/4203/655 3052/4202/655 3054/4198/655 -f 3055/4204/653 3053/4199/653 3051/4205/653 -f 3060/4206/655 3061/4207/655 3059/4208/655 -f 3066/4209/665 3067/4210/665 3063/4211/665 -f 3060/4206/654 3066/4212/654 3062/4213/654 -f 3061/4214/652 3064/4215/652 3059/4208/652 -f 3062/4216/659 3063/4217/659 3061/4214/659 -f 3059/4208/658 3065/4218/658 3060/4206/658 -f 3068/4219/655 3069/4220/655 3067/4221/655 -f 3068/4222/654 3074/4223/654 3070/4224/654 -f 3069/4220/652 3071/4225/652 3067/4221/652 -f 3074/4223/653 3071/4225/653 3073/4226/653 -f 3064/4215/664 3072/4227/664 3065/4218/664 -f 3072/4227/654 3066/4228/654 3065/4218/654 -f 3067/4210/652 3064/4215/652 3063/4211/652 -f 3076/4229/653 3077/4230/653 3075/4231/653 -f 3078/4232/659 3081/4233/659 3077/4234/659 -f 3082/4235/655 3079/4236/655 3081/4233/655 -f 3080/4237/658 3075/4231/658 3079/4236/658 -f 3078/4238/654 3090/4239/654 3082/4240/654 -f 3082/4240/655 3094/4241/655 3086/4242/655 -f 3078/4243/653 3076/4244/653 3085/4245/653 -f 3086/4242/656 3076/4229/656 3080/4237/656 -f 3082/4240/655 3086/4242/655 3080/4246/655 -f 3077/4247/653 3083/4248/653 3075/4249/653 -f 3083/4248/657 3079/4236/657 3075/4231/657 -f 3081/4250/655 3079/4251/655 3084/4252/655 -f 3084/4252/655 3087/4253/655 3081/4250/655 -f 3083/4248/654 3091/4254/654 3084/4252/654 -f 3085/4245/653 3089/4255/653 3078/4243/653 -f 3086/4242/652 3093/4256/652 3085/4245/652 -f 3081/4250/652 3088/4257/652 3077/4258/652 -f 3077/4247/653 3092/4259/653 3083/4248/653 -f 3097/4260/659 3102/4261/659 3101/4262/659 -f 3096/4263/653 3097/4260/653 3095/4264/653 -f 3095/4264/658 3100/4265/658 3096/4266/658 -f 3097/4260/654 3099/4267/654 3095/4264/654 -f 3105/4268/659 3110/4269/659 3109/4270/659 -f 3104/4271/653 3105/4268/653 3103/4272/653 -f 3103/4272/658 3108/4273/658 3104/4274/658 -f 3105/4268/654 3107/4275/654 3103/4272/654 -f 3114/4276/672 3112/4277/672 3111/4278/672 -f 3115/4279/653 3113/4280/653 3118/4281/653 -f 3120/4282/655 3126/4283/655 3121/4284/655 -f 3122/4285/657 3120/4282/657 3121/4284/657 -f 3122/4286/653 3124/4287/653 3119/4288/653 -f 3115/4289/657 3117/4290/657 3116/4291/657 -f 3117/4290/655 3111/4278/655 3116/4291/655 -f 3123/4292/672 3125/4293/672 3126/4283/672 -f 3133/4294/652 3131/4295/652 3132/4296/652 -f 3129/4297/659 3134/4298/659 3130/4299/659 -f 3128/4300/658 3132/4296/658 3127/4301/658 -f 3130/4302/655 3133/4294/655 3128/4303/655 -f 3127/4304/653 3131/4295/653 3129/4305/653 -f 3137/4306/653 3139/4307/653 3135/4308/653 -f 3142/4309/658 3137/4306/658 3138/4310/658 -f 3136/4311/655 3142/4309/655 3138/4310/655 -f 3135/4312/659 3140/4313/659 3136/4311/659 -f 3145/4314/653 3147/4315/653 3143/4316/653 -f 3150/4317/658 3145/4318/658 3146/4319/658 -f 3144/4320/655 3150/4317/655 3146/4319/655 -f 3143/4316/659 3148/4321/659 3144/4320/659 -f 3153/4322/653 3155/4323/653 3151/4324/653 -f 3158/4325/658 3153/4322/658 3154/4326/658 -f 3152/4327/655 3158/4325/655 3154/4326/655 -f 3151/4324/659 3156/4328/659 3152/4329/659 -f 3161/4330/653 3163/4331/653 3159/4332/653 -f 3166/4333/658 3161/4330/658 3162/4334/658 -f 3160/4335/655 3166/4336/655 3162/4337/655 -f 3159/4332/659 3164/4338/659 3160/4335/659 -f 3170/4339/652 3167/4340/652 3168/4341/652 -f 3171/4342/654 3174/4343/654 3172/4344/654 -f 3170/4339/653 3173/4345/653 3169/4346/653 -f 3167/4340/655 3172/4344/655 3168/4341/655 -f 3168/4341/659 3174/4347/659 3170/4339/659 -f 3169/4346/658 3171/4348/658 3167/4340/658 -f 3180/4349/672 3185/4350/672 3179/4351/672 -f 3179/4352/652 3182/4353/652 3180/4354/652 -f 3177/4355/655 3179/4352/655 3175/4356/655 -f 3178/4357/653 3180/4354/653 3182/4353/653 -f 3179/4351/655 3183/4358/655 3175/4356/655 -f 3176/4359/653 3186/4360/653 3180/4349/653 -f 3188/4361/653 3189/4362/653 3187/4363/653 -f 3190/4364/659 3193/4365/659 3189/4366/659 -f 3194/4367/655 3191/4368/655 3193/4369/655 -f 3190/4364/652 3192/4370/652 3194/4367/652 -f 3202/4371/653 3196/4372/653 3198/4373/653 -f 3195/4374/655 3201/4375/655 3197/4376/655 -f 3197/4376/652 3202/4371/652 3198/4373/652 -f 3201/4377/658 3204/4378/658 3202/4379/658 -f 3203/4380/652 3206/4381/652 3204/4378/652 -f 3202/4379/653 3206/4382/653 3200/4383/653 -f 3205/4384/655 3201/4377/655 3199/4385/655 -f 3213/4386/672 3210/4387/672 3209/4388/672 -f 3211/4389/653 3209/4388/653 3207/4390/653 -f 3214/4391/655 3208/4392/655 3210/4387/655 -f 3217/4393/655 3216/4394/655 3215/4395/655 -f 3221/4396/659 3218/4397/659 3217/4398/659 -f 3219/4399/653 3222/4400/653 3221/4401/653 -f 3220/4402/652 3218/4397/652 3222/4400/652 -f 3229/4403/652 3227/4404/652 3228/4405/652 -f 3225/4406/659 3234/4407/659 3226/4408/659 -f 3223/4409/653 3231/4410/653 3225/4411/653 -f 3226/4412/655 3233/4413/655 3224/4414/655 -f 3233/4413/652 3231/4410/652 3232/4415/652 -f 3224/4416/658 3232/4415/658 3223/4417/658 -f 3235/4418/654 3237/4419/654 3236/4420/654 -f 3229/4403/655 3238/4421/655 3230/4422/655 -f 3227/4404/653 3236/4423/653 3228/4405/653 -f 3230/4422/659 3235/4424/659 3227/4404/659 -f 3228/4405/658 3237/4419/658 3229/4403/658 -f 3208/4392/655 3458/4425/655 3210/4426/655 -f 3209/4427/653 3455/4428/653 3207/4390/653 -f 3210/4426/652 3457/4429/652 3209/4427/652 -f 3458/4430/655 3460/4431/655 3462/4432/655 -f 3457/4433/653 3459/4434/653 3455/4428/653 -f 3458/4430/658 3461/4435/658 3457/4433/658 -f 3460/4436/655 3466/4437/655 3462/4432/655 -f 3459/4438/653 3465/4439/653 3463/4440/653 -f 3462/4432/652 3465/4439/652 3461/4435/652 -f 3464/4441/659 3465/4439/659 3466/4437/659 -f 3480/4442/653 3481/4443/653 3479/4444/653 -f 3472/4445/653 3473/4446/653 3471/4447/653 -f 3470/4448/658 3472/4449/658 3468/4450/658 -f 3571/4451/653 3573/4452/653 3564/4453/653 -f 3467/4454/659 3473/4446/659 3469/4455/659 -f 3469/4455/652 3474/4456/652 3470/4448/652 -f 3478/4457/658 3480/4458/658 3476/4459/658 -f 3566/4460/655 3576/4461/655 3572/4462/655 -f 3475/4463/659 3481/4443/659 3477/4464/659 -f 3477/4464/652 3482/4465/652 3478/4457/652 -f 3496/4466/653 3497/4467/653 3495/4468/653 -f 3488/4469/653 3489/4470/653 3487/4471/653 -f 3486/4472/658 3488/4473/658 3484/4474/658 -f 3585/4475/653 3587/4476/653 3578/4477/653 -f 3483/4478/659 3489/4470/659 3485/4479/659 -f 3485/4479/652 3490/4480/652 3486/4472/652 -f 3494/4481/658 3496/4482/658 3492/4483/658 -f 3564/4484/653 3569/4485/653 3571/4486/653 -f 3491/4487/659 3497/4467/659 3493/4488/659 -f 3493/4488/652 3498/4489/652 3494/4481/652 -f 3512/4490/653 3513/4491/653 3511/4492/653 -f 3504/4493/653 3505/4494/653 3503/4495/653 -f 3502/4496/658 3504/4497/658 3500/4498/658 -f 3572/4462/656 3569/4485/656 3570/4499/656 -f 3499/4500/659 3505/4494/659 3501/4501/659 -f 3501/4501/652 3506/4502/652 3502/4496/652 -f 3510/4503/658 3512/4504/658 3508/4505/658 -f 3566/4506/655 3572/4507/655 3570/4499/655 -f 3507/4508/659 3513/4491/659 3509/4509/659 -f 3509/4509/652 3514/4510/652 3510/4503/652 -f 3518/4511/658 3520/4512/658 3516/4513/658 -f 3591/4514/653 3597/4515/653 3592/4516/653 -f 3515/4517/659 3521/4518/659 3517/4519/659 -f 3517/4519/652 3522/4520/652 3518/4511/652 -f 3526/4521/658 3528/4522/658 3524/4523/658 -f 3566/4506/655 3567/4524/655 3565/4525/655 -f 3523/4526/659 3529/4527/659 3525/4528/659 -f 3525/4528/652 3530/4529/652 3526/4521/652 -f 3534/4530/658 3536/4531/658 3532/4532/658 -f 3564/4453/654 3574/4533/654 3566/4534/654 -f 3531/4535/659 3537/4536/659 3533/4537/659 -f 3533/4537/652 3538/4538/652 3534/4530/652 -f 3542/4539/658 3544/4540/658 3540/4541/658 -f 3563/4542/653 3569/4485/653 3564/4484/653 -f 3539/4543/659 3545/4544/659 3541/4545/659 -f 3541/4545/652 3546/4546/652 3542/4539/652 -f 3550/4547/658 3552/4548/658 3548/4549/658 -f 3567/4524/658 3569/4485/658 3568/4550/658 -f 3547/4551/659 3553/4552/659 3549/4553/659 -f 3549/4553/652 3554/4554/652 3550/4547/652 -f 3558/4555/658 3560/4556/658 3556/4557/658 -f 3564/4484/659 3565/4558/659 3563/4542/659 -f 3555/4559/659 3561/4560/659 3557/4561/659 -f 3557/4561/652 3562/4562/652 3558/4555/652 -f 3555/4563/655 3558/4555/655 3556/4564/655 -f 3547/4565/655 3550/4547/655 3548/4566/655 -f 3539/4567/655 3542/4539/655 3540/4568/655 -f 3531/4569/655 3534/4530/655 3532/4570/655 -f 3523/4571/655 3526/4521/655 3524/4572/655 -f 3515/4573/655 3518/4511/655 3516/4574/655 -f 3572/4462/652 3575/4575/652 3571/4451/652 -f 3580/4576/655 3590/4577/655 3586/4578/655 -f 3578/4579/653 3583/4580/653 3585/4581/653 -f 3586/4578/656 3583/4580/656 3584/4582/656 -f 3580/4583/655 3586/4584/655 3584/4582/655 -f 3594/4585/655 3595/4586/655 3593/4587/655 -f 3580/4583/655 3581/4588/655 3579/4589/655 -f 3578/4477/654 3588/4590/654 3580/4591/654 -f 3577/4592/653 3583/4580/653 3578/4579/653 -f 3581/4588/658 3583/4580/658 3582/4593/658 -f 3578/4579/659 3579/4594/659 3577/4592/659 -f 3586/4578/652 3589/4595/652 3585/4475/652 -f 3595/4586/658 3597/4515/658 3596/4596/658 -f 3592/4516/659 3593/4597/659 3591/4514/659 -f 3602/4598/655 3603/4599/655 3601/4600/655 -f 3599/4601/653 3605/4602/653 3600/4603/653 -f 3603/4599/658 3605/4602/658 3604/4604/658 -f 3600/4603/659 3601/4605/659 3599/4601/659 -f 2743/4063/658 2742/4606/658 2744/4064/658 -f 2739/4607/658 2747/4072/658 2741/4062/658 -f 2719/4032/659 2726/4608/659 2717/4609/659 -f 2720/4610/659 2721/4035/659 2722/4031/659 -f 3611/4611/658 3610/4612/658 3607/4613/658 -f 3609/4614/659 3612/4615/659 3608/4616/659 -f 3610/4612/653 3613/4617/653 3609/4618/653 -f 3608/4616/655 3611/4611/655 3607/4613/655 -f 3619/4619/658 3618/4620/658 3615/4621/658 -f 3617/4622/659 3620/4623/659 3616/4624/659 -f 3618/4620/653 3621/4625/653 3617/4622/653 -f 3616/4626/655 3619/4619/655 3615/4621/655 -f 3620/4627/670 3625/4628/670 3619/4629/670 -f 3614/4630/671 3623/4631/671 3613/4632/671 -f 3624/4633/654 3626/4634/654 3623/4635/654 -f 3624/4633/658 3629/4636/658 3625/4637/658 -f 3626/4638/659 3627/4639/659 3623/4640/659 -f 3629/4636/652 3627/4639/652 3630/4641/652 -f 3625/4637/658 3622/4642/658 3619/4643/658 -f 3629/4636/660 3621/4625/660 3622/4644/660 -f 3630/4641/659 3620/4645/659 3621/4646/659 -f 3628/4647/658 3614/4648/658 3611/4649/658 -f 3612/4615/661 3628/4647/661 3611/4611/661 -f 3623/4640/659 3612/4650/659 3613/4651/659 -f 3647/4652/658 3651/4653/658 3655/4654/658 -f 3641/4655/659 3637/4656/659 3633/4657/659 -f 3665/4658/653 3664/4659/653 3663/4660/653 -f 3671/4661/663 3670/4662/663 3667/4663/663 -f 3670/4664/654 3664/4659/654 3666/4665/654 -f 3668/4666/652 3665/4667/652 3663/4660/652 -f 3667/4668/659 3666/4669/659 3665/4667/659 -f 3669/4670/658 3663/4660/658 3664/4659/658 -f 3673/4671/653 3672/4672/653 3671/4673/653 -f 3678/4674/654 3672/4675/654 3674/4676/654 -f 3675/4677/652 3673/4671/652 3671/4673/652 -f 3675/4677/655 3678/4674/655 3677/4678/655 -f 3676/4679/662 3668/4666/662 3669/4670/662 -f 3670/4680/654 3676/4679/654 3669/4670/654 -f 3668/4666/652 3671/4661/652 3667/4663/652 -f 3681/4681/655 3680/4682/655 3679/4683/655 -f 3685/4684/659 3682/4685/659 3681/4686/659 -f 3683/4687/653 3686/4688/653 3685/4684/653 -f 3679/4683/658 3684/4689/658 3683/4687/658 -f 3694/4690/654 3682/4691/654 3686/4692/654 -f 3698/4693/653 3686/4692/653 3690/4694/653 -f 3682/4695/655 3689/4696/655 3680/4697/655 -f 3680/4682/656 3690/4694/656 3684/4689/656 -f 3686/4692/653 3684/4698/653 3690/4694/653 -f 3681/4699/655 3679/4700/655 3687/4701/655 -f 3683/4687/657 3687/4701/657 3679/4683/657 -f 3685/4702/653 3688/4703/653 3683/4704/653 -f 3691/4705/653 3688/4703/653 3685/4702/653 -f 3695/4706/654 3687/4701/654 3688/4703/654 -f 3693/4707/655 3689/4696/655 3682/4695/655 -f 3697/4708/652 3690/4694/652 3689/4696/652 -f 3692/4709/652 3685/4702/652 3681/4710/652 -f 3696/4711/655 3681/4699/655 3687/4701/655 -f 3701/4712/658 3706/4713/658 3705/4714/658 -f 3700/4715/655 3701/4712/655 3699/4716/655 -f 3699/4716/659 3704/4717/659 3700/4718/659 -f 3701/4712/654 3703/4719/654 3699/4716/654 -f 3709/4720/658 3714/4721/658 3713/4722/658 -f 3708/4723/655 3709/4720/655 3707/4724/655 -f 3707/4724/659 3712/4725/659 3708/4726/659 -f 3709/4720/654 3711/4727/654 3707/4724/654 -f 3717/4728/659 3722/4729/659 3721/4730/659 -f 3716/4731/655 3717/4728/655 3715/4732/655 -f 3715/4732/658 3720/4733/658 3716/4734/658 -f 3717/4728/652 3719/4735/652 3715/4732/652 -f 3725/4736/659 3730/4737/659 3729/4738/659 -f 3724/4739/655 3725/4736/655 3723/4740/655 -f 3723/4740/658 3728/4741/658 3724/4742/658 -f 3725/4736/652 3727/4743/652 3723/4740/652 -f 3733/4744/658 3738/4745/658 3737/4746/658 -f 3732/4747/653 3733/4744/653 3731/4748/653 -f 3731/4748/659 3736/4749/659 3732/4750/659 -f 3733/4744/652 3735/4751/652 3731/4748/652 -f 3741/4752/658 3746/4753/658 3745/4754/658 -f 3740/4755/653 3741/4752/653 3739/4756/653 -f 3739/4756/659 3744/4757/659 3740/4758/659 -f 3741/4752/652 3743/4759/652 3739/4756/652 -f 3749/4760/659 3754/4761/659 3753/4762/659 -f 3748/4763/654 3749/4760/654 3747/4764/654 -f 3747/4764/658 3752/4765/658 3748/4766/658 -f 3749/4760/655 3751/4767/655 3747/4764/655 -f 3757/4768/659 3762/4769/659 3761/4770/659 -f 3756/4771/654 3757/4768/654 3755/4772/654 -f 3755/4772/658 3760/4773/658 3756/4774/658 -f 3757/4768/655 3759/4775/655 3755/4772/655 -f 3766/4776/658 3769/4777/658 3765/4778/658 -f 3764/4779/652 3765/4778/652 3763/4780/652 -f 3763/4780/659 3768/4781/659 3764/4782/659 -f 3765/4778/655 3767/4783/655 3763/4780/655 -f 3774/4784/658 3777/4785/658 3773/4786/658 -f 3772/4787/652 3773/4786/652 3771/4788/652 -f 3771/4788/659 3776/4789/659 3772/4790/659 -f 3773/4786/655 3775/4791/655 3771/4788/655 -f 3781/4792/659 3786/4793/659 3785/4794/659 -f 3780/4795/652 3781/4792/652 3779/4796/652 -f 3779/4796/658 3784/4797/658 3780/4798/658 -f 3781/4792/653 3783/4799/653 3779/4796/653 -f 3789/4800/659 3794/4801/659 3793/4802/659 -f 3788/4803/652 3789/4800/652 3787/4804/652 -f 3787/4804/658 3792/4805/658 3788/4806/658 -f 3789/4800/653 3791/4807/653 3787/4804/653 -f 3798/4808/658 3801/4809/658 3797/4810/658 -f 3796/4811/654 3797/4810/654 3795/4812/654 -f 3795/4812/659 3800/4813/659 3796/4814/659 -f 3797/4810/653 3799/4815/653 3795/4812/653 -f 3806/4816/658 3809/4817/658 3805/4818/658 -f 3804/4819/654 3805/4818/654 3803/4820/654 -f 3803/4820/659 3808/4821/659 3804/4822/659 -f 3805/4818/653 3807/4823/653 3803/4820/653 -f 3817/4824/658 3818/4825/658 3811/4826/658 -f 3833/4827/658 3834/4828/658 3827/4829/658 -f 3849/4830/658 3850/4831/658 3843/4832/658 -f 3199/4385/659 3206/4833/659 3205/4384/659 -f 2533/3786/652 2530/3803/652 2529/3787/652 -f 2534/3788/653 2529/3787/653 2531/3789/653 -f 2540/3791/654 2531/4834/654 2532/3792/654 -f 2535/3796/656 2533/3786/656 2534/3788/656 -f 2541/3800/657 2536/3804/657 2537/3801/657 -f 2539/3793/655 2532/3792/655 2530/3803/655 -f 2540/3798/653 2542/4835/653 2537/3801/653 -f 2539/3794/655 2535/3796/655 2536/3804/655 -f 2536/3804/658 2535/3796/658 2538/3797/658 -f 2540/3806/659 2539/3794/659 2541/3805/659 -f 2545/3811/660 2548/4836/660 2546/3812/660 -f 2544/3808/655 2547/3815/655 2548/3814/655 -f 2543/3813/654 2546/3812/654 2547/3815/654 -f 2549/3816/654 2551/4837/654 2552/3817/654 -f 2549/3819/653 2553/3824/653 2554/3820/653 -f 2552/3817/661 2554/4838/661 2553/3822/661 -f 2548/3814/658 2554/3820/658 2552/3825/658 -f 2562/3827/662 2570/4839/662 2568/3828/662 -f 2569/3830/658 2570/3934/658 2562/3831/658 -f 2565/3833/663 2563/3845/663 2555/3834/663 -f 2558/3836/659 2566/3849/659 2565/3837/659 -f 2567/3839/664 2569/4840/664 2561/3840/664 -f 2568/3828/655 2564/3843/655 2556/3842/655 -f 2564/3843/665 2566/4841/665 2558/3844/665 -f 2563/3845/653 2567/3839/653 2559/3841/653 -f 2558/3846/654 2557/4842/654 2546/3812/654 -f 2546/3812/654 2557/4842/654 2555/3847/654 -f 2552/3817/654 2551/4837/654 2556/3848/654 -f 2548/3814/652 2565/3837/652 2566/3849/652 -f 2583/3852/659 2582/3894/659 2597/3853/659 -f 2575/3857/658 2577/3861/658 2576/3858/658 -f 2574/3856/655 2595/3893/655 2597/3859/655 -f 2593/3863/653 2594/4843/653 2589/3864/653 -f 2587/3869/659 2586/3872/659 2585/3867/659 -f 2595/3870/652 2591/4844/652 2592/3854/652 -f 2577/3861/660 2586/3872/660 2588/3873/660 -f 2627/3875/658 2628/3946/658 2620/3876/658 -f 2573/3855/653 2581/4845/653 2582/3878/653 -f 2575/3857/652 2585/3867/652 2586/3872/652 -f 2574/3880/661 2584/4846/661 2585/3867/661 -f 2579/3881/655 2590/4847/655 2587/3882/655 -f 2620/3883/662 2628/4848/662 2626/3884/662 -f 2576/3886/654 2587/3869/654 2581/3866/654 -f 2572/3888/655 2583/4849/655 2592/3889/655 -f 2588/3891/653 2598/4850/653 2596/3892/653 -f 2572/3888/658 2591/3890/658 2595/3893/658 -f 2595/3893/658 2574/3856/658 2573/3855/658 -f 2581/3866/659 2584/3868/659 2597/3853/659 -f 2598/3895/659 2588/3871/659 2587/3869/659 -f 2576/3858/658 2580/3862/658 2596/3892/658 -f 2598/3895/659 2590/3896/659 2589/3897/659 -f 2578/3865/658 2579/3881/658 2596/3892/658 -f 2594/3898/652 2593/4851/652 2596/3899/652 -f 2547/3815/655 2599/3951/655 2600/3900/655 -f 2606/3916/659 2601/3903/659 2602/3905/659 -f 2602/3905/659 2603/3908/659 2605/3907/659 -f 2605/3907/659 2607/3913/659 2609/3911/659 -f 2609/3911/659 2608/3917/659 2606/3916/659 -f 2606/3916/659 2602/3905/659 2609/3911/659 -f 2610/3912/653 2604/4852/653 2551/3821/653 -f 2600/3901/655 2601/3903/655 2606/3916/655 -f 2610/3910/653 2612/4853/653 2607/3913/653 -f 2609/3911/652 2612/4854/652 2611/3919/652 -f 2623/3920/663 2621/3932/663 2613/3921/663 -f 2616/3923/659 2624/3933/659 2623/3924/659 -f 2625/3926/664 2627/4855/664 2619/3927/664 -f 2626/3884/655 2622/3930/655 2614/3929/655 -f 2622/3930/665 2624/4856/665 2616/3931/665 -f 2621/3932/653 2625/3926/653 2617/3928/653 -f 2569/3830/652 2623/3924/652 2624/3933/652 -f 2616/3935/654 2615/4857/654 2561/3936/654 -f 2621/3938/652 2623/3924/652 2569/3830/652 -f 2561/3936/654 2615/4857/654 2613/3940/654 -f 2560/3942/654 2614/3954/654 2616/3935/654 -f 2624/3933/652 2622/3955/652 2568/3943/652 -f 2612/3944/658 2610/3912/658 2600/3900/658 -f 2627/3875/652 2600/3900/652 2610/3912/652 -f 2602/3905/654 2619/3952/654 2620/3949/654 -f 2620/3949/654 2618/3953/654 2604/3950/654 -f 2599/3951/654 2617/4858/654 2619/3952/654 -f 2555/3847/654 2559/3941/654 2547/3815/654 -f 2559/3941/654 2613/3940/654 2599/3951/654 -f 2613/3940/654 2617/4858/654 2599/3951/654 -f 2567/3939/652 2563/3851/652 2548/3814/652 -f 2548/3814/652 2600/3900/652 2621/3938/652 -f 2600/3900/652 2625/3948/652 2621/3938/652 -f 2614/3954/654 2560/3942/654 2604/3950/654 -f 2560/3942/654 2556/3848/654 2551/4837/654 -f 2604/3950/654 2560/3942/654 2551/4837/654 -f 2554/3820/652 2564/3850/652 2568/3943/652 -f 2622/3955/652 2626/3947/652 2610/3912/652 -f 2554/3820/652 2568/3943/652 2622/3955/652 -f 2633/3956/658 2636/4859/658 2632/3957/658 -f 2631/3959/659 2635/4860/659 2634/3960/659 -f 2632/3957/653 2636/4859/653 2635/3962/653 -f 2630/3961/655 2634/3960/655 2633/3956/655 -f 2641/3964/658 2644/3989/658 2640/3965/658 -f 2639/3967/659 2643/3970/659 2642/3968/659 -f 2640/3965/653 2644/3989/653 2643/3970/653 -f 2638/3971/655 2642/4861/655 2641/3964/655 -f 2642/3972/670 2648/4862/670 2647/3973/670 -f 2636/3975/671 2646/4863/671 2645/3976/671 -f 2646/3978/654 2647/3982/654 2648/3979/654 -f 2646/3978/658 2650/3992/658 2651/3981/658 -f 2648/3983/659 2652/3986/659 2649/3984/659 -f 2651/3981/652 2650/3992/652 2649/3984/652 -f 2647/3982/658 2651/3981/658 2644/3987/658 -f 2651/3981/660 2652/3986/660 2643/3970/660 -f 2652/3986/659 2648/3983/659 2642/3990/659 -f 2650/3992/658 2646/3978/658 2636/3993/658 -f 2634/3960/661 2649/3984/661 2650/3992/661 -f 2645/3985/659 2649/3984/659 2634/3995/659 -f 2653/3999/658 2654/4864/658 2655/4865/658 -f 2655/4865/658 2656/4866/658 2653/3999/658 -f 2656/4866/658 2657/4867/658 2653/3999/658 -f 2657/4867/658 2658/4868/658 2653/3999/658 -f 2658/4868/658 2659/3997/658 2653/3999/658 -f 2685/4000/658 2686/4869/658 2687/4870/658 -f 2687/4870/658 2688/4871/658 2685/4000/658 -f 2688/4871/658 2689/4001/658 2685/4000/658 -f 2689/4001/658 2690/4872/658 2691/4873/658 -f 2691/4873/658 2692/4874/658 2689/4001/658 -f 2692/4874/658 2693/4002/658 2689/4001/658 -f 2693/4002/658 2694/4875/658 2695/4876/658 -f 2695/4876/658 2696/4877/658 2697/4878/658 -f 2697/4878/658 2698/4879/658 2685/4000/658 -f 2698/4879/658 2699/4880/658 2685/4000/658 -f 2699/4880/658 2700/4881/658 2685/4000/658 -f 2693/4002/658 2695/4876/658 2685/4000/658 -f 2695/4876/658 2697/4878/658 2685/4000/658 -f 2671/4005/659 2670/4882/659 2669/4883/659 -f 2669/4883/659 2684/4884/659 2683/4885/659 -f 2683/4885/659 2682/4886/659 2679/4003/659 -f 2682/4886/659 2681/4887/659 2679/4003/659 -f 2681/4887/659 2680/4888/659 2679/4003/659 -f 2679/4003/659 2678/4889/659 2677/4890/659 -f 2677/4890/659 2676/4891/659 2679/4003/659 -f 2676/4891/659 2675/4004/659 2679/4003/659 -f 2675/4004/659 2674/4892/659 2673/4893/659 -f 2673/4893/659 2672/4894/659 2675/4004/659 -f 2672/4894/659 2671/4005/659 2675/4004/659 -f 2671/4005/659 2669/4883/659 2679/4003/659 -f 2669/4883/659 2683/4885/659 2679/4003/659 -f 2703/4009/670 2706/4012/670 2704/4010/670 -f 2702/4006/653 2705/4013/653 2706/4012/653 -f 2701/4008/652 2704/4027/652 2705/4013/652 -f 2707/4014/652 2709/4018/652 2710/4015/652 -f 2707/4014/655 2711/4020/655 2712/4017/655 -f 2710/4019/671 2712/4017/671 2711/4020/671 -f 2710/4015/658 2713/4029/658 2714/4023/658 -f 2706/4025/658 2716/4895/658 2715/4026/658 -f 2710/4015/660 2721/4035/660 2723/4028/660 -f 2704/4027/652 2719/4032/652 2718/4030/652 -f 2712/4017/655 2720/4037/655 2722/4031/655 -f 2715/4026/661 2725/4896/661 2719/4032/661 -f 2706/4012/671 2717/4038/671 2726/4033/671 -f 2709/4018/652 2722/4031/652 2721/4035/652 -f 2714/4036/670 2724/4897/670 2720/4037/670 -f 2705/4013/653 2718/4030/653 2717/4038/653 -f 2723/4028/659 2721/4035/659 2720/4039/659 -f 2729/4042/670 2732/4046/670 2730/4043/670 -f 2728/4045/653 2731/4048/653 2732/4046/653 -f 2727/4047/652 2730/4898/652 2731/4048/652 -f 2733/4049/652 2735/4053/652 2736/4050/652 -f 2733/4049/655 2737/4055/655 2738/4052/655 -f 2736/4054/671 2738/4052/671 2737/4055/671 -f 2742/4057/658 2743/4063/658 2745/4058/658 -f 2743/4063/652 2744/4064/652 2733/4049/652 -f 2744/4064/655 2742/4069/655 2737/4055/655 -f 2740/4060/652 2741/4062/652 2727/4047/652 -f 2739/4065/653 2740/4060/653 2728/4045/653 -f 2743/4063/660 2734/4051/660 2749/4066/660 -f 2737/4067/659 2750/4899/659 2749/4066/659 -f 2750/4068/670 2737/4055/670 2742/4069/670 -f 2751/4071/661 2727/4047/661 2741/4062/661 -f 2751/4071/659 2752/4900/659 2729/4073/659 -f 2739/4065/671 2729/4042/671 2752/4074/671 -f 2951/4076/659 2952/4082/659 2950/4077/659 -f 2955/4079/658 2956/4090/658 2953/4080/658 -f 2952/4082/655 2956/4090/655 2955/4079/655 -f 2951/4083/653 2949/4901/653 2954/4081/653 -f 2952/4084/655 2959/4094/655 2961/4085/655 -f 2950/4087/657 2955/4079/657 2954/4081/657 -f 2956/4090/656 2958/4086/656 2957/4091/656 -f 2951/4093/654 2960/4902/654 2959/4094/654 -f 2957/4091/653 2962/4097/653 2960/4095/653 -f 2958/4086/652 2961/4085/652 2962/4097/652 -f 2966/4098/652 2970/4104/652 2969/4099/652 -f 2963/4101/654 2967/4903/654 2968/4102/654 -f 2964/4103/655 2968/4102/655 2970/4104/655 -f 2965/4100/653 2969/4099/653 2967/4105/653 -f 2974/4107/652 2978/4113/652 2977/4108/652 -f 2971/4110/654 2975/4904/654 2976/4111/654 -f 2972/4112/655 2976/4111/655 2978/4113/655 -f 2973/4109/653 2977/4108/653 2975/4114/653 -f 2985/4116/652 2986/4122/652 2982/4117/652 -f 2984/4119/654 2983/4905/654 2979/4120/654 -f 2986/4122/655 2984/4119/655 2980/4121/655 -f 2983/4123/653 2985/4116/653 2981/4118/653 -f 2993/4125/652 2994/4131/652 2990/4126/652 -f 2992/4128/654 2991/4906/654 2987/4129/654 -f 2994/4131/655 2992/4128/655 2988/4130/655 -f 2991/4132/653 2993/4125/653 2989/4127/653 -f 3001/4134/652 3002/4140/652 2998/4135/652 -f 3000/4137/654 2999/4907/654 2995/4138/654 -f 3002/4140/655 3000/4137/655 2996/4139/655 -f 2999/4141/653 3001/4134/653 2997/4136/653 -f 3009/4143/652 3010/4149/652 3006/4144/652 -f 3008/4146/654 3007/4908/654 3003/4147/654 -f 3010/4149/655 3008/4146/655 3004/4148/655 -f 3007/4150/653 3009/4143/653 3005/4145/653 -f 3017/4152/652 3018/4158/652 3014/4153/652 -f 3016/4155/654 3015/4909/654 3011/4156/654 -f 3018/4158/655 3016/4155/655 3012/4157/655 -f 3015/4159/653 3017/4152/653 3013/4154/653 -f 3025/4161/652 3026/4167/652 3022/4162/652 -f 3024/4164/654 3023/4910/654 3019/4165/654 -f 3026/4167/655 3024/4164/655 3020/4166/655 -f 3023/4168/653 3025/4161/653 3021/4163/653 -f 3033/4170/652 3034/4176/652 3030/4171/652 -f 3032/4173/654 3031/4911/654 3027/4174/654 -f 3034/4176/655 3032/4173/655 3028/4175/655 -f 3031/4177/653 3033/4170/653 3029/4172/653 -f 3041/4179/652 3042/4185/652 3038/4180/652 -f 3040/4182/654 3039/4912/654 3035/4183/654 -f 3042/4185/655 3040/4182/655 3036/4184/655 -f 3039/4186/653 3041/4179/653 3037/4181/653 -f 3049/4188/652 3050/4194/652 3046/4189/652 -f 3048/4191/654 3047/4913/654 3043/4192/654 -f 3050/4194/655 3048/4191/655 3044/4193/655 -f 3047/4195/653 3049/4188/653 3045/4190/653 -f 3057/4197/652 3058/4203/652 3054/4198/652 -f 3056/4200/654 3055/4914/654 3051/4201/654 -f 3058/4203/655 3056/4200/655 3052/4202/655 -f 3055/4204/653 3057/4197/653 3053/4199/653 -f 3060/4206/655 3062/4915/655 3061/4207/655 -f 3066/4209/665 3068/4916/665 3067/4210/665 -f 3060/4206/654 3065/4218/654 3066/4212/654 -f 3061/4214/652 3063/4217/652 3064/4215/652 -f 3062/4216/659 3066/4917/659 3063/4217/659 -f 3059/4208/658 3064/4215/658 3065/4218/658 -f 3068/4219/655 3070/4918/655 3069/4220/655 -f 3068/4222/654 3072/4227/654 3074/4223/654 -f 3069/4220/652 3073/4226/652 3071/4225/652 -f 3074/4223/653 3072/4227/653 3071/4225/653 -f 3064/4215/664 3071/4225/664 3072/4227/664 -f 3072/4227/654 3068/4919/654 3066/4228/654 -f 3067/4210/652 3071/4225/652 3064/4215/652 -f 3076/4229/653 3078/4920/653 3077/4230/653 -f 3078/4232/659 3082/4235/659 3081/4233/659 -f 3082/4235/655 3080/4237/655 3079/4236/655 -f 3080/4237/658 3076/4229/658 3075/4231/658 -f 3078/4238/654 3089/4921/654 3090/4239/654 -f 3082/4240/655 3090/4239/655 3094/4241/655 -f 3086/4242/656 3085/4245/656 3076/4229/656 -f 3083/4248/657 3084/4252/657 3079/4236/657 -f 3084/4252/655 3091/4254/655 3087/4253/655 -f 3083/4248/654 3092/4259/654 3091/4254/654 -f 3085/4245/653 3093/4256/653 3089/4255/653 -f 3086/4242/652 3094/4241/652 3093/4256/652 -f 3081/4250/652 3087/4253/652 3088/4257/652 -f 3077/4247/653 3088/4922/653 3092/4259/653 -f 3097/4260/659 3098/4923/659 3102/4261/659 -f 3096/4263/653 3098/4924/653 3097/4260/653 -f 3095/4264/658 3099/4267/658 3100/4265/658 -f 3097/4260/654 3101/4262/654 3099/4267/654 -f 3105/4268/659 3106/4925/659 3110/4269/659 -f 3104/4271/653 3106/4926/653 3105/4268/653 -f 3103/4272/658 3107/4275/658 3108/4273/658 -f 3105/4268/654 3109/4270/654 3107/4275/654 -f 3114/4276/672 3113/4280/672 3112/4277/672 -f 3115/4279/653 3112/4277/653 3113/4280/653 -f 3120/4282/655 3123/4292/655 3126/4283/655 -f 3122/4285/657 3119/4927/657 3120/4282/657 -f 3122/4286/653 3125/4293/653 3124/4287/653 -f 3115/4289/657 3118/4928/657 3117/4290/657 -f 3117/4290/655 3114/4276/655 3111/4278/655 -f 3123/4292/672 3124/4287/672 3125/4293/672 -f 3133/4294/652 3134/4298/652 3131/4295/652 -f 3129/4297/659 3131/4295/659 3134/4298/659 -f 3128/4300/658 3133/4294/658 3132/4296/658 -f 3130/4302/655 3134/4298/655 3133/4294/655 -f 3127/4304/653 3132/4296/653 3131/4295/653 -f 3137/4306/653 3141/4929/653 3139/4307/653 -f 3142/4309/658 3141/4929/658 3137/4306/658 -f 3136/4311/655 3140/4313/655 3142/4309/655 -f 3135/4312/659 3139/4930/659 3140/4313/659 -f 3145/4314/653 3149/4931/653 3147/4315/653 -f 3150/4317/658 3149/4932/658 3145/4318/658 -f 3144/4320/655 3148/4321/655 3150/4317/655 -f 3143/4316/659 3147/4315/659 3148/4321/659 -f 3153/4322/653 3157/4933/653 3155/4323/653 -f 3158/4325/658 3157/4933/658 3153/4322/658 -f 3152/4327/655 3156/4934/655 3158/4325/655 -f 3151/4324/659 3155/4323/659 3156/4328/659 -f 3161/4330/653 3165/4935/653 3163/4331/653 -f 3166/4333/658 3165/4935/658 3161/4330/658 -f 3160/4335/655 3164/4338/655 3166/4336/655 -f 3159/4332/659 3163/4331/659 3164/4338/659 -f 3170/4339/652 3169/4346/652 3167/4340/652 -f 3171/4342/654 3173/4936/654 3174/4343/654 -f 3170/4339/653 3174/4937/653 3173/4345/653 -f 3167/4340/655 3171/4342/655 3172/4344/655 -f 3168/4341/659 3172/4938/659 3174/4347/659 -f 3169/4346/658 3173/4939/658 3171/4348/658 -f 3180/4349/672 3186/4360/672 3185/4350/672 -f 3179/4352/652 3181/4940/652 3182/4353/652 -f 3177/4355/655 3181/4940/655 3179/4352/655 -f 3178/4357/653 3176/4359/653 3180/4354/653 -f 3179/4351/655 3185/4350/655 3183/4358/655 -f 3176/4359/653 3184/4941/653 3186/4360/653 -f 3188/4361/653 3190/4364/653 3189/4362/653 -f 3190/4364/659 3194/4367/659 3193/4365/659 -f 3194/4367/655 3192/4370/655 3191/4368/655 -f 3190/4364/652 3188/4361/652 3192/4370/652 -f 3202/4371/653 3200/4383/653 3196/4372/653 -f 3195/4374/655 3199/4385/655 3201/4375/655 -f 3197/4376/652 3201/4375/652 3202/4371/652 -f 3201/4377/658 3203/4380/658 3204/4378/658 -f 3203/4380/652 3205/4942/652 3206/4381/652 -f 3202/4379/653 3204/4378/653 3206/4382/653 -f 3205/4384/655 3203/4380/655 3201/4377/655 -f 3213/4386/672 3214/4391/672 3210/4387/672 -f 3211/4389/653 3213/4386/653 3209/4388/653 -f 3214/4391/655 3212/4943/655 3208/4392/655 -f 3217/4393/655 3218/4397/655 3216/4394/655 -f 3221/4396/659 3222/4400/659 3218/4397/659 -f 3219/4399/653 3220/4402/653 3222/4400/653 -f 3220/4402/652 3216/4394/652 3218/4397/652 -f 3229/4403/652 3230/4422/652 3227/4404/652 -f 3225/4406/659 3231/4410/659 3234/4407/659 -f 3223/4409/653 3232/4415/653 3231/4410/653 -f 3226/4412/655 3234/4407/655 3233/4413/655 -f 3233/4413/652 3234/4407/652 3231/4410/652 -f 3224/4416/658 3233/4413/658 3232/4415/658 -f 3235/4418/654 3238/4944/654 3237/4419/654 -f 3229/4403/655 3237/4945/655 3238/4421/655 -f 3227/4404/653 3235/4946/653 3236/4423/653 -f 3230/4422/659 3238/4947/659 3235/4424/659 -f 3228/4405/658 3236/4420/658 3237/4419/658 -f 3208/4392/655 3456/4948/655 3458/4425/655 -f 3209/4427/653 3457/4429/653 3455/4428/653 -f 3210/4426/652 3458/4425/652 3457/4429/652 -f 3458/4430/655 3456/4948/655 3460/4431/655 -f 3457/4433/653 3461/4435/653 3459/4434/653 -f 3458/4430/658 3462/4432/658 3461/4435/658 -f 3460/4436/655 3464/4949/655 3466/4437/655 -f 3459/4438/653 3461/4435/653 3465/4439/653 -f 3462/4432/652 3466/4437/652 3465/4439/652 -f 3464/4441/659 3463/4950/659 3465/4439/659 -f 3480/4442/653 3482/4465/653 3481/4443/653 -f 3472/4445/653 3474/4456/653 3473/4446/653 -f 3470/4448/658 3474/4456/658 3472/4449/658 -f 3571/4451/653 3575/4575/653 3573/4452/653 -f 3467/4454/659 3471/4951/659 3473/4446/659 -f 3469/4455/652 3473/4446/652 3474/4456/652 -f 3478/4457/658 3482/4465/658 3480/4458/658 -f 3566/4460/655 3574/4952/655 3576/4461/655 -f 3475/4463/659 3479/4953/659 3481/4443/659 -f 3477/4464/652 3481/4443/652 3482/4465/652 -f 3496/4466/653 3498/4489/653 3497/4467/653 -f 3488/4469/653 3490/4480/653 3489/4470/653 -f 3486/4472/658 3490/4480/658 3488/4473/658 -f 3585/4475/653 3589/4595/653 3587/4476/653 -f 3483/4478/659 3487/4954/659 3489/4470/659 -f 3485/4479/652 3489/4470/652 3490/4480/652 -f 3494/4481/658 3498/4489/658 3496/4482/658 -f 3491/4487/659 3495/4955/659 3497/4467/659 -f 3493/4488/652 3497/4467/652 3498/4489/652 -f 3512/4490/653 3514/4510/653 3513/4491/653 -f 3504/4493/653 3506/4502/653 3505/4494/653 -f 3502/4496/658 3506/4502/658 3504/4497/658 -f 3572/4462/656 3571/4451/656 3569/4485/656 -f 3499/4500/659 3503/4956/659 3505/4494/659 -f 3501/4501/652 3505/4494/652 3506/4502/652 -f 3510/4503/658 3514/4510/658 3512/4504/658 -f 3507/4508/659 3511/4957/659 3513/4491/659 -f 3509/4509/652 3513/4491/652 3514/4510/652 -f 3518/4511/658 3522/4520/658 3520/4512/658 -f 3591/4514/653 3596/4596/653 3597/4515/653 -f 3515/4517/659 3519/4958/659 3521/4518/659 -f 3517/4519/652 3521/4518/652 3522/4520/652 -f 3526/4521/658 3530/4529/658 3528/4522/658 -f 3566/4506/655 3570/4499/655 3567/4524/655 -f 3523/4526/659 3527/4959/659 3529/4527/659 -f 3525/4528/652 3529/4527/652 3530/4529/652 -f 3534/4530/658 3538/4538/658 3536/4531/658 -f 3564/4453/654 3573/4452/654 3574/4533/654 -f 3531/4535/659 3535/4960/659 3537/4536/659 -f 3533/4537/652 3537/4536/652 3538/4538/652 -f 3542/4539/658 3546/4546/658 3544/4540/658 -f 3563/4542/653 3568/4550/653 3569/4485/653 -f 3539/4543/659 3543/4961/659 3545/4544/659 -f 3541/4545/652 3545/4544/652 3546/4546/652 -f 3550/4547/658 3554/4554/658 3552/4548/658 -f 3567/4524/658 3570/4499/658 3569/4485/658 -f 3547/4551/659 3551/4962/659 3553/4552/659 -f 3549/4553/652 3553/4552/652 3554/4554/652 -f 3558/4555/658 3562/4562/658 3560/4556/658 -f 3564/4484/659 3566/4963/659 3565/4558/659 -f 3555/4559/659 3559/4964/659 3561/4560/659 -f 3557/4561/652 3561/4560/652 3562/4562/652 -f 3555/4563/655 3557/4561/655 3558/4555/655 -f 3547/4565/655 3549/4553/655 3550/4547/655 -f 3539/4567/655 3541/4545/655 3542/4539/655 -f 3531/4569/655 3533/4537/655 3534/4530/655 -f 3523/4571/655 3525/4528/655 3526/4521/655 -f 3515/4573/655 3517/4519/655 3518/4511/655 -f 3572/4462/652 3576/4461/652 3575/4575/652 -f 3580/4576/655 3588/4965/655 3590/4577/655 -f 3586/4578/656 3585/4475/656 3583/4580/656 -f 3594/4585/655 3598/4966/655 3595/4586/655 -f 3580/4583/655 3584/4582/655 3581/4588/655 -f 3578/4477/654 3587/4476/654 3588/4590/654 -f 3577/4592/653 3582/4593/653 3583/4580/653 -f 3581/4588/658 3584/4582/658 3583/4580/658 -f 3578/4579/659 3580/4967/659 3579/4594/659 -f 3586/4578/652 3590/4577/652 3589/4595/652 -f 3595/4586/658 3598/4966/658 3597/4515/658 -f 3592/4516/659 3594/4968/659 3593/4597/659 -f 3602/4598/655 3606/4969/655 3603/4599/655 -f 3599/4601/653 3604/4604/653 3605/4602/653 -f 3603/4599/658 3606/4969/658 3605/4602/658 -f 3600/4603/659 3602/4970/659 3601/4605/659 -f 2739/4607/658 2748/4971/658 2747/4072/658 -f 2719/4032/659 2725/4896/659 2726/4608/659 -f 3611/4611/658 3614/4972/658 3610/4612/658 -f 3609/4614/659 3613/4973/659 3612/4615/659 -f 3610/4612/653 3614/4972/653 3613/4617/653 -f 3608/4616/655 3612/4615/655 3611/4611/655 -f 3619/4619/658 3622/4644/658 3618/4620/658 -f 3617/4622/659 3621/4625/659 3620/4623/659 -f 3618/4620/653 3622/4644/653 3621/4625/653 -f 3616/4626/655 3620/4974/655 3619/4619/655 -f 3620/4627/670 3626/4975/670 3625/4628/670 -f 3614/4630/671 3624/4976/671 3623/4631/671 -f 3624/4633/654 3625/4637/654 3626/4634/654 -f 3624/4633/658 3628/4647/658 3629/4636/658 -f 3626/4638/659 3630/4641/659 3627/4639/659 -f 3629/4636/652 3628/4647/652 3627/4639/652 -f 3625/4637/658 3629/4636/658 3622/4642/658 -f 3629/4636/660 3630/4641/660 3621/4625/660 -f 3630/4641/659 3626/4638/659 3620/4645/659 -f 3628/4647/658 3624/4633/658 3614/4648/658 -f 3612/4615/661 3627/4639/661 3628/4647/661 -f 3623/4640/659 3627/4639/659 3612/4650/659 -f 3647/4652/658 3648/4977/658 3649/4978/658 -f 3649/4978/658 3650/4979/658 3647/4652/658 -f 3650/4979/658 3651/4653/658 3647/4652/658 -f 3651/4653/658 3652/4980/658 3653/4981/658 -f 3653/4981/658 3654/4982/658 3651/4653/658 -f 3654/4982/658 3655/4654/658 3651/4653/658 -f 3655/4654/658 3656/4983/658 3657/4984/658 -f 3657/4984/658 3658/4985/658 3659/4986/658 -f 3659/4986/658 3660/4987/658 3647/4652/658 -f 3660/4987/658 3661/4988/658 3647/4652/658 -f 3661/4988/658 3662/4989/658 3647/4652/658 -f 3655/4654/658 3657/4984/658 3647/4652/658 -f 3657/4984/658 3659/4986/658 3647/4652/658 -f 3633/4657/659 3632/4990/659 3631/4991/659 -f 3631/4991/659 3646/4992/659 3645/4993/659 -f 3645/4993/659 3644/4994/659 3641/4655/659 -f 3644/4994/659 3643/4995/659 3641/4655/659 -f 3643/4995/659 3642/4996/659 3641/4655/659 -f 3641/4655/659 3640/4997/659 3639/4998/659 -f 3639/4998/659 3638/4999/659 3641/4655/659 -f 3638/4999/659 3637/4656/659 3641/4655/659 -f 3637/4656/659 3636/5000/659 3635/5001/659 -f 3635/5001/659 3634/5002/659 3637/4656/659 -f 3634/5002/659 3633/4657/659 3637/4656/659 -f 3633/4657/659 3631/4991/659 3641/4655/659 -f 3631/4991/659 3645/4993/659 3641/4655/659 -f 3665/4658/653 3666/5003/653 3664/4659/653 -f 3671/4661/663 3672/5004/663 3670/4662/663 -f 3670/4664/654 3669/4670/654 3664/4659/654 -f 3668/4666/652 3667/4668/652 3665/4667/652 -f 3667/4668/659 3670/5005/659 3666/4669/659 -f 3669/4670/658 3668/4666/658 3663/4660/658 -f 3673/4671/653 3674/5006/653 3672/4672/653 -f 3678/4674/654 3676/4679/654 3672/4675/654 -f 3675/4677/652 3677/4678/652 3673/4671/652 -f 3675/4677/655 3676/4679/655 3678/4674/655 -f 3676/4679/662 3675/4677/662 3668/4666/662 -f 3670/4680/654 3672/5007/654 3676/4679/654 -f 3668/4666/652 3675/4677/652 3671/4661/652 -f 3681/4681/655 3682/5008/655 3680/4682/655 -f 3685/4684/659 3686/4688/659 3682/4685/659 -f 3683/4687/653 3684/4689/653 3686/4688/653 -f 3679/4683/658 3680/4682/658 3684/4689/658 -f 3694/4690/654 3693/5009/654 3682/4691/654 -f 3698/4693/653 3694/4690/653 3686/4692/653 -f 3680/4682/656 3689/4696/656 3690/4694/656 -f 3683/4687/657 3688/4703/657 3687/4701/657 -f 3691/4705/653 3695/4706/653 3688/4703/653 -f 3695/4706/654 3696/4711/654 3687/4701/654 -f 3693/4707/655 3697/4708/655 3689/4696/655 -f 3697/4708/652 3698/4693/652 3690/4694/652 -f 3692/4709/652 3691/4705/652 3685/4702/652 -f 3696/4711/655 3692/5010/655 3681/4699/655 -f 3701/4712/658 3702/5011/658 3706/4713/658 -f 3700/4715/655 3702/5012/655 3701/4712/655 -f 3699/4716/659 3703/4719/659 3704/4717/659 -f 3701/4712/654 3705/4714/654 3703/4719/654 -f 3709/4720/658 3710/5013/658 3714/4721/658 -f 3708/4723/655 3710/5014/655 3709/4720/655 -f 3707/4724/659 3711/4727/659 3712/4725/659 -f 3709/4720/654 3713/4722/654 3711/4727/654 -f 3717/4728/659 3718/5015/659 3722/4729/659 -f 3716/4731/655 3718/5016/655 3717/4728/655 -f 3715/4732/658 3719/4735/658 3720/4733/658 -f 3717/4728/652 3721/4730/652 3719/4735/652 -f 3725/4736/659 3726/5017/659 3730/4737/659 -f 3724/4739/655 3726/5018/655 3725/4736/655 -f 3723/4740/658 3727/4743/658 3728/4741/658 -f 3725/4736/652 3729/4738/652 3727/4743/652 -f 3733/4744/658 3734/5019/658 3738/4745/658 -f 3732/4747/653 3734/5020/653 3733/4744/653 -f 3731/4748/659 3735/4751/659 3736/4749/659 -f 3733/4744/652 3737/4746/652 3735/4751/652 -f 3741/4752/658 3742/5021/658 3746/4753/658 -f 3740/4755/653 3742/5022/653 3741/4752/653 -f 3739/4756/659 3743/4759/659 3744/4757/659 -f 3741/4752/652 3745/4754/652 3743/4759/652 -f 3749/4760/659 3750/5023/659 3754/4761/659 -f 3748/4763/654 3750/5024/654 3749/4760/654 -f 3747/4764/658 3751/4767/658 3752/4765/658 -f 3749/4760/655 3753/4762/655 3751/4767/655 -f 3757/4768/659 3758/5025/659 3762/4769/659 -f 3756/4771/654 3758/5026/654 3757/4768/654 -f 3755/4772/658 3759/4775/658 3760/4773/658 -f 3757/4768/655 3761/4770/655 3759/4775/655 -f 3766/4776/658 3770/5027/658 3769/4777/658 -f 3764/4779/652 3766/5028/652 3765/4778/652 -f 3763/4780/659 3767/4783/659 3768/4781/659 -f 3765/4778/655 3769/4777/655 3767/4783/655 -f 3774/4784/658 3778/5029/658 3777/4785/658 -f 3772/4787/652 3774/5030/652 3773/4786/652 -f 3771/4788/659 3775/4791/659 3776/4789/659 -f 3773/4786/655 3777/4785/655 3775/4791/655 -f 3781/4792/659 3782/5031/659 3786/4793/659 -f 3780/4795/652 3782/5032/652 3781/4792/652 -f 3779/4796/658 3783/4799/658 3784/4797/658 -f 3781/4792/653 3785/4794/653 3783/4799/653 -f 3789/4800/659 3790/5033/659 3794/4801/659 -f 3788/4803/652 3790/5034/652 3789/4800/652 -f 3787/4804/658 3791/4807/658 3792/4805/658 -f 3789/4800/653 3793/4802/653 3791/4807/653 -f 3798/4808/658 3802/5035/658 3801/4809/658 -f 3796/4811/654 3798/5036/654 3797/4810/654 -f 3795/4812/659 3799/4815/659 3800/4813/659 -f 3797/4810/653 3801/4809/653 3799/4815/653 -f 3806/4816/658 3810/5037/658 3809/4817/658 -f 3804/4819/654 3806/5038/654 3805/4818/654 -f 3803/4820/659 3807/4823/659 3808/4821/659 -f 3805/4818/653 3809/4817/653 3807/4823/653 -f 3811/4826/658 3812/5039/658 3813/5040/658 -f 3813/5040/658 3814/5041/658 3811/4826/658 -f 3814/5041/658 3815/5042/658 3811/4826/658 -f 3815/5042/658 3816/5043/658 3811/4826/658 -f 3816/5043/658 3817/4824/658 3811/4826/658 -f 3827/4829/658 3828/5044/658 3829/5045/658 -f 3829/5045/658 3830/5046/658 3827/4829/658 -f 3830/5046/658 3831/5047/658 3827/4829/658 -f 3831/5047/658 3832/5048/658 3827/4829/658 -f 3832/5048/658 3833/4827/658 3827/4829/658 -f 3843/4832/658 3844/5049/658 3845/5050/658 -f 3845/5050/658 3846/5051/658 3843/4832/658 -f 3846/5051/658 3847/5052/658 3843/4832/658 -f 3847/5052/658 3848/5053/658 3843/4832/658 -f 3848/5053/658 3849/4830/658 3843/4832/658 -f 3199/4385/659 3200/5054/659 3206/4833/659 +f 2949/4260/652 2945/4261/652 2950/4262/652 +f 2950/4262/653 2947/4263/653 2956/4264/653 +f 2956/4265/654 2948/4266/654 2955/4267/654 +f 2955/4268/655 2949/4269/655 2951/4270/655 +f 2951/4270/656 2950/4262/656 2954/4271/656 +f 2956/4272/653 2954/4271/653 2950/4273/653 +f 2957/4274/657 2953/4275/657 2958/4276/657 +f 2955/4267/655 2946/4277/655 2949/4260/655 +f 2956/4272/653 2953/4275/653 2954/4271/653 +f 2955/4268/655 2952/4278/655 2957/4279/655 +f 2952/4278/658 2954/4271/658 2953/4275/658 +f 2956/4280/659 2957/4279/659 2958/4281/659 +f 2960/4282/658 2961/4283/658 2959/4284/658 +f 2961/4285/660 2962/4286/660 2959/4287/660 +f 2960/4282/655 2964/4288/655 2961/4283/655 +f 2959/4287/654 2963/4289/654 2960/4282/654 +f 2965/4290/654 2968/4291/654 2966/4292/654 +f 2965/4293/653 2970/4294/653 2967/4295/653 +f 2968/4291/661 2969/4296/661 2966/4292/661 +f 2966/4297/658 2969/4298/658 2965/4293/658 +f 2964/4288/658 2968/4299/658 2962/4300/658 +f 2978/4301/662 2984/4302/662 2976/4303/662 +f 2985/4304/658 2978/4305/658 2977/4306/658 +f 2981/4307/663 2971/4308/663 2973/4309/663 +f 2974/4310/659 2981/4311/659 2973/4312/659 +f 2983/4313/664 2977/4314/664 2975/4315/664 +f 2984/4302/655 2972/4316/655 2976/4303/655 +f 2980/4317/665 2974/4318/665 2972/4316/665 +f 2979/4319/653 2975/4315/653 2971/4308/653 +f 2974/4320/654 2962/4286/654 2968/4291/654 +f 2962/4286/654 2971/4321/654 2963/4289/654 +f 2968/4291/654 2972/4322/654 2974/4320/654 +f 2964/4288/652 2982/4323/652 2970/4294/652 +f 2982/4323/652 2980/4324/652 2970/4294/652 +f 2981/4311/652 2964/4288/652 2979/4325/652 +f 2999/4326/659 3013/4327/659 3008/4328/659 +f 2989/4329/658 2990/4330/658 2991/4331/658 +f 2991/4331/658 2992/4332/658 2989/4329/658 +f 2990/4330/655 3013/4333/655 3000/4334/655 +f 2992/4332/658 2993/4335/658 2996/4336/658 +f 3009/4337/653 3005/4338/653 2994/4339/653 +f 2997/4340/659 3001/4341/659 3000/4342/659 +f 3003/4343/659 3001/4341/659 2997/4340/659 +f 3011/4344/652 3008/4328/652 3013/4327/652 +f 3003/4343/659 3004/4345/659 3002/4346/659 +f 2993/4335/660 3004/4347/660 2996/4348/660 +f 3043/4349/658 3036/4350/658 3035/4351/658 +f 2989/4329/653 2998/4352/653 2987/4353/653 +f 2991/4331/652 3002/4346/652 2993/4335/652 +f 2990/4354/661 3001/4341/661 2991/4331/661 +f 2995/4355/655 3003/4356/655 2992/4332/655 +f 3036/4357/662 3042/4358/662 3034/4359/662 +f 2992/4360/654 2997/4340/654 2989/4361/654 +f 2988/4362/655 3008/4363/655 3007/4364/655 +f 3004/4365/653 3012/4366/653 2996/4336/653 +f 2988/4362/658 3011/4367/658 2987/4353/658 +f 3011/4367/658 2989/4329/658 2987/4353/658 +f 2997/4340/659 3013/4327/659 2998/4368/659 +f 3014/4369/659 3003/4343/659 3006/4370/659 +f 2992/4332/658 3012/4366/658 2995/4355/658 +f 3014/4369/659 3005/4371/659 3010/4372/659 +f 2994/4339/658 3012/4366/658 3009/4337/658 +f 3010/4372/652 3012/4373/652 3014/4369/652 +f 2963/4289/655 3016/4374/655 2964/4288/655 +f 3016/4375/655 3015/4376/655 3017/4377/655 +f 3017/4377/666 3015/4378/666 3018/4379/666 +f 3020/4380/667 3021/4381/667 3019/4382/667 +f 3021/4381/653 3020/4383/653 3026/4384/653 +f 3018/4379/659 3021/4381/659 3025/4385/659 +f 3026/4386/653 2967/4295/653 2970/4294/653 +f 3023/4387/668 3028/4388/668 3025/4385/668 +f 3027/4389/669 3022/4390/669 3024/4391/669 +f 3016/4375/655 3022/4390/655 3027/4392/655 +f 3026/4384/653 3023/4387/653 3021/4381/653 +f 3025/4385/652 3027/4393/652 3024/4391/652 +f 3039/4394/663 3029/4395/663 3031/4396/663 +f 3032/4397/659 3039/4398/659 3031/4399/659 +f 3041/4400/664 3035/4401/664 3033/4402/664 +f 3042/4358/655 3030/4403/655 3034/4359/655 +f 3038/4404/665 3032/4405/665 3030/4403/665 +f 3037/4406/653 3033/4402/653 3029/4395/653 +f 2985/4304/652 3040/4407/652 2986/4408/652 +f 3032/4409/654 2977/4410/654 2978/4411/654 +f 3037/4412/652 2985/4304/652 2983/4413/652 +f 2977/4410/654 3029/4414/654 2975/4415/654 +f 2976/4416/654 3032/4409/654 2978/4411/654 +f 3040/4407/652 2984/4417/652 2986/4408/652 +f 3028/4418/658 3016/4374/658 3027/4419/658 +f 3043/4349/652 3026/4386/652 3044/4420/652 +f 3044/4420/652 3026/4386/652 3042/4421/652 +f 3043/4349/652 3041/4422/652 3016/4374/652 +f 3018/4379/654 3036/4423/654 3019/4382/654 +f 3036/4423/654 3020/4424/654 3019/4382/654 +f 3015/4425/654 3035/4426/654 3018/4379/654 +f 3015/4425/654 2963/4289/654 2975/4415/654 +f 3037/4412/652 2983/4413/652 2964/4288/652 +f 3020/4424/654 3034/4427/654 3030/4428/654 +f 3038/4429/652 3026/4386/652 2970/4294/652 +f 3049/4430/658 3048/4431/658 3045/4432/658 +f 3047/4433/659 3050/4434/659 3046/4435/659 +f 3048/4431/653 3051/4436/653 3047/4437/653 +f 3046/4435/655 3049/4430/655 3045/4432/655 +f 3057/4438/658 3056/4439/658 3053/4440/658 +f 3055/4441/659 3058/4442/659 3054/4443/659 +f 3056/4439/653 3059/4444/653 3055/4441/653 +f 3054/4445/655 3057/4438/655 3053/4440/655 +f 3058/4446/670 3063/4447/670 3057/4448/670 +f 3052/4449/671 3061/4450/671 3051/4451/671 +f 3062/4452/654 3064/4453/654 3061/4454/654 +f 3062/4452/658 3067/4455/658 3063/4456/658 +f 3064/4457/659 3065/4458/659 3061/4459/659 +f 3067/4455/652 3065/4458/652 3068/4460/652 +f 3063/4456/658 3060/4461/658 3057/4462/658 +f 3067/4455/660 3059/4444/660 3060/4463/660 +f 3068/4460/659 3058/4464/659 3059/4465/659 +f 3066/4466/658 3052/4467/658 3049/4468/658 +f 3050/4434/661 3066/4466/661 3049/4430/661 +f 3061/4459/659 3050/4469/659 3051/4470/659 +f 3075/4471/658 3076/4472/658 3069/4473/658 +f 3101/4474/658 3105/4475/658 3109/4476/658 +f 3095/4477/659 3091/4478/659 3087/4479/659 +f 3118/4480/658 3119/4481/658 3117/4482/658 +f 3119/4483/670 3120/4484/670 3117/4485/670 +f 3118/4480/653 3122/4486/653 3119/4483/653 +f 3117/4482/652 3121/4487/652 3118/4480/652 +f 3123/4488/652 3126/4489/652 3124/4490/652 +f 3123/4488/655 3128/4491/655 3125/4492/655 +f 3126/4493/671 3127/4494/671 3124/4495/671 +f 3124/4490/658 3127/4496/658 3123/4488/658 +f 3126/4489/658 3130/4497/658 3128/4498/658 +f 3122/4499/658 3131/4500/658 3120/4501/658 +f 3126/4489/660 3139/4502/660 3129/4503/660 +f 3120/4501/652 3134/4504/652 3121/4487/652 +f 3128/4491/655 3138/4505/655 3125/4492/655 +f 3131/4500/661 3135/4506/661 3120/4501/661 +f 3122/4486/671 3142/4507/671 3132/4508/671 +f 3125/4492/652 3137/4509/652 3126/4489/652 +f 3130/4510/670 3136/4511/670 3128/4491/670 +f 3121/4487/653 3133/4512/653 3122/4486/653 +f 3139/4502/659 3136/4513/659 3140/4514/659 +f 3134/4504/659 3135/4506/659 3133/4515/659 +f 3145/4516/670 3146/4517/670 3143/4518/670 +f 3144/4519/653 3148/4520/653 3145/4516/653 +f 3143/4521/652 3147/4522/652 3144/4519/652 +f 3149/4523/652 3152/4524/652 3150/4525/652 +f 3149/4523/655 3154/4526/655 3151/4527/655 +f 3152/4528/671 3153/4529/671 3150/4530/671 +f 3158/4531/658 3161/4532/658 3162/4533/658 +f 3156/4534/658 3155/4535/658 3157/4536/658 +f 3159/4537/652 3149/4523/652 3150/4525/652 +f 3160/4538/655 3153/4529/655 3149/4523/655 +f 3156/4534/652 3143/4521/652 3144/4519/652 +f 3155/4539/653 3144/4519/653 3145/4516/653 +f 3159/4537/660 3165/4540/660 3161/4532/660 +f 3153/4541/659 3165/4540/659 3150/4525/659 +f 3166/4542/670 3158/4543/670 3162/4544/670 +f 3167/4545/661 3157/4536/661 3163/4546/661 +f 3167/4545/659 3145/4547/659 3143/4521/659 +f 3155/4539/671 3168/4548/671 3164/4549/671 +f 3367/4550/659 3366/4551/659 3365/4552/659 +f 3371/4553/658 3369/4554/658 3370/4555/658 +f 3368/4556/655 3371/4553/655 3366/4551/655 +f 3367/4557/653 3370/4555/653 3369/4554/653 +f 3368/4558/655 3377/4559/655 3374/4560/655 +f 3366/4561/657 3370/4555/657 3365/4562/657 +f 3367/4557/653 3369/4554/653 3373/4563/653 +f 3372/4564/656 3373/4565/656 3369/4554/656 +f 3368/4556/655 3374/4566/655 3372/4564/655 +f 3367/4567/654 3375/4568/654 3368/4558/654 +f 3373/4565/653 3376/4569/653 3367/4570/653 +f 3374/4560/652 3378/4571/652 3373/4565/652 +f 3382/4572/652 3385/4573/652 3381/4574/652 +f 3379/4575/654 3384/4576/654 3380/4577/654 +f 3380/4577/655 3386/4578/655 3382/4572/655 +f 3381/4574/653 3383/4579/653 3379/4580/653 +f 3390/4581/652 3393/4582/652 3389/4583/652 +f 3387/4584/654 3392/4585/654 3388/4586/654 +f 3388/4586/655 3394/4587/655 3390/4581/655 +f 3389/4583/653 3391/4588/653 3387/4589/653 +f 3401/4590/652 3398/4591/652 3397/4592/652 +f 3400/4593/654 3395/4594/654 3396/4595/654 +f 3402/4596/655 3396/4595/655 3398/4591/655 +f 3399/4597/653 3397/4592/653 3395/4598/653 +f 3409/4599/652 3406/4600/652 3405/4601/652 +f 3408/4602/654 3403/4603/654 3404/4604/654 +f 3410/4605/655 3404/4604/655 3406/4600/655 +f 3407/4606/653 3405/4601/653 3403/4607/653 +f 3417/4608/652 3414/4609/652 3413/4610/652 +f 3416/4611/654 3411/4612/654 3412/4613/654 +f 3418/4614/655 3412/4613/655 3414/4609/655 +f 3415/4615/653 3413/4610/653 3411/4616/653 +f 3425/4617/652 3422/4618/652 3421/4619/652 +f 3424/4620/654 3419/4621/654 3420/4622/654 +f 3426/4623/655 3420/4622/655 3422/4618/655 +f 3423/4624/653 3421/4619/653 3419/4625/653 +f 3433/4626/652 3430/4627/652 3429/4628/652 +f 3432/4629/654 3427/4630/654 3428/4631/654 +f 3434/4632/655 3428/4631/655 3430/4627/655 +f 3431/4633/653 3429/4628/653 3427/4634/653 +f 3441/4635/652 3438/4636/652 3437/4637/652 +f 3440/4638/654 3435/4639/654 3436/4640/654 +f 3442/4641/655 3436/4640/655 3438/4636/655 +f 3439/4642/653 3437/4637/653 3435/4643/653 +f 3449/4644/652 3446/4645/652 3445/4646/652 +f 3448/4647/654 3443/4648/654 3444/4649/654 +f 3450/4650/655 3444/4649/655 3446/4645/655 +f 3447/4651/653 3445/4646/653 3443/4652/653 +f 3457/4653/652 3454/4654/652 3453/4655/652 +f 3456/4656/654 3451/4657/654 3452/4658/654 +f 3458/4659/655 3452/4658/655 3454/4654/655 +f 3455/4660/653 3453/4655/653 3451/4661/653 +f 3465/4662/652 3462/4663/652 3461/4664/652 +f 3464/4665/654 3459/4666/654 3460/4667/654 +f 3466/4668/655 3460/4667/655 3462/4663/655 +f 3463/4669/653 3461/4664/653 3459/4670/653 +f 3473/4671/652 3470/4672/652 3469/4673/652 +f 3472/4674/654 3467/4675/654 3468/4676/654 +f 3474/4677/655 3468/4676/655 3470/4672/655 +f 3471/4678/653 3469/4673/653 3467/4679/653 +f 3476/4680/655 3477/4681/655 3475/4682/655 +f 3482/4683/665 3483/4684/665 3479/4685/665 +f 3476/4680/654 3482/4686/654 3478/4687/654 +f 3477/4688/652 3480/4689/652 3475/4682/652 +f 3478/4690/659 3479/4691/659 3477/4688/659 +f 3475/4682/658 3481/4692/658 3476/4680/658 +f 3484/4693/655 3485/4694/655 3483/4695/655 +f 3484/4696/654 3490/4697/654 3486/4698/654 +f 3485/4694/652 3487/4699/652 3483/4695/652 +f 3490/4697/653 3487/4699/653 3489/4700/653 +f 3480/4689/664 3488/4701/664 3481/4692/664 +f 3488/4701/654 3482/4702/654 3481/4692/654 +f 3483/4684/652 3480/4689/652 3479/4685/652 +f 3492/4703/653 3493/4704/653 3491/4705/653 +f 3494/4706/659 3497/4707/659 3493/4708/659 +f 3498/4709/655 3495/4710/655 3497/4707/655 +f 3496/4711/658 3491/4705/658 3495/4710/658 +f 3494/4712/654 3506/4713/654 3498/4714/654 +f 3498/4714/655 3510/4715/655 3502/4716/655 +f 3494/4717/653 3492/4718/653 3501/4719/653 +f 3502/4716/656 3492/4703/656 3496/4711/656 +f 3498/4714/655 3502/4716/655 3496/4720/655 +f 3493/4721/653 3499/4722/653 3491/4723/653 +f 3499/4722/657 3495/4710/657 3491/4705/657 +f 3497/4724/655 3495/4725/655 3500/4726/655 +f 3500/4726/655 3503/4727/655 3497/4724/655 +f 3499/4722/654 3507/4728/654 3500/4726/654 +f 3501/4719/653 3505/4729/653 3494/4717/653 +f 3502/4716/652 3509/4730/652 3501/4719/652 +f 3497/4724/652 3504/4731/652 3493/4732/652 +f 3493/4721/653 3508/4733/653 3499/4722/653 +f 3513/4734/659 3518/4735/659 3517/4736/659 +f 3512/4737/653 3513/4734/653 3511/4738/653 +f 3511/4738/658 3516/4739/658 3512/4740/658 +f 3513/4734/654 3515/4741/654 3511/4738/654 +f 3521/4742/659 3526/4743/659 3525/4744/659 +f 3520/4745/653 3521/4742/653 3519/4746/653 +f 3519/4746/658 3524/4747/658 3520/4748/658 +f 3521/4742/654 3523/4749/654 3519/4746/654 +f 3530/4750/672 3528/4751/672 3527/4752/672 +f 3531/4753/653 3529/4754/653 3534/4755/653 +f 3536/4756/655 3542/4757/655 3537/4758/655 +f 3538/4759/657 3536/4756/657 3537/4758/657 +f 3538/4760/653 3540/4761/653 3535/4762/653 +f 3531/4763/657 3533/4764/657 3532/4765/657 +f 3533/4764/655 3527/4752/655 3532/4765/655 +f 3539/4766/672 3541/4767/672 3542/4757/672 +f 3549/4768/652 3547/4769/652 3548/4770/652 +f 3545/4771/659 3550/4772/659 3546/4773/659 +f 3544/4774/658 3548/4770/658 3543/4775/658 +f 3546/4776/655 3549/4768/655 3544/4777/655 +f 3543/4778/653 3547/4769/653 3545/4779/653 +f 3553/4780/653 3555/4781/653 3551/4782/653 +f 3558/4783/658 3553/4780/658 3554/4784/658 +f 3552/4785/655 3558/4783/655 3554/4784/655 +f 3551/4786/659 3556/4787/659 3552/4785/659 +f 3561/4788/653 3563/4789/653 3559/4790/653 +f 3566/4791/658 3561/4792/658 3562/4793/658 +f 3560/4794/655 3566/4791/655 3562/4793/655 +f 3559/4790/659 3564/4795/659 3560/4794/659 +f 3569/4796/653 3571/4797/653 3567/4798/653 +f 3574/4799/658 3569/4796/658 3570/4800/658 +f 3568/4801/655 3574/4799/655 3570/4800/655 +f 3567/4798/659 3572/4802/659 3568/4803/659 +f 3577/4804/653 3579/4805/653 3575/4806/653 +f 3582/4807/658 3577/4804/658 3578/4808/658 +f 3576/4809/655 3582/4810/655 3578/4811/655 +f 3575/4806/659 3580/4812/659 3576/4809/659 +f 3586/4813/652 3583/4814/652 3584/4815/652 +f 3587/4816/654 3590/4817/654 3588/4818/654 +f 3586/4813/653 3589/4819/653 3585/4820/653 +f 3583/4814/655 3588/4818/655 3584/4815/655 +f 3584/4815/659 3590/4821/659 3586/4813/659 +f 3585/4820/658 3587/4822/658 3583/4814/658 +f 3596/4823/672 3601/4824/672 3595/4825/672 +f 3595/4826/652 3598/4827/652 3596/4828/652 +f 3593/4829/655 3595/4826/655 3591/4830/655 +f 3594/4831/653 3596/4828/653 3598/4827/653 +f 3595/4825/655 3599/4832/655 3591/4830/655 +f 3592/4833/653 3602/4834/653 3596/4823/653 +f 3604/4835/653 3605/4836/653 3603/4837/653 +f 3606/4838/659 3609/4839/659 3605/4840/659 +f 3610/4841/655 3607/4842/655 3609/4843/655 +f 3606/4838/652 3608/4844/652 3610/4841/652 +f 3618/4845/653 3612/4846/653 3614/4847/653 +f 3611/4848/655 3617/4849/655 3613/4850/655 +f 3613/4850/652 3618/4845/652 3614/4847/652 +f 3617/4851/658 3620/4852/658 3618/4853/658 +f 3619/4854/652 3622/4855/652 3620/4852/652 +f 3618/4853/653 3622/4856/653 3616/4857/653 +f 3621/4858/655 3617/4851/655 3615/4859/655 +f 3629/4860/672 3626/4861/672 3625/4862/672 +f 3627/4863/653 3625/4862/653 3623/4864/653 +f 3630/4865/655 3624/4866/655 3626/4861/655 +f 3633/4867/655 3632/4868/655 3631/4869/655 +f 3637/4870/659 3634/4871/659 3633/4872/659 +f 3635/4873/653 3638/4874/653 3637/4875/653 +f 3636/4876/652 3634/4871/652 3638/4874/652 +f 3645/4877/652 3643/4878/652 3644/4879/652 +f 3641/4880/659 3650/4881/659 3642/4882/659 +f 3639/4883/653 3647/4884/653 3641/4885/653 +f 3642/4886/655 3649/4887/655 3640/4888/655 +f 3649/4887/652 3647/4884/652 3648/4889/652 +f 3640/4890/658 3648/4889/658 3639/4891/658 +f 3651/4892/654 3653/4893/654 3652/4894/654 +f 3645/4877/655 3654/4895/655 3646/4896/655 +f 3643/4878/653 3652/4897/653 3644/4879/653 +f 3646/4896/659 3651/4898/659 3643/4878/659 +f 3644/4879/658 3653/4893/658 3645/4877/658 +f 3624/4866/655 3874/4899/655 3626/4900/655 +f 3625/4901/653 3871/4902/653 3623/4864/653 +f 3626/4900/652 3873/4903/652 3625/4901/652 +f 3874/4904/655 3876/4905/655 3878/4906/655 +f 3873/4907/653 3875/4908/653 3871/4902/653 +f 3874/4904/658 3877/4909/658 3873/4907/658 +f 3876/4910/655 3882/4911/655 3878/4906/655 +f 3875/4912/653 3881/4913/653 3879/4914/653 +f 3878/4906/652 3881/4913/652 3877/4909/652 +f 3880/4915/659 3881/4913/659 3882/4911/659 +f 3896/4916/653 3897/4917/653 3895/4918/653 +f 3888/4919/653 3889/4920/653 3887/4921/653 +f 3886/4922/658 3888/4923/658 3884/4924/658 +f 3987/4925/653 3989/4926/653 3980/4927/653 +f 3883/4928/659 3889/4920/659 3885/4929/659 +f 3885/4929/652 3890/4930/652 3886/4922/652 +f 3894/4931/658 3896/4932/658 3892/4933/658 +f 3982/4934/655 3992/4935/655 3988/4936/655 +f 3891/4937/659 3897/4917/659 3893/4938/659 +f 3893/4938/652 3898/4939/652 3894/4931/652 +f 3912/4940/653 3913/4941/653 3911/4942/653 +f 3904/4943/653 3905/4944/653 3903/4945/653 +f 3902/4946/658 3904/4947/658 3900/4948/658 +f 4001/4949/653 4003/4950/653 3994/4951/653 +f 3899/4952/659 3905/4944/659 3901/4953/659 +f 3901/4953/652 3906/4954/652 3902/4946/652 +f 3910/4955/658 3912/4956/658 3908/4957/658 +f 3980/4958/653 3985/4959/653 3987/4960/653 +f 3907/4961/659 3913/4941/659 3909/4962/659 +f 3909/4962/652 3914/4963/652 3910/4955/652 +f 3928/4964/653 3929/4965/653 3927/4966/653 +f 3920/4967/653 3921/4968/653 3919/4969/653 +f 3918/4970/658 3920/4971/658 3916/4972/658 +f 3988/4936/656 3985/4959/656 3986/4973/656 +f 3915/4974/659 3921/4968/659 3917/4975/659 +f 3917/4975/652 3922/4976/652 3918/4970/652 +f 3926/4977/658 3928/4978/658 3924/4979/658 +f 3982/4980/655 3988/4981/655 3986/4973/655 +f 3923/4982/659 3929/4965/659 3925/4983/659 +f 3925/4983/652 3930/4984/652 3926/4977/652 +f 3934/4985/658 3936/4986/658 3932/4987/658 +f 4007/4988/653 4013/4989/653 4008/4990/653 +f 3931/4991/659 3937/4992/659 3933/4993/659 +f 3933/4993/652 3938/4994/652 3934/4985/652 +f 3942/4995/658 3944/4996/658 3940/4997/658 +f 3982/4980/655 3983/4998/655 3981/4999/655 +f 3939/5000/659 3945/5001/659 3941/5002/659 +f 3941/5002/652 3946/5003/652 3942/4995/652 +f 3950/5004/658 3952/5005/658 3948/5006/658 +f 3980/4927/654 3990/5007/654 3982/5008/654 +f 3947/5009/659 3953/5010/659 3949/5011/659 +f 3949/5011/652 3954/5012/652 3950/5004/652 +f 3958/5013/658 3960/5014/658 3956/5015/658 +f 3979/5016/653 3985/4959/653 3980/4958/653 +f 3955/5017/659 3961/5018/659 3957/5019/659 +f 3957/5019/652 3962/5020/652 3958/5013/652 +f 3966/5021/658 3968/5022/658 3964/5023/658 +f 3983/4998/658 3985/4959/658 3984/5024/658 +f 3963/5025/659 3969/5026/659 3965/5027/659 +f 3965/5027/652 3970/5028/652 3966/5021/652 +f 3974/5029/658 3976/5030/658 3972/5031/658 +f 3980/4958/659 3981/5032/659 3979/5016/659 +f 3971/5033/659 3977/5034/659 3973/5035/659 +f 3973/5035/652 3978/5036/652 3974/5029/652 +f 3971/5037/655 3974/5029/655 3972/5038/655 +f 3963/5039/655 3966/5021/655 3964/5040/655 +f 3955/5041/655 3958/5013/655 3956/5042/655 +f 3947/5043/655 3950/5004/655 3948/5044/655 +f 3939/5045/655 3942/4995/655 3940/5046/655 +f 3931/5047/655 3934/4985/655 3932/5048/655 +f 3988/4936/652 3991/5049/652 3987/4925/652 +f 3996/5050/655 4006/5051/655 4002/5052/655 +f 3994/5053/653 3999/5054/653 4001/5055/653 +f 4002/5052/656 3999/5054/656 4000/5056/656 +f 3996/5057/655 4002/5058/655 4000/5056/655 +f 4010/5059/655 4011/5060/655 4009/5061/655 +f 3996/5057/655 3997/5062/655 3995/5063/655 +f 3994/4951/654 4004/5064/654 3996/5065/654 +f 3993/5066/653 3999/5054/653 3994/5053/653 +f 3997/5062/658 3999/5054/658 3998/5067/658 +f 3994/5053/659 3995/5068/659 3993/5066/659 +f 4002/5052/652 4005/5069/652 4001/4949/652 +f 4011/5060/658 4013/4989/658 4012/5070/658 +f 4008/4990/659 4009/5071/659 4007/4988/659 +f 4018/5072/655 4019/5073/655 4017/5074/655 +f 4015/5075/653 4021/5076/653 4016/5077/653 +f 4019/5073/658 4021/5076/658 4020/5078/658 +f 4016/5077/659 4017/5079/659 4015/5075/659 +f 3159/4537/658 3158/5080/658 3160/4538/658 +f 3155/5081/658 3163/4546/658 3157/4536/658 +f 3135/4506/659 3142/5082/659 3133/5083/659 +f 3136/5084/659 3137/4509/659 3138/4505/659 +f 4027/5085/658 4026/5086/658 4023/5087/658 +f 4025/5088/659 4028/5089/659 4024/5090/659 +f 4026/5086/653 4029/5091/653 4025/5092/653 +f 4024/5090/655 4027/5085/655 4023/5087/655 +f 4035/5093/658 4034/5094/658 4031/5095/658 +f 4033/5096/659 4036/5097/659 4032/5098/659 +f 4034/5094/653 4037/5099/653 4033/5096/653 +f 4032/5100/655 4035/5093/655 4031/5095/655 +f 4036/5101/670 4041/5102/670 4035/5103/670 +f 4030/5104/671 4039/5105/671 4029/5106/671 +f 4040/5107/654 4042/5108/654 4039/5109/654 +f 4040/5107/658 4045/5110/658 4041/5111/658 +f 4042/5112/659 4043/5113/659 4039/5114/659 +f 4045/5110/652 4043/5113/652 4046/5115/652 +f 4041/5111/658 4038/5116/658 4035/5117/658 +f 4045/5110/660 4037/5099/660 4038/5118/660 +f 4046/5115/659 4036/5119/659 4037/5120/659 +f 4044/5121/658 4030/5122/658 4027/5123/658 +f 4028/5089/661 4044/5121/661 4027/5085/661 +f 4039/5114/659 4028/5124/659 4029/5125/659 +f 4063/5126/658 4067/5127/658 4071/5128/658 +f 4057/5129/659 4053/5130/659 4049/5131/659 +f 4081/5132/653 4080/5133/653 4079/5134/653 +f 4087/5135/663 4086/5136/663 4083/5137/663 +f 4086/5138/654 4080/5133/654 4082/5139/654 +f 4084/5140/652 4081/5141/652 4079/5134/652 +f 4083/5142/659 4082/5143/659 4081/5141/659 +f 4085/5144/658 4079/5134/658 4080/5133/658 +f 4089/5145/653 4088/5146/653 4087/5147/653 +f 4094/5148/654 4088/5149/654 4090/5150/654 +f 4091/5151/652 4089/5145/652 4087/5147/652 +f 4091/5151/655 4094/5148/655 4093/5152/655 +f 4092/5153/662 4084/5140/662 4085/5144/662 +f 4086/5154/654 4092/5153/654 4085/5144/654 +f 4084/5140/652 4087/5135/652 4083/5137/652 +f 4097/5155/655 4096/5156/655 4095/5157/655 +f 4101/5158/659 4098/5159/659 4097/5160/659 +f 4099/5161/653 4102/5162/653 4101/5158/653 +f 4095/5157/658 4100/5163/658 4099/5161/658 +f 4110/5164/654 4098/5165/654 4102/5166/654 +f 4114/5167/653 4102/5166/653 4106/5168/653 +f 4098/5169/655 4105/5170/655 4096/5171/655 +f 4096/5156/656 4106/5168/656 4100/5163/656 +f 4102/5166/653 4100/5172/653 4106/5168/653 +f 4097/5173/655 4095/5174/655 4103/5175/655 +f 4099/5161/657 4103/5175/657 4095/5157/657 +f 4101/5176/653 4104/5177/653 4099/5178/653 +f 4107/5179/653 4104/5177/653 4101/5176/653 +f 4111/5180/654 4103/5175/654 4104/5177/654 +f 4109/5181/655 4105/5170/655 4098/5169/655 +f 4113/5182/652 4106/5168/652 4105/5170/652 +f 4108/5183/652 4101/5176/652 4097/5184/652 +f 4112/5185/655 4097/5173/655 4103/5175/655 +f 4117/5186/658 4122/5187/658 4121/5188/658 +f 4116/5189/655 4117/5186/655 4115/5190/655 +f 4115/5190/659 4120/5191/659 4116/5192/659 +f 4117/5186/654 4119/5193/654 4115/5190/654 +f 4125/5194/658 4130/5195/658 4129/5196/658 +f 4124/5197/655 4125/5194/655 4123/5198/655 +f 4123/5198/659 4128/5199/659 4124/5200/659 +f 4125/5194/654 4127/5201/654 4123/5198/654 +f 4133/5202/659 4138/5203/659 4137/5204/659 +f 4132/5205/655 4133/5202/655 4131/5206/655 +f 4131/5206/658 4136/5207/658 4132/5208/658 +f 4133/5202/652 4135/5209/652 4131/5206/652 +f 4141/5210/659 4146/5211/659 4145/5212/659 +f 4140/5213/655 4141/5210/655 4139/5214/655 +f 4139/5214/658 4144/5215/658 4140/5216/658 +f 4141/5210/652 4143/5217/652 4139/5214/652 +f 4149/5218/658 4154/5219/658 4153/5220/658 +f 4148/5221/653 4149/5218/653 4147/5222/653 +f 4147/5222/659 4152/5223/659 4148/5224/659 +f 4149/5218/652 4151/5225/652 4147/5222/652 +f 4157/5226/658 4162/5227/658 4161/5228/658 +f 4156/5229/653 4157/5226/653 4155/5230/653 +f 4155/5230/659 4160/5231/659 4156/5232/659 +f 4157/5226/652 4159/5233/652 4155/5230/652 +f 4165/5234/659 4170/5235/659 4169/5236/659 +f 4164/5237/654 4165/5234/654 4163/5238/654 +f 4163/5238/658 4168/5239/658 4164/5240/658 +f 4165/5234/655 4167/5241/655 4163/5238/655 +f 4173/5242/659 4178/5243/659 4177/5244/659 +f 4172/5245/654 4173/5242/654 4171/5246/654 +f 4171/5246/658 4176/5247/658 4172/5248/658 +f 4173/5242/655 4175/5249/655 4171/5246/655 +f 4182/5250/658 4185/5251/658 4181/5252/658 +f 4180/5253/652 4181/5252/652 4179/5254/652 +f 4179/5254/659 4184/5255/659 4180/5256/659 +f 4181/5252/655 4183/5257/655 4179/5254/655 +f 4190/5258/658 4193/5259/658 4189/5260/658 +f 4188/5261/652 4189/5260/652 4187/5262/652 +f 4187/5262/659 4192/5263/659 4188/5264/659 +f 4189/5260/655 4191/5265/655 4187/5262/655 +f 4197/5266/659 4202/5267/659 4201/5268/659 +f 4196/5269/652 4197/5266/652 4195/5270/652 +f 4195/5270/658 4200/5271/658 4196/5272/658 +f 4197/5266/653 4199/5273/653 4195/5270/653 +f 4205/5274/659 4210/5275/659 4209/5276/659 +f 4204/5277/652 4205/5274/652 4203/5278/652 +f 4203/5278/658 4208/5279/658 4204/5280/658 +f 4205/5274/653 4207/5281/653 4203/5278/653 +f 4214/5282/658 4217/5283/658 4213/5284/658 +f 4212/5285/654 4213/5284/654 4211/5286/654 +f 4211/5286/659 4216/5287/659 4212/5288/659 +f 4213/5284/653 4215/5289/653 4211/5286/653 +f 4222/5290/658 4225/5291/658 4221/5292/658 +f 4220/5293/654 4221/5292/654 4219/5294/654 +f 4219/5294/659 4224/5295/659 4220/5296/659 +f 4221/5292/653 4223/5297/653 4219/5294/653 +f 4233/5298/658 4234/5299/658 4227/5300/658 +f 4249/5301/658 4250/5302/658 4243/5303/658 +f 4265/5304/658 4266/5305/658 4259/5306/658 +f 3615/4859/659 3622/5307/659 3621/4858/659 +f 2949/4260/652 2946/4277/652 2945/4261/652 +f 2950/4262/653 2945/4261/653 2947/4263/653 +f 2956/4265/654 2947/5308/654 2948/4266/654 +f 2951/4270/656 2949/4260/656 2950/4262/656 +f 2957/4274/657 2952/4278/657 2953/4275/657 +f 2955/4267/655 2948/4266/655 2946/4277/655 +f 2956/4272/653 2958/5309/653 2953/4275/653 +f 2955/4268/655 2951/4270/655 2952/4278/655 +f 2952/4278/658 2951/4270/658 2954/4271/658 +f 2956/4280/659 2955/4268/659 2957/4279/659 +f 2961/4285/660 2964/5310/660 2962/4286/660 +f 2960/4282/655 2963/4289/655 2964/4288/655 +f 2959/4287/654 2962/4286/654 2963/4289/654 +f 2965/4290/654 2967/5311/654 2968/4291/654 +f 2965/4293/653 2969/4298/653 2970/4294/653 +f 2968/4291/661 2970/5312/661 2969/4296/661 +f 2964/4288/658 2970/4294/658 2968/4299/658 +f 2978/4301/662 2986/5313/662 2984/4302/662 +f 2985/4304/658 2986/4408/658 2978/4305/658 +f 2981/4307/663 2979/4319/663 2971/4308/663 +f 2974/4310/659 2982/4323/659 2981/4311/659 +f 2983/4313/664 2985/5314/664 2977/4314/664 +f 2984/4302/655 2980/4317/655 2972/4316/655 +f 2980/4317/665 2982/5315/665 2974/4318/665 +f 2979/4319/653 2983/4313/653 2975/4315/653 +f 2974/4320/654 2973/5316/654 2962/4286/654 +f 2962/4286/654 2973/5316/654 2971/4321/654 +f 2968/4291/654 2967/5311/654 2972/4322/654 +f 2964/4288/652 2981/4311/652 2982/4323/652 +f 2999/4326/659 2998/4368/659 3013/4327/659 +f 2991/4331/658 2993/4335/658 2992/4332/658 +f 2990/4330/655 3011/4367/655 3013/4333/655 +f 3009/4337/653 3010/5317/653 3005/4338/653 +f 3003/4343/659 3002/4346/659 3001/4341/659 +f 3011/4344/652 3007/5318/652 3008/4328/652 +f 2993/4335/660 3002/4346/660 3004/4347/660 +f 3043/4349/658 3044/4420/658 3036/4350/658 +f 2989/4329/653 2997/5319/653 2998/4352/653 +f 2991/4331/652 3001/4341/652 3002/4346/652 +f 2990/4354/661 3000/5320/661 3001/4341/661 +f 2995/4355/655 3006/5321/655 3003/4356/655 +f 3036/4357/662 3044/5322/662 3042/4358/662 +f 2992/4360/654 3003/4343/654 2997/4340/654 +f 2988/4362/655 2999/5323/655 3008/4363/655 +f 3004/4365/653 3014/5324/653 3012/4366/653 +f 2988/4362/658 3007/4364/658 3011/4367/658 +f 3011/4367/658 2990/4330/658 2989/4329/658 +f 2997/4340/659 3000/4342/659 3013/4327/659 +f 3014/4369/659 3004/4345/659 3003/4343/659 +f 2992/4332/658 2996/4336/658 3012/4366/658 +f 3014/4369/659 3006/4370/659 3005/4371/659 +f 2994/4339/658 2995/4355/658 3012/4366/658 +f 3010/4372/652 3009/5325/652 3012/4373/652 +f 2963/4289/655 3015/4425/655 3016/4374/655 +f 3022/4390/659 3017/4377/659 3018/4379/659 +f 3018/4379/659 3019/4382/659 3021/4381/659 +f 3021/4381/659 3023/4387/659 3025/4385/659 +f 3025/4385/659 3024/4391/659 3022/4390/659 +f 3022/4390/659 3018/4379/659 3025/4385/659 +f 3026/4386/653 3020/5326/653 2967/4295/653 +f 3016/4375/655 3017/4377/655 3022/4390/655 +f 3026/4384/653 3028/5327/653 3023/4387/653 +f 3025/4385/652 3028/5328/652 3027/4393/652 +f 3039/4394/663 3037/4406/663 3029/4395/663 +f 3032/4397/659 3040/4407/659 3039/4398/659 +f 3041/4400/664 3043/5329/664 3035/4401/664 +f 3042/4358/655 3038/4404/655 3030/4403/655 +f 3038/4404/665 3040/5330/665 3032/4405/665 +f 3037/4406/653 3041/4400/653 3033/4402/653 +f 2985/4304/652 3039/4398/652 3040/4407/652 +f 3032/4409/654 3031/5331/654 2977/4410/654 +f 3037/4412/652 3039/4398/652 2985/4304/652 +f 2977/4410/654 3031/5331/654 3029/4414/654 +f 2976/4416/654 3030/4428/654 3032/4409/654 +f 3040/4407/652 3038/4429/652 2984/4417/652 +f 3028/4418/658 3026/4386/658 3016/4374/658 +f 3043/4349/652 3016/4374/652 3026/4386/652 +f 3018/4379/654 3035/4426/654 3036/4423/654 +f 3036/4423/654 3034/4427/654 3020/4424/654 +f 3015/4425/654 3033/5332/654 3035/4426/654 +f 2971/4321/654 2975/4415/654 2963/4289/654 +f 2975/4415/654 3029/4414/654 3015/4425/654 +f 3029/4414/654 3033/5332/654 3015/4425/654 +f 2983/4413/652 2979/4325/652 2964/4288/652 +f 2964/4288/652 3016/4374/652 3037/4412/652 +f 3016/4374/652 3041/4422/652 3037/4412/652 +f 3030/4428/654 2976/4416/654 3020/4424/654 +f 2976/4416/654 2972/4322/654 2967/5311/654 +f 3020/4424/654 2976/4416/654 2967/5311/654 +f 2970/4294/652 2980/4324/652 2984/4417/652 +f 3038/4429/652 3042/4421/652 3026/4386/652 +f 2970/4294/652 2984/4417/652 3038/4429/652 +f 3049/4430/658 3052/5333/658 3048/4431/658 +f 3047/4433/659 3051/5334/659 3050/4434/659 +f 3048/4431/653 3052/5333/653 3051/4436/653 +f 3046/4435/655 3050/4434/655 3049/4430/655 +f 3057/4438/658 3060/4463/658 3056/4439/658 +f 3055/4441/659 3059/4444/659 3058/4442/659 +f 3056/4439/653 3060/4463/653 3059/4444/653 +f 3054/4445/655 3058/5335/655 3057/4438/655 +f 3058/4446/670 3064/5336/670 3063/4447/670 +f 3052/4449/671 3062/5337/671 3061/4450/671 +f 3062/4452/654 3063/4456/654 3064/4453/654 +f 3062/4452/658 3066/4466/658 3067/4455/658 +f 3064/4457/659 3068/4460/659 3065/4458/659 +f 3067/4455/652 3066/4466/652 3065/4458/652 +f 3063/4456/658 3067/4455/658 3060/4461/658 +f 3067/4455/660 3068/4460/660 3059/4444/660 +f 3068/4460/659 3064/4457/659 3058/4464/659 +f 3066/4466/658 3062/4452/658 3052/4467/658 +f 3050/4434/661 3065/4458/661 3066/4466/661 +f 3061/4459/659 3065/4458/659 3050/4469/659 +f 3069/4473/658 3070/5338/658 3071/5339/658 +f 3071/5339/658 3072/5340/658 3069/4473/658 +f 3072/5340/658 3073/5341/658 3069/4473/658 +f 3073/5341/658 3074/5342/658 3069/4473/658 +f 3074/5342/658 3075/4471/658 3069/4473/658 +f 3101/4474/658 3102/5343/658 3103/5344/658 +f 3103/5344/658 3104/5345/658 3101/4474/658 +f 3104/5345/658 3105/4475/658 3101/4474/658 +f 3105/4475/658 3106/5346/658 3107/5347/658 +f 3107/5347/658 3108/5348/658 3105/4475/658 +f 3108/5348/658 3109/4476/658 3105/4475/658 +f 3109/4476/658 3110/5349/658 3111/5350/658 +f 3111/5350/658 3112/5351/658 3113/5352/658 +f 3113/5352/658 3114/5353/658 3101/4474/658 +f 3114/5353/658 3115/5354/658 3101/4474/658 +f 3115/5354/658 3116/5355/658 3101/4474/658 +f 3109/4476/658 3111/5350/658 3101/4474/658 +f 3111/5350/658 3113/5352/658 3101/4474/658 +f 3087/4479/659 3086/5356/659 3085/5357/659 +f 3085/5357/659 3100/5358/659 3099/5359/659 +f 3099/5359/659 3098/5360/659 3095/4477/659 +f 3098/5360/659 3097/5361/659 3095/4477/659 +f 3097/5361/659 3096/5362/659 3095/4477/659 +f 3095/4477/659 3094/5363/659 3093/5364/659 +f 3093/5364/659 3092/5365/659 3095/4477/659 +f 3092/5365/659 3091/4478/659 3095/4477/659 +f 3091/4478/659 3090/5366/659 3089/5367/659 +f 3089/5367/659 3088/5368/659 3091/4478/659 +f 3088/5368/659 3087/4479/659 3091/4478/659 +f 3087/4479/659 3085/5357/659 3095/4477/659 +f 3085/5357/659 3099/5359/659 3095/4477/659 +f 3119/4483/670 3122/4486/670 3120/4484/670 +f 3118/4480/653 3121/4487/653 3122/4486/653 +f 3117/4482/652 3120/4501/652 3121/4487/652 +f 3123/4488/652 3125/4492/652 3126/4489/652 +f 3123/4488/655 3127/4494/655 3128/4491/655 +f 3126/4493/671 3128/4491/671 3127/4494/671 +f 3126/4489/658 3129/4503/658 3130/4497/658 +f 3122/4499/658 3132/5369/658 3131/4500/658 +f 3126/4489/660 3137/4509/660 3139/4502/660 +f 3120/4501/652 3135/4506/652 3134/4504/652 +f 3128/4491/655 3136/4511/655 3138/4505/655 +f 3131/4500/661 3141/5370/661 3135/4506/661 +f 3122/4486/671 3133/4512/671 3142/4507/671 +f 3125/4492/652 3138/4505/652 3137/4509/652 +f 3130/4510/670 3140/5371/670 3136/4511/670 +f 3121/4487/653 3134/4504/653 3133/4512/653 +f 3139/4502/659 3137/4509/659 3136/4513/659 +f 3145/4516/670 3148/4520/670 3146/4517/670 +f 3144/4519/653 3147/4522/653 3148/4520/653 +f 3143/4521/652 3146/5372/652 3147/4522/652 +f 3149/4523/652 3151/4527/652 3152/4524/652 +f 3149/4523/655 3153/4529/655 3154/4526/655 +f 3152/4528/671 3154/4526/671 3153/4529/671 +f 3158/4531/658 3159/4537/658 3161/4532/658 +f 3159/4537/652 3160/4538/652 3149/4523/652 +f 3160/4538/655 3158/4543/655 3153/4529/655 +f 3156/4534/652 3157/4536/652 3143/4521/652 +f 3155/4539/653 3156/4534/653 3144/4519/653 +f 3159/4537/660 3150/4525/660 3165/4540/660 +f 3153/4541/659 3166/5373/659 3165/4540/659 +f 3166/4542/670 3153/4529/670 3158/4543/670 +f 3167/4545/661 3143/4521/661 3157/4536/661 +f 3167/4545/659 3168/5374/659 3145/4547/659 +f 3155/4539/671 3145/4516/671 3168/4548/671 +f 3367/4550/659 3368/4556/659 3366/4551/659 +f 3371/4553/658 3372/4564/658 3369/4554/658 +f 3368/4556/655 3372/4564/655 3371/4553/655 +f 3367/4557/653 3365/5375/653 3370/4555/653 +f 3368/4558/655 3375/4568/655 3377/4559/655 +f 3366/4561/657 3371/4553/657 3370/4555/657 +f 3372/4564/656 3374/4560/656 3373/4565/656 +f 3367/4567/654 3376/5376/654 3375/4568/654 +f 3373/4565/653 3378/4571/653 3376/4569/653 +f 3374/4560/652 3377/4559/652 3378/4571/652 +f 3382/4572/652 3386/4578/652 3385/4573/652 +f 3379/4575/654 3383/5377/654 3384/4576/654 +f 3380/4577/655 3384/4576/655 3386/4578/655 +f 3381/4574/653 3385/4573/653 3383/4579/653 +f 3390/4581/652 3394/4587/652 3393/4582/652 +f 3387/4584/654 3391/5378/654 3392/4585/654 +f 3388/4586/655 3392/4585/655 3394/4587/655 +f 3389/4583/653 3393/4582/653 3391/4588/653 +f 3401/4590/652 3402/4596/652 3398/4591/652 +f 3400/4593/654 3399/5379/654 3395/4594/654 +f 3402/4596/655 3400/4593/655 3396/4595/655 +f 3399/4597/653 3401/4590/653 3397/4592/653 +f 3409/4599/652 3410/4605/652 3406/4600/652 +f 3408/4602/654 3407/5380/654 3403/4603/654 +f 3410/4605/655 3408/4602/655 3404/4604/655 +f 3407/4606/653 3409/4599/653 3405/4601/653 +f 3417/4608/652 3418/4614/652 3414/4609/652 +f 3416/4611/654 3415/5381/654 3411/4612/654 +f 3418/4614/655 3416/4611/655 3412/4613/655 +f 3415/4615/653 3417/4608/653 3413/4610/653 +f 3425/4617/652 3426/4623/652 3422/4618/652 +f 3424/4620/654 3423/5382/654 3419/4621/654 +f 3426/4623/655 3424/4620/655 3420/4622/655 +f 3423/4624/653 3425/4617/653 3421/4619/653 +f 3433/4626/652 3434/4632/652 3430/4627/652 +f 3432/4629/654 3431/5383/654 3427/4630/654 +f 3434/4632/655 3432/4629/655 3428/4631/655 +f 3431/4633/653 3433/4626/653 3429/4628/653 +f 3441/4635/652 3442/4641/652 3438/4636/652 +f 3440/4638/654 3439/5384/654 3435/4639/654 +f 3442/4641/655 3440/4638/655 3436/4640/655 +f 3439/4642/653 3441/4635/653 3437/4637/653 +f 3449/4644/652 3450/4650/652 3446/4645/652 +f 3448/4647/654 3447/5385/654 3443/4648/654 +f 3450/4650/655 3448/4647/655 3444/4649/655 +f 3447/4651/653 3449/4644/653 3445/4646/653 +f 3457/4653/652 3458/4659/652 3454/4654/652 +f 3456/4656/654 3455/5386/654 3451/4657/654 +f 3458/4659/655 3456/4656/655 3452/4658/655 +f 3455/4660/653 3457/4653/653 3453/4655/653 +f 3465/4662/652 3466/4668/652 3462/4663/652 +f 3464/4665/654 3463/5387/654 3459/4666/654 +f 3466/4668/655 3464/4665/655 3460/4667/655 +f 3463/4669/653 3465/4662/653 3461/4664/653 +f 3473/4671/652 3474/4677/652 3470/4672/652 +f 3472/4674/654 3471/5388/654 3467/4675/654 +f 3474/4677/655 3472/4674/655 3468/4676/655 +f 3471/4678/653 3473/4671/653 3469/4673/653 +f 3476/4680/655 3478/5389/655 3477/4681/655 +f 3482/4683/665 3484/5390/665 3483/4684/665 +f 3476/4680/654 3481/4692/654 3482/4686/654 +f 3477/4688/652 3479/4691/652 3480/4689/652 +f 3478/4690/659 3482/5391/659 3479/4691/659 +f 3475/4682/658 3480/4689/658 3481/4692/658 +f 3484/4693/655 3486/5392/655 3485/4694/655 +f 3484/4696/654 3488/4701/654 3490/4697/654 +f 3485/4694/652 3489/4700/652 3487/4699/652 +f 3490/4697/653 3488/4701/653 3487/4699/653 +f 3480/4689/664 3487/4699/664 3488/4701/664 +f 3488/4701/654 3484/5393/654 3482/4702/654 +f 3483/4684/652 3487/4699/652 3480/4689/652 +f 3492/4703/653 3494/5394/653 3493/4704/653 +f 3494/4706/659 3498/4709/659 3497/4707/659 +f 3498/4709/655 3496/4711/655 3495/4710/655 +f 3496/4711/658 3492/4703/658 3491/4705/658 +f 3494/4712/654 3505/5395/654 3506/4713/654 +f 3498/4714/655 3506/4713/655 3510/4715/655 +f 3502/4716/656 3501/4719/656 3492/4703/656 +f 3499/4722/657 3500/4726/657 3495/4710/657 +f 3500/4726/655 3507/4728/655 3503/4727/655 +f 3499/4722/654 3508/4733/654 3507/4728/654 +f 3501/4719/653 3509/4730/653 3505/4729/653 +f 3502/4716/652 3510/4715/652 3509/4730/652 +f 3497/4724/652 3503/4727/652 3504/4731/652 +f 3493/4721/653 3504/5396/653 3508/4733/653 +f 3513/4734/659 3514/5397/659 3518/4735/659 +f 3512/4737/653 3514/5398/653 3513/4734/653 +f 3511/4738/658 3515/4741/658 3516/4739/658 +f 3513/4734/654 3517/4736/654 3515/4741/654 +f 3521/4742/659 3522/5399/659 3526/4743/659 +f 3520/4745/653 3522/5400/653 3521/4742/653 +f 3519/4746/658 3523/4749/658 3524/4747/658 +f 3521/4742/654 3525/4744/654 3523/4749/654 +f 3530/4750/672 3529/4754/672 3528/4751/672 +f 3531/4753/653 3528/4751/653 3529/4754/653 +f 3536/4756/655 3539/4766/655 3542/4757/655 +f 3538/4759/657 3535/5401/657 3536/4756/657 +f 3538/4760/653 3541/4767/653 3540/4761/653 +f 3531/4763/657 3534/5402/657 3533/4764/657 +f 3533/4764/655 3530/4750/655 3527/4752/655 +f 3539/4766/672 3540/4761/672 3541/4767/672 +f 3549/4768/652 3550/4772/652 3547/4769/652 +f 3545/4771/659 3547/4769/659 3550/4772/659 +f 3544/4774/658 3549/4768/658 3548/4770/658 +f 3546/4776/655 3550/4772/655 3549/4768/655 +f 3543/4778/653 3548/4770/653 3547/4769/653 +f 3553/4780/653 3557/5403/653 3555/4781/653 +f 3558/4783/658 3557/5403/658 3553/4780/658 +f 3552/4785/655 3556/4787/655 3558/4783/655 +f 3551/4786/659 3555/5404/659 3556/4787/659 +f 3561/4788/653 3565/5405/653 3563/4789/653 +f 3566/4791/658 3565/5406/658 3561/4792/658 +f 3560/4794/655 3564/4795/655 3566/4791/655 +f 3559/4790/659 3563/4789/659 3564/4795/659 +f 3569/4796/653 3573/5407/653 3571/4797/653 +f 3574/4799/658 3573/5407/658 3569/4796/658 +f 3568/4801/655 3572/5408/655 3574/4799/655 +f 3567/4798/659 3571/4797/659 3572/4802/659 +f 3577/4804/653 3581/5409/653 3579/4805/653 +f 3582/4807/658 3581/5409/658 3577/4804/658 +f 3576/4809/655 3580/4812/655 3582/4810/655 +f 3575/4806/659 3579/4805/659 3580/4812/659 +f 3586/4813/652 3585/4820/652 3583/4814/652 +f 3587/4816/654 3589/5410/654 3590/4817/654 +f 3586/4813/653 3590/5411/653 3589/4819/653 +f 3583/4814/655 3587/4816/655 3588/4818/655 +f 3584/4815/659 3588/5412/659 3590/4821/659 +f 3585/4820/658 3589/5413/658 3587/4822/658 +f 3596/4823/672 3602/4834/672 3601/4824/672 +f 3595/4826/652 3597/5414/652 3598/4827/652 +f 3593/4829/655 3597/5414/655 3595/4826/655 +f 3594/4831/653 3592/4833/653 3596/4828/653 +f 3595/4825/655 3601/4824/655 3599/4832/655 +f 3592/4833/653 3600/5415/653 3602/4834/653 +f 3604/4835/653 3606/4838/653 3605/4836/653 +f 3606/4838/659 3610/4841/659 3609/4839/659 +f 3610/4841/655 3608/4844/655 3607/4842/655 +f 3606/4838/652 3604/4835/652 3608/4844/652 +f 3618/4845/653 3616/4857/653 3612/4846/653 +f 3611/4848/655 3615/4859/655 3617/4849/655 +f 3613/4850/652 3617/4849/652 3618/4845/652 +f 3617/4851/658 3619/4854/658 3620/4852/658 +f 3619/4854/652 3621/5416/652 3622/4855/652 +f 3618/4853/653 3620/4852/653 3622/4856/653 +f 3621/4858/655 3619/4854/655 3617/4851/655 +f 3629/4860/672 3630/4865/672 3626/4861/672 +f 3627/4863/653 3629/4860/653 3625/4862/653 +f 3630/4865/655 3628/5417/655 3624/4866/655 +f 3633/4867/655 3634/4871/655 3632/4868/655 +f 3637/4870/659 3638/4874/659 3634/4871/659 +f 3635/4873/653 3636/4876/653 3638/4874/653 +f 3636/4876/652 3632/4868/652 3634/4871/652 +f 3645/4877/652 3646/4896/652 3643/4878/652 +f 3641/4880/659 3647/4884/659 3650/4881/659 +f 3639/4883/653 3648/4889/653 3647/4884/653 +f 3642/4886/655 3650/4881/655 3649/4887/655 +f 3649/4887/652 3650/4881/652 3647/4884/652 +f 3640/4890/658 3649/4887/658 3648/4889/658 +f 3651/4892/654 3654/5418/654 3653/4893/654 +f 3645/4877/655 3653/5419/655 3654/4895/655 +f 3643/4878/653 3651/5420/653 3652/4897/653 +f 3646/4896/659 3654/5421/659 3651/4898/659 +f 3644/4879/658 3652/4894/658 3653/4893/658 +f 3624/4866/655 3872/5422/655 3874/4899/655 +f 3625/4901/653 3873/4903/653 3871/4902/653 +f 3626/4900/652 3874/4899/652 3873/4903/652 +f 3874/4904/655 3872/5422/655 3876/4905/655 +f 3873/4907/653 3877/4909/653 3875/4908/653 +f 3874/4904/658 3878/4906/658 3877/4909/658 +f 3876/4910/655 3880/5423/655 3882/4911/655 +f 3875/4912/653 3877/4909/653 3881/4913/653 +f 3878/4906/652 3882/4911/652 3881/4913/652 +f 3880/4915/659 3879/5424/659 3881/4913/659 +f 3896/4916/653 3898/4939/653 3897/4917/653 +f 3888/4919/653 3890/4930/653 3889/4920/653 +f 3886/4922/658 3890/4930/658 3888/4923/658 +f 3987/4925/653 3991/5049/653 3989/4926/653 +f 3883/4928/659 3887/5425/659 3889/4920/659 +f 3885/4929/652 3889/4920/652 3890/4930/652 +f 3894/4931/658 3898/4939/658 3896/4932/658 +f 3982/4934/655 3990/5426/655 3992/4935/655 +f 3891/4937/659 3895/5427/659 3897/4917/659 +f 3893/4938/652 3897/4917/652 3898/4939/652 +f 3912/4940/653 3914/4963/653 3913/4941/653 +f 3904/4943/653 3906/4954/653 3905/4944/653 +f 3902/4946/658 3906/4954/658 3904/4947/658 +f 4001/4949/653 4005/5069/653 4003/4950/653 +f 3899/4952/659 3903/5428/659 3905/4944/659 +f 3901/4953/652 3905/4944/652 3906/4954/652 +f 3910/4955/658 3914/4963/658 3912/4956/658 +f 3907/4961/659 3911/5429/659 3913/4941/659 +f 3909/4962/652 3913/4941/652 3914/4963/652 +f 3928/4964/653 3930/4984/653 3929/4965/653 +f 3920/4967/653 3922/4976/653 3921/4968/653 +f 3918/4970/658 3922/4976/658 3920/4971/658 +f 3988/4936/656 3987/4925/656 3985/4959/656 +f 3915/4974/659 3919/5430/659 3921/4968/659 +f 3917/4975/652 3921/4968/652 3922/4976/652 +f 3926/4977/658 3930/4984/658 3928/4978/658 +f 3923/4982/659 3927/5431/659 3929/4965/659 +f 3925/4983/652 3929/4965/652 3930/4984/652 +f 3934/4985/658 3938/4994/658 3936/4986/658 +f 4007/4988/653 4012/5070/653 4013/4989/653 +f 3931/4991/659 3935/5432/659 3937/4992/659 +f 3933/4993/652 3937/4992/652 3938/4994/652 +f 3942/4995/658 3946/5003/658 3944/4996/658 +f 3982/4980/655 3986/4973/655 3983/4998/655 +f 3939/5000/659 3943/5433/659 3945/5001/659 +f 3941/5002/652 3945/5001/652 3946/5003/652 +f 3950/5004/658 3954/5012/658 3952/5005/658 +f 3980/4927/654 3989/4926/654 3990/5007/654 +f 3947/5009/659 3951/5434/659 3953/5010/659 +f 3949/5011/652 3953/5010/652 3954/5012/652 +f 3958/5013/658 3962/5020/658 3960/5014/658 +f 3979/5016/653 3984/5024/653 3985/4959/653 +f 3955/5017/659 3959/5435/659 3961/5018/659 +f 3957/5019/652 3961/5018/652 3962/5020/652 +f 3966/5021/658 3970/5028/658 3968/5022/658 +f 3983/4998/658 3986/4973/658 3985/4959/658 +f 3963/5025/659 3967/5436/659 3969/5026/659 +f 3965/5027/652 3969/5026/652 3970/5028/652 +f 3974/5029/658 3978/5036/658 3976/5030/658 +f 3980/4958/659 3982/5437/659 3981/5032/659 +f 3971/5033/659 3975/5438/659 3977/5034/659 +f 3973/5035/652 3977/5034/652 3978/5036/652 +f 3971/5037/655 3973/5035/655 3974/5029/655 +f 3963/5039/655 3965/5027/655 3966/5021/655 +f 3955/5041/655 3957/5019/655 3958/5013/655 +f 3947/5043/655 3949/5011/655 3950/5004/655 +f 3939/5045/655 3941/5002/655 3942/4995/655 +f 3931/5047/655 3933/4993/655 3934/4985/655 +f 3988/4936/652 3992/4935/652 3991/5049/652 +f 3996/5050/655 4004/5439/655 4006/5051/655 +f 4002/5052/656 4001/4949/656 3999/5054/656 +f 4010/5059/655 4014/5440/655 4011/5060/655 +f 3996/5057/655 4000/5056/655 3997/5062/655 +f 3994/4951/654 4003/4950/654 4004/5064/654 +f 3993/5066/653 3998/5067/653 3999/5054/653 +f 3997/5062/658 4000/5056/658 3999/5054/658 +f 3994/5053/659 3996/5441/659 3995/5068/659 +f 4002/5052/652 4006/5051/652 4005/5069/652 +f 4011/5060/658 4014/5440/658 4013/4989/658 +f 4008/4990/659 4010/5442/659 4009/5071/659 +f 4018/5072/655 4022/5443/655 4019/5073/655 +f 4015/5075/653 4020/5078/653 4021/5076/653 +f 4019/5073/658 4022/5443/658 4021/5076/658 +f 4016/5077/659 4018/5444/659 4017/5079/659 +f 3155/5081/658 3164/5445/658 3163/4546/658 +f 3135/4506/659 3141/5370/659 3142/5082/659 +f 4027/5085/658 4030/5446/658 4026/5086/658 +f 4025/5088/659 4029/5447/659 4028/5089/659 +f 4026/5086/653 4030/5446/653 4029/5091/653 +f 4024/5090/655 4028/5089/655 4027/5085/655 +f 4035/5093/658 4038/5118/658 4034/5094/658 +f 4033/5096/659 4037/5099/659 4036/5097/659 +f 4034/5094/653 4038/5118/653 4037/5099/653 +f 4032/5100/655 4036/5448/655 4035/5093/655 +f 4036/5101/670 4042/5449/670 4041/5102/670 +f 4030/5104/671 4040/5450/671 4039/5105/671 +f 4040/5107/654 4041/5111/654 4042/5108/654 +f 4040/5107/658 4044/5121/658 4045/5110/658 +f 4042/5112/659 4046/5115/659 4043/5113/659 +f 4045/5110/652 4044/5121/652 4043/5113/652 +f 4041/5111/658 4045/5110/658 4038/5116/658 +f 4045/5110/660 4046/5115/660 4037/5099/660 +f 4046/5115/659 4042/5112/659 4036/5119/659 +f 4044/5121/658 4040/5107/658 4030/5122/658 +f 4028/5089/661 4043/5113/661 4044/5121/661 +f 4039/5114/659 4043/5113/659 4028/5124/659 +f 4063/5126/658 4064/5451/658 4065/5452/658 +f 4065/5452/658 4066/5453/658 4063/5126/658 +f 4066/5453/658 4067/5127/658 4063/5126/658 +f 4067/5127/658 4068/5454/658 4069/5455/658 +f 4069/5455/658 4070/5456/658 4067/5127/658 +f 4070/5456/658 4071/5128/658 4067/5127/658 +f 4071/5128/658 4072/5457/658 4073/5458/658 +f 4073/5458/658 4074/5459/658 4075/5460/658 +f 4075/5460/658 4076/5461/658 4063/5126/658 +f 4076/5461/658 4077/5462/658 4063/5126/658 +f 4077/5462/658 4078/5463/658 4063/5126/658 +f 4071/5128/658 4073/5458/658 4063/5126/658 +f 4073/5458/658 4075/5460/658 4063/5126/658 +f 4049/5131/659 4048/5464/659 4047/5465/659 +f 4047/5465/659 4062/5466/659 4061/5467/659 +f 4061/5467/659 4060/5468/659 4057/5129/659 +f 4060/5468/659 4059/5469/659 4057/5129/659 +f 4059/5469/659 4058/5470/659 4057/5129/659 +f 4057/5129/659 4056/5471/659 4055/5472/659 +f 4055/5472/659 4054/5473/659 4057/5129/659 +f 4054/5473/659 4053/5130/659 4057/5129/659 +f 4053/5130/659 4052/5474/659 4051/5475/659 +f 4051/5475/659 4050/5476/659 4053/5130/659 +f 4050/5476/659 4049/5131/659 4053/5130/659 +f 4049/5131/659 4047/5465/659 4057/5129/659 +f 4047/5465/659 4061/5467/659 4057/5129/659 +f 4081/5132/653 4082/5477/653 4080/5133/653 +f 4087/5135/663 4088/5478/663 4086/5136/663 +f 4086/5138/654 4085/5144/654 4080/5133/654 +f 4084/5140/652 4083/5142/652 4081/5141/652 +f 4083/5142/659 4086/5479/659 4082/5143/659 +f 4085/5144/658 4084/5140/658 4079/5134/658 +f 4089/5145/653 4090/5480/653 4088/5146/653 +f 4094/5148/654 4092/5153/654 4088/5149/654 +f 4091/5151/652 4093/5152/652 4089/5145/652 +f 4091/5151/655 4092/5153/655 4094/5148/655 +f 4092/5153/662 4091/5151/662 4084/5140/662 +f 4086/5154/654 4088/5481/654 4092/5153/654 +f 4084/5140/652 4091/5151/652 4087/5135/652 +f 4097/5155/655 4098/5482/655 4096/5156/655 +f 4101/5158/659 4102/5162/659 4098/5159/659 +f 4099/5161/653 4100/5163/653 4102/5162/653 +f 4095/5157/658 4096/5156/658 4100/5163/658 +f 4110/5164/654 4109/5483/654 4098/5165/654 +f 4114/5167/653 4110/5164/653 4102/5166/653 +f 4096/5156/656 4105/5170/656 4106/5168/656 +f 4099/5161/657 4104/5177/657 4103/5175/657 +f 4107/5179/653 4111/5180/653 4104/5177/653 +f 4111/5180/654 4112/5185/654 4103/5175/654 +f 4109/5181/655 4113/5182/655 4105/5170/655 +f 4113/5182/652 4114/5167/652 4106/5168/652 +f 4108/5183/652 4107/5179/652 4101/5176/652 +f 4112/5185/655 4108/5484/655 4097/5173/655 +f 4117/5186/658 4118/5485/658 4122/5187/658 +f 4116/5189/655 4118/5486/655 4117/5186/655 +f 4115/5190/659 4119/5193/659 4120/5191/659 +f 4117/5186/654 4121/5188/654 4119/5193/654 +f 4125/5194/658 4126/5487/658 4130/5195/658 +f 4124/5197/655 4126/5488/655 4125/5194/655 +f 4123/5198/659 4127/5201/659 4128/5199/659 +f 4125/5194/654 4129/5196/654 4127/5201/654 +f 4133/5202/659 4134/5489/659 4138/5203/659 +f 4132/5205/655 4134/5490/655 4133/5202/655 +f 4131/5206/658 4135/5209/658 4136/5207/658 +f 4133/5202/652 4137/5204/652 4135/5209/652 +f 4141/5210/659 4142/5491/659 4146/5211/659 +f 4140/5213/655 4142/5492/655 4141/5210/655 +f 4139/5214/658 4143/5217/658 4144/5215/658 +f 4141/5210/652 4145/5212/652 4143/5217/652 +f 4149/5218/658 4150/5493/658 4154/5219/658 +f 4148/5221/653 4150/5494/653 4149/5218/653 +f 4147/5222/659 4151/5225/659 4152/5223/659 +f 4149/5218/652 4153/5220/652 4151/5225/652 +f 4157/5226/658 4158/5495/658 4162/5227/658 +f 4156/5229/653 4158/5496/653 4157/5226/653 +f 4155/5230/659 4159/5233/659 4160/5231/659 +f 4157/5226/652 4161/5228/652 4159/5233/652 +f 4165/5234/659 4166/5497/659 4170/5235/659 +f 4164/5237/654 4166/5498/654 4165/5234/654 +f 4163/5238/658 4167/5241/658 4168/5239/658 +f 4165/5234/655 4169/5236/655 4167/5241/655 +f 4173/5242/659 4174/5499/659 4178/5243/659 +f 4172/5245/654 4174/5500/654 4173/5242/654 +f 4171/5246/658 4175/5249/658 4176/5247/658 +f 4173/5242/655 4177/5244/655 4175/5249/655 +f 4182/5250/658 4186/5501/658 4185/5251/658 +f 4180/5253/652 4182/5502/652 4181/5252/652 +f 4179/5254/659 4183/5257/659 4184/5255/659 +f 4181/5252/655 4185/5251/655 4183/5257/655 +f 4190/5258/658 4194/5503/658 4193/5259/658 +f 4188/5261/652 4190/5504/652 4189/5260/652 +f 4187/5262/659 4191/5265/659 4192/5263/659 +f 4189/5260/655 4193/5259/655 4191/5265/655 +f 4197/5266/659 4198/5505/659 4202/5267/659 +f 4196/5269/652 4198/5506/652 4197/5266/652 +f 4195/5270/658 4199/5273/658 4200/5271/658 +f 4197/5266/653 4201/5268/653 4199/5273/653 +f 4205/5274/659 4206/5507/659 4210/5275/659 +f 4204/5277/652 4206/5508/652 4205/5274/652 +f 4203/5278/658 4207/5281/658 4208/5279/658 +f 4205/5274/653 4209/5276/653 4207/5281/653 +f 4214/5282/658 4218/5509/658 4217/5283/658 +f 4212/5285/654 4214/5510/654 4213/5284/654 +f 4211/5286/659 4215/5289/659 4216/5287/659 +f 4213/5284/653 4217/5283/653 4215/5289/653 +f 4222/5290/658 4226/5511/658 4225/5291/658 +f 4220/5293/654 4222/5512/654 4221/5292/654 +f 4219/5294/659 4223/5297/659 4224/5295/659 +f 4221/5292/653 4225/5291/653 4223/5297/653 +f 4227/5300/658 4228/5513/658 4229/5514/658 +f 4229/5514/658 4230/5515/658 4227/5300/658 +f 4230/5515/658 4231/5516/658 4227/5300/658 +f 4231/5516/658 4232/5517/658 4227/5300/658 +f 4232/5517/658 4233/5298/658 4227/5300/658 +f 4243/5303/658 4244/5518/658 4245/5519/658 +f 4245/5519/658 4246/5520/658 4243/5303/658 +f 4246/5520/658 4247/5521/658 4243/5303/658 +f 4247/5521/658 4248/5522/658 4243/5303/658 +f 4248/5522/658 4249/5301/658 4243/5303/658 +f 4259/5306/658 4260/5523/658 4261/5524/658 +f 4261/5524/658 4262/5525/658 4259/5306/658 +f 4262/5525/658 4263/5526/658 4259/5306/658 +f 4263/5526/658 4264/5527/658 4259/5306/658 +f 4264/5527/658 4265/5304/658 4259/5306/658 +f 3615/4859/659 3616/5528/659 3622/5307/659 s 1 -f 2668/5055/661 2653/5056/652 2660/5057/661 -f 2666/5058/670 2659/5059/655 2658/5060/670 -f 2664/5061/671 2657/5062/654 2656/5063/671 -f 2661/5064/660 2655/5065/653 2654/5066/660 -f 2667/5067/655 2660/5057/661 2659/5059/655 -f 2665/5068/654 2658/5060/670 2657/5069/654 -f 2663/5070/653 2656/5063/671 2655/5065/653 -f 2662/5071/652 2654/5066/660 2653/5056/652 -f 2683/5072/661 2698/5073/673 2682/5074/673 -f 2676/5075/674 2691/5076/671 2675/5077/671 -f 2684/5078/675 2699/5079/661 2683/5072/661 -f 2677/5080/654 2692/5081/674 2676/5075/674 -f 2670/5082/676 2685/5083/652 2669/5084/652 -f 2669/5084/652 2700/5085/675 2684/5078/675 -f 2678/5086/677 2693/5087/654 2677/5088/654 -f 2671/5089/660 2686/5090/676 2670/5082/676 -f 2679/5091/670 2694/5092/677 2678/5086/677 -f 2672/5093/678 2687/5094/660 2671/5089/660 -f 2680/5095/679 2695/5096/670 2679/5091/670 -f 2673/5097/653 2688/5098/678 2672/5093/678 -f 2681/5099/655 2696/5100/679 2680/5095/679 -f 2674/5101/680 2689/5102/653 2673/5097/653 -f 2682/5074/673 2697/5103/655 2681/5099/655 -f 2675/5077/671 2690/5104/680 2674/5101/680 -f 2765/5105/655 2798/5106/681 2766/5107/661 -f 2778/5108/671 2811/5109/682 2779/5110/654 -f 2753/5111/660 2791/5112/683 2759/5113/653 -f 2779/5110/654 2812/5114/684 2780/5115/670 -f 2768/5116/652 2793/5117/685 2761/5118/660 -f 2791/5112/683 2754/5119/671 2759/5113/653 -f 2780/5115/670 2813/5120/686 2781/5121/655 -f 2798/5106/681 2768/5122/652 2766/5107/661 -f 2754/5119/671 2787/5123/682 2755/5124/654 -f 2781/5121/655 2814/5125/681 2782/5126/661 -f 2769/5127/660 2807/5128/683 2775/5129/653 -f 2755/5124/654 2788/5130/684 2756/5131/670 -f 2784/5132/652 2809/5133/685 2777/5134/660 -f 2807/5128/683 2770/5135/671 2775/5129/653 -f 2756/5131/670 2789/5136/686 2757/5137/655 -f 2814/5125/681 2784/5138/652 2782/5126/661 -f 2770/5135/671 2803/5139/682 2771/5140/654 -f 2757/5137/655 2790/5141/681 2758/5142/661 -f 2771/5140/654 2804/5143/684 2772/5144/670 -f 2760/5145/652 2785/5146/685 2753/5111/660 -f 2772/5144/670 2805/5147/686 2773/5148/655 -f 2790/5141/681 2760/5149/652 2758/5142/661 -f 2773/5148/655 2806/5150/681 2774/5151/661 -f 2761/5118/660 2799/5152/683 2767/5153/653 -f 2776/5154/652 2801/5155/685 2769/5127/660 -f 2799/5152/683 2762/5156/671 2767/5153/653 -f 2806/5150/681 2776/5157/652 2774/5151/661 -f 2762/5156/671 2795/5158/682 2763/5159/654 -f 2777/5134/660 2815/5160/683 2783/5161/653 -f 2763/5159/654 2796/5162/684 2764/5163/670 -f 2815/5160/683 2778/5108/671 2783/5161/653 -f 2764/5163/670 2797/5164/686 2765/5105/655 -f 2796/5165/684 2828/5166/687 2797/5167/686 -f 2786/5168/688 2819/5169/689 2787/5123/682 -f 2799/5170/683 2825/5171/690 2794/5172/688 -f 2798/5173/681 2828/5166/687 2829/5174/691 -f 2788/5175/684 2819/5169/689 2820/5176/692 -f 2795/5158/682 2825/5171/690 2826/5177/689 -f 2785/5178/685 2823/5179/693 2791/5180/683 -f 2788/5175/684 2821/5181/687 2789/5182/686 -f 2796/5165/684 2826/5177/689 2827/5183/692 -f 2791/5180/683 2818/5184/690 2786/5168/688 -f 2793/5185/685 2830/5186/693 2799/5170/683 -f 2789/5182/686 2822/5187/691 2790/5188/681 -f 2824/5189/694 2844/5190/695 2830/5186/693 -f 2819/5169/689 2834/5191/696 2820/5176/692 -f 2828/5166/687 2841/5192/696 2842/5193/697 -f 2817/5194/694 2837/5195/695 2823/5179/693 -f 2830/5186/693 2839/5196/698 2825/5171/690 -f 2821/5181/687 2834/5191/696 2835/5197/697 -f 2829/5174/691 2842/5193/697 2843/5198/699 -f 2823/5179/693 2832/5199/698 2818/5184/690 -f 2825/5171/690 2840/5200/700 2826/5177/689 -f 2822/5187/691 2835/5197/697 2836/5201/699 -f 2819/5169/689 2832/5199/698 2833/5202/700 -f 2826/5177/689 2841/5192/696 2827/5183/692 -f 2814/5203/681 2856/5204/687 2857/5205/691 -f 2804/5206/684 2847/5207/689 2848/5208/692 -f 2810/5209/688 2854/5210/689 2811/5109/682 -f 2807/5211/683 2845/5212/694 2851/5213/693 -f 2805/5214/686 2848/5208/692 2849/5215/687 -f 2811/5109/682 2855/5216/692 2812/5217/684 -f 2807/5211/683 2846/5218/690 2802/5219/688 -f 2815/5220/683 2852/5221/694 2858/5222/693 -f 2805/5214/686 2850/5223/691 2806/5224/681 -f 2813/5225/686 2855/5216/692 2856/5204/687 -f 2802/5219/688 2847/5207/689 2803/5139/682 -f 2815/5220/683 2853/5226/690 2810/5209/688 -f 2850/5223/691 2863/5227/697 2864/5228/699 -f 2847/5207/689 2860/5229/698 2861/5230/700 -f 2854/5210/689 2869/5231/696 2855/5216/692 -f 2852/5221/694 2872/5232/695 2858/5222/693 -f 2847/5207/689 2862/5233/696 2848/5208/692 -f 2855/5216/692 2870/5234/697 2856/5204/687 -f 2845/5212/694 2865/5235/695 2851/5213/693 -f 2858/5222/693 2867/5236/698 2853/5226/690 -f 2848/5208/692 2863/5227/697 2849/5215/687 -f 2856/5204/687 2871/5237/699 2857/5205/691 -f 2846/5218/690 2865/5235/695 2860/5229/698 -f 2854/5210/689 2867/5236/698 2868/5238/700 -f 2809/5239/685 2816/5240/656 2852/5221/694 -f 2852/5221/694 2816/5240/656 2866/5241/701 -f 2814/5203/681 2857/5205/691 2816/5242/656 -f 2857/5205/691 2871/5237/699 2816/5242/656 -f 2801/5243/685 2808/5244/656 2845/5212/694 -f 2845/5212/694 2808/5244/656 2859/5245/701 -f 2806/5224/681 2850/5223/691 2808/5246/656 -f 2850/5223/691 2864/5228/699 2808/5246/656 -f 2793/5185/685 2800/5247/656 2824/5189/694 -f 2824/5189/694 2800/5247/656 2838/5248/701 -f 2798/5173/681 2829/5174/691 2800/5249/656 -f 2829/5174/691 2843/5198/699 2800/5249/656 -f 2785/5178/685 2792/5250/656 2817/5194/694 -f 2817/5194/694 2792/5250/656 2831/5251/701 -f 2790/5188/681 2822/5187/691 2792/5252/656 -f 2822/5187/691 2836/5201/699 2792/5252/656 -f 2842/5253/697 2889/5254/702 2843/5255/699 -f 2859/5256/701 2897/5257/653 2865/5258/695 -f 2866/5259/701 2876/5260/703 2898/5261/704 -f 2836/5262/699 2873/5263/658 2792/5264/656 -f 2865/5258/695 2892/5265/663 2860/5266/698 -f 2831/5267/701 2883/5268/653 2837/5269/695 -f 2861/5230/700 2892/5265/663 2893/5270/659 -f 2871/5271/699 2876/5272/703 2816/5273/656 -f 2837/5269/695 2878/5274/663 2832/5275/698 -f 2861/5230/700 2894/5276/665 2862/5277/696 -f 2832/5275/698 2879/5278/659 2833/5202/700 -f 2862/5277/696 2895/5279/655 2863/5280/697 -f 2859/5256/701 2875/5281/658 2891/5282/664 -f 2833/5202/700 2880/5283/665 2834/5284/696 -f 2864/5285/699 2895/5279/655 2896/5286/662 -f 2834/5284/696 2881/5287/655 2835/5288/697 -f 2866/5259/701 2904/5289/705 2872/5290/695 -f 2864/5285/699 2875/5291/658 2808/5292/656 -f 2836/5262/699 2881/5287/655 2882/5293/662 -f 2872/5290/695 2899/5294/706 2867/5295/698 -f 2838/5296/701 2890/5297/705 2844/5298/695 -f 2868/5238/700 2899/5294/706 2900/5299/707 -f 2800/5300/656 2884/5301/704 2838/5296/701 -f 2844/5298/695 2885/5302/706 2839/5303/698 -f 2868/5238/700 2901/5304/708 2869/5305/696 -f 2839/5303/698 2886/5306/707 2840/5200/700 -f 2869/5305/696 2902/5307/670 2870/5308/697 -f 2843/5255/699 2874/5309/703 2800/5310/656 -f 2840/5200/700 2887/5311/708 2841/5312/696 -f 2871/5271/699 2902/5307/670 2903/5313/702 -f 2841/5312/696 2888/5314/670 2842/5253/697 -f 2792/5315/656 2877/5316/664 2831/5267/701 -f 2874/5317/703 2911/5318/709 2905/5319/710 -f 2904/5289/705 2914/5320/711 2899/5321/706 -f 2886/5322/707 2910/5323/712 2887/5324/708 -f 2890/5297/705 2907/5325/713 2912/5326/660 -f 2900/5327/707 2914/5320/711 2915/5328/714 -f 2890/5297/705 2908/5329/711 2885/5330/706 -f 2898/5331/704 2906/5332/710 2913/5333/713 -f 2900/5327/707 2916/5334/712 2901/5335/708 -f 2874/5336/703 2907/5325/713 2884/5337/704 -f 2898/5331/704 2918/5338/660 2904/5289/705 -f 2876/5339/703 2917/5340/709 2906/5341/710 -f 2885/5330/706 2909/5342/714 2886/5322/707 -f 2909/5342/714 2922/5343/715 2923/5344/716 -f 2917/5340/709 2920/5345/717 2906/5341/710 -f 2915/5328/714 2928/5346/715 2929/5347/716 -f 2910/5323/712 2923/5344/716 2924/5348/718 -f 2907/5325/713 2919/5349/717 2921/5350/719 -f 2907/5325/713 2926/5351/720 2912/5326/660 -f 2916/5334/712 2929/5347/716 2930/5352/718 -f 2913/5333/713 2932/5353/720 2918/5338/660 -f 2911/5318/709 2919/5354/717 2905/5319/710 -f 2908/5329/711 2926/5351/720 2922/5343/715 -f 2906/5332/710 2927/5355/719 2913/5333/713 -f 2918/5338/660 2928/5346/715 2914/5320/711 -f 2889/5356/702 2888/5357/670 2911/5318/709 -f 2911/5318/709 2888/5357/670 2925/5358/721 -f 2887/5324/708 2910/5323/712 2888/5357/670 -f 2910/5323/712 2924/5348/718 2888/5357/670 -f 2901/5335/708 2916/5334/712 2902/5359/670 -f 2916/5334/712 2930/5352/718 2902/5359/670 -f 2903/5360/702 2902/5359/670 2917/5340/709 -f 2917/5340/709 2902/5359/670 2931/5361/721 -f 2927/5362/719 2948/5363/652 2932/5353/720 -f 2888/5364/670 2941/5365/657 2925/5366/721 -f 2932/5353/720 2944/5367/672 2928/5368/715 -f 2929/5369/716 2944/5367/672 2945/5370/659 -f 2924/5371/718 2933/5372/654 2888/5364/670 -f 2929/5369/716 2946/5373/689 2930/5374/718 -f 2921/5375/719 2942/5376/652 2926/5351/720 -f 2920/5377/717 2943/5378/656 2927/5362/719 -f 2926/5351/720 2938/5379/672 2922/5380/715 -f 2930/5374/718 2934/5381/654 2902/5382/670 -f 2931/5383/721 2936/5384/658 2920/5385/717 -f 2922/5380/715 2939/5386/659 2923/5387/716 -f 2919/5388/717 2937/5389/656 2921/5375/719 -f 2923/5387/716 2940/5390/689 2924/5371/718 -f 2902/5382/670 2947/5391/657 2931/5383/721 -f 2925/5366/721 2935/5392/658 2919/5393/717 -f 3243/5394/722 3249/5395/664 3242/5396/664 -f 3241/5397/653 3247/5398/663 3240/5399/663 -f 3245/5400/665 3251/5401/723 3244/5402/723 -f 3242/5396/664 3248/5403/653 3241/5397/653 -f 3240/5399/663 3246/5404/659 3239/5405/659 -f 3239/5406/659 3252/5407/665 3245/5400/665 -f 3257/5408/722 3261/5409/664 3256/5410/664 -f 3255/5411/653 3259/5412/663 3254/5413/663 -f 3256/5410/664 3260/5414/653 3255/5411/653 -f 3254/5413/663 3258/5415/724 3253/5416/724 -f 3267/5417/722 3271/5418/664 3266/5419/664 -f 3265/5420/653 3269/5421/663 3264/5422/663 -f 3266/5419/664 3270/5423/653 3265/5420/653 -f 3264/5422/663 3268/5424/724 3263/5425/724 -f 3277/5426/722 3281/5427/664 3276/5428/664 -f 3275/5429/653 3279/5430/663 3274/5431/663 -f 3276/5428/664 3280/5432/653 3275/5429/653 -f 3274/5431/663 3278/5433/724 3273/5434/724 -f 3287/5435/722 3291/5436/664 3286/5437/664 -f 3285/5438/653 3289/5439/663 3284/5440/663 -f 3286/5437/664 3290/5441/653 3285/5438/653 -f 3284/5440/663 3288/5442/724 3283/5443/724 -f 3299/5444/725 3305/5445/662 3298/5446/662 -f 3297/5447/658 3303/5448/664 3296/5449/664 -f 3295/5450/653 3301/5451/663 3294/5452/663 -f 3298/5446/662 3304/5453/658 3297/5447/658 -f 3296/5449/664 3302/5454/653 3295/5450/653 -f 3294/5452/663 3300/5455/724 3293/5456/724 -f 3312/5457/655 3318/5458/662 3311/5459/662 -f 3309/5460/726 3315/5461/663 3308/5462/663 -f 3313/5463/665 3319/5464/655 3312/5457/655 -f 3311/5459/662 3317/5465/727 3310/5466/727 -f 3308/5462/663 3314/5467/659 3307/5468/659 -f 3307/5469/659 3320/5470/665 3313/5463/665 -f 3324/5471/655 3328/5472/662 3323/5473/662 -f 3325/5474/665 3329/5475/655 3324/5471/655 -f 3323/5473/662 3327/5476/727 3322/5477/727 -f 3321/5478/728 3330/5479/665 3325/5474/665 -f 3334/5480/655 3338/5481/662 3333/5482/662 -f 3335/5483/665 3339/5484/655 3334/5480/655 -f 3333/5482/662 3337/5485/727 3332/5486/727 -f 3331/5487/728 3340/5488/665 3335/5483/665 -f 3344/5489/655 3348/5490/662 3343/5491/662 -f 3345/5492/665 3349/5493/655 3344/5489/655 -f 3343/5491/662 3347/5494/727 3342/5495/727 -f 3341/5496/728 3350/5497/665 3345/5492/665 -f 3354/5498/655 3358/5499/662 3353/5500/662 -f 3355/5501/665 3359/5502/655 3354/5498/655 -f 3353/5500/662 3357/5503/727 3352/5504/727 -f 3351/5505/728 3360/5506/665 3355/5501/665 -f 3366/5507/655 3372/5508/662 3365/5509/662 -f 3364/5510/658 3370/5511/664 3363/5512/664 -f 3367/5513/665 3373/5514/655 3366/5507/655 -f 3365/5509/662 3371/5515/658 3364/5510/658 -f 3363/5512/664 3369/5516/729 3362/5517/729 -f 3361/5518/728 3374/5519/665 3367/5513/665 -f 3377/5520/726 3381/5521/663 3376/5522/663 -f 3379/5523/665 3383/5524/723 3378/5525/723 -f 3376/5522/663 3380/5526/659 3375/5527/659 -f 3375/5528/659 3384/5529/665 3379/5523/665 -f 3389/5530/725 3393/5531/662 3388/5532/662 -f 3387/5533/658 3391/5534/664 3386/5535/664 -f 3388/5532/662 3392/5536/658 3387/5533/658 -f 3386/5535/664 3390/5537/729 3385/5538/729 -f 3397/5539/726 3401/5540/663 3396/5541/663 -f 3399/5542/665 3403/5543/723 3398/5544/723 -f 3396/5541/663 3400/5545/659 3395/5546/659 -f 3395/5547/659 3404/5548/665 3399/5542/665 -f 3409/5549/725 3413/5550/662 3408/5551/662 -f 3407/5552/658 3411/5553/664 3406/5554/664 -f 3408/5551/662 3412/5555/658 3407/5552/658 -f 3406/5554/664 3410/5556/729 3405/5557/729 -f 3417/5558/726 3421/5559/663 3416/5560/663 -f 3419/5561/665 3423/5562/723 3418/5563/723 -f 3416/5560/663 3420/5564/659 3415/5565/659 -f 3415/5566/659 3424/5567/665 3419/5561/665 -f 3429/5568/725 3433/5569/662 3428/5570/662 -f 3427/5571/658 3431/5572/664 3426/5573/664 -f 3428/5570/662 3432/5574/658 3427/5571/658 -f 3426/5573/664 3430/5575/729 3425/5576/729 -f 3437/5577/726 3441/5578/663 3436/5579/663 -f 3439/5580/665 3443/5581/723 3438/5582/723 -f 3436/5579/663 3440/5583/659 3435/5584/659 -f 3435/5585/659 3444/5586/665 3439/5580/665 -f 3449/5587/725 3453/5588/662 3448/5589/662 -f 3447/5590/658 3451/5591/664 3446/5592/664 -f 3448/5589/662 3452/5593/658 3447/5590/658 -f 3446/5592/664 3450/5594/729 3445/5595/729 -f 3645/5596/661 3660/5597/673 3644/5598/673 -f 3638/5599/674 3653/5600/671 3637/5601/671 -f 3646/5602/675 3661/5603/661 3645/5596/661 -f 3639/5604/654 3654/5605/674 3638/5599/674 -f 3632/5606/676 3647/5607/652 3631/5608/652 -f 3631/5608/652 3662/5609/675 3646/5602/675 -f 3640/5610/677 3655/5611/654 3639/5612/654 -f 3633/5613/660 3648/5614/676 3632/5606/676 -f 3641/5615/670 3656/5616/677 3640/5610/677 -f 3634/5617/678 3649/5618/660 3633/5613/660 -f 3642/5619/679 3657/5620/670 3641/5615/670 -f 3635/5621/653 3650/5622/678 3634/5617/678 -f 3643/5623/655 3658/5624/679 3642/5619/679 -f 3636/5625/680 3651/5626/653 3635/5621/653 -f 3644/5598/673 3659/5627/655 3643/5623/655 -f 3637/5601/671 3652/5628/680 3636/5625/680 -f 3826/5629/661 3811/5630/652 3818/5631/661 -f 3824/5632/670 3817/5633/655 3816/5634/670 -f 3822/5635/671 3815/5636/654 3814/5637/671 -f 3819/5638/660 3813/5639/653 3812/5640/660 -f 3825/5641/655 3818/5631/661 3817/5633/655 -f 3823/5642/654 3816/5634/670 3815/5643/654 -f 3821/5644/653 3814/5637/671 3813/5639/653 -f 3820/5645/652 3812/5640/660 3811/5630/652 -f 3842/5646/661 3827/5647/652 3834/5648/661 -f 3840/5649/670 3833/5650/655 3832/5651/670 -f 3838/5652/671 3831/5653/654 3830/5654/671 -f 3835/5655/660 3829/5656/653 3828/5657/660 -f 3841/5658/655 3834/5648/661 3833/5650/655 -f 3839/5659/654 3832/5651/670 3831/5660/654 -f 3837/5661/653 3830/5654/671 3829/5656/653 -f 3836/5662/652 3828/5657/660 3827/5647/652 -f 3858/5663/661 3843/5664/652 3850/5665/661 -f 3856/5666/670 3849/5667/655 3848/5668/670 -f 3854/5669/671 3847/5670/654 3846/5671/671 -f 3851/5672/660 3845/5673/653 3844/5674/660 -f 3857/5675/655 3850/5665/661 3849/5667/655 -f 3855/5676/654 3848/5668/670 3847/5677/654 -f 3853/5678/653 3846/5671/671 3845/5673/653 -f 3852/5679/652 3844/5674/660 3843/5664/652 -f 3904/5680/685 3871/5681/653 3872/5682/660 -f 3917/5683/682 3884/5684/670 3885/5685/654 -f 3897/5686/686 3859/5687/661 3865/5688/655 -f 3918/5689/688 3885/5685/654 3886/5690/671 -f 3899/5691/681 3874/5692/652 3867/5693/661 -f 3860/5694/670 3897/5686/686 3865/5688/655 -f 3919/5695/683 3886/5690/671 3887/5696/653 -f 3874/5697/652 3904/5680/685 3872/5682/660 -f 3893/5698/682 3860/5694/670 3861/5699/654 -f 3920/5700/685 3887/5696/653 3888/5701/660 -f 3913/5702/686 3875/5703/661 3881/5704/655 -f 3894/5705/688 3861/5699/654 3862/5706/671 -f 3915/5707/681 3890/5708/652 3883/5709/661 -f 3876/5710/670 3913/5702/686 3881/5704/655 -f 3895/5711/683 3862/5706/671 3863/5712/653 -f 3890/5713/652 3920/5700/685 3888/5701/660 -f 3909/5714/682 3876/5710/670 3877/5715/654 -f 3896/5716/685 3863/5712/653 3864/5717/660 -f 3910/5718/688 3877/5715/654 3878/5719/671 -f 3891/5720/681 3866/5721/652 3859/5687/661 -f 3911/5722/683 3878/5719/671 3879/5723/653 -f 3866/5724/652 3896/5716/685 3864/5717/660 -f 3912/5725/685 3879/5723/653 3880/5726/660 -f 3905/5727/686 3867/5693/661 3873/5728/655 -f 3907/5729/681 3882/5730/652 3875/5703/661 -f 3868/5731/670 3905/5727/686 3873/5728/655 -f 3882/5732/652 3912/5725/685 3880/5726/660 -f 3901/5733/682 3868/5731/670 3869/5734/654 -f 3921/5735/686 3883/5709/661 3889/5736/655 -f 3902/5737/688 3869/5734/654 3870/5738/671 -f 3884/5684/670 3921/5735/686 3889/5736/655 -f 3903/5739/683 3870/5738/671 3871/5681/653 -f 3903/5740/683 3933/5741/690 3902/5742/688 -f 3925/5743/689 3892/5744/684 3893/5698/682 -f 3900/5745/684 3936/5746/687 3905/5747/686 -f 3935/5748/694 3903/5740/683 3904/5749/685 -f 3894/5750/688 3925/5743/689 3893/5698/682 -f 3932/5751/689 3900/5745/684 3901/5733/682 -f 3897/5752/686 3923/5753/691 3891/5754/681 -f 3895/5755/683 3926/5756/690 3894/5750/688 -f 3902/5742/688 3932/5751/689 3901/5733/682 -f 3924/5757/692 3897/5752/686 3892/5744/684 -f 3905/5747/686 3930/5758/691 3899/5759/681 -f 3928/5760/694 3895/5755/683 3896/5761/685 -f 3950/5762/697 3930/5758/691 3936/5746/687 -f 3940/5763/698 3925/5743/689 3926/5756/690 -f 3934/5764/693 3947/5765/698 3933/5741/690 -f 3943/5766/697 3923/5753/691 3929/5767/687 -f 3945/5768/696 3936/5746/687 3931/5769/692 -f 3927/5770/693 3940/5763/698 3926/5756/690 -f 3935/5748/694 3948/5771/695 3934/5764/693 -f 3938/5772/696 3929/5767/687 3924/5757/692 -f 3932/5751/689 3945/5768/696 3931/5769/692 -f 3928/5760/694 3941/5773/695 3927/5770/693 -f 3925/5743/689 3938/5772/696 3924/5757/692 -f 3947/5765/698 3932/5751/689 3933/5741/690 -f 3963/5774/694 3919/5775/683 3920/5776/685 -f 3954/5777/690 3909/5714/682 3910/5778/688 -f 3960/5779/689 3916/5780/684 3917/5683/682 -f 3913/5781/686 3951/5782/691 3907/5783/681 -f 3911/5784/683 3954/5777/690 3910/5778/688 -f 3961/5785/690 3917/5683/682 3918/5786/688 -f 3952/5787/692 3913/5781/686 3908/5788/684 -f 3921/5789/686 3958/5790/691 3915/5791/681 -f 3956/5792/694 3911/5784/683 3912/5793/685 -f 3919/5775/683 3961/5785/690 3918/5786/688 -f 3953/5794/689 3908/5788/684 3909/5714/682 -f 3916/5780/684 3964/5795/687 3921/5789/686 -f 3956/5792/694 3969/5796/695 3955/5797/693 -f 3953/5794/689 3966/5798/696 3952/5787/692 -f 3975/5799/698 3960/5779/689 3961/5785/690 -f 3978/5800/697 3958/5790/691 3964/5795/687 -f 3968/5801/698 3953/5794/689 3954/5777/690 -f 3962/5802/693 3975/5799/698 3961/5785/690 -f 3971/5803/697 3951/5782/691 3957/5804/687 -f 3973/5805/696 3964/5795/687 3959/5806/692 -f 3955/5797/693 3968/5801/698 3954/5777/690 -f 3963/5774/694 3976/5807/695 3962/5802/693 -f 3966/5798/696 3957/5804/687 3952/5787/692 -f 3960/5779/689 3973/5805/696 3959/5806/692 -f 3915/5791/681 3958/5790/691 3922/5808/656 -f 3958/5790/691 3972/5809/699 3922/5808/656 -f 3920/5776/685 3922/5810/656 3963/5774/694 -f 3963/5774/694 3922/5810/656 3977/5811/701 -f 3907/5783/681 3951/5782/691 3914/5812/656 -f 3951/5782/691 3965/5813/699 3914/5812/656 -f 3912/5793/685 3914/5814/656 3956/5792/694 -f 3956/5792/694 3914/5814/656 3970/5815/701 -f 3899/5759/681 3930/5758/691 3906/5816/656 -f 3930/5758/691 3944/5817/699 3906/5816/656 -f 3904/5749/685 3906/5818/656 3935/5748/694 -f 3935/5748/694 3906/5818/656 3949/5819/701 -f 3891/5754/681 3923/5753/691 3898/5820/656 -f 3923/5753/691 3937/5821/699 3898/5820/656 -f 3896/5761/685 3898/5822/656 3928/5760/694 -f 3928/5760/694 3898/5822/656 3942/5823/701 -f 3995/5824/730 3948/5825/695 3949/5826/701 -f 4003/5827/655 3965/5828/699 3971/5829/697 -f 3972/5830/699 3982/5831/731 3922/5832/656 -f 3979/5833/658 3942/5834/701 3898/5835/656 -f 3998/5836/665 3971/5829/697 3966/5837/696 -f 3989/5838/655 3937/5839/699 3943/5840/697 -f 3967/5841/700 3998/5836/665 3966/5837/696 -f 3982/5842/731 3977/5843/701 3922/5844/656 -f 3984/5845/665 3943/5840/697 3938/5846/696 -f 4000/5847/663 3967/5841/700 3968/5848/698 -f 3985/5849/659 3938/5846/696 3939/5850/700 -f 4001/5851/653 3968/5848/698 3969/5852/695 -f 3965/5828/699 3981/5853/658 3914/5854/656 -f 3986/5855/663 3939/5850/700 3940/5856/698 -f 3970/5857/701 4001/5851/653 3969/5852/695 -f 3987/5858/653 3940/5856/698 3941/5859/695 -f 4010/5860/732 3972/5830/699 3978/5861/697 -f 3981/5862/658 3970/5857/701 3914/5863/656 -f 3988/5864/664 3941/5859/695 3942/5834/701 -f 4005/5865/733 3978/5861/697 3973/5866/696 -f 3996/5867/732 3944/5868/699 3950/5869/697 -f 3974/5870/700 4005/5865/733 3973/5866/696 -f 3990/5871/734 3906/5872/656 3944/5868/699 -f 3991/5873/733 3950/5869/697 3945/5874/696 -f 4007/5875/735 3974/5870/700 3975/5876/698 -f 3992/5877/736 3945/5874/696 3946/5878/700 -f 4008/5879/671 3975/5876/698 3976/5880/695 -f 3980/5881/731 3949/5826/701 3906/5882/656 -f 3993/5883/735 3946/5878/700 3947/5884/698 -f 3977/5843/701 4008/5879/671 3976/5880/695 -f 3994/5885/671 3947/5884/698 3948/5825/695 -f 3983/5886/662 3898/5887/656 3937/5839/699 -f 3980/5888/731 4017/5889/737 3995/5890/730 -f 4020/5891/738 4010/5860/732 4005/5892/733 -f 4016/5893/739 3992/5894/736 3993/5895/735 -f 3996/5867/732 4013/5896/740 3990/5897/734 -f 4006/5898/736 4020/5891/738 4005/5892/733 -f 4014/5899/738 3996/5867/732 3991/5900/733 -f 4004/5901/734 4012/5902/741 3982/5903/731 -f 4022/5904/739 4006/5898/736 4007/5905/735 -f 4013/5896/740 3980/5906/731 3990/5897/734 -f 4024/5907/661 4004/5901/734 4010/5860/732 -f 3982/5908/731 4023/5909/737 4009/5910/730 -f 4015/5911/742 3991/5900/733 3992/5894/736 -f 4029/5912/743 4014/5899/738 4015/5911/742 -f 4026/5913/744 4023/5909/737 4012/5914/741 -f 4021/5915/742 4034/5916/745 4020/5891/738 -f 4016/5893/739 4029/5912/743 4015/5911/742 -f 4013/5896/740 4025/5917/744 4011/5918/741 -f 4032/5919/746 4013/5896/740 4018/5920/661 -f 4036/5921/747 4021/5915/742 4022/5904/739 -f 4038/5922/746 4019/5923/740 4024/5907/661 -f 4025/5924/744 4017/5889/737 4011/5925/741 -f 4014/5899/738 4032/5919/746 4018/5920/661 -f 4033/5926/748 4012/5902/741 4019/5923/740 -f 4034/5916/745 4024/5907/661 4020/5891/738 -f 3995/5890/730 4017/5889/737 3994/5927/671 -f 4017/5889/737 4031/5928/749 3994/5927/671 -f 3993/5895/735 3994/5927/671 4016/5893/739 -f 4016/5893/739 3994/5927/671 4030/5929/747 -f 4007/5905/735 4008/5930/671 4022/5904/739 -f 4022/5904/739 4008/5930/671 4036/5921/747 -f 4009/5910/730 4023/5909/737 4008/5930/671 -f 4023/5909/737 4037/5931/749 4008/5930/671 -f 4054/5932/652 4033/5933/748 4038/5922/746 -f 4047/5934/657 3994/5935/671 4031/5936/749 -f 4050/5937/672 4038/5922/746 4034/5938/745 -f 4035/5939/743 4050/5937/672 4034/5938/745 -f 4039/5940/654 4030/5941/747 3994/5935/671 -f 4052/5942/689 4035/5939/743 4036/5943/747 -f 4048/5944/652 4027/5945/748 4032/5919/746 -f 4049/5946/656 4026/5947/744 4033/5933/748 -f 4044/5948/672 4032/5919/746 4028/5949/745 -f 4040/5950/654 4036/5943/747 4008/5951/671 -f 4042/5952/658 4037/5953/749 4026/5954/744 -f 4045/5955/659 4028/5949/745 4029/5956/743 -f 4043/5957/656 4025/5958/744 4027/5945/748 -f 4046/5959/689 4029/5956/743 4030/5941/747 -f 4053/5960/657 4008/5951/671 4037/5953/749 -f 4041/5961/658 4031/5936/749 4025/5962/744 -f 2668/5055/661 2662/5071/652 2653/5056/652 -f 2666/5058/670 2667/5067/655 2659/5059/655 -f 2664/5061/671 2665/5963/654 2657/5062/654 -f 2661/5064/660 2663/5070/653 2655/5065/653 -f 2667/5067/655 2668/5055/661 2660/5057/661 -f 2665/5068/654 2666/5058/670 2658/5060/670 -f 2663/5070/653 2664/5061/671 2656/5063/671 -f 2662/5071/652 2661/5064/660 2654/5066/660 -f 2683/5072/661 2699/5079/661 2698/5073/673 -f 2676/5075/674 2692/5081/674 2691/5076/671 -f 2684/5078/675 2700/5085/675 2699/5079/661 -f 2677/5080/654 2693/5964/654 2692/5081/674 -f 2670/5082/676 2686/5090/676 2685/5083/652 -f 2669/5084/652 2685/5083/652 2700/5085/675 -f 2678/5086/677 2694/5092/677 2693/5087/654 -f 2671/5089/660 2687/5094/660 2686/5090/676 -f 2679/5091/670 2695/5096/670 2694/5092/677 -f 2672/5093/678 2688/5098/678 2687/5094/660 -f 2680/5095/679 2696/5100/679 2695/5096/670 -f 2673/5097/653 2689/5102/653 2688/5098/678 -f 2681/5099/655 2697/5103/655 2696/5100/679 -f 2674/5101/680 2690/5104/680 2689/5102/653 -f 2682/5074/673 2698/5073/673 2697/5103/655 -f 2675/5077/671 2691/5076/671 2690/5104/680 -f 2765/5105/655 2797/5164/686 2798/5106/681 -f 2778/5108/671 2810/5965/688 2811/5109/682 -f 2753/5111/660 2785/5146/685 2791/5112/683 -f 2779/5110/654 2811/5109/682 2812/5114/684 -f 2768/5116/652 2800/5966/656 2793/5117/685 -f 2791/5112/683 2786/5967/688 2754/5119/671 -f 2780/5115/670 2812/5114/684 2813/5120/686 -f 2798/5106/681 2800/5968/656 2768/5122/652 -f 2754/5119/671 2786/5967/688 2787/5123/682 -f 2781/5121/655 2813/5120/686 2814/5125/681 -f 2769/5127/660 2801/5155/685 2807/5128/683 -f 2755/5124/654 2787/5123/682 2788/5130/684 -f 2784/5132/652 2816/5969/656 2809/5133/685 -f 2807/5128/683 2802/5970/688 2770/5135/671 -f 2756/5131/670 2788/5130/684 2789/5136/686 -f 2814/5125/681 2816/5971/656 2784/5138/652 -f 2770/5135/671 2802/5970/688 2803/5139/682 -f 2757/5137/655 2789/5136/686 2790/5141/681 -f 2771/5140/654 2803/5139/682 2804/5143/684 -f 2760/5145/652 2792/5972/656 2785/5146/685 -f 2772/5144/670 2804/5143/684 2805/5147/686 -f 2790/5141/681 2792/5973/656 2760/5149/652 -f 2773/5148/655 2805/5147/686 2806/5150/681 -f 2761/5118/660 2793/5117/685 2799/5152/683 -f 2776/5154/652 2808/5974/656 2801/5155/685 -f 2799/5152/683 2794/5975/688 2762/5156/671 -f 2806/5150/681 2808/5976/656 2776/5157/652 -f 2762/5156/671 2794/5975/688 2795/5158/682 -f 2777/5134/660 2809/5133/685 2815/5160/683 -f 2763/5159/654 2795/5158/682 2796/5162/684 -f 2815/5160/683 2810/5965/688 2778/5108/671 -f 2764/5163/670 2796/5162/684 2797/5164/686 -f 2796/5165/684 2827/5183/692 2828/5166/687 -f 2786/5168/688 2818/5184/690 2819/5169/689 -f 2799/5170/683 2830/5186/693 2825/5171/690 -f 2798/5173/681 2797/5167/686 2828/5166/687 -f 2788/5175/684 2787/5123/682 2819/5169/689 -f 2795/5158/682 2794/5172/688 2825/5171/690 -f 2785/5178/685 2817/5194/694 2823/5179/693 -f 2788/5175/684 2820/5176/692 2821/5181/687 -f 2796/5165/684 2795/5158/682 2826/5177/689 -f 2791/5180/683 2823/5179/693 2818/5184/690 -f 2793/5185/685 2824/5189/694 2830/5186/693 -f 2789/5182/686 2821/5181/687 2822/5187/691 -f 2824/5189/694 2838/5248/701 2844/5190/695 -f 2819/5169/689 2833/5202/700 2834/5191/696 -f 2828/5166/687 2827/5183/692 2841/5192/696 -f 2817/5194/694 2831/5251/701 2837/5195/695 -f 2830/5186/693 2844/5190/695 2839/5196/698 -f 2821/5181/687 2820/5176/692 2834/5191/696 -f 2829/5174/691 2828/5166/687 2842/5193/697 -f 2823/5179/693 2837/5195/695 2832/5199/698 -f 2825/5171/690 2839/5196/698 2840/5200/700 -f 2822/5187/691 2821/5181/687 2835/5197/697 -f 2819/5169/689 2818/5184/690 2832/5199/698 -f 2826/5177/689 2840/5200/700 2841/5192/696 -f 2814/5203/681 2813/5225/686 2856/5204/687 -f 2804/5206/684 2803/5139/682 2847/5207/689 -f 2810/5209/688 2853/5226/690 2854/5210/689 -f 2807/5211/683 2801/5243/685 2845/5212/694 -f 2805/5214/686 2804/5206/684 2848/5208/692 -f 2811/5109/682 2854/5210/689 2855/5216/692 -f 2807/5211/683 2851/5213/693 2846/5218/690 -f 2815/5220/683 2809/5239/685 2852/5221/694 -f 2805/5214/686 2849/5215/687 2850/5223/691 -f 2813/5225/686 2812/5217/684 2855/5216/692 -f 2802/5219/688 2846/5218/690 2847/5207/689 -f 2815/5220/683 2858/5222/693 2853/5226/690 -f 2850/5223/691 2849/5215/687 2863/5227/697 -f 2847/5207/689 2846/5218/690 2860/5229/698 -f 2854/5210/689 2868/5238/700 2869/5231/696 -f 2852/5221/694 2866/5241/701 2872/5232/695 -f 2847/5207/689 2861/5230/700 2862/5233/696 -f 2855/5216/692 2869/5231/696 2870/5234/697 -f 2845/5212/694 2859/5245/701 2865/5235/695 -f 2858/5222/693 2872/5232/695 2867/5236/698 -f 2848/5208/692 2862/5233/696 2863/5227/697 -f 2856/5204/687 2870/5234/697 2871/5237/699 -f 2846/5218/690 2851/5213/693 2865/5235/695 -f 2854/5210/689 2853/5226/690 2867/5236/698 -f 2842/5253/697 2888/5314/670 2889/5254/702 -f 2859/5256/701 2891/5282/664 2897/5257/653 -f 2866/5259/701 2816/5977/656 2876/5260/703 -f 2836/5262/699 2882/5293/662 2873/5263/658 -f 2865/5258/695 2897/5257/653 2892/5265/663 -f 2831/5267/701 2877/5316/664 2883/5268/653 -f 2861/5230/700 2860/5266/698 2892/5265/663 -f 2871/5271/699 2903/5313/702 2876/5272/703 -f 2837/5269/695 2883/5268/653 2878/5274/663 -f 2861/5230/700 2893/5270/659 2894/5276/665 -f 2832/5275/698 2878/5274/663 2879/5278/659 -f 2862/5277/696 2894/5276/665 2895/5279/655 -f 2859/5256/701 2808/5978/656 2875/5281/658 -f 2833/5202/700 2879/5278/659 2880/5283/665 -f 2864/5285/699 2863/5280/697 2895/5279/655 -f 2834/5284/696 2880/5283/665 2881/5287/655 -f 2866/5259/701 2898/5261/704 2904/5289/705 -f 2864/5285/699 2896/5286/662 2875/5291/658 -f 2836/5262/699 2835/5288/697 2881/5287/655 -f 2872/5290/695 2904/5289/705 2899/5294/706 -f 2838/5296/701 2884/5301/704 2890/5297/705 -f 2868/5238/700 2867/5295/698 2899/5294/706 -f 2800/5300/656 2874/5979/703 2884/5301/704 -f 2844/5298/695 2890/5297/705 2885/5302/706 -f 2868/5238/700 2900/5299/707 2901/5304/708 -f 2839/5303/698 2885/5302/706 2886/5306/707 -f 2869/5305/696 2901/5304/708 2902/5307/670 -f 2843/5255/699 2889/5254/702 2874/5309/703 -f 2840/5200/700 2886/5306/707 2887/5311/708 -f 2871/5271/699 2870/5308/697 2902/5307/670 -f 2841/5312/696 2887/5311/708 2888/5314/670 -f 2792/5315/656 2873/5980/658 2877/5316/664 -f 2874/5317/703 2889/5356/702 2911/5318/709 -f 2904/5289/705 2918/5338/660 2914/5320/711 -f 2886/5322/707 2909/5342/714 2910/5323/712 -f 2890/5297/705 2884/5337/704 2907/5325/713 -f 2900/5327/707 2899/5321/706 2914/5320/711 -f 2890/5297/705 2912/5326/660 2908/5329/711 -f 2898/5331/704 2876/5981/703 2906/5332/710 -f 2900/5327/707 2915/5328/714 2916/5334/712 -f 2874/5336/703 2905/5982/710 2907/5325/713 -f 2898/5331/704 2913/5333/713 2918/5338/660 -f 2876/5339/703 2903/5360/702 2917/5340/709 -f 2885/5330/706 2908/5329/711 2909/5342/714 -f 2909/5342/714 2908/5329/711 2922/5343/715 -f 2917/5340/709 2931/5361/721 2920/5345/717 -f 2915/5328/714 2914/5320/711 2928/5346/715 -f 2910/5323/712 2909/5342/714 2923/5344/716 -f 2907/5325/713 2905/5982/710 2919/5349/717 -f 2907/5325/713 2921/5350/719 2926/5351/720 -f 2916/5334/712 2915/5328/714 2929/5347/716 -f 2913/5333/713 2927/5355/719 2932/5353/720 -f 2911/5318/709 2925/5358/721 2919/5354/717 -f 2908/5329/711 2912/5326/660 2926/5351/720 -f 2906/5332/710 2920/5983/717 2927/5355/719 -f 2918/5338/660 2932/5353/720 2928/5346/715 -f 2927/5362/719 2943/5378/656 2948/5363/652 -f 2888/5364/670 2933/5372/654 2941/5365/657 -f 2932/5353/720 2948/5363/652 2944/5367/672 -f 2929/5369/716 2928/5368/715 2944/5367/672 -f 2924/5371/718 2940/5390/689 2933/5372/654 -f 2929/5369/716 2945/5370/659 2946/5373/689 -f 2921/5375/719 2937/5389/656 2942/5376/652 -f 2920/5377/717 2936/5984/658 2943/5378/656 -f 2926/5351/720 2942/5376/652 2938/5379/672 -f 2930/5374/718 2946/5373/689 2934/5381/654 -f 2931/5383/721 2947/5391/657 2936/5384/658 -f 2922/5380/715 2938/5379/672 2939/5386/659 -f 2919/5388/717 2935/5985/658 2937/5389/656 -f 2923/5387/716 2939/5386/659 2940/5390/689 -f 2902/5382/670 2934/5381/654 2947/5391/657 -f 2925/5366/721 2941/5365/657 2935/5392/658 -f 3243/5394/722 3250/5986/722 3249/5395/664 -f 3241/5397/653 3248/5403/653 3247/5398/663 -f 3245/5400/665 3252/5407/665 3251/5401/723 -f 3242/5396/664 3249/5395/664 3248/5403/653 -f 3240/5399/663 3247/5398/663 3246/5404/659 -f 3239/5406/659 3246/5987/659 3252/5407/665 -f 3257/5408/722 3262/5988/722 3261/5409/664 -f 3255/5411/653 3260/5414/653 3259/5412/663 -f 3256/5410/664 3261/5409/664 3260/5414/653 -f 3254/5413/663 3259/5412/663 3258/5415/724 -f 3267/5417/722 3272/5989/722 3271/5418/664 -f 3265/5420/653 3270/5423/653 3269/5421/663 -f 3266/5419/664 3271/5418/664 3270/5423/653 -f 3264/5422/663 3269/5421/663 3268/5424/724 -f 3277/5426/722 3282/5990/722 3281/5427/664 -f 3275/5429/653 3280/5432/653 3279/5430/663 -f 3276/5428/664 3281/5427/664 3280/5432/653 -f 3274/5431/663 3279/5430/663 3278/5433/724 -f 3287/5435/722 3292/5991/722 3291/5436/664 -f 3285/5438/653 3290/5441/653 3289/5439/663 -f 3286/5437/664 3291/5436/664 3290/5441/653 -f 3284/5440/663 3289/5439/663 3288/5442/724 -f 3299/5444/725 3306/5992/725 3305/5445/662 -f 3297/5447/658 3304/5453/658 3303/5448/664 -f 3295/5450/653 3302/5454/653 3301/5451/663 -f 3298/5446/662 3305/5445/662 3304/5453/658 -f 3296/5449/664 3303/5448/664 3302/5454/653 -f 3294/5452/663 3301/5451/663 3300/5455/724 -f 3312/5457/655 3319/5464/655 3318/5458/662 -f 3309/5460/726 3316/5993/726 3315/5461/663 -f 3313/5463/665 3320/5470/665 3319/5464/655 -f 3311/5459/662 3318/5458/662 3317/5465/727 -f 3308/5462/663 3315/5461/663 3314/5467/659 -f 3307/5469/659 3314/5994/659 3320/5470/665 -f 3324/5471/655 3329/5475/655 3328/5472/662 -f 3325/5474/665 3330/5479/665 3329/5475/655 -f 3323/5473/662 3328/5472/662 3327/5476/727 -f 3321/5478/728 3326/5995/728 3330/5479/665 -f 3334/5480/655 3339/5484/655 3338/5481/662 -f 3335/5483/665 3340/5488/665 3339/5484/655 -f 3333/5482/662 3338/5481/662 3337/5485/727 -f 3331/5487/728 3336/5996/728 3340/5488/665 -f 3344/5489/655 3349/5493/655 3348/5490/662 -f 3345/5492/665 3350/5497/665 3349/5493/655 -f 3343/5491/662 3348/5490/662 3347/5494/727 -f 3341/5496/728 3346/5997/728 3350/5497/665 -f 3354/5498/655 3359/5502/655 3358/5499/662 -f 3355/5501/665 3360/5506/665 3359/5502/655 -f 3353/5500/662 3358/5499/662 3357/5503/727 -f 3351/5505/728 3356/5998/728 3360/5506/665 -f 3366/5507/655 3373/5514/655 3372/5508/662 -f 3364/5510/658 3371/5515/658 3370/5511/664 -f 3367/5513/665 3374/5519/665 3373/5514/655 -f 3365/5509/662 3372/5508/662 3371/5515/658 -f 3363/5512/664 3370/5511/664 3369/5516/729 -f 3361/5518/728 3368/5999/728 3374/5519/665 -f 3377/5520/726 3382/6000/726 3381/5521/663 -f 3379/5523/665 3384/5529/665 3383/5524/723 -f 3376/5522/663 3381/5521/663 3380/5526/659 -f 3375/5528/659 3380/6001/659 3384/5529/665 -f 3389/5530/725 3394/6002/725 3393/5531/662 -f 3387/5533/658 3392/5536/658 3391/5534/664 -f 3388/5532/662 3393/5531/662 3392/5536/658 -f 3386/5535/664 3391/5534/664 3390/5537/729 -f 3397/5539/726 3402/6003/726 3401/5540/663 -f 3399/5542/665 3404/5548/665 3403/5543/723 -f 3396/5541/663 3401/5540/663 3400/5545/659 -f 3395/5547/659 3400/6004/659 3404/5548/665 -f 3409/5549/725 3414/6005/725 3413/5550/662 -f 3407/5552/658 3412/5555/658 3411/5553/664 -f 3408/5551/662 3413/5550/662 3412/5555/658 -f 3406/5554/664 3411/5553/664 3410/5556/729 -f 3417/5558/726 3422/6006/726 3421/5559/663 -f 3419/5561/665 3424/5567/665 3423/5562/723 -f 3416/5560/663 3421/5559/663 3420/5564/659 -f 3415/5566/659 3420/6007/659 3424/5567/665 -f 3429/5568/725 3434/6008/725 3433/5569/662 -f 3427/5571/658 3432/5574/658 3431/5572/664 -f 3428/5570/662 3433/5569/662 3432/5574/658 -f 3426/5573/664 3431/5572/664 3430/5575/729 -f 3437/5577/726 3442/6009/726 3441/5578/663 -f 3439/5580/665 3444/5586/665 3443/5581/723 -f 3436/5579/663 3441/5578/663 3440/5583/659 -f 3435/5585/659 3440/6010/659 3444/5586/665 -f 3449/5587/725 3454/6011/725 3453/5588/662 -f 3447/5590/658 3452/5593/658 3451/5591/664 -f 3448/5589/662 3453/5588/662 3452/5593/658 -f 3446/5592/664 3451/5591/664 3450/5594/729 -f 3645/5596/661 3661/5603/661 3660/5597/673 -f 3638/5599/674 3654/5605/674 3653/5600/671 -f 3646/5602/675 3662/5609/675 3661/5603/661 -f 3639/5604/654 3655/6012/654 3654/5605/674 -f 3632/5606/676 3648/5614/676 3647/5607/652 -f 3631/5608/652 3647/5607/652 3662/5609/675 -f 3640/5610/677 3656/5616/677 3655/5611/654 -f 3633/5613/660 3649/5618/660 3648/5614/676 -f 3641/5615/670 3657/5620/670 3656/5616/677 -f 3634/5617/678 3650/5622/678 3649/5618/660 -f 3642/5619/679 3658/5624/679 3657/5620/670 -f 3635/5621/653 3651/5626/653 3650/5622/678 -f 3643/5623/655 3659/5627/655 3658/5624/679 -f 3636/5625/680 3652/5628/680 3651/5626/653 -f 3644/5598/673 3660/5597/673 3659/5627/655 -f 3637/5601/671 3653/5600/671 3652/5628/680 -f 3826/5629/661 3820/5645/652 3811/5630/652 -f 3824/5632/670 3825/5641/655 3817/5633/655 -f 3822/5635/671 3823/6013/654 3815/5636/654 -f 3819/5638/660 3821/5644/653 3813/5639/653 -f 3825/5641/655 3826/5629/661 3818/5631/661 -f 3823/5642/654 3824/5632/670 3816/5634/670 -f 3821/5644/653 3822/5635/671 3814/5637/671 -f 3820/5645/652 3819/5638/660 3812/5640/660 -f 3842/5646/661 3836/5662/652 3827/5647/652 -f 3840/5649/670 3841/5658/655 3833/5650/655 -f 3838/5652/671 3839/6014/654 3831/5653/654 -f 3835/5655/660 3837/5661/653 3829/5656/653 -f 3841/5658/655 3842/5646/661 3834/5648/661 -f 3839/5659/654 3840/5649/670 3832/5651/670 -f 3837/5661/653 3838/5652/671 3830/5654/671 -f 3836/5662/652 3835/5655/660 3828/5657/660 -f 3858/5663/661 3852/5679/652 3843/5664/652 -f 3856/5666/670 3857/5675/655 3849/5667/655 -f 3854/5669/671 3855/6015/654 3847/5670/654 -f 3851/5672/660 3853/5678/653 3845/5673/653 -f 3857/5675/655 3858/5663/661 3850/5665/661 -f 3855/5676/654 3856/5666/670 3848/5668/670 -f 3853/5678/653 3854/5669/671 3846/5671/671 -f 3852/5679/652 3851/5672/660 3844/5674/660 -f 3904/5680/685 3903/5739/683 3871/5681/653 -f 3917/5683/682 3916/6016/684 3884/5684/670 -f 3897/5686/686 3891/5720/681 3859/5687/661 -f 3918/5689/688 3917/5683/682 3885/5685/654 -f 3899/5691/681 3906/6017/656 3874/5692/652 -f 3860/5694/670 3892/6018/684 3897/5686/686 -f 3919/5695/683 3918/5689/688 3886/5690/671 -f 3874/5697/652 3906/6019/656 3904/5680/685 -f 3893/5698/682 3892/6018/684 3860/5694/670 -f 3920/5700/685 3919/5695/683 3887/5696/653 -f 3913/5702/686 3907/5729/681 3875/5703/661 -f 3894/5705/688 3893/5698/682 3861/5699/654 -f 3915/5707/681 3922/6020/656 3890/5708/652 -f 3876/5710/670 3908/6021/684 3913/5702/686 -f 3895/5711/683 3894/5705/688 3862/5706/671 -f 3890/5713/652 3922/6022/656 3920/5700/685 -f 3909/5714/682 3908/6021/684 3876/5710/670 -f 3896/5716/685 3895/5711/683 3863/5712/653 -f 3910/5718/688 3909/5714/682 3877/5715/654 -f 3891/5720/681 3898/6023/656 3866/5721/652 -f 3911/5722/683 3910/5718/688 3878/5719/671 -f 3866/5724/652 3898/6024/656 3896/5716/685 -f 3912/5725/685 3911/5722/683 3879/5723/653 -f 3905/5727/686 3899/5691/681 3867/5693/661 -f 3907/5729/681 3914/6025/656 3882/5730/652 -f 3868/5731/670 3900/6026/684 3905/5727/686 -f 3882/5732/652 3914/6027/656 3912/5725/685 -f 3901/5733/682 3900/6026/684 3868/5731/670 -f 3921/5735/686 3915/5707/681 3883/5709/661 -f 3902/5737/688 3901/5733/682 3869/5734/654 -f 3884/5684/670 3916/6016/684 3921/5735/686 -f 3903/5739/683 3902/5737/688 3870/5738/671 -f 3903/5740/683 3934/5764/693 3933/5741/690 -f 3925/5743/689 3924/5757/692 3892/5744/684 -f 3900/5745/684 3931/5769/692 3936/5746/687 -f 3935/5748/694 3934/5764/693 3903/5740/683 -f 3894/5750/688 3926/5756/690 3925/5743/689 -f 3932/5751/689 3931/5769/692 3900/5745/684 -f 3897/5752/686 3929/5767/687 3923/5753/691 -f 3895/5755/683 3927/5770/693 3926/5756/690 -f 3902/5742/688 3933/5741/690 3932/5751/689 -f 3924/5757/692 3929/5767/687 3897/5752/686 -f 3905/5747/686 3936/5746/687 3930/5758/691 -f 3928/5760/694 3927/5770/693 3895/5755/683 -f 3950/5762/697 3944/5817/699 3930/5758/691 -f 3940/5763/698 3939/5850/700 3925/5743/689 -f 3934/5764/693 3948/5771/695 3947/5765/698 -f 3943/5766/697 3937/5821/699 3923/5753/691 -f 3945/5768/696 3950/5762/697 3936/5746/687 -f 3927/5770/693 3941/5773/695 3940/5763/698 -f 3935/5748/694 3949/5819/701 3948/5771/695 -f 3938/5772/696 3943/5766/697 3929/5767/687 -f 3932/5751/689 3946/5878/700 3945/5768/696 -f 3928/5760/694 3942/5823/701 3941/5773/695 -f 3925/5743/689 3939/5850/700 3938/5772/696 -f 3947/5765/698 3946/5878/700 3932/5751/689 -f 3963/5774/694 3962/5802/693 3919/5775/683 -f 3954/5777/690 3953/5794/689 3909/5714/682 -f 3960/5779/689 3959/5806/692 3916/5780/684 -f 3913/5781/686 3957/5804/687 3951/5782/691 -f 3911/5784/683 3955/5797/693 3954/5777/690 -f 3961/5785/690 3960/5779/689 3917/5683/682 -f 3952/5787/692 3957/5804/687 3913/5781/686 -f 3921/5789/686 3964/5795/687 3958/5790/691 -f 3956/5792/694 3955/5797/693 3911/5784/683 -f 3919/5775/683 3962/5802/693 3961/5785/690 -f 3953/5794/689 3952/5787/692 3908/5788/684 -f 3916/5780/684 3959/5806/692 3964/5795/687 -f 3956/5792/694 3970/5815/701 3969/5796/695 -f 3953/5794/689 3967/5841/700 3966/5798/696 -f 3975/5799/698 3974/5870/700 3960/5779/689 -f 3978/5800/697 3972/5809/699 3958/5790/691 -f 3968/5801/698 3967/5841/700 3953/5794/689 -f 3962/5802/693 3976/5807/695 3975/5799/698 -f 3971/5803/697 3965/5813/699 3951/5782/691 -f 3973/5805/696 3978/5800/697 3964/5795/687 -f 3955/5797/693 3969/5796/695 3968/5801/698 -f 3963/5774/694 3977/5811/701 3976/5807/695 -f 3966/5798/696 3971/5803/697 3957/5804/687 -f 3960/5779/689 3974/5870/700 3973/5805/696 -f 3995/5824/730 3994/5885/671 3948/5825/695 -f 4003/5827/655 3997/6028/662 3965/5828/699 -f 3972/5830/699 4004/6029/734 3982/5831/731 -f 3979/5833/658 3988/5864/664 3942/5834/701 -f 3998/5836/665 4003/5827/655 3971/5829/697 -f 3989/5838/655 3983/5886/662 3937/5839/699 -f 3967/5841/700 3999/6030/659 3998/5836/665 -f 3982/5842/731 4009/6031/730 3977/5843/701 -f 3984/5845/665 3989/5838/655 3943/5840/697 -f 4000/5847/663 3999/6030/659 3967/5841/700 -f 3985/5849/659 3984/5845/665 3938/5846/696 -f 4001/5851/653 4000/5847/663 3968/5848/698 -f 3965/5828/699 3997/6028/662 3981/5853/658 -f 3986/5855/663 3985/5849/659 3939/5850/700 -f 3970/5857/701 4002/6032/664 4001/5851/653 -f 3987/5858/653 3986/5855/663 3940/5856/698 -f 4010/5860/732 4004/6029/734 3972/5830/699 -f 3981/5862/658 4002/6032/664 3970/5857/701 -f 3988/5864/664 3987/5858/653 3941/5859/695 -f 4005/5865/733 4010/5860/732 3978/5861/697 -f 3996/5867/732 3990/5871/734 3944/5868/699 -f 3974/5870/700 4006/6033/736 4005/5865/733 -f 3990/5871/734 3980/6034/731 3906/5872/656 -f 3991/5873/733 3996/5867/732 3950/5869/697 -f 4007/5875/735 4006/6033/736 3974/5870/700 -f 3992/5877/736 3991/5873/733 3945/5874/696 -f 4008/5879/671 4007/5875/735 3975/5876/698 -f 3980/5881/731 3995/5824/730 3949/5826/701 -f 3993/5883/735 3992/5877/736 3946/5878/700 -f 3977/5843/701 4009/6031/730 4008/5879/671 -f 3994/5885/671 3993/5883/735 3947/5884/698 -f 3983/5886/662 3979/6035/658 3898/5887/656 -f 3980/5888/731 4011/5925/741 4017/5889/737 -f 4020/5891/738 4024/5907/661 4010/5860/732 -f 4016/5893/739 4015/5911/742 3992/5894/736 -f 3996/5867/732 4018/5920/661 4013/5896/740 -f 4006/5898/736 4021/5915/742 4020/5891/738 -f 4014/5899/738 4018/5920/661 3996/5867/732 -f 4004/5901/734 4019/5923/740 4012/5902/741 -f 4022/5904/739 4021/5915/742 4006/5898/736 -f 4013/5896/740 4011/5918/741 3980/5906/731 -f 4024/5907/661 4019/5923/740 4004/5901/734 -f 3982/5908/731 4012/5914/741 4023/5909/737 -f 4015/5911/742 4014/5899/738 3991/5900/733 -f 4029/5912/743 4028/6036/745 4014/5899/738 -f 4026/5913/744 4037/5931/749 4023/5909/737 -f 4021/5915/742 4035/6037/743 4034/5916/745 -f 4016/5893/739 4030/5929/747 4029/5912/743 -f 4013/5896/740 4027/6038/748 4025/5917/744 -f 4032/5919/746 4027/6038/748 4013/5896/740 -f 4036/5921/747 4035/6037/743 4021/5915/742 -f 4038/5922/746 4033/5926/748 4019/5923/740 -f 4025/5924/744 4031/5928/749 4017/5889/737 -f 4014/5899/738 4028/6036/745 4032/5919/746 -f 4033/5926/748 4026/6039/744 4012/5902/741 -f 4034/5916/745 4038/5922/746 4024/5907/661 -f 4054/5932/652 4049/5946/656 4033/5933/748 -f 4047/5934/657 4039/5940/654 3994/5935/671 -f 4050/5937/672 4054/5932/652 4038/5922/746 -f 4035/5939/743 4051/6040/659 4050/5937/672 -f 4039/5940/654 4046/5959/689 4030/5941/747 -f 4052/5942/689 4051/6040/659 4035/5939/743 -f 4048/5944/652 4043/5957/656 4027/5945/748 -f 4049/5946/656 4042/6041/658 4026/5947/744 -f 4044/5948/672 4048/5944/652 4032/5919/746 -f 4040/5950/654 4052/5942/689 4036/5943/747 -f 4042/5952/658 4053/5960/657 4037/5953/749 -f 4045/5955/659 4044/5948/672 4028/5949/745 -f 4043/5957/656 4041/6042/658 4025/5958/744 -f 4046/5959/689 4045/5955/659 4029/5956/743 -f 4053/5960/657 4040/5950/654 4008/5951/671 -f 4041/5961/658 4047/5934/657 4031/5936/749 +f 3084/5529/661 3069/5530/652 3076/5531/661 +f 3082/5532/670 3075/5533/655 3074/5534/670 +f 3080/5535/671 3073/5536/654 3072/5537/671 +f 3077/5538/660 3071/5539/653 3070/5540/660 +f 3083/5541/655 3076/5531/661 3075/5533/655 +f 3081/5542/654 3074/5534/670 3073/5543/654 +f 3079/5544/653 3072/5537/671 3071/5539/653 +f 3078/5545/652 3070/5540/660 3069/5530/652 +f 3099/5546/661 3114/5547/673 3098/5548/673 +f 3092/5549/674 3107/5550/671 3091/5551/671 +f 3100/5552/675 3115/5553/661 3099/5546/661 +f 3093/5554/654 3108/5555/674 3092/5549/674 +f 3086/5556/676 3101/5557/652 3085/5558/652 +f 3085/5558/652 3116/5559/675 3100/5552/675 +f 3094/5560/677 3109/5561/654 3093/5562/654 +f 3087/5563/660 3102/5564/676 3086/5556/676 +f 3095/5565/670 3110/5566/677 3094/5560/677 +f 3088/5567/678 3103/5568/660 3087/5563/660 +f 3096/5569/679 3111/5570/670 3095/5565/670 +f 3089/5571/653 3104/5572/678 3088/5567/678 +f 3097/5573/655 3112/5574/679 3096/5569/679 +f 3090/5575/680 3105/5576/653 3089/5571/653 +f 3098/5548/673 3113/5577/655 3097/5573/655 +f 3091/5551/671 3106/5578/680 3090/5575/680 +f 3181/5579/655 3214/5580/681 3182/5581/661 +f 3194/5582/671 3227/5583/682 3195/5584/654 +f 3169/5585/660 3207/5586/683 3175/5587/653 +f 3195/5584/654 3228/5588/684 3196/5589/670 +f 3184/5590/652 3209/5591/685 3177/5592/660 +f 3207/5586/683 3170/5593/671 3175/5587/653 +f 3196/5589/670 3229/5594/686 3197/5595/655 +f 3214/5580/681 3184/5596/652 3182/5581/661 +f 3170/5593/671 3203/5597/682 3171/5598/654 +f 3197/5595/655 3230/5599/681 3198/5600/661 +f 3185/5601/660 3223/5602/683 3191/5603/653 +f 3171/5598/654 3204/5604/684 3172/5605/670 +f 3200/5606/652 3225/5607/685 3193/5608/660 +f 3223/5602/683 3186/5609/671 3191/5603/653 +f 3172/5605/670 3205/5610/686 3173/5611/655 +f 3230/5599/681 3200/5612/652 3198/5600/661 +f 3186/5609/671 3219/5613/682 3187/5614/654 +f 3173/5611/655 3206/5615/681 3174/5616/661 +f 3187/5614/654 3220/5617/684 3188/5618/670 +f 3176/5619/652 3201/5620/685 3169/5585/660 +f 3188/5618/670 3221/5621/686 3189/5622/655 +f 3206/5615/681 3176/5623/652 3174/5616/661 +f 3189/5622/655 3222/5624/681 3190/5625/661 +f 3177/5592/660 3215/5626/683 3183/5627/653 +f 3192/5628/652 3217/5629/685 3185/5601/660 +f 3215/5626/683 3178/5630/671 3183/5627/653 +f 3222/5624/681 3192/5631/652 3190/5625/661 +f 3178/5630/671 3211/5632/682 3179/5633/654 +f 3193/5608/660 3231/5634/683 3199/5635/653 +f 3179/5633/654 3212/5636/684 3180/5637/670 +f 3231/5634/683 3194/5582/671 3199/5635/653 +f 3180/5637/670 3213/5638/686 3181/5579/655 +f 3212/5639/684 3244/5640/687 3213/5641/686 +f 3202/5642/688 3235/5643/689 3203/5597/682 +f 3215/5644/683 3241/5645/690 3210/5646/688 +f 3214/5647/681 3244/5640/687 3245/5648/691 +f 3204/5649/684 3235/5643/689 3236/5650/692 +f 3211/5632/682 3241/5645/690 3242/5651/689 +f 3201/5652/685 3239/5653/693 3207/5654/683 +f 3204/5649/684 3237/5655/687 3205/5656/686 +f 3212/5639/684 3242/5651/689 3243/5657/692 +f 3207/5654/683 3234/5658/690 3202/5642/688 +f 3209/5659/685 3246/5660/693 3215/5644/683 +f 3205/5656/686 3238/5661/691 3206/5662/681 +f 3240/5663/694 3260/5664/695 3246/5660/693 +f 3235/5643/689 3250/5665/696 3236/5650/692 +f 3244/5640/687 3257/5666/696 3258/5667/697 +f 3233/5668/694 3253/5669/695 3239/5653/693 +f 3246/5660/693 3255/5670/698 3241/5645/690 +f 3237/5655/687 3250/5665/696 3251/5671/697 +f 3245/5648/691 3258/5667/697 3259/5672/699 +f 3239/5653/693 3248/5673/698 3234/5658/690 +f 3241/5645/690 3256/5674/700 3242/5651/689 +f 3238/5661/691 3251/5671/697 3252/5675/699 +f 3235/5643/689 3248/5673/698 3249/5676/700 +f 3242/5651/689 3257/5666/696 3243/5657/692 +f 3230/5677/681 3272/5678/687 3273/5679/691 +f 3220/5680/684 3263/5681/689 3264/5682/692 +f 3226/5683/688 3270/5684/689 3227/5583/682 +f 3223/5685/683 3261/5686/694 3267/5687/693 +f 3221/5688/686 3264/5682/692 3265/5689/687 +f 3227/5583/682 3271/5690/692 3228/5691/684 +f 3223/5685/683 3262/5692/690 3218/5693/688 +f 3231/5694/683 3268/5695/694 3274/5696/693 +f 3221/5688/686 3266/5697/691 3222/5698/681 +f 3229/5699/686 3271/5690/692 3272/5678/687 +f 3218/5693/688 3263/5681/689 3219/5613/682 +f 3231/5694/683 3269/5700/690 3226/5683/688 +f 3266/5697/691 3279/5701/697 3280/5702/699 +f 3263/5681/689 3276/5703/698 3277/5704/700 +f 3270/5684/689 3285/5705/696 3271/5690/692 +f 3268/5695/694 3288/5706/695 3274/5696/693 +f 3263/5681/689 3278/5707/696 3264/5682/692 +f 3271/5690/692 3286/5708/697 3272/5678/687 +f 3261/5686/694 3281/5709/695 3267/5687/693 +f 3274/5696/693 3283/5710/698 3269/5700/690 +f 3264/5682/692 3279/5701/697 3265/5689/687 +f 3272/5678/687 3287/5711/699 3273/5679/691 +f 3262/5692/690 3281/5709/695 3276/5703/698 +f 3270/5684/689 3283/5710/698 3284/5712/700 +f 3225/5713/685 3232/5714/656 3268/5695/694 +f 3268/5695/694 3232/5714/656 3282/5715/701 +f 3230/5677/681 3273/5679/691 3232/5716/656 +f 3273/5679/691 3287/5711/699 3232/5716/656 +f 3217/5717/685 3224/5718/656 3261/5686/694 +f 3261/5686/694 3224/5718/656 3275/5719/701 +f 3222/5698/681 3266/5697/691 3224/5720/656 +f 3266/5697/691 3280/5702/699 3224/5720/656 +f 3209/5659/685 3216/5721/656 3240/5663/694 +f 3240/5663/694 3216/5721/656 3254/5722/701 +f 3214/5647/681 3245/5648/691 3216/5723/656 +f 3245/5648/691 3259/5672/699 3216/5723/656 +f 3201/5652/685 3208/5724/656 3233/5668/694 +f 3233/5668/694 3208/5724/656 3247/5725/701 +f 3206/5662/681 3238/5661/691 3208/5726/656 +f 3238/5661/691 3252/5675/699 3208/5726/656 +f 3258/5727/697 3305/5728/702 3259/5729/699 +f 3275/5730/701 3313/5731/653 3281/5732/695 +f 3282/5733/701 3292/5734/703 3314/5735/704 +f 3252/5736/699 3289/5737/658 3208/5738/656 +f 3281/5732/695 3308/5739/663 3276/5740/698 +f 3247/5741/701 3299/5742/653 3253/5743/695 +f 3277/5704/700 3308/5739/663 3309/5744/659 +f 3287/5745/699 3292/5746/703 3232/5747/656 +f 3253/5743/695 3294/5748/663 3248/5749/698 +f 3277/5704/700 3310/5750/665 3278/5751/696 +f 3248/5749/698 3295/5752/659 3249/5676/700 +f 3278/5751/696 3311/5753/655 3279/5754/697 +f 3275/5730/701 3291/5755/658 3307/5756/664 +f 3249/5676/700 3296/5757/665 3250/5758/696 +f 3280/5759/699 3311/5753/655 3312/5760/662 +f 3250/5758/696 3297/5761/655 3251/5762/697 +f 3282/5733/701 3320/5763/705 3288/5764/695 +f 3280/5759/699 3291/5765/658 3224/5766/656 +f 3252/5736/699 3297/5761/655 3298/5767/662 +f 3288/5764/695 3315/5768/706 3283/5769/698 +f 3254/5770/701 3306/5771/705 3260/5772/695 +f 3284/5712/700 3315/5768/706 3316/5773/707 +f 3216/5774/656 3300/5775/704 3254/5770/701 +f 3260/5772/695 3301/5776/706 3255/5777/698 +f 3284/5712/700 3317/5778/708 3285/5779/696 +f 3255/5777/698 3302/5780/707 3256/5674/700 +f 3285/5779/696 3318/5781/670 3286/5782/697 +f 3259/5729/699 3290/5783/703 3216/5784/656 +f 3256/5674/700 3303/5785/708 3257/5786/696 +f 3287/5745/699 3318/5781/670 3319/5787/702 +f 3257/5786/696 3304/5788/670 3258/5727/697 +f 3208/5789/656 3293/5790/664 3247/5741/701 +f 3290/5791/703 3327/5792/709 3321/5793/710 +f 3320/5763/705 3330/5794/711 3315/5795/706 +f 3302/5796/707 3326/5797/712 3303/5798/708 +f 3306/5771/705 3323/5799/713 3328/5800/660 +f 3316/5801/707 3330/5794/711 3331/5802/714 +f 3306/5771/705 3324/5803/711 3301/5804/706 +f 3314/5805/704 3322/5806/710 3329/5807/713 +f 3316/5801/707 3332/5808/712 3317/5809/708 +f 3290/5810/703 3323/5799/713 3300/5811/704 +f 3314/5805/704 3334/5812/660 3320/5763/705 +f 3292/5813/703 3333/5814/709 3322/5815/710 +f 3301/5804/706 3325/5816/714 3302/5796/707 +f 3325/5816/714 3338/5817/715 3339/5818/716 +f 3333/5814/709 3336/5819/717 3322/5815/710 +f 3331/5802/714 3344/5820/715 3345/5821/716 +f 3326/5797/712 3339/5818/716 3340/5822/718 +f 3323/5799/713 3335/5823/717 3337/5824/719 +f 3323/5799/713 3342/5825/720 3328/5800/660 +f 3332/5808/712 3345/5821/716 3346/5826/718 +f 3329/5807/713 3348/5827/720 3334/5812/660 +f 3327/5792/709 3335/5828/717 3321/5793/710 +f 3324/5803/711 3342/5825/720 3338/5817/715 +f 3322/5806/710 3343/5829/719 3329/5807/713 +f 3334/5812/660 3344/5820/715 3330/5794/711 +f 3305/5830/702 3304/5831/670 3327/5792/709 +f 3327/5792/709 3304/5831/670 3341/5832/721 +f 3303/5798/708 3326/5797/712 3304/5831/670 +f 3326/5797/712 3340/5822/718 3304/5831/670 +f 3317/5809/708 3332/5808/712 3318/5833/670 +f 3332/5808/712 3346/5826/718 3318/5833/670 +f 3319/5834/702 3318/5833/670 3333/5814/709 +f 3333/5814/709 3318/5833/670 3347/5835/721 +f 3343/5836/719 3364/5837/652 3348/5827/720 +f 3304/5838/670 3357/5839/657 3341/5840/721 +f 3348/5827/720 3360/5841/672 3344/5842/715 +f 3345/5843/716 3360/5841/672 3361/5844/659 +f 3340/5845/718 3349/5846/654 3304/5838/670 +f 3345/5843/716 3362/5847/689 3346/5848/718 +f 3337/5849/719 3358/5850/652 3342/5825/720 +f 3336/5851/717 3359/5852/656 3343/5836/719 +f 3342/5825/720 3354/5853/672 3338/5854/715 +f 3346/5848/718 3350/5855/654 3318/5856/670 +f 3347/5857/721 3352/5858/658 3336/5859/717 +f 3338/5854/715 3355/5860/659 3339/5861/716 +f 3335/5862/717 3353/5863/656 3337/5849/719 +f 3339/5861/716 3356/5864/689 3340/5845/718 +f 3318/5856/670 3363/5865/657 3347/5857/721 +f 3341/5840/721 3351/5866/658 3335/5867/717 +f 3659/5868/722 3665/5869/664 3658/5870/664 +f 3657/5871/653 3663/5872/663 3656/5873/663 +f 3661/5874/665 3667/5875/723 3660/5876/723 +f 3658/5870/664 3664/5877/653 3657/5871/653 +f 3656/5873/663 3662/5878/659 3655/5879/659 +f 3655/5880/659 3668/5881/665 3661/5874/665 +f 3673/5882/722 3677/5883/664 3672/5884/664 +f 3671/5885/653 3675/5886/663 3670/5887/663 +f 3672/5884/664 3676/5888/653 3671/5885/653 +f 3670/5887/663 3674/5889/724 3669/5890/724 +f 3683/5891/722 3687/5892/664 3682/5893/664 +f 3681/5894/653 3685/5895/663 3680/5896/663 +f 3682/5893/664 3686/5897/653 3681/5894/653 +f 3680/5896/663 3684/5898/724 3679/5899/724 +f 3693/5900/722 3697/5901/664 3692/5902/664 +f 3691/5903/653 3695/5904/663 3690/5905/663 +f 3692/5902/664 3696/5906/653 3691/5903/653 +f 3690/5905/663 3694/5907/724 3689/5908/724 +f 3703/5909/722 3707/5910/664 3702/5911/664 +f 3701/5912/653 3705/5913/663 3700/5914/663 +f 3702/5911/664 3706/5915/653 3701/5912/653 +f 3700/5914/663 3704/5916/724 3699/5917/724 +f 3715/5918/725 3721/5919/662 3714/5920/662 +f 3713/5921/658 3719/5922/664 3712/5923/664 +f 3711/5924/653 3717/5925/663 3710/5926/663 +f 3714/5920/662 3720/5927/658 3713/5921/658 +f 3712/5923/664 3718/5928/653 3711/5924/653 +f 3710/5926/663 3716/5929/724 3709/5930/724 +f 3728/5931/655 3734/5932/662 3727/5933/662 +f 3725/5934/726 3731/5935/663 3724/5936/663 +f 3729/5937/665 3735/5938/655 3728/5931/655 +f 3727/5933/662 3733/5939/727 3726/5940/727 +f 3724/5936/663 3730/5941/659 3723/5942/659 +f 3723/5943/659 3736/5944/665 3729/5937/665 +f 3740/5945/655 3744/5946/662 3739/5947/662 +f 3741/5948/665 3745/5949/655 3740/5945/655 +f 3739/5947/662 3743/5950/727 3738/5951/727 +f 3737/5952/728 3746/5953/665 3741/5948/665 +f 3750/5954/655 3754/5955/662 3749/5956/662 +f 3751/5957/665 3755/5958/655 3750/5954/655 +f 3749/5956/662 3753/5959/727 3748/5960/727 +f 3747/5961/728 3756/5962/665 3751/5957/665 +f 3760/5963/655 3764/5964/662 3759/5965/662 +f 3761/5966/665 3765/5967/655 3760/5963/655 +f 3759/5965/662 3763/5968/727 3758/5969/727 +f 3757/5970/728 3766/5971/665 3761/5966/665 +f 3770/5972/655 3774/5973/662 3769/5974/662 +f 3771/5975/665 3775/5976/655 3770/5972/655 +f 3769/5974/662 3773/5977/727 3768/5978/727 +f 3767/5979/728 3776/5980/665 3771/5975/665 +f 3782/5981/655 3788/5982/662 3781/5983/662 +f 3780/5984/658 3786/5985/664 3779/5986/664 +f 3783/5987/665 3789/5988/655 3782/5981/655 +f 3781/5983/662 3787/5989/658 3780/5984/658 +f 3779/5986/664 3785/5990/729 3778/5991/729 +f 3777/5992/728 3790/5993/665 3783/5987/665 +f 3793/5994/726 3797/5995/663 3792/5996/663 +f 3795/5997/665 3799/5998/723 3794/5999/723 +f 3792/5996/663 3796/6000/659 3791/6001/659 +f 3791/6002/659 3800/6003/665 3795/5997/665 +f 3805/6004/725 3809/6005/662 3804/6006/662 +f 3803/6007/658 3807/6008/664 3802/6009/664 +f 3804/6006/662 3808/6010/658 3803/6007/658 +f 3802/6009/664 3806/6011/729 3801/6012/729 +f 3813/6013/726 3817/6014/663 3812/6015/663 +f 3815/6016/665 3819/6017/723 3814/6018/723 +f 3812/6015/663 3816/6019/659 3811/6020/659 +f 3811/6021/659 3820/6022/665 3815/6016/665 +f 3825/6023/725 3829/6024/662 3824/6025/662 +f 3823/6026/658 3827/6027/664 3822/6028/664 +f 3824/6025/662 3828/6029/658 3823/6026/658 +f 3822/6028/664 3826/6030/729 3821/6031/729 +f 3833/6032/726 3837/6033/663 3832/6034/663 +f 3835/6035/665 3839/6036/723 3834/6037/723 +f 3832/6034/663 3836/6038/659 3831/6039/659 +f 3831/6040/659 3840/6041/665 3835/6035/665 +f 3845/6042/725 3849/6043/662 3844/6044/662 +f 3843/6045/658 3847/6046/664 3842/6047/664 +f 3844/6044/662 3848/6048/658 3843/6045/658 +f 3842/6047/664 3846/6049/729 3841/6050/729 +f 3853/6051/726 3857/6052/663 3852/6053/663 +f 3855/6054/665 3859/6055/723 3854/6056/723 +f 3852/6053/663 3856/6057/659 3851/6058/659 +f 3851/6059/659 3860/6060/665 3855/6054/665 +f 3865/6061/725 3869/6062/662 3864/6063/662 +f 3863/6064/658 3867/6065/664 3862/6066/664 +f 3864/6063/662 3868/6067/658 3863/6064/658 +f 3862/6066/664 3866/6068/729 3861/6069/729 +f 4061/6070/661 4076/6071/673 4060/6072/673 +f 4054/6073/674 4069/6074/671 4053/6075/671 +f 4062/6076/675 4077/6077/661 4061/6070/661 +f 4055/6078/654 4070/6079/674 4054/6073/674 +f 4048/6080/676 4063/6081/652 4047/6082/652 +f 4047/6082/652 4078/6083/675 4062/6076/675 +f 4056/6084/677 4071/6085/654 4055/6086/654 +f 4049/6087/660 4064/6088/676 4048/6080/676 +f 4057/6089/670 4072/6090/677 4056/6084/677 +f 4050/6091/678 4065/6092/660 4049/6087/660 +f 4058/6093/679 4073/6094/670 4057/6089/670 +f 4051/6095/653 4066/6096/678 4050/6091/678 +f 4059/6097/655 4074/6098/679 4058/6093/679 +f 4052/6099/680 4067/6100/653 4051/6095/653 +f 4060/6072/673 4075/6101/655 4059/6097/655 +f 4053/6075/671 4068/6102/680 4052/6099/680 +f 4242/6103/661 4227/6104/652 4234/6105/661 +f 4240/6106/670 4233/6107/655 4232/6108/670 +f 4238/6109/671 4231/6110/654 4230/6111/671 +f 4235/6112/660 4229/6113/653 4228/6114/660 +f 4241/6115/655 4234/6105/661 4233/6107/655 +f 4239/6116/654 4232/6108/670 4231/6117/654 +f 4237/6118/653 4230/6111/671 4229/6113/653 +f 4236/6119/652 4228/6114/660 4227/6104/652 +f 4258/6120/661 4243/6121/652 4250/6122/661 +f 4256/6123/670 4249/6124/655 4248/6125/670 +f 4254/6126/671 4247/6127/654 4246/6128/671 +f 4251/6129/660 4245/6130/653 4244/6131/660 +f 4257/6132/655 4250/6122/661 4249/6124/655 +f 4255/6133/654 4248/6125/670 4247/6134/654 +f 4253/6135/653 4246/6128/671 4245/6130/653 +f 4252/6136/652 4244/6131/660 4243/6121/652 +f 4274/6137/661 4259/6138/652 4266/6139/661 +f 4272/6140/670 4265/6141/655 4264/6142/670 +f 4270/6143/671 4263/6144/654 4262/6145/671 +f 4267/6146/660 4261/6147/653 4260/6148/660 +f 4273/6149/655 4266/6139/661 4265/6141/655 +f 4271/6150/654 4264/6142/670 4263/6151/654 +f 4269/6152/653 4262/6145/671 4261/6147/653 +f 4268/6153/652 4260/6148/660 4259/6138/652 +f 4320/6154/685 4287/6155/653 4288/6156/660 +f 4333/6157/682 4300/6158/670 4301/6159/654 +f 4313/6160/686 4275/6161/661 4281/6162/655 +f 4334/6163/688 4301/6159/654 4302/6164/671 +f 4315/6165/681 4290/6166/652 4283/6167/661 +f 4276/6168/670 4313/6160/686 4281/6162/655 +f 4335/6169/683 4302/6164/671 4303/6170/653 +f 4290/6171/652 4320/6154/685 4288/6156/660 +f 4309/6172/682 4276/6168/670 4277/6173/654 +f 4336/6174/685 4303/6170/653 4304/6175/660 +f 4329/6176/686 4291/6177/661 4297/6178/655 +f 4310/6179/688 4277/6173/654 4278/6180/671 +f 4331/6181/681 4306/6182/652 4299/6183/661 +f 4292/6184/670 4329/6176/686 4297/6178/655 +f 4311/6185/683 4278/6180/671 4279/6186/653 +f 4306/6187/652 4336/6174/685 4304/6175/660 +f 4325/6188/682 4292/6184/670 4293/6189/654 +f 4312/6190/685 4279/6186/653 4280/6191/660 +f 4326/6192/688 4293/6189/654 4294/6193/671 +f 4307/6194/681 4282/6195/652 4275/6161/661 +f 4327/6196/683 4294/6193/671 4295/6197/653 +f 4282/6198/652 4312/6190/685 4280/6191/660 +f 4328/6199/685 4295/6197/653 4296/6200/660 +f 4321/6201/686 4283/6167/661 4289/6202/655 +f 4323/6203/681 4298/6204/652 4291/6177/661 +f 4284/6205/670 4321/6201/686 4289/6202/655 +f 4298/6206/652 4328/6199/685 4296/6200/660 +f 4317/6207/682 4284/6205/670 4285/6208/654 +f 4337/6209/686 4299/6183/661 4305/6210/655 +f 4318/6211/688 4285/6208/654 4286/6212/671 +f 4300/6158/670 4337/6209/686 4305/6210/655 +f 4319/6213/683 4286/6212/671 4287/6155/653 +f 4319/6214/683 4349/6215/690 4318/6216/688 +f 4341/6217/689 4308/6218/684 4309/6172/682 +f 4316/6219/684 4352/6220/687 4321/6221/686 +f 4351/6222/694 4319/6214/683 4320/6223/685 +f 4310/6224/688 4341/6217/689 4309/6172/682 +f 4348/6225/689 4316/6219/684 4317/6207/682 +f 4313/6226/686 4339/6227/691 4307/6228/681 +f 4311/6229/683 4342/6230/690 4310/6224/688 +f 4318/6216/688 4348/6225/689 4317/6207/682 +f 4340/6231/692 4313/6226/686 4308/6218/684 +f 4321/6221/686 4346/6232/691 4315/6233/681 +f 4344/6234/694 4311/6229/683 4312/6235/685 +f 4366/6236/697 4346/6232/691 4352/6220/687 +f 4356/6237/698 4341/6217/689 4342/6230/690 +f 4350/6238/693 4363/6239/698 4349/6215/690 +f 4359/6240/697 4339/6227/691 4345/6241/687 +f 4361/6242/696 4352/6220/687 4347/6243/692 +f 4343/6244/693 4356/6237/698 4342/6230/690 +f 4351/6222/694 4364/6245/695 4350/6238/693 +f 4354/6246/696 4345/6241/687 4340/6231/692 +f 4348/6225/689 4361/6242/696 4347/6243/692 +f 4344/6234/694 4357/6247/695 4343/6244/693 +f 4341/6217/689 4354/6246/696 4340/6231/692 +f 4363/6239/698 4348/6225/689 4349/6215/690 +f 4379/6248/694 4335/6249/683 4336/6250/685 +f 4370/6251/690 4325/6188/682 4326/6252/688 +f 4376/6253/689 4332/6254/684 4333/6157/682 +f 4329/6255/686 4367/6256/691 4323/6257/681 +f 4327/6258/683 4370/6251/690 4326/6252/688 +f 4377/6259/690 4333/6157/682 4334/6260/688 +f 4368/6261/692 4329/6255/686 4324/6262/684 +f 4337/6263/686 4374/6264/691 4331/6265/681 +f 4372/6266/694 4327/6258/683 4328/6267/685 +f 4335/6249/683 4377/6259/690 4334/6260/688 +f 4369/6268/689 4324/6262/684 4325/6188/682 +f 4332/6254/684 4380/6269/687 4337/6263/686 +f 4372/6266/694 4385/6270/695 4371/6271/693 +f 4369/6268/689 4382/6272/696 4368/6261/692 +f 4391/6273/698 4376/6253/689 4377/6259/690 +f 4394/6274/697 4374/6264/691 4380/6269/687 +f 4384/6275/698 4369/6268/689 4370/6251/690 +f 4378/6276/693 4391/6273/698 4377/6259/690 +f 4387/6277/697 4367/6256/691 4373/6278/687 +f 4389/6279/696 4380/6269/687 4375/6280/692 +f 4371/6271/693 4384/6275/698 4370/6251/690 +f 4379/6248/694 4392/6281/695 4378/6276/693 +f 4382/6272/696 4373/6278/687 4368/6261/692 +f 4376/6253/689 4389/6279/696 4375/6280/692 +f 4331/6265/681 4374/6264/691 4338/6282/656 +f 4374/6264/691 4388/6283/699 4338/6282/656 +f 4336/6250/685 4338/6284/656 4379/6248/694 +f 4379/6248/694 4338/6284/656 4393/6285/701 +f 4323/6257/681 4367/6256/691 4330/6286/656 +f 4367/6256/691 4381/6287/699 4330/6286/656 +f 4328/6267/685 4330/6288/656 4372/6266/694 +f 4372/6266/694 4330/6288/656 4386/6289/701 +f 4315/6233/681 4346/6232/691 4322/6290/656 +f 4346/6232/691 4360/6291/699 4322/6290/656 +f 4320/6223/685 4322/6292/656 4351/6222/694 +f 4351/6222/694 4322/6292/656 4365/6293/701 +f 4307/6228/681 4339/6227/691 4314/6294/656 +f 4339/6227/691 4353/6295/699 4314/6294/656 +f 4312/6235/685 4314/6296/656 4344/6234/694 +f 4344/6234/694 4314/6296/656 4358/6297/701 +f 4411/6298/730 4364/6299/695 4365/6300/701 +f 4419/6301/655 4381/6302/699 4387/6303/697 +f 4388/6304/699 4398/6305/731 4338/6306/656 +f 4395/6307/658 4358/6308/701 4314/6309/656 +f 4414/6310/665 4387/6303/697 4382/6311/696 +f 4405/6312/655 4353/6313/699 4359/6314/697 +f 4383/6315/700 4414/6310/665 4382/6311/696 +f 4398/6316/731 4393/6317/701 4338/6318/656 +f 4400/6319/665 4359/6314/697 4354/6320/696 +f 4416/6321/663 4383/6315/700 4384/6322/698 +f 4401/6323/659 4354/6320/696 4355/6324/700 +f 4417/6325/653 4384/6322/698 4385/6326/695 +f 4381/6302/699 4397/6327/658 4330/6328/656 +f 4402/6329/663 4355/6324/700 4356/6330/698 +f 4386/6331/701 4417/6325/653 4385/6326/695 +f 4403/6332/653 4356/6330/698 4357/6333/695 +f 4426/6334/732 4388/6304/699 4394/6335/697 +f 4397/6336/658 4386/6331/701 4330/6337/656 +f 4404/6338/664 4357/6333/695 4358/6308/701 +f 4421/6339/733 4394/6335/697 4389/6340/696 +f 4412/6341/732 4360/6342/699 4366/6343/697 +f 4390/6344/700 4421/6339/733 4389/6340/696 +f 4406/6345/734 4322/6346/656 4360/6342/699 +f 4407/6347/733 4366/6343/697 4361/6348/696 +f 4423/6349/735 4390/6344/700 4391/6350/698 +f 4408/6351/736 4361/6348/696 4362/6352/700 +f 4424/6353/671 4391/6350/698 4392/6354/695 +f 4396/6355/731 4365/6300/701 4322/6356/656 +f 4409/6357/735 4362/6352/700 4363/6358/698 +f 4393/6317/701 4424/6353/671 4392/6354/695 +f 4410/6359/671 4363/6358/698 4364/6299/695 +f 4399/6360/662 4314/6361/656 4353/6313/699 +f 4396/6362/731 4433/6363/737 4411/6364/730 +f 4436/6365/738 4426/6334/732 4421/6366/733 +f 4432/6367/739 4408/6368/736 4409/6369/735 +f 4412/6341/732 4429/6370/740 4406/6371/734 +f 4422/6372/736 4436/6365/738 4421/6366/733 +f 4430/6373/738 4412/6341/732 4407/6374/733 +f 4420/6375/734 4428/6376/741 4398/6377/731 +f 4438/6378/739 4422/6372/736 4423/6379/735 +f 4429/6370/740 4396/6380/731 4406/6371/734 +f 4440/6381/661 4420/6375/734 4426/6334/732 +f 4398/6382/731 4439/6383/737 4425/6384/730 +f 4431/6385/742 4407/6374/733 4408/6368/736 +f 4445/6386/743 4430/6373/738 4431/6385/742 +f 4442/6387/744 4439/6383/737 4428/6388/741 +f 4437/6389/742 4450/6390/745 4436/6365/738 +f 4432/6367/739 4445/6386/743 4431/6385/742 +f 4429/6370/740 4441/6391/744 4427/6392/741 +f 4448/6393/746 4429/6370/740 4434/6394/661 +f 4452/6395/747 4437/6389/742 4438/6378/739 +f 4454/6396/746 4435/6397/740 4440/6381/661 +f 4441/6398/744 4433/6363/737 4427/6399/741 +f 4430/6373/738 4448/6393/746 4434/6394/661 +f 4449/6400/748 4428/6376/741 4435/6397/740 +f 4450/6390/745 4440/6381/661 4436/6365/738 +f 4411/6364/730 4433/6363/737 4410/6401/671 +f 4433/6363/737 4447/6402/749 4410/6401/671 +f 4409/6369/735 4410/6401/671 4432/6367/739 +f 4432/6367/739 4410/6401/671 4446/6403/747 +f 4423/6379/735 4424/6404/671 4438/6378/739 +f 4438/6378/739 4424/6404/671 4452/6395/747 +f 4425/6384/730 4439/6383/737 4424/6404/671 +f 4439/6383/737 4453/6405/749 4424/6404/671 +f 4470/6406/652 4449/6407/748 4454/6396/746 +f 4463/6408/657 4410/6409/671 4447/6410/749 +f 4466/6411/672 4454/6396/746 4450/6412/745 +f 4451/6413/743 4466/6411/672 4450/6412/745 +f 4455/6414/654 4446/6415/747 4410/6409/671 +f 4468/6416/689 4451/6413/743 4452/6417/747 +f 4464/6418/652 4443/6419/748 4448/6393/746 +f 4465/6420/656 4442/6421/744 4449/6407/748 +f 4460/6422/672 4448/6393/746 4444/6423/745 +f 4456/6424/654 4452/6417/747 4424/6425/671 +f 4458/6426/658 4453/6427/749 4442/6428/744 +f 4461/6429/659 4444/6423/745 4445/6430/743 +f 4459/6431/656 4441/6432/744 4443/6419/748 +f 4462/6433/689 4445/6430/743 4446/6415/747 +f 4469/6434/657 4424/6425/671 4453/6427/749 +f 4457/6435/658 4447/6410/749 4441/6436/744 +f 3084/5529/661 3078/5545/652 3069/5530/652 +f 3082/5532/670 3083/5541/655 3075/5533/655 +f 3080/5535/671 3081/6437/654 3073/5536/654 +f 3077/5538/660 3079/5544/653 3071/5539/653 +f 3083/5541/655 3084/5529/661 3076/5531/661 +f 3081/5542/654 3082/5532/670 3074/5534/670 +f 3079/5544/653 3080/5535/671 3072/5537/671 +f 3078/5545/652 3077/5538/660 3070/5540/660 +f 3099/5546/661 3115/5553/661 3114/5547/673 +f 3092/5549/674 3108/5555/674 3107/5550/671 +f 3100/5552/675 3116/5559/675 3115/5553/661 +f 3093/5554/654 3109/6438/654 3108/5555/674 +f 3086/5556/676 3102/5564/676 3101/5557/652 +f 3085/5558/652 3101/5557/652 3116/5559/675 +f 3094/5560/677 3110/5566/677 3109/5561/654 +f 3087/5563/660 3103/5568/660 3102/5564/676 +f 3095/5565/670 3111/5570/670 3110/5566/677 +f 3088/5567/678 3104/5572/678 3103/5568/660 +f 3096/5569/679 3112/5574/679 3111/5570/670 +f 3089/5571/653 3105/5576/653 3104/5572/678 +f 3097/5573/655 3113/5577/655 3112/5574/679 +f 3090/5575/680 3106/5578/680 3105/5576/653 +f 3098/5548/673 3114/5547/673 3113/5577/655 +f 3091/5551/671 3107/5550/671 3106/5578/680 +f 3181/5579/655 3213/5638/686 3214/5580/681 +f 3194/5582/671 3226/6439/688 3227/5583/682 +f 3169/5585/660 3201/5620/685 3207/5586/683 +f 3195/5584/654 3227/5583/682 3228/5588/684 +f 3184/5590/652 3216/6440/656 3209/5591/685 +f 3207/5586/683 3202/6441/688 3170/5593/671 +f 3196/5589/670 3228/5588/684 3229/5594/686 +f 3214/5580/681 3216/6442/656 3184/5596/652 +f 3170/5593/671 3202/6441/688 3203/5597/682 +f 3197/5595/655 3229/5594/686 3230/5599/681 +f 3185/5601/660 3217/5629/685 3223/5602/683 +f 3171/5598/654 3203/5597/682 3204/5604/684 +f 3200/5606/652 3232/6443/656 3225/5607/685 +f 3223/5602/683 3218/6444/688 3186/5609/671 +f 3172/5605/670 3204/5604/684 3205/5610/686 +f 3230/5599/681 3232/6445/656 3200/5612/652 +f 3186/5609/671 3218/6444/688 3219/5613/682 +f 3173/5611/655 3205/5610/686 3206/5615/681 +f 3187/5614/654 3219/5613/682 3220/5617/684 +f 3176/5619/652 3208/6446/656 3201/5620/685 +f 3188/5618/670 3220/5617/684 3221/5621/686 +f 3206/5615/681 3208/6447/656 3176/5623/652 +f 3189/5622/655 3221/5621/686 3222/5624/681 +f 3177/5592/660 3209/5591/685 3215/5626/683 +f 3192/5628/652 3224/6448/656 3217/5629/685 +f 3215/5626/683 3210/6449/688 3178/5630/671 +f 3222/5624/681 3224/6450/656 3192/5631/652 +f 3178/5630/671 3210/6449/688 3211/5632/682 +f 3193/5608/660 3225/5607/685 3231/5634/683 +f 3179/5633/654 3211/5632/682 3212/5636/684 +f 3231/5634/683 3226/6439/688 3194/5582/671 +f 3180/5637/670 3212/5636/684 3213/5638/686 +f 3212/5639/684 3243/5657/692 3244/5640/687 +f 3202/5642/688 3234/5658/690 3235/5643/689 +f 3215/5644/683 3246/5660/693 3241/5645/690 +f 3214/5647/681 3213/5641/686 3244/5640/687 +f 3204/5649/684 3203/5597/682 3235/5643/689 +f 3211/5632/682 3210/5646/688 3241/5645/690 +f 3201/5652/685 3233/5668/694 3239/5653/693 +f 3204/5649/684 3236/5650/692 3237/5655/687 +f 3212/5639/684 3211/5632/682 3242/5651/689 +f 3207/5654/683 3239/5653/693 3234/5658/690 +f 3209/5659/685 3240/5663/694 3246/5660/693 +f 3205/5656/686 3237/5655/687 3238/5661/691 +f 3240/5663/694 3254/5722/701 3260/5664/695 +f 3235/5643/689 3249/5676/700 3250/5665/696 +f 3244/5640/687 3243/5657/692 3257/5666/696 +f 3233/5668/694 3247/5725/701 3253/5669/695 +f 3246/5660/693 3260/5664/695 3255/5670/698 +f 3237/5655/687 3236/5650/692 3250/5665/696 +f 3245/5648/691 3244/5640/687 3258/5667/697 +f 3239/5653/693 3253/5669/695 3248/5673/698 +f 3241/5645/690 3255/5670/698 3256/5674/700 +f 3238/5661/691 3237/5655/687 3251/5671/697 +f 3235/5643/689 3234/5658/690 3248/5673/698 +f 3242/5651/689 3256/5674/700 3257/5666/696 +f 3230/5677/681 3229/5699/686 3272/5678/687 +f 3220/5680/684 3219/5613/682 3263/5681/689 +f 3226/5683/688 3269/5700/690 3270/5684/689 +f 3223/5685/683 3217/5717/685 3261/5686/694 +f 3221/5688/686 3220/5680/684 3264/5682/692 +f 3227/5583/682 3270/5684/689 3271/5690/692 +f 3223/5685/683 3267/5687/693 3262/5692/690 +f 3231/5694/683 3225/5713/685 3268/5695/694 +f 3221/5688/686 3265/5689/687 3266/5697/691 +f 3229/5699/686 3228/5691/684 3271/5690/692 +f 3218/5693/688 3262/5692/690 3263/5681/689 +f 3231/5694/683 3274/5696/693 3269/5700/690 +f 3266/5697/691 3265/5689/687 3279/5701/697 +f 3263/5681/689 3262/5692/690 3276/5703/698 +f 3270/5684/689 3284/5712/700 3285/5705/696 +f 3268/5695/694 3282/5715/701 3288/5706/695 +f 3263/5681/689 3277/5704/700 3278/5707/696 +f 3271/5690/692 3285/5705/696 3286/5708/697 +f 3261/5686/694 3275/5719/701 3281/5709/695 +f 3274/5696/693 3288/5706/695 3283/5710/698 +f 3264/5682/692 3278/5707/696 3279/5701/697 +f 3272/5678/687 3286/5708/697 3287/5711/699 +f 3262/5692/690 3267/5687/693 3281/5709/695 +f 3270/5684/689 3269/5700/690 3283/5710/698 +f 3258/5727/697 3304/5788/670 3305/5728/702 +f 3275/5730/701 3307/5756/664 3313/5731/653 +f 3282/5733/701 3232/6451/656 3292/5734/703 +f 3252/5736/699 3298/5767/662 3289/5737/658 +f 3281/5732/695 3313/5731/653 3308/5739/663 +f 3247/5741/701 3293/5790/664 3299/5742/653 +f 3277/5704/700 3276/5740/698 3308/5739/663 +f 3287/5745/699 3319/5787/702 3292/5746/703 +f 3253/5743/695 3299/5742/653 3294/5748/663 +f 3277/5704/700 3309/5744/659 3310/5750/665 +f 3248/5749/698 3294/5748/663 3295/5752/659 +f 3278/5751/696 3310/5750/665 3311/5753/655 +f 3275/5730/701 3224/6452/656 3291/5755/658 +f 3249/5676/700 3295/5752/659 3296/5757/665 +f 3280/5759/699 3279/5754/697 3311/5753/655 +f 3250/5758/696 3296/5757/665 3297/5761/655 +f 3282/5733/701 3314/5735/704 3320/5763/705 +f 3280/5759/699 3312/5760/662 3291/5765/658 +f 3252/5736/699 3251/5762/697 3297/5761/655 +f 3288/5764/695 3320/5763/705 3315/5768/706 +f 3254/5770/701 3300/5775/704 3306/5771/705 +f 3284/5712/700 3283/5769/698 3315/5768/706 +f 3216/5774/656 3290/6453/703 3300/5775/704 +f 3260/5772/695 3306/5771/705 3301/5776/706 +f 3284/5712/700 3316/5773/707 3317/5778/708 +f 3255/5777/698 3301/5776/706 3302/5780/707 +f 3285/5779/696 3317/5778/708 3318/5781/670 +f 3259/5729/699 3305/5728/702 3290/5783/703 +f 3256/5674/700 3302/5780/707 3303/5785/708 +f 3287/5745/699 3286/5782/697 3318/5781/670 +f 3257/5786/696 3303/5785/708 3304/5788/670 +f 3208/5789/656 3289/6454/658 3293/5790/664 +f 3290/5791/703 3305/5830/702 3327/5792/709 +f 3320/5763/705 3334/5812/660 3330/5794/711 +f 3302/5796/707 3325/5816/714 3326/5797/712 +f 3306/5771/705 3300/5811/704 3323/5799/713 +f 3316/5801/707 3315/5795/706 3330/5794/711 +f 3306/5771/705 3328/5800/660 3324/5803/711 +f 3314/5805/704 3292/6455/703 3322/5806/710 +f 3316/5801/707 3331/5802/714 3332/5808/712 +f 3290/5810/703 3321/6456/710 3323/5799/713 +f 3314/5805/704 3329/5807/713 3334/5812/660 +f 3292/5813/703 3319/5834/702 3333/5814/709 +f 3301/5804/706 3324/5803/711 3325/5816/714 +f 3325/5816/714 3324/5803/711 3338/5817/715 +f 3333/5814/709 3347/5835/721 3336/5819/717 +f 3331/5802/714 3330/5794/711 3344/5820/715 +f 3326/5797/712 3325/5816/714 3339/5818/716 +f 3323/5799/713 3321/6456/710 3335/5823/717 +f 3323/5799/713 3337/5824/719 3342/5825/720 +f 3332/5808/712 3331/5802/714 3345/5821/716 +f 3329/5807/713 3343/5829/719 3348/5827/720 +f 3327/5792/709 3341/5832/721 3335/5828/717 +f 3324/5803/711 3328/5800/660 3342/5825/720 +f 3322/5806/710 3336/6457/717 3343/5829/719 +f 3334/5812/660 3348/5827/720 3344/5820/715 +f 3343/5836/719 3359/5852/656 3364/5837/652 +f 3304/5838/670 3349/5846/654 3357/5839/657 +f 3348/5827/720 3364/5837/652 3360/5841/672 +f 3345/5843/716 3344/5842/715 3360/5841/672 +f 3340/5845/718 3356/5864/689 3349/5846/654 +f 3345/5843/716 3361/5844/659 3362/5847/689 +f 3337/5849/719 3353/5863/656 3358/5850/652 +f 3336/5851/717 3352/6458/658 3359/5852/656 +f 3342/5825/720 3358/5850/652 3354/5853/672 +f 3346/5848/718 3362/5847/689 3350/5855/654 +f 3347/5857/721 3363/5865/657 3352/5858/658 +f 3338/5854/715 3354/5853/672 3355/5860/659 +f 3335/5862/717 3351/6459/658 3353/5863/656 +f 3339/5861/716 3355/5860/659 3356/5864/689 +f 3318/5856/670 3350/5855/654 3363/5865/657 +f 3341/5840/721 3357/5839/657 3351/5866/658 +f 3659/5868/722 3666/6460/722 3665/5869/664 +f 3657/5871/653 3664/5877/653 3663/5872/663 +f 3661/5874/665 3668/5881/665 3667/5875/723 +f 3658/5870/664 3665/5869/664 3664/5877/653 +f 3656/5873/663 3663/5872/663 3662/5878/659 +f 3655/5880/659 3662/6461/659 3668/5881/665 +f 3673/5882/722 3678/6462/722 3677/5883/664 +f 3671/5885/653 3676/5888/653 3675/5886/663 +f 3672/5884/664 3677/5883/664 3676/5888/653 +f 3670/5887/663 3675/5886/663 3674/5889/724 +f 3683/5891/722 3688/6463/722 3687/5892/664 +f 3681/5894/653 3686/5897/653 3685/5895/663 +f 3682/5893/664 3687/5892/664 3686/5897/653 +f 3680/5896/663 3685/5895/663 3684/5898/724 +f 3693/5900/722 3698/6464/722 3697/5901/664 +f 3691/5903/653 3696/5906/653 3695/5904/663 +f 3692/5902/664 3697/5901/664 3696/5906/653 +f 3690/5905/663 3695/5904/663 3694/5907/724 +f 3703/5909/722 3708/6465/722 3707/5910/664 +f 3701/5912/653 3706/5915/653 3705/5913/663 +f 3702/5911/664 3707/5910/664 3706/5915/653 +f 3700/5914/663 3705/5913/663 3704/5916/724 +f 3715/5918/725 3722/6466/725 3721/5919/662 +f 3713/5921/658 3720/5927/658 3719/5922/664 +f 3711/5924/653 3718/5928/653 3717/5925/663 +f 3714/5920/662 3721/5919/662 3720/5927/658 +f 3712/5923/664 3719/5922/664 3718/5928/653 +f 3710/5926/663 3717/5925/663 3716/5929/724 +f 3728/5931/655 3735/5938/655 3734/5932/662 +f 3725/5934/726 3732/6467/726 3731/5935/663 +f 3729/5937/665 3736/5944/665 3735/5938/655 +f 3727/5933/662 3734/5932/662 3733/5939/727 +f 3724/5936/663 3731/5935/663 3730/5941/659 +f 3723/5943/659 3730/6468/659 3736/5944/665 +f 3740/5945/655 3745/5949/655 3744/5946/662 +f 3741/5948/665 3746/5953/665 3745/5949/655 +f 3739/5947/662 3744/5946/662 3743/5950/727 +f 3737/5952/728 3742/6469/728 3746/5953/665 +f 3750/5954/655 3755/5958/655 3754/5955/662 +f 3751/5957/665 3756/5962/665 3755/5958/655 +f 3749/5956/662 3754/5955/662 3753/5959/727 +f 3747/5961/728 3752/6470/728 3756/5962/665 +f 3760/5963/655 3765/5967/655 3764/5964/662 +f 3761/5966/665 3766/5971/665 3765/5967/655 +f 3759/5965/662 3764/5964/662 3763/5968/727 +f 3757/5970/728 3762/6471/728 3766/5971/665 +f 3770/5972/655 3775/5976/655 3774/5973/662 +f 3771/5975/665 3776/5980/665 3775/5976/655 +f 3769/5974/662 3774/5973/662 3773/5977/727 +f 3767/5979/728 3772/6472/728 3776/5980/665 +f 3782/5981/655 3789/5988/655 3788/5982/662 +f 3780/5984/658 3787/5989/658 3786/5985/664 +f 3783/5987/665 3790/5993/665 3789/5988/655 +f 3781/5983/662 3788/5982/662 3787/5989/658 +f 3779/5986/664 3786/5985/664 3785/5990/729 +f 3777/5992/728 3784/6473/728 3790/5993/665 +f 3793/5994/726 3798/6474/726 3797/5995/663 +f 3795/5997/665 3800/6003/665 3799/5998/723 +f 3792/5996/663 3797/5995/663 3796/6000/659 +f 3791/6002/659 3796/6475/659 3800/6003/665 +f 3805/6004/725 3810/6476/725 3809/6005/662 +f 3803/6007/658 3808/6010/658 3807/6008/664 +f 3804/6006/662 3809/6005/662 3808/6010/658 +f 3802/6009/664 3807/6008/664 3806/6011/729 +f 3813/6013/726 3818/6477/726 3817/6014/663 +f 3815/6016/665 3820/6022/665 3819/6017/723 +f 3812/6015/663 3817/6014/663 3816/6019/659 +f 3811/6021/659 3816/6478/659 3820/6022/665 +f 3825/6023/725 3830/6479/725 3829/6024/662 +f 3823/6026/658 3828/6029/658 3827/6027/664 +f 3824/6025/662 3829/6024/662 3828/6029/658 +f 3822/6028/664 3827/6027/664 3826/6030/729 +f 3833/6032/726 3838/6480/726 3837/6033/663 +f 3835/6035/665 3840/6041/665 3839/6036/723 +f 3832/6034/663 3837/6033/663 3836/6038/659 +f 3831/6040/659 3836/6481/659 3840/6041/665 +f 3845/6042/725 3850/6482/725 3849/6043/662 +f 3843/6045/658 3848/6048/658 3847/6046/664 +f 3844/6044/662 3849/6043/662 3848/6048/658 +f 3842/6047/664 3847/6046/664 3846/6049/729 +f 3853/6051/726 3858/6483/726 3857/6052/663 +f 3855/6054/665 3860/6060/665 3859/6055/723 +f 3852/6053/663 3857/6052/663 3856/6057/659 +f 3851/6059/659 3856/6484/659 3860/6060/665 +f 3865/6061/725 3870/6485/725 3869/6062/662 +f 3863/6064/658 3868/6067/658 3867/6065/664 +f 3864/6063/662 3869/6062/662 3868/6067/658 +f 3862/6066/664 3867/6065/664 3866/6068/729 +f 4061/6070/661 4077/6077/661 4076/6071/673 +f 4054/6073/674 4070/6079/674 4069/6074/671 +f 4062/6076/675 4078/6083/675 4077/6077/661 +f 4055/6078/654 4071/6486/654 4070/6079/674 +f 4048/6080/676 4064/6088/676 4063/6081/652 +f 4047/6082/652 4063/6081/652 4078/6083/675 +f 4056/6084/677 4072/6090/677 4071/6085/654 +f 4049/6087/660 4065/6092/660 4064/6088/676 +f 4057/6089/670 4073/6094/670 4072/6090/677 +f 4050/6091/678 4066/6096/678 4065/6092/660 +f 4058/6093/679 4074/6098/679 4073/6094/670 +f 4051/6095/653 4067/6100/653 4066/6096/678 +f 4059/6097/655 4075/6101/655 4074/6098/679 +f 4052/6099/680 4068/6102/680 4067/6100/653 +f 4060/6072/673 4076/6071/673 4075/6101/655 +f 4053/6075/671 4069/6074/671 4068/6102/680 +f 4242/6103/661 4236/6119/652 4227/6104/652 +f 4240/6106/670 4241/6115/655 4233/6107/655 +f 4238/6109/671 4239/6487/654 4231/6110/654 +f 4235/6112/660 4237/6118/653 4229/6113/653 +f 4241/6115/655 4242/6103/661 4234/6105/661 +f 4239/6116/654 4240/6106/670 4232/6108/670 +f 4237/6118/653 4238/6109/671 4230/6111/671 +f 4236/6119/652 4235/6112/660 4228/6114/660 +f 4258/6120/661 4252/6136/652 4243/6121/652 +f 4256/6123/670 4257/6132/655 4249/6124/655 +f 4254/6126/671 4255/6488/654 4247/6127/654 +f 4251/6129/660 4253/6135/653 4245/6130/653 +f 4257/6132/655 4258/6120/661 4250/6122/661 +f 4255/6133/654 4256/6123/670 4248/6125/670 +f 4253/6135/653 4254/6126/671 4246/6128/671 +f 4252/6136/652 4251/6129/660 4244/6131/660 +f 4274/6137/661 4268/6153/652 4259/6138/652 +f 4272/6140/670 4273/6149/655 4265/6141/655 +f 4270/6143/671 4271/6489/654 4263/6144/654 +f 4267/6146/660 4269/6152/653 4261/6147/653 +f 4273/6149/655 4274/6137/661 4266/6139/661 +f 4271/6150/654 4272/6140/670 4264/6142/670 +f 4269/6152/653 4270/6143/671 4262/6145/671 +f 4268/6153/652 4267/6146/660 4260/6148/660 +f 4320/6154/685 4319/6213/683 4287/6155/653 +f 4333/6157/682 4332/6490/684 4300/6158/670 +f 4313/6160/686 4307/6194/681 4275/6161/661 +f 4334/6163/688 4333/6157/682 4301/6159/654 +f 4315/6165/681 4322/6491/656 4290/6166/652 +f 4276/6168/670 4308/6492/684 4313/6160/686 +f 4335/6169/683 4334/6163/688 4302/6164/671 +f 4290/6171/652 4322/6493/656 4320/6154/685 +f 4309/6172/682 4308/6492/684 4276/6168/670 +f 4336/6174/685 4335/6169/683 4303/6170/653 +f 4329/6176/686 4323/6203/681 4291/6177/661 +f 4310/6179/688 4309/6172/682 4277/6173/654 +f 4331/6181/681 4338/6494/656 4306/6182/652 +f 4292/6184/670 4324/6495/684 4329/6176/686 +f 4311/6185/683 4310/6179/688 4278/6180/671 +f 4306/6187/652 4338/6496/656 4336/6174/685 +f 4325/6188/682 4324/6495/684 4292/6184/670 +f 4312/6190/685 4311/6185/683 4279/6186/653 +f 4326/6192/688 4325/6188/682 4293/6189/654 +f 4307/6194/681 4314/6497/656 4282/6195/652 +f 4327/6196/683 4326/6192/688 4294/6193/671 +f 4282/6198/652 4314/6498/656 4312/6190/685 +f 4328/6199/685 4327/6196/683 4295/6197/653 +f 4321/6201/686 4315/6165/681 4283/6167/661 +f 4323/6203/681 4330/6499/656 4298/6204/652 +f 4284/6205/670 4316/6500/684 4321/6201/686 +f 4298/6206/652 4330/6501/656 4328/6199/685 +f 4317/6207/682 4316/6500/684 4284/6205/670 +f 4337/6209/686 4331/6181/681 4299/6183/661 +f 4318/6211/688 4317/6207/682 4285/6208/654 +f 4300/6158/670 4332/6490/684 4337/6209/686 +f 4319/6213/683 4318/6211/688 4286/6212/671 +f 4319/6214/683 4350/6238/693 4349/6215/690 +f 4341/6217/689 4340/6231/692 4308/6218/684 +f 4316/6219/684 4347/6243/692 4352/6220/687 +f 4351/6222/694 4350/6238/693 4319/6214/683 +f 4310/6224/688 4342/6230/690 4341/6217/689 +f 4348/6225/689 4347/6243/692 4316/6219/684 +f 4313/6226/686 4345/6241/687 4339/6227/691 +f 4311/6229/683 4343/6244/693 4342/6230/690 +f 4318/6216/688 4349/6215/690 4348/6225/689 +f 4340/6231/692 4345/6241/687 4313/6226/686 +f 4321/6221/686 4352/6220/687 4346/6232/691 +f 4344/6234/694 4343/6244/693 4311/6229/683 +f 4366/6236/697 4360/6291/699 4346/6232/691 +f 4356/6237/698 4355/6324/700 4341/6217/689 +f 4350/6238/693 4364/6245/695 4363/6239/698 +f 4359/6240/697 4353/6295/699 4339/6227/691 +f 4361/6242/696 4366/6236/697 4352/6220/687 +f 4343/6244/693 4357/6247/695 4356/6237/698 +f 4351/6222/694 4365/6293/701 4364/6245/695 +f 4354/6246/696 4359/6240/697 4345/6241/687 +f 4348/6225/689 4362/6352/700 4361/6242/696 +f 4344/6234/694 4358/6297/701 4357/6247/695 +f 4341/6217/689 4355/6324/700 4354/6246/696 +f 4363/6239/698 4362/6352/700 4348/6225/689 +f 4379/6248/694 4378/6276/693 4335/6249/683 +f 4370/6251/690 4369/6268/689 4325/6188/682 +f 4376/6253/689 4375/6280/692 4332/6254/684 +f 4329/6255/686 4373/6278/687 4367/6256/691 +f 4327/6258/683 4371/6271/693 4370/6251/690 +f 4377/6259/690 4376/6253/689 4333/6157/682 +f 4368/6261/692 4373/6278/687 4329/6255/686 +f 4337/6263/686 4380/6269/687 4374/6264/691 +f 4372/6266/694 4371/6271/693 4327/6258/683 +f 4335/6249/683 4378/6276/693 4377/6259/690 +f 4369/6268/689 4368/6261/692 4324/6262/684 +f 4332/6254/684 4375/6280/692 4380/6269/687 +f 4372/6266/694 4386/6289/701 4385/6270/695 +f 4369/6268/689 4383/6315/700 4382/6272/696 +f 4391/6273/698 4390/6344/700 4376/6253/689 +f 4394/6274/697 4388/6283/699 4374/6264/691 +f 4384/6275/698 4383/6315/700 4369/6268/689 +f 4378/6276/693 4392/6281/695 4391/6273/698 +f 4387/6277/697 4381/6287/699 4367/6256/691 +f 4389/6279/696 4394/6274/697 4380/6269/687 +f 4371/6271/693 4385/6270/695 4384/6275/698 +f 4379/6248/694 4393/6285/701 4392/6281/695 +f 4382/6272/696 4387/6277/697 4373/6278/687 +f 4376/6253/689 4390/6344/700 4389/6279/696 +f 4411/6298/730 4410/6359/671 4364/6299/695 +f 4419/6301/655 4413/6502/662 4381/6302/699 +f 4388/6304/699 4420/6503/734 4398/6305/731 +f 4395/6307/658 4404/6338/664 4358/6308/701 +f 4414/6310/665 4419/6301/655 4387/6303/697 +f 4405/6312/655 4399/6360/662 4353/6313/699 +f 4383/6315/700 4415/6504/659 4414/6310/665 +f 4398/6316/731 4425/6505/730 4393/6317/701 +f 4400/6319/665 4405/6312/655 4359/6314/697 +f 4416/6321/663 4415/6504/659 4383/6315/700 +f 4401/6323/659 4400/6319/665 4354/6320/696 +f 4417/6325/653 4416/6321/663 4384/6322/698 +f 4381/6302/699 4413/6502/662 4397/6327/658 +f 4402/6329/663 4401/6323/659 4355/6324/700 +f 4386/6331/701 4418/6506/664 4417/6325/653 +f 4403/6332/653 4402/6329/663 4356/6330/698 +f 4426/6334/732 4420/6503/734 4388/6304/699 +f 4397/6336/658 4418/6506/664 4386/6331/701 +f 4404/6338/664 4403/6332/653 4357/6333/695 +f 4421/6339/733 4426/6334/732 4394/6335/697 +f 4412/6341/732 4406/6345/734 4360/6342/699 +f 4390/6344/700 4422/6507/736 4421/6339/733 +f 4406/6345/734 4396/6508/731 4322/6346/656 +f 4407/6347/733 4412/6341/732 4366/6343/697 +f 4423/6349/735 4422/6507/736 4390/6344/700 +f 4408/6351/736 4407/6347/733 4361/6348/696 +f 4424/6353/671 4423/6349/735 4391/6350/698 +f 4396/6355/731 4411/6298/730 4365/6300/701 +f 4409/6357/735 4408/6351/736 4362/6352/700 +f 4393/6317/701 4425/6505/730 4424/6353/671 +f 4410/6359/671 4409/6357/735 4363/6358/698 +f 4399/6360/662 4395/6509/658 4314/6361/656 +f 4396/6362/731 4427/6399/741 4433/6363/737 +f 4436/6365/738 4440/6381/661 4426/6334/732 +f 4432/6367/739 4431/6385/742 4408/6368/736 +f 4412/6341/732 4434/6394/661 4429/6370/740 +f 4422/6372/736 4437/6389/742 4436/6365/738 +f 4430/6373/738 4434/6394/661 4412/6341/732 +f 4420/6375/734 4435/6397/740 4428/6376/741 +f 4438/6378/739 4437/6389/742 4422/6372/736 +f 4429/6370/740 4427/6392/741 4396/6380/731 +f 4440/6381/661 4435/6397/740 4420/6375/734 +f 4398/6382/731 4428/6388/741 4439/6383/737 +f 4431/6385/742 4430/6373/738 4407/6374/733 +f 4445/6386/743 4444/6510/745 4430/6373/738 +f 4442/6387/744 4453/6405/749 4439/6383/737 +f 4437/6389/742 4451/6511/743 4450/6390/745 +f 4432/6367/739 4446/6403/747 4445/6386/743 +f 4429/6370/740 4443/6512/748 4441/6391/744 +f 4448/6393/746 4443/6512/748 4429/6370/740 +f 4452/6395/747 4451/6511/743 4437/6389/742 +f 4454/6396/746 4449/6400/748 4435/6397/740 +f 4441/6398/744 4447/6402/749 4433/6363/737 +f 4430/6373/738 4444/6510/745 4448/6393/746 +f 4449/6400/748 4442/6513/744 4428/6376/741 +f 4450/6390/745 4454/6396/746 4440/6381/661 +f 4470/6406/652 4465/6420/656 4449/6407/748 +f 4463/6408/657 4455/6414/654 4410/6409/671 +f 4466/6411/672 4470/6406/652 4454/6396/746 +f 4451/6413/743 4467/6514/659 4466/6411/672 +f 4455/6414/654 4462/6433/689 4446/6415/747 +f 4468/6416/689 4467/6514/659 4451/6413/743 +f 4464/6418/652 4459/6431/656 4443/6419/748 +f 4465/6420/656 4458/6515/658 4442/6421/744 +f 4460/6422/672 4464/6418/652 4448/6393/746 +f 4456/6424/654 4468/6416/689 4452/6417/747 +f 4458/6426/658 4469/6434/657 4453/6427/749 +f 4461/6429/659 4460/6422/672 4444/6423/745 +f 4459/6431/656 4457/6516/658 4441/6432/744 +f 4462/6433/689 4461/6429/659 4445/6430/743 +f 4469/6434/657 4456/6424/654 4424/6425/671 +f 4457/6435/658 4463/6408/657 4447/6410/749 diff --git a/src/main/resources/assets/hbm/models/weapons/maresleg_mk2.obj b/src/main/resources/assets/hbm/models/weapons/maresleg_mk2.obj new file mode 100644 index 000000000..420992dda --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/maresleg_mk2.obj @@ -0,0 +1,2314 @@ +# Blender v2.79 (sub 0) OBJ File: 'maresleg.blend' +# www.blender.org +o Circle +v 0.000000 1.187500 8.000000 +v -0.093750 1.162380 8.000000 +v -0.162380 1.093750 8.000000 +v -0.187500 1.000000 8.000000 +v -0.162380 0.906250 8.000000 +v -0.093750 0.837620 8.000000 +v 0.000000 0.812500 8.000000 +v 0.093750 0.837620 8.000000 +v 0.162380 0.906250 8.000000 +v 0.187500 1.000000 8.000000 +v 0.162380 1.093750 8.000000 +v 0.093750 1.162380 8.000000 +v 0.000000 1.187500 -2.000000 +v -0.093750 1.162380 -2.000000 +v -0.162380 1.093750 -2.000000 +v -0.187500 1.000000 -2.000000 +v -0.162380 0.906250 -2.000000 +v -0.093750 0.837620 -2.000000 +v 0.000000 0.812500 -2.000000 +v 0.093750 0.837620 -2.000000 +v 0.162380 0.906250 -2.000000 +v 0.187500 1.000000 -2.000000 +v 0.162380 1.093750 -2.000000 +v 0.093750 1.162380 -2.000000 +v 0.000000 1.187500 3.750000 +v -0.093750 1.162380 3.750000 +v -0.162380 1.093750 3.750000 +v -0.187500 1.000000 3.750000 +v -0.162380 0.906250 3.750000 +v -0.093750 0.837620 3.750000 +v 0.000000 0.812500 3.750000 +v 0.093750 0.837620 3.750000 +v 0.162380 0.906250 3.750000 +v 0.187500 1.000000 3.750000 +v 0.162380 1.093750 3.750000 +v 0.093750 1.162380 3.750000 +v 0.000000 1.187500 3.750000 +v -0.093750 1.162380 3.750000 +v -0.162380 1.093750 3.750000 +v -0.187500 1.000000 3.750000 +v -0.162380 0.906250 3.750000 +v -0.093750 0.837620 3.750000 +v 0.000000 0.812500 3.750000 +v 0.093750 0.837620 3.750000 +v 0.162380 0.906250 3.750000 +v 0.187500 1.000000 3.750000 +v 0.162380 1.093750 3.750000 +v 0.093750 1.162380 3.750000 +v 0.000000 1.125000 8.000000 +v -0.062500 1.108253 8.000000 +v -0.108253 1.062500 8.000000 +v -0.125000 1.000000 8.000000 +v -0.108253 0.937500 8.000000 +v -0.062500 0.891747 8.000000 +v 0.000000 0.875000 8.000000 +v 0.062500 0.891747 8.000000 +v 0.108253 0.937500 8.000000 +v 0.125000 1.000000 8.000000 +v 0.108253 1.062500 8.000000 +v 0.062500 1.108253 8.000000 +v 0.000000 1.125000 7.000000 +v -0.062500 1.108253 7.000000 +v -0.108253 1.062500 7.000000 +v -0.125000 1.000000 7.000000 +v -0.108253 0.937500 7.000000 +v -0.062500 0.891747 7.000000 +v 0.000000 0.875000 7.000000 +v 0.062500 0.891747 7.000000 +v 0.108253 0.937500 7.000000 +v 0.125000 1.000000 7.000000 +v 0.108253 1.062500 7.000000 +v 0.062500 1.108253 7.000000 +v 0.000000 1.125000 3.750000 +v -0.062500 1.108253 3.750000 +v -0.108253 1.062500 3.750000 +v -0.125000 1.000000 3.750000 +v -0.108253 0.937500 3.750000 +v -0.062500 0.891747 3.750000 +v 0.000000 0.875000 3.750000 +v 0.062500 0.891747 3.750000 +v 0.108253 0.937500 3.750000 +v 0.125000 1.000000 3.750000 +v 0.108253 1.062500 3.750000 +v 0.062500 1.108253 3.750000 +v 0.000000 1.125000 2.750000 +v -0.062500 1.108253 2.750000 +v -0.108253 1.062500 2.750000 +v -0.125000 1.000000 2.750000 +v -0.108253 0.937500 2.750000 +v -0.062500 0.891747 2.750000 +v 0.000000 0.875000 2.750000 +v 0.062500 0.891747 2.750000 +v 0.108253 0.937500 2.750000 +v 0.125000 1.000000 2.750000 +v 0.108253 1.062500 2.750000 +v 0.062500 1.108253 2.750000 +v 0.000000 1.187500 3.000000 +v -0.093750 1.162380 3.000000 +v -0.162380 1.093750 3.000000 +v -0.187500 1.000000 3.000000 +v -0.162380 0.906250 3.000000 +v -0.093750 0.837620 3.000000 +v 0.000000 0.812500 3.000000 +v 0.093750 0.837620 3.000000 +v 0.162380 0.906250 3.000000 +v 0.187500 1.000000 3.000000 +v 0.162380 1.093750 3.000000 +v 0.093750 1.162380 3.000000 +v 0.000000 1.250000 3.000000 +v -0.125000 1.216506 3.000000 +v -0.216506 1.125000 3.000000 +v -0.250000 1.000000 3.000000 +v 0.250000 1.000000 3.000000 +v 0.216506 1.125000 3.000000 +v 0.125000 1.216506 3.000000 +v 0.000000 1.250000 3.250000 +v -0.125000 1.216506 3.250000 +v -0.216506 1.125000 3.250000 +v -0.250000 1.000000 3.250000 +v 0.250000 1.000000 3.250000 +v 0.216506 1.125000 3.250000 +v 0.125000 1.216506 3.250000 +v 0.000000 1.187500 3.250000 +v -0.093750 1.162380 3.250000 +v -0.162380 1.093750 3.250000 +v -0.187500 1.000000 3.250000 +v -0.162380 0.906250 3.250000 +v -0.093750 0.837620 3.250000 +v 0.000000 0.812500 3.250000 +v 0.093750 0.837620 3.250000 +v 0.162380 0.906250 3.250000 +v 0.187500 1.000000 3.250000 +v 0.162380 1.093750 3.250000 +v 0.093750 1.162380 3.250000 +v 0.000000 0.750000 -2.000000 +v -0.093750 0.724880 -2.000000 +v -0.162380 0.656250 -2.000000 +v -0.187500 0.562500 -2.000000 +v -0.162380 0.468750 -2.000000 +v -0.093750 0.400120 -2.000000 +v 0.000000 0.375000 -2.000000 +v 0.093750 0.400120 -2.000000 +v 0.162380 0.468750 -2.000000 +v 0.187500 0.562500 -2.000000 +v 0.162380 0.656250 -2.000000 +v 0.093750 0.724880 -2.000000 +v 0.000000 0.750000 3.000000 +v -0.093750 0.724880 3.000000 +v -0.162380 0.656250 3.000000 +v -0.187500 0.562500 3.000000 +v -0.162380 0.468750 3.000000 +v -0.093750 0.400120 3.000000 +v 0.000000 0.375000 3.000000 +v 0.093750 0.400120 3.000000 +v 0.162380 0.468750 3.000000 +v 0.187500 0.562500 3.000000 +v 0.162380 0.656250 3.000000 +v 0.093750 0.724880 3.000000 +v -0.250000 0.562500 3.000000 +v -0.216506 0.437500 3.000000 +v -0.125000 0.345994 3.000000 +v 0.000000 0.312500 3.000000 +v 0.125000 0.345994 3.000000 +v 0.216506 0.437500 3.000000 +v 0.250000 0.562500 3.000000 +v -0.250000 0.562500 3.250000 +v -0.216506 0.437500 3.250000 +v -0.125000 0.345994 3.250000 +v 0.000000 0.312500 3.250000 +v 0.125000 0.345994 3.250000 +v 0.216506 0.437500 3.250000 +v 0.250000 0.562500 3.250000 +v 0.000000 1.250000 -2.000000 +v -0.125000 1.216506 -2.000000 +v -0.216506 1.125000 -2.000000 +v -0.250000 1.000000 -2.000000 +v 0.250000 1.000000 -2.000000 +v 0.216506 1.125000 -2.000000 +v 0.125000 1.216506 -2.000000 +v -0.250000 0.562500 -2.000000 +v -0.216506 0.437500 -2.000000 +v -0.125000 0.345994 -2.000000 +v 0.000000 0.312500 -2.000000 +v 0.125000 0.345994 -2.000000 +v 0.216506 0.437500 -2.000000 +v 0.250000 0.562500 -2.000000 +v -0.125000 1.216506 -2.375000 +v 0.000000 1.250000 -2.375000 +v -0.216506 1.125000 -2.375000 +v -0.250000 1.000000 -2.375000 +v 0.216506 1.125000 -2.375000 +v 0.250000 1.000000 -2.375000 +v 0.125000 1.216506 -2.375000 +v -0.250000 0.562500 -2.375000 +v 0.250000 0.562500 -2.375000 +v -0.216506 0.437500 -2.375000 +v -0.125000 0.345994 -2.375000 +v 0.000000 0.312500 -2.375000 +v 0.125000 0.345994 -2.375000 +v 0.216506 0.437500 -2.375000 +v 0.000000 1.125000 -2.375000 +v -0.062500 1.108253 -2.375000 +v -0.108253 1.062500 -2.375000 +v -0.125000 1.000000 -2.375000 +v -0.108253 0.937500 -2.375000 +v -0.062500 0.891747 -2.375000 +v 0.000000 0.875000 -2.375000 +v 0.062500 0.891747 -2.375000 +v 0.108253 0.937500 -2.375000 +v 0.125000 1.000000 -2.375000 +v 0.108253 1.062500 -2.375000 +v 0.062500 1.108253 -2.375000 +v 0.000000 0.687500 -2.375000 +v -0.062500 0.670753 -2.375000 +v -0.108253 0.625000 -2.375000 +v -0.125000 0.562500 -2.375000 +v -0.108253 0.500000 -2.375000 +v -0.062500 0.454247 -2.375000 +v 0.000000 0.437500 -2.375000 +v 0.062500 0.454247 -2.375000 +v 0.108253 0.500000 -2.375000 +v 0.125000 0.562500 -2.375000 +v 0.108253 0.625000 -2.375000 +v 0.062500 0.670753 -2.375000 +v 0.000000 1.125000 -1.375000 +v -0.062500 1.108253 -1.375000 +v -0.108253 1.062500 -1.375000 +v -0.125000 1.000000 -1.375000 +v -0.108253 0.937500 -1.375000 +v -0.062500 0.891747 -1.375000 +v 0.000000 0.875000 -1.375000 +v 0.062500 0.891747 -1.375000 +v 0.108253 0.937500 -1.375000 +v 0.125000 1.000000 -1.375000 +v 0.108253 1.062500 -1.375000 +v 0.062500 1.108253 -1.375000 +v 0.000000 0.687500 -1.375000 +v -0.062500 0.670753 -1.375000 +v -0.108253 0.625000 -1.375000 +v -0.125000 0.562500 -1.375000 +v -0.108253 0.500000 -1.375000 +v -0.062500 0.454247 -1.375000 +v 0.000000 0.437500 -1.375000 +v 0.062500 0.454247 -1.375000 +v 0.108253 0.500000 -1.375000 +v 0.125000 0.562500 -1.375000 +v 0.108253 0.625000 -1.375000 +v 0.062500 0.670753 -1.375000 +v 0.312500 1.125000 -2.125000 +v 0.312500 1.125000 -2.500000 +v 0.187500 1.125000 -2.125000 +v 0.187500 1.125000 -2.500000 +v 0.312500 0.437500 -2.125000 +v 0.187500 0.437500 -2.125000 +v 0.312500 0.187500 -2.375000 +v 0.312500 1.000000 -2.625000 +v 0.187500 1.000000 -2.625000 +v 0.312500 1.000000 -3.000000 +v 0.187500 1.000000 -3.000000 +v 0.312500 0.562500 -3.750000 +v 0.312500 0.875000 -3.375000 +v 0.187500 0.875000 -3.375000 +v 0.312500 -0.062500 -2.875000 +v 0.312500 -0.062500 -3.875000 +v -0.187500 1.125000 -2.125000 +v -0.187500 1.125000 -2.500000 +v -0.312500 1.125000 -2.125000 +v -0.312500 1.125000 -2.500000 +v -0.187500 0.437500 -2.125000 +v -0.312500 0.437500 -2.125000 +v -0.312500 0.187500 -2.375000 +v -0.187500 1.000000 -2.625000 +v -0.312500 1.000000 -2.625000 +v -0.187500 1.000000 -3.000000 +v -0.312500 1.000000 -3.000000 +v -0.312500 0.562500 -3.750000 +v -0.187500 0.875000 -3.375000 +v -0.312500 0.875000 -3.375000 +v -0.312500 -0.062500 -2.875000 +v -0.312500 -0.062500 -3.875000 +v -0.187500 0.769607 -3.582107 +v -0.187500 0.445183 -3.798880 +v 0.250000 0.562500 -2.000000 +v -0.250000 0.562500 -2.000000 +v 0.250000 1.000000 -2.000000 +v -0.250000 1.000000 -2.000000 +v 0.250000 0.562500 1.625000 +v -0.250000 0.562500 1.625000 +v 0.250000 1.000000 1.625000 +v -0.250000 1.000000 1.625000 +v 0.250000 0.687500 1.750000 +v -0.250000 0.687500 1.750000 +v 0.250000 0.874000 1.750000 +v -0.250000 0.874000 1.750000 +v 0.187500 0.562500 -2.000000 +v 0.187500 1.000000 -2.000000 +v -0.187500 0.562500 -2.000000 +v -0.187500 1.000000 -2.000000 +v 0.187500 0.562500 -1.375000 +v 0.187500 1.000000 -1.375000 +v -0.187500 0.562500 -1.375000 +v -0.187500 1.000000 -1.375000 +v 0.187500 1.187500 -2.375000 +v -0.187500 1.187500 -2.375000 +v 0.187500 0.437500 -2.375000 +v -0.187500 0.437500 -2.375000 +v -0.187500 0.437500 -2.875000 +v 0.187500 0.437500 -2.875000 +v -0.187500 1.187500 -2.500000 +v 0.187500 1.187500 -2.500000 +v -0.187500 -0.062500 -2.875000 +v 0.187500 -0.062500 -2.875000 +v 0.187500 -0.062500 -2.875000 +v -0.187500 -0.062500 -2.875000 +v -0.187500 0.062500 -3.875000 +v 0.187500 -0.062500 -3.875000 +v -0.187500 -0.062500 -3.875000 +v -0.187500 0.562500 -3.750000 +v 0.187500 0.562500 -3.750000 +v 0.187500 0.062500 -3.875000 +v 0.187500 0.445183 -3.798880 +v 0.187500 0.769607 -3.582107 +v 0.187500 0.986380 -3.257684 +v 0.187500 1.062500 -2.875000 +v -0.187500 0.986380 -3.257684 +v -0.187500 1.062500 -2.875000 +v 0.187500 -0.062500 -3.875000 +v -0.187500 -0.062500 -3.875000 +v -0.187500 1.062500 -2.625000 +v 0.187500 1.062500 -2.625000 +v 0.312500 0.437500 -4.125000 +v -0.312500 0.437500 -4.125000 +v 0.312500 -0.187500 -4.125000 +v -0.312500 -0.187500 -4.125000 +v -0.187500 0.437500 -3.500000 +v 0.187500 0.437500 -3.500000 +v -0.250000 -0.250000 -4.125000 +v 0.250000 -0.250000 -4.125000 +v -0.250000 0.500000 -4.125000 +v 0.250000 0.500000 -4.125000 +v -0.250000 -0.250000 -5.625000 +v -0.250000 -1.000000 -5.250000 +v 0.250000 -1.000000 -5.250000 +v 0.250000 -0.250000 -5.625000 +v 0.375000 -0.125000 -4.125000 +v 0.375000 0.375000 -4.125000 +v 0.375000 -0.875000 -5.312500 +v 0.375000 -0.375000 -5.562500 +v -0.375000 0.375000 -4.125000 +v -0.375000 -0.125000 -4.125000 +v -0.375000 -0.375000 -5.562500 +v -0.375000 -0.875000 -5.312500 +v -0.250000 -0.500000 -5.750000 +v -0.250000 -1.000000 -5.500000 +v 0.250000 -1.000000 -5.500000 +v 0.250000 -0.500000 -5.750000 +v -0.375000 -0.375000 -5.562500 +v -0.375000 -0.625000 -5.437500 +v -0.375000 -1.375000 -8.000000 +v -0.375000 0.000000 -5.562500 +v -0.375000 -0.125000 -8.000000 +v 0.375000 -0.375000 -5.562500 +v 0.375000 -0.625000 -5.437500 +v 0.375000 -1.375000 -8.000000 +v 0.375000 0.000000 -5.562500 +v 0.375000 -0.125000 -8.000000 +v 0.250000 0.000000 -8.000000 +v -0.250000 0.000000 -8.000000 +v -0.250000 -1.500000 -8.000000 +v 0.250000 -1.500000 -8.000000 +v 0.250000 -0.750000 -5.375000 +v -0.250000 -0.750000 -5.375000 +v 0.250000 0.125000 -5.562500 +v -0.250000 0.125000 -5.562500 +v 0.125000 -0.062500 -3.750000 +v -0.125000 -0.062500 -3.750000 +v -0.125000 -0.062500 -3.625000 +v 0.125000 -0.062500 -3.625000 +v 0.125000 -0.812500 -4.875000 +v -0.125000 -0.812500 -4.875000 +v 0.125000 -1.062500 -4.875000 +v -0.125000 -1.062500 -4.875000 +v 0.125000 -1.187500 -4.750000 +v -0.125000 -1.187500 -4.750000 +v 0.125000 -1.187500 -4.500000 +v -0.125000 -1.187500 -4.500000 +v 0.125000 -0.687500 -3.750000 +v -0.125000 -0.687500 -3.750000 +v 0.125000 -0.437500 -3.750000 +v -0.125000 -0.437500 -3.750000 +v 0.125000 -0.437500 -3.250000 +v -0.125000 -0.437500 -3.250000 +v 0.125000 -0.187500 -3.000000 +v -0.125000 -0.187500 -3.000000 +v 0.125000 -0.062500 -3.000000 +v -0.125000 -0.062500 -3.000000 +v 0.125000 -0.187500 -3.062500 +v -0.125000 -0.187500 -3.062500 +v 0.125000 -0.062500 -3.062500 +v -0.125000 -0.062500 -3.062500 +v 0.125000 -0.375000 -3.625000 +v -0.125000 -0.375000 -3.625000 +v 0.125000 -0.375000 -3.250000 +v -0.125000 -0.375000 -3.250000 +v 0.125000 -0.250000 -3.812500 +v -0.125000 -0.250000 -3.812500 +v 0.125000 -1.125000 -4.750000 +v -0.125000 -1.125000 -4.750000 +v 0.125000 -1.125000 -4.500000 +v -0.125000 -1.125000 -4.500000 +v 0.125000 -0.812500 -4.812500 +v -0.125000 -0.812500 -4.812500 +v 0.125000 -1.062500 -4.812500 +v -0.125000 -1.062500 -4.812500 +v 0.125000 -0.750000 -3.937500 +v -0.125000 -0.750000 -3.937500 +v 0.125000 -0.500000 -3.937500 +v -0.125000 -0.500000 -3.937500 +v 0.125000 -0.437500 -4.250000 +v -0.125000 -0.437500 -4.250000 +v 0.125000 -0.437500 -4.000000 +v -0.125000 -0.437500 -4.000000 +v 0.062500 -0.062500 -3.562500 +v -0.062500 -0.062500 -3.562500 +v 0.062500 -0.062500 -3.500000 +v -0.062500 -0.062500 -3.500000 +v 0.062500 -0.187500 -3.562500 +v -0.062500 -0.187500 -3.562500 +v 0.062500 -0.187500 -3.500000 +v -0.062500 -0.187500 -3.500000 +v 0.062500 -0.312500 -3.437500 +v -0.062500 -0.312500 -3.437500 +v 0.000000 1.625000 -2.375000 +v -0.062500 1.608253 -2.375000 +v -0.108253 1.562500 -2.375000 +v -0.125000 1.500000 -2.375000 +v -0.108253 1.437500 -2.375000 +v -0.062500 1.391747 -2.375000 +v 0.000000 1.375000 -2.375000 +v 0.062500 1.391747 -2.375000 +v 0.108253 1.437500 -2.375000 +v 0.125000 1.500000 -2.375000 +v 0.108253 1.562500 -2.375000 +v 0.062500 1.608253 -2.375000 +v 0.000000 1.625000 -1.625000 +v -0.062500 1.608253 -1.625000 +v -0.108253 1.562500 -1.625000 +v -0.125000 1.500000 -1.625000 +v -0.108253 1.437500 -1.625000 +v -0.062500 1.391747 -1.625000 +v 0.000000 1.375000 -1.625000 +v 0.062500 1.391747 -1.625000 +v 0.108253 1.437500 -1.625000 +v 0.125000 1.500000 -1.625000 +v 0.108253 1.562500 -1.625000 +v 0.062500 1.608253 -1.625000 +v 0.000000 1.640625 -2.375000 +v -0.070312 1.621785 -2.375000 +v -0.121785 1.570312 -2.375000 +v -0.140625 1.500000 -2.375000 +v -0.121785 1.429688 -2.375000 +v -0.070312 1.378215 -2.375000 +v 0.000000 1.359375 -2.375000 +v 0.070312 1.378215 -2.375000 +v 0.121785 1.429688 -2.375000 +v 0.140625 1.500000 -2.375000 +v 0.121785 1.570312 -2.375000 +v 0.070312 1.621785 -2.375000 +v 0.000000 1.640625 -2.437500 +v -0.070312 1.621785 -2.437500 +v -0.121785 1.570312 -2.437500 +v -0.140625 1.500000 -2.437500 +v -0.121785 1.429688 -2.437500 +v -0.070312 1.378215 -2.437500 +v 0.000000 1.359375 -2.437500 +v 0.070312 1.378215 -2.437500 +v 0.121785 1.429688 -2.437500 +v 0.140625 1.500000 -2.437500 +v 0.121785 1.570312 -2.437500 +v 0.070312 1.621785 -2.437500 +vt 0.004098 0.224299 +vt 0.000000 0.205607 +vt 0.004098 0.205607 +vt 0.004098 -0.000000 +vt 0.000000 0.009346 +vt 0.000000 -0.000000 +vt 0.004098 0.037383 +vt 0.000000 0.018692 +vt 0.004098 0.018692 +vt 0.004098 0.056075 +vt 0.000000 0.037383 +vt 0.000000 0.065421 +vt 0.000000 0.056075 +vt 0.004098 0.093458 +vt 0.000000 0.074766 +vt 0.004098 0.074766 +vt 0.000000 0.102804 +vt 0.000000 0.093458 +vt 0.004098 0.130841 +vt 0.000000 0.112150 +vt 0.004098 0.112150 +vt 0.000000 0.140187 +vt 0.000000 0.130841 +vt 0.004098 0.168224 +vt 0.000000 0.149533 +vt 0.004098 0.149533 +vt 0.000000 0.177570 +vt 0.000000 0.168224 +vt 0.004098 0.186916 +vt 0.000000 0.196262 +vt 0.000000 0.186916 +vt 0.073770 0.224346 +vt 0.080851 0.233668 +vt 0.073770 0.261635 +vt 0.073770 0.336468 +vt 0.080862 0.345804 +vt 0.073770 0.373812 +vt 0.286885 0.224299 +vt 0.282787 0.205607 +vt 0.286885 0.205607 +vt 0.286885 0.186916 +vt 0.282787 0.196262 +vt 0.282787 0.186916 +vt 0.286885 0.168224 +vt 0.282787 0.177570 +vt 0.282787 0.168224 +vt 0.282787 0.149533 +vt 0.286885 0.149533 +vt 0.286885 0.130841 +vt 0.282787 0.140187 +vt 0.282787 0.130841 +vt 0.282787 0.112150 +vt 0.286885 0.112150 +vt 0.286885 0.093458 +vt 0.282787 0.102804 +vt 0.282787 0.093458 +vt 0.282787 0.074766 +vt 0.286885 0.074766 +vt 0.286885 0.056075 +vt 0.282787 0.065421 +vt 0.282787 0.056075 +vt 0.282787 0.037383 +vt 0.286885 0.037383 +vt 0.282787 0.018692 +vt 0.286885 0.018692 +vt 0.286885 0.000000 +vt 0.282787 0.009346 +vt 0.282787 -0.000000 +vt 0.571329 0.341081 +vt 0.573778 0.359421 +vt 0.567782 0.345750 +vt 0.575825 0.351334 +vt 0.581967 0.364425 +vt 0.581967 0.355087 +vt 0.590157 0.359421 +vt 0.588109 0.351334 +vt 0.596152 0.345750 +vt 0.594252 0.327074 +vt 0.592606 0.341081 +vt 0.588109 0.302814 +vt 0.596152 0.243035 +vt 0.592606 0.313068 +vt 0.569683 0.327074 +vt 0.565588 0.327074 +vt 0.557370 0.359421 +vt 0.559819 0.341081 +vt 0.563365 0.345750 +vt 0.549180 0.364425 +vt 0.555323 0.351334 +vt 0.540991 0.359421 +vt 0.549180 0.355087 +vt 0.534996 0.345750 +vt 0.543038 0.351334 +vt 0.532801 0.327074 +vt 0.538542 0.341081 +vt 0.598346 0.327074 +vt 0.598346 0.261711 +vt 0.565588 0.261711 +vt 0.571329 0.313068 +vt 0.575825 0.302814 +vt 0.567782 0.243035 +vt 0.573778 0.229364 +vt 0.581967 0.299061 +vt 0.581967 0.224360 +vt 0.590157 0.229364 +vt 0.561465 0.327074 +vt 0.565560 0.327074 +vt 0.532801 0.261711 +vt 0.538542 0.313068 +vt 0.559819 0.313068 +vt 0.555323 0.302814 +vt 0.563365 0.243035 +vt 0.549180 0.299061 +vt 0.557370 0.229364 +vt 0.540991 0.229364 +vt 0.543038 0.302814 +vt 0.534996 0.243035 +vt 0.476516 0.252326 +vt 0.483607 0.224321 +vt 0.490697 0.252326 +vt 0.476543 0.364441 +vt 0.483607 0.336542 +vt 0.490670 0.364441 +vt 0.620900 0.302820 +vt 0.625399 0.275706 +vt 0.625399 0.313079 +vt 0.614754 0.299064 +vt 0.620900 0.285965 +vt 0.608608 0.302820 +vt 0.614754 0.289721 +vt 0.604109 0.313079 +vt 0.608608 0.285965 +vt 0.602462 0.327095 +vt 0.604109 0.275706 +vt 0.627046 0.261690 +vt 0.627046 0.327095 +vt 0.631143 0.327095 +vt 0.631143 0.261690 +vt 0.602462 0.261690 +vt 0.598365 0.327095 +vt 0.598365 0.261690 +vt 0.600561 0.345781 +vt 0.604109 0.341110 +vt 0.608608 0.351370 +vt 0.614754 0.355125 +vt 0.606559 0.359461 +vt 0.620900 0.351370 +vt 0.614754 0.364468 +vt 0.625399 0.341110 +vt 0.622949 0.359461 +vt 0.628948 0.345781 +vt 0.628948 0.243004 +vt 0.625399 0.247675 +vt 0.620900 0.237416 +vt 0.614754 0.233660 +vt 0.622949 0.229324 +vt 0.606559 0.229324 +vt 0.608608 0.237416 +vt 0.600561 0.243004 +vt 0.604109 0.247675 +vt 0.643444 0.310911 +vt 0.647541 0.280377 +vt 0.647541 0.308408 +vt 0.651638 0.310911 +vt 0.654638 0.271034 +vt 0.654638 0.317751 +vt 0.655736 0.327095 +vt 0.640444 0.271034 +vt 0.640444 0.317751 +vt 0.639346 0.261690 +vt 0.639346 0.327095 +vt 0.631152 0.327095 +vt 0.631152 0.261690 +vt 0.663930 0.327095 +vt 0.655736 0.261690 +vt 0.663930 0.261690 +vt 0.654638 0.336438 +vt 0.661735 0.345781 +vt 0.651638 0.343278 +vt 0.655736 0.359461 +vt 0.647541 0.345781 +vt 0.647541 0.364468 +vt 0.639346 0.359461 +vt 0.640444 0.336438 +vt 0.633347 0.345781 +vt 0.640444 0.252347 +vt 0.633347 0.243004 +vt 0.643444 0.245507 +vt 0.639346 0.229324 +vt 0.647541 0.224317 +vt 0.651638 0.245507 +vt 0.655736 0.229324 +vt 0.661735 0.243004 +vt 0.654638 0.252347 +vt 0.713115 0.186916 +vt 0.721311 0.289720 +vt 0.713115 0.289720 +vt 0.803279 0.252336 +vt 0.778689 0.271028 +vt 0.770492 0.112150 +vt 0.721311 0.485981 +vt 0.713115 0.383178 +vt 0.721311 0.383178 +vt 0.803279 0.420561 +vt 0.827869 0.467290 +vt 0.770492 0.560748 +vt 0.975410 0.317757 +vt 0.909836 0.261682 +vt 0.975410 0.261682 +vt 0.028689 0.728972 +vt 0.266393 0.663551 +vt 0.266393 0.728972 +vt 0.266393 0.588785 +vt 0.028689 0.523364 +vt 0.266393 0.523364 +vt 0.020492 0.570093 +vt 0.028689 0.588785 +vt 0.020492 0.682243 +vt 0.028689 0.663551 +vt 0.852459 0.504673 +vt 0.877049 0.392523 +vt 0.877049 0.504673 +vt 0.975410 0.635514 +vt 1.000000 0.616822 +vt 1.000000 0.635514 +vt 0.975410 0.598131 +vt 1.000000 0.598131 +vt 0.852459 0.392523 +vt 0.877049 0.317757 +vt 0.836066 0.112150 +vt 0.852459 0.186916 +vt 0.827869 0.205607 +vt 0.836066 0.560748 +vt 0.852459 0.485981 +vt 0.852459 0.579439 +vt 0.852459 0.102804 +vt 0.852459 0.000000 +vt 0.885246 0.018692 +vt 0.959016 0.158879 +vt 0.942623 0.102804 +vt 0.959016 0.102804 +vt 0.959016 0.084112 +vt 0.934426 0.037383 +vt 0.942623 0.158879 +vt 0.909836 0.242991 +vt 0.885246 0.242991 +vt 0.852459 0.158879 +vt 0.885246 0.392523 +vt 0.909836 0.317757 +vt 0.909836 0.392523 +vt 0.934426 0.224299 +vt 0.959016 0.177570 +vt 0.893443 0.485981 +vt 0.909836 0.392523 +vt 0.877049 0.392523 +vt 0.893443 0.485981 +vt 0.885246 0.504673 +vt 0.934942 0.474589 +vt 0.956208 0.442187 +vt 0.970412 0.393687 +vt 0.266393 0.738318 +vt 0.274590 0.644860 +vt 0.315574 0.663551 +vt 0.803279 0.803738 +vt 0.721311 0.803738 +vt 0.803279 0.691589 +vt 0.520492 0.691589 +vt 0.520492 0.803738 +vt 0.495902 0.710280 +vt 0.545082 0.691589 +vt 0.553279 0.710280 +vt 0.336066 0.878505 +vt 0.344262 0.887850 +vt 0.336066 0.887850 +vt 0.344262 0.934579 +vt 0.336066 0.925234 +vt 0.344262 0.925234 +vt 0.368852 0.887850 +vt 0.393443 0.878505 +vt 0.401639 0.887850 +vt 0.393443 0.934579 +vt 0.368852 0.925234 +vt 0.401639 0.925234 +vt 0.364754 0.878505 +vt 0.364754 0.934579 +vt 0.241803 0.738318 +vt 0.258197 0.728972 +vt 0.241803 0.728972 +vt 0.258197 0.738318 +vt 0.241803 0.728972 +vt 0.258197 0.728972 +vt 0.262295 0.747664 +vt 0.266393 0.785047 +vt 0.266393 0.747664 +vt 0.262295 0.785047 +vt 0.266393 0.747664 +vt 0.266393 0.785047 +vt 0.262295 0.747664 +vt 0.204918 0.794393 +vt 0.192623 0.803738 +vt 0.204918 0.831776 +vt 0.204918 0.794393 +vt 0.192623 0.803738 +vt 0.204918 0.831776 +vt 0.192623 0.841121 +vt 0.196721 0.869159 +vt 0.209016 0.841121 +vt 0.209016 0.841121 +vt 0.196721 0.869159 +vt 0.225410 0.841121 +vt 0.192623 0.897196 +vt 0.225410 0.841121 +vt 0.168033 0.785047 +vt 0.172131 0.766355 +vt 0.172131 0.785047 +vt 0.180328 0.803738 +vt 0.184426 0.785047 +vt 0.184426 0.803738 +vt 0.168033 0.803738 +vt 0.172131 0.803738 +vt 0.180328 0.785047 +vt 0.180328 0.766355 +vt 0.778689 0.803764 +vt 0.785777 0.813097 +vt 0.778689 0.841096 +vt 0.762295 0.878505 +vt 0.766393 0.869159 +vt 0.766393 0.878505 +vt 0.762295 0.822430 +vt 0.766393 0.831776 +vt 0.762295 0.831776 +vt 0.762295 0.906542 +vt 0.766393 0.915888 +vt 0.762295 0.915888 +vt 0.766393 0.887850 +vt 0.762295 0.887850 +vt 0.762295 0.841121 +vt 0.766393 0.841121 +vt 0.762295 0.813084 +vt 0.766393 0.803738 +vt 0.766393 0.813084 +vt 0.762295 0.897196 +vt 0.766393 0.897196 +vt 0.766393 0.850467 +vt 0.762295 0.850467 +vt 0.762295 0.859813 +vt 0.762295 0.869159 +vt 0.766393 0.822430 +vt 0.766393 0.906542 +vt 0.766393 0.859813 +vt 0.787992 0.831765 +vt 0.795082 0.803760 +vt 0.802173 0.831765 +vt 0.000000 0.214953 +vt 0.000000 0.028037 +vt 0.000000 0.046729 +vt 0.000000 0.084112 +vt 0.000000 0.121495 +vt 0.000000 0.158879 +vt 0.069682 0.259137 +vt 0.066690 0.233668 +vt 0.066690 0.252313 +vt 0.065594 0.242991 +vt 0.069682 0.226844 +vt 0.077859 0.226844 +vt 0.081947 0.242991 +vt 0.080851 0.252313 +vt 0.077858 0.259137 +vt 0.069676 0.371311 +vt 0.066679 0.345804 +vt 0.066679 0.364476 +vt 0.065582 0.355140 +vt 0.069676 0.338970 +vt 0.077865 0.338970 +vt 0.081959 0.355140 +vt 0.080862 0.364476 +vt 0.077865 0.371311 +vt 0.282787 0.214953 +vt 0.282787 0.158879 +vt 0.282787 0.121495 +vt 0.282787 0.084112 +vt 0.282787 0.046729 +vt 0.282787 0.028037 +vt 0.536896 0.327074 +vt 0.565560 0.261711 +vt 0.549180 0.224360 +vt 0.487700 0.259160 +vt 0.483607 0.261661 +vt 0.479513 0.259160 +vt 0.475419 0.242991 +vt 0.476516 0.233656 +vt 0.479513 0.226822 +vt 0.487700 0.226822 +vt 0.490697 0.233656 +vt 0.491794 0.242991 +vt 0.487685 0.371248 +vt 0.483607 0.373740 +vt 0.479529 0.371248 +vt 0.475451 0.355141 +vt 0.476543 0.345842 +vt 0.479529 0.339034 +vt 0.487685 0.339034 +vt 0.490670 0.345842 +vt 0.491763 0.355141 +vt 0.614754 0.224317 +vt 0.643444 0.277874 +vt 0.651638 0.277874 +vt 0.643444 0.343278 +vt 0.647541 0.243004 +vt 0.721311 0.186916 +vt 0.745902 0.289720 +vt 0.754098 0.271028 +vt 0.737705 0.149533 +vt 0.713115 0.485981 +vt 0.754098 0.401869 +vt 0.745902 0.383178 +vt 0.778689 0.401869 +vt 0.737705 0.523364 +vt 0.020492 0.542056 +vt 0.020492 0.710280 +vt 0.975410 0.616822 +vt 0.852459 0.317757 +vt 0.852459 0.093458 +vt 0.877049 0.000000 +vt 0.909836 0.018692 +vt 0.877049 0.261682 +vt 0.852459 0.261682 +vt 0.885246 0.317757 +vt 0.877049 0.504673 +vt 0.885246 0.504673 +vt 0.909836 0.485981 +vt 0.909836 0.485981 +vt 0.970417 0.393693 +vt 0.975410 0.336449 +vt 0.909836 0.317757 +vt 0.975410 0.317757 +vt 0.975410 0.336449 +vt 0.956204 0.442175 +vt 0.934941 0.474575 +vt 0.315574 0.738318 +vt 0.307377 0.757009 +vt 0.274590 0.757009 +vt 0.266393 0.663551 +vt 0.307377 0.644860 +vt 0.713115 0.785047 +vt 0.713115 0.710280 +vt 0.721311 0.691589 +vt 0.811475 0.710280 +vt 0.811475 0.785047 +vt 0.504098 0.803738 +vt 0.495902 0.785047 +vt 0.504098 0.691589 +vt 0.553279 0.785047 +vt 0.545082 0.803738 +vt 0.344262 0.878505 +vt 0.336066 0.934579 +vt 0.368852 0.878505 +vt 0.368852 0.934579 +vt 0.348361 0.878505 +vt 0.348361 0.934579 +vt 0.258197 0.738318 +vt 0.241803 0.738318 +vt 0.262295 0.785047 +vt 0.192623 0.841121 +vt 0.184426 0.850467 +vt 0.184426 0.850467 +vt 0.192623 0.897196 +vt 0.184426 0.897196 +vt 0.184426 0.897196 +vt 0.774596 0.838595 +vt 0.771600 0.813097 +vt 0.771600 0.831763 +vt 0.770503 0.822430 +vt 0.774596 0.806265 +vt 0.782781 0.806265 +vt 0.786874 0.822430 +vt 0.785777 0.831763 +vt 0.782781 0.838595 +vt 0.762295 0.803738 +vt 0.799176 0.838599 +vt 0.795082 0.841100 +vt 0.790989 0.838599 +vt 0.786895 0.822430 +vt 0.787992 0.813095 +vt 0.790989 0.806261 +vt 0.799176 0.806261 +vt 0.802173 0.813095 +vt 0.803269 0.822430 +vt 0.282787 0.149533 +vt 0.282787 0.130841 +vt 0.282787 0.018692 +vt 0.282787 0.074766 +vt 0.282787 0.205607 +vt 0.282787 0.093458 +vt 0.282787 0.112150 +vt 0.282787 0.168224 +vt 0.282787 -0.000000 +vt 0.282787 0.056075 +vt 0.282787 0.037383 +vt 0.282787 0.186916 +vt 0.663934 0.224299 +vt 0.663934 0.205607 +vt 0.663934 0.186916 +vt 0.663934 0.168224 +vt 0.663934 0.149533 +vt 0.663934 0.130841 +vt 0.663934 0.112150 +vt 0.663934 0.093458 +vt 0.663934 0.074766 +vt 0.663934 0.056075 +vt 0.663934 0.037383 +vt 0.663934 0.018692 +vt 0.663934 0.000000 +vt -0.000000 0.252336 +vt 0.065574 0.261682 +vt -0.000000 0.261682 +vt -0.000000 0.299065 +vt 0.065574 0.308411 +vt -0.000000 0.308411 +vt -0.000000 0.327103 +vt 0.065574 0.336449 +vt -0.000000 0.336449 +vt -0.000000 0.242991 +vt 0.065574 0.252336 +vt -0.000000 0.289720 +vt 0.065574 0.299065 +vt -0.000000 0.271028 +vt 0.065574 0.280374 +vt -0.000000 0.280374 +vt -0.000000 0.317757 +vt 0.065574 0.327103 +vt -0.000000 0.233645 +vt 0.065574 0.242991 +vt 0.065574 0.289720 +vt 0.065574 0.271028 +vt 0.065574 0.317757 +vt -0.000000 0.224299 +vt 0.065574 0.233645 +vt -0.000000 0.364486 +vt 0.065574 0.373832 +vt -0.000000 0.373832 +vt -0.000000 0.411215 +vt 0.065574 0.420561 +vt -0.000000 0.420561 +vt -0.000000 0.439252 +vt 0.065574 0.448598 +vt -0.000000 0.448598 +vt -0.000000 0.355140 +vt 0.065574 0.364486 +vt -0.000000 0.401869 +vt 0.065574 0.411215 +vt -0.000000 0.383178 +vt 0.065574 0.392523 +vt -0.000000 0.392523 +vt -0.000000 0.429907 +vt 0.065574 0.439252 +vt -0.000000 0.345794 +vt 0.065574 0.355140 +vt 0.065574 0.401869 +vt 0.065574 0.383178 +vt 0.065574 0.429907 +vt -0.000000 0.336449 +vt 0.065574 0.345794 +vt 0.688525 0.196262 +vt 0.704918 0.214953 +vt 0.688525 0.214953 +vt 0.688525 0.158879 +vt 0.704918 0.177570 +vt 0.688525 0.177570 +vt 0.704918 0.196262 +vt 0.688525 0.140187 +vt 0.704918 0.158879 +vt 0.688525 0.121495 +vt 0.704918 0.140187 +vt 0.704918 0.233645 +vt 0.688525 0.233645 +vt 0.688525 0.299065 +vt 0.704918 0.299065 +vt 0.409836 0.448598 +vt 0.081967 0.429907 +vt 0.409836 0.429907 +vt 0.081967 0.411215 +vt 0.409836 0.411215 +vt 0.081967 0.392523 +vt 0.409836 0.392523 +vt 0.081967 0.373832 +vt 0.409836 0.373832 +vt 0.081967 0.355140 +vt 0.409836 0.355140 +vt 0.081967 0.336449 +vt 0.409836 0.336449 +vt 0.081967 0.317757 +vt 0.409836 0.317757 +vt 0.081967 0.299065 +vt 0.409836 0.299065 +vt 0.081967 0.280374 +vt 0.409836 0.280374 +vt 0.081967 0.261682 +vt 0.409836 0.261682 +vt 0.081967 0.242991 +vt 0.409836 0.242991 +vt 0.081967 0.224299 +vt 0.409836 0.224299 +vt 0.704918 0.056075 +vt 0.688525 0.056075 +vt 0.688525 0.336449 +vt 0.704918 0.355140 +vt 0.688525 0.355140 +vt 0.688525 0.037383 +vt 0.688525 0.317757 +vt 0.704918 0.336449 +vt 0.688525 0.018692 +vt 0.704918 0.037383 +vt 0.704918 0.317757 +vt 0.688525 -0.000000 +vt 0.704918 0.018692 +vt 0.663934 0.317757 +vt 0.688525 0.336449 +vt 0.663934 0.336449 +vt 0.663934 0.214953 +vt 0.688525 0.233645 +vt 0.663934 0.233645 +vt 0.688525 0.355140 +vt 0.663934 0.355140 +vt 0.663934 0.121495 +vt 0.688525 0.140187 +vt 0.663934 0.140187 +vt 0.663934 -0.000000 +vt 0.688525 0.018692 +vt 0.663934 0.018692 +vt 0.688525 0.158879 +vt 0.663934 0.158879 +vt 0.688525 0.037383 +vt 0.663934 0.037383 +vt 0.688525 0.177570 +vt 0.663934 0.177570 +vt 0.688525 0.056075 +vt 0.663934 0.056075 +vt 0.688525 0.299065 +vt 0.663934 0.299065 +vt 0.688525 0.121495 +vt 0.688525 0.196262 +vt 0.663934 0.196262 +vt 0.688525 0.317757 +vt 0.688525 0.214953 +vt 0.409836 0.401869 +vt 0.475410 0.392523 +vt 0.475410 0.401869 +vt 0.409836 0.355140 +vt 0.475410 0.345794 +vt 0.475410 0.355140 +vt 0.409836 0.327103 +vt 0.475410 0.317757 +vt 0.475410 0.327103 +vt 0.409836 0.280374 +vt 0.475410 0.271028 +vt 0.475410 0.280374 +vt 0.409836 0.345794 +vt 0.475410 0.336449 +vt 0.409836 0.317757 +vt 0.475410 0.308411 +vt 0.409836 0.271028 +vt 0.475410 0.261682 +vt 0.409836 0.448598 +vt 0.475410 0.439252 +vt 0.475410 0.448598 +vt 0.409836 0.308411 +vt 0.475410 0.299065 +vt 0.409836 0.261682 +vt 0.475410 0.252336 +vt 0.409836 0.439252 +vt 0.475410 0.429907 +vt 0.409836 0.299065 +vt 0.475410 0.289720 +vt 0.409836 0.392523 +vt 0.475410 0.383178 +vt 0.409836 0.252336 +vt 0.475410 0.242991 +vt 0.409836 0.429907 +vt 0.475410 0.420561 +vt 0.409836 0.289720 +vt 0.409836 0.383178 +vt 0.475410 0.373832 +vt 0.409836 0.242991 +vt 0.475410 0.233645 +vt 0.409836 0.420561 +vt 0.475410 0.411215 +vt 0.409836 0.373832 +vt 0.475410 0.364486 +vt 0.409836 0.233645 +vt 0.475410 0.224299 +vt 0.409836 0.411215 +vt 0.409836 0.364486 +vt 0.409836 0.336449 +vt 0.475410 0.336449 +vt 0.745902 0.308411 +vt 0.754098 0.289720 +vt 0.778689 0.289720 +vt 0.754098 0.308411 +vt 0.803279 0.289720 +vt 0.778689 0.308411 +vt 0.721311 0.018692 +vt 0.737705 0.093458 +vt 0.721311 0.074766 +vt 0.721311 0.364486 +vt 0.745902 0.364486 +vt 0.754098 0.364486 +vt 0.778689 0.364486 +vt 0.754098 0.383178 +vt 0.803279 0.364486 +vt 0.778689 0.383178 +vt 0.827869 0.383178 +vt 0.827869 0.364486 +vt 0.852459 0.383178 +vt 0.770492 0.093458 +vt 0.836066 0.074766 +vt 0.840164 0.093458 +vt 0.000000 0.588785 +vt 0.008197 0.663551 +vt 0.000000 0.663551 +vt 0.020492 0.588785 +vt 0.020492 0.663551 +vt 0.008197 0.588785 +vt 0.225410 0.514019 +vt 0.028689 0.448598 +vt 0.225410 0.654206 +vt 0.836066 0.018692 +vt 0.770492 0.000000 +vt 0.836066 0.000000 +vt 0.770492 0.074766 +vt 0.827869 0.308411 +vt 0.803279 0.308411 +vt 0.803279 0.383178 +vt 1.000000 0.504673 +vt 0.975410 0.560748 +vt 0.975410 0.504673 +vt 1.000000 0.336449 +vt 0.975410 0.392523 +vt 1.000000 0.317757 +vt 1.000000 0.392523 +vt 0.975410 0.448598 +vt 1.000000 0.560748 +vt 1.000000 0.448598 +vt 0.852459 0.289720 +vt 0.827869 0.289720 +vt 0.852459 -0.000000 +vt 0.426230 0.663551 +vt 0.442623 0.738318 +vt 0.426230 0.738318 +vt 0.336066 0.448598 +vt 0.426230 0.523364 +vt 0.336066 0.523364 +vt 0.319672 0.635514 +vt 0.426230 0.635514 +vt 0.319672 0.766355 +vt 0.331967 0.551402 +vt 0.426230 0.850467 +vt 0.442623 0.766355 +vt 0.442623 0.850467 +vt 0.426230 0.551402 +vt 0.331967 0.850467 +vt 0.426230 0.766355 +vt 0.336066 0.878505 +vt 0.426230 0.878505 +vt 0.475410 0.663551 +vt 0.475410 0.738318 +vt 0.491803 0.738318 +vt 0.491803 0.663551 +vt 0.442623 0.635514 +vt 0.442623 0.551402 +vt 0.553279 0.813084 +vt 0.536885 0.392523 +vt 0.713115 0.364486 +vt 0.713115 0.392523 +vt 0.553279 0.682243 +vt 0.713115 0.682243 +vt 0.536885 0.467290 +vt 0.713115 0.495327 +vt 0.536885 0.495327 +vt 0.713115 1.000000 +vt 0.553279 0.869159 +vt 0.713115 0.813084 +vt 0.553279 0.626168 +vt 0.545082 0.588785 +vt 0.147541 0.897196 +vt 0.057377 0.934579 +vt 0.057377 0.897196 +vt 0.163934 0.897196 +vt 0.147541 0.934579 +vt 0.176230 0.897196 +vt 0.163934 0.934579 +vt 0.192623 0.897196 +vt 0.176230 0.934579 +vt 0.250000 0.897196 +vt 0.192623 0.934579 +vt 0.266393 0.897196 +vt 0.250000 0.934579 +vt 0.336066 0.971963 +vt 0.348361 0.971963 +vt 0.364754 0.971963 +vt 0.368852 0.971963 +vt 0.409836 0.934579 +vt 0.393443 0.971963 +vt 0.409836 0.971963 +vt 0.426230 0.934579 +vt 0.426230 0.971963 +vt 0.077869 0.728972 +vt 0.061475 0.766355 +vt 0.061475 0.728972 +vt 0.077869 0.766355 +vt 0.086066 0.728972 +vt 0.086066 0.766355 +vt 0.102459 0.728972 +vt 0.020492 0.766355 +vt 0.168033 0.766355 +vt 0.184426 0.728972 +vt 0.184426 0.766355 +vt 0.143443 0.728972 +vt 0.102459 0.766355 +vt 0.159836 0.728972 +vt 0.143443 0.766355 +vt 0.159836 0.766355 +vt 0.168033 0.728972 +vt 0.159836 0.803738 +vt 0.159836 0.785047 +vt 0.168033 0.766355 +vt 0.770492 0.018692 +vt 0.737705 0.000000 +vt 0.721311 -0.000000 +vt 0.721311 0.093458 +vt 0.713115 0.850467 +vt 0.713115 0.897196 +vt 0.713115 0.906542 +vt 0.713115 0.803738 +vt 0.713115 0.813084 +vt 0.713115 0.859813 +vt 0.713115 0.822430 +vt 0.713115 0.869159 +vt 0.713115 0.831776 +vt 0.713115 0.878505 +vt 0.713115 0.841121 +vt 0.713115 0.887850 +vt 0.770492 0.813084 +vt 0.770492 0.897196 +vt 0.770492 0.850467 +vt 0.770492 0.869159 +vt 0.770492 0.822430 +vt 0.770492 0.906542 +vt 0.770492 0.859813 +vt 0.770492 0.878505 +vt 0.770492 0.831776 +vt 0.770492 0.915888 +vt 0.770492 0.887850 +vt 0.770492 0.841121 +vt 0.282787 0.224299 +vt 0.065574 0.224299 +vt 0.065574 0.336449 +vt 0.704918 0.121495 +vt 0.081967 0.448598 +vt 0.704918 0.000000 +vt 0.688525 -0.000000 +vt 0.409836 0.336449 +vt 0.409836 0.224299 +vt 0.721311 0.308411 +vt 0.266393 0.448598 +vt 0.225410 0.457944 +vt 0.266393 0.457944 +vt 0.266393 0.514019 +vt 0.225410 0.598131 +vt 0.266393 0.598131 +vt 0.266393 0.654206 +vt 0.442623 0.663551 +vt 0.426230 0.448598 +vt 0.536885 0.364486 +vt 0.713115 0.467290 +vt 0.545082 0.906542 +vt 0.266393 0.934579 +vt 0.344262 0.971963 +vt 0.020492 0.728972 +vt 0.159836 0.766355 +vt 0.713115 0.915888 +vt 0.770492 0.803738 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.8944 0.4472 +vn 0.0000 0.4472 0.8944 +vn -0.8660 0.5000 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.8660 -0.5000 0.0000 +vn 0.8660 0.5000 0.0000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.8660 -0.5000 0.0000 +vn -0.9914 0.1305 0.0000 +vn 0.9914 0.1305 0.0000 +vn 0.9914 -0.1305 0.0000 +vn -0.9914 -0.1305 0.0000 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9871 -0.1602 +vn 0.0000 0.8736 -0.4866 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.8112 0.5847 +vn 0.0000 0.9024 -0.4308 +vn 0.0000 0.9487 -0.3162 +vn 0.0000 -0.9732 0.2298 +vn 0.0000 -0.9522 0.3054 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.9231 0.3845 +vn 0.0000 0.3808 0.9246 +vn 0.0000 0.9952 -0.0980 +vn 0.0000 0.0980 -0.9952 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 -0.8944 0.4472 +vn 0.3702 0.6646 -0.6490 +vn -0.4346 -0.0292 -0.9002 +vn -0.3702 0.6646 -0.6490 +vn 0.3158 0.8487 -0.4243 +vn -0.3158 0.8487 -0.4243 +vn -0.3875 -0.7728 0.5027 +vn 0.3803 -0.8832 0.2744 +vn 0.3875 -0.7728 0.5027 +vn 0.8592 0.4574 -0.2292 +vn 0.9085 0.1932 -0.3706 +vn -0.8592 0.4574 -0.2292 +vn 0.9547 -0.2517 0.1590 +vn -0.9201 -0.3912 -0.0217 +vn -0.4362 -0.7533 -0.4922 +vn 0.9201 -0.3912 -0.0217 +vn -0.9547 -0.2517 0.1590 +vn -0.9085 0.1932 -0.3706 +vn -0.3803 -0.8832 0.2744 +vn 0.4362 -0.7533 -0.4922 +vn 0.4346 -0.0292 -0.9002 +vn -0.3867 0.9210 -0.0472 +vn -0.9193 0.3932 -0.0202 +vn -0.3779 0.9246 -0.0474 +vn -0.3846 -0.8870 0.2557 +vn -0.8923 -0.4340 0.1241 +vn -0.3487 -0.9012 0.2575 +vn 0.3867 0.9210 -0.0472 +vn 0.9193 0.3932 -0.0202 +vn 0.9281 0.3719 -0.0191 +vn 0.3846 -0.8870 0.2557 +vn 0.8923 -0.4340 0.1241 +vn 0.9180 -0.3806 0.1114 +vn 0.3779 0.9246 -0.0474 +vn -0.9281 0.3719 -0.0191 +vn 0.0000 0.4719 -0.8817 +vn 0.0000 0.8321 -0.5547 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 -0.9239 -0.3827 +vn 0.0000 -0.9571 0.2898 +vn 0.0000 -0.4719 0.8817 +vn 0.0000 0.9571 0.2898 +vn 0.0000 0.0985 0.9951 +vn 0.0000 0.9239 0.3827 +vn 0.0000 0.9571 -0.2898 +vn 0.0000 0.3827 0.9239 +vn 0.0000 0.2298 0.9732 +vn 0.0000 -0.7071 -0.7071 +vn -0.9180 -0.3806 0.1114 +vn 0.3487 -0.9012 0.2575 +s off +f 7/1/1 54/2/1 6/3/1 +f 7/4/1 56/5/1 55/6/1 +f 9/7/1 56/8/1 8/9/1 +f 10/10/1 57/11/1 9/7/1 +f 10/10/1 59/12/1 58/13/1 +f 12/14/1 59/15/1 11/16/1 +f 12/14/1 49/17/1 60/18/1 +f 2/19/1 49/20/1 1/21/1 +f 2/19/1 51/22/1 50/23/1 +f 4/24/1 51/25/1 3/26/1 +f 4/24/1 53/27/1 52/28/1 +f 5/29/1 54/30/1 53/31/1 +f 67/32/1 69/33/1 61/34/1 +f 91/35/1 93/36/1 85/37/1 +f 43/38/1 78/39/1 42/40/1 +f 41/41/1 78/42/1 77/43/1 +f 40/44/1 77/45/1 76/46/1 +f 40/44/1 75/47/1 39/48/1 +f 38/49/1 75/50/1 74/51/1 +f 38/49/1 73/52/1 37/53/1 +f 48/54/1 73/55/1 84/56/1 +f 48/54/1 83/57/1 47/58/1 +f 46/59/1 83/60/1 82/61/1 +f 46/59/1 81/62/1 45/63/1 +f 45/63/1 80/64/1 44/65/1 +f 43/66/1 80/67/1 79/68/1 +f 107/69/2 115/70/2 114/71/2 +f 108/72/2 109/73/2 115/70/2 +f 97/74/2 110/75/2 109/73/2 +f 98/76/2 111/77/2 110/75/2 +f 100/78/2 111/77/2 99/79/2 +f 102/80/2 160/81/2 101/82/2 +f 106/83/2 114/71/2 113/84/2 +f 122/85/1 133/86/1 121/87/1 +f 116/88/1 134/89/1 122/85/1 +f 117/90/1 123/91/1 116/88/1 +f 118/92/1 124/93/1 117/90/1 +f 119/94/1 125/95/1 118/92/1 +f 112/96/2 101/82/2 159/97/2 +f 165/98/2 105/99/2 113/84/2 +f 104/100/2 164/101/2 163/102/2 +f 103/103/2 163/102/2 162/104/2 +f 103/103/2 161/105/2 102/80/2 +f 121/87/1 132/106/1 120/107/1 +f 166/108/1 127/109/1 119/94/1 +f 120/107/1 132/106/1 131/110/1 +f 130/111/1 171/112/1 131/110/1 +f 129/113/1 170/114/1 130/111/1 +f 168/115/1 129/113/1 128/116/1 +f 167/117/1 128/116/1 127/109/1 +f 247/118/2 243/119/2 239/120/2 +f 235/121/2 231/122/2 227/123/2 +f 20/124/1 145/125/1 21/126/1 +f 19/127/1 146/128/1 20/124/1 +f 18/129/1 135/130/1 19/127/1 +f 17/131/1 136/132/1 18/129/1 +f 16/133/1 137/134/1 17/131/1 +f 21/126/1 144/135/1 22/136/1 +f 177/137/1 144/135/1 186/138/1 +f 138/139/1 176/140/1 180/141/1 +f 175/142/1 16/133/1 15/143/1 +f 14/144/1 175/142/1 15/143/1 +f 13/145/1 174/146/1 14/144/1 +f 24/147/1 173/148/1 13/145/1 +f 23/149/1 179/150/1 24/147/1 +f 22/136/1 178/151/1 23/149/1 +f 185/152/1 144/135/1 143/153/1 +f 142/154/1 185/152/1 143/153/1 +f 141/155/1 184/156/1 142/154/1 +f 182/157/1 141/155/1 140/158/1 +f 181/159/1 140/158/1 139/160/1 +f 180/141/1 139/160/1 138/139/1 +f 208/161/2 213/162/2 207/163/2 +f 213/162/2 206/164/2 207/163/2 +f 206/164/2 215/165/2 205/166/2 +f 215/165/2 204/167/2 205/166/2 +f 223/168/2 208/161/2 209/169/2 +f 222/170/2 209/169/2 210/171/2 +f 222/170/2 192/172/2 195/173/2 +f 190/174/2 216/175/2 194/176/2 +f 203/177/2 190/174/2 189/178/2 +f 202/179/2 189/178/2 187/180/2 +f 201/181/2 187/180/2 188/182/2 +f 193/183/2 201/181/2 188/182/2 +f 211/184/2 193/183/2 191/185/2 +f 192/172/2 211/184/2 191/185/2 +f 221/186/2 195/173/2 200/187/2 +f 220/188/2 200/187/2 199/189/2 +f 198/190/2 220/188/2 199/189/2 +f 218/191/2 198/190/2 197/192/2 +f 196/193/2 218/191/2 197/192/2 +f 194/176/2 217/194/2 196/193/2 +f 254/195/1 249/196/1 251/197/1 +f 261/198/3 258/199/3 263/200/3 +f 270/201/1 265/202/1 267/203/1 +f 278/204/4 276/205/4 279/206/4 +f 327/207/5 311/208/5 328/209/5 +f 288/210/4 286/211/4 284/212/4 +f 285/213/3 287/214/3 283/215/3 +f 293/216/3 287/214/3 289/217/3 +f 288/210/4 294/218/4 290/219/4 +f 304/220/1 305/221/1 303/222/1 +f 303/223/6 309/224/6 304/225/6 +f 309/224/7 330/226/7 329/227/7 +f 306/228/5 308/229/5 305/221/5 +f 264/230/3 331/231/3 260/232/3 +f 280/233/4 332/234/4 334/235/4 +f 254/236/4 251/237/4 257/238/4 +f 318/239/8 336/240/8 319/241/8 +f 319/242/4 336/240/4 262/243/4 +f 335/244/3 274/245/3 272/246/3 +f 254/236/6 335/244/6 269/247/6 +f 307/248/1 312/249/1 308/250/1 +f 277/251/3 335/244/3 318/252/3 +f 329/253/4 307/254/4 306/255/4 +f 330/256/3 310/257/3 303/222/3 +f 325/258/4 281/259/4 307/254/4 +f 308/250/3 312/249/3 321/260/3 +f 337/261/1 345/262/1 340/263/1 +f 359/264/2 361/265/2 364/266/2 +f 362/267/9 357/268/9 371/269/9 +f 362/267/1 365/270/1 373/271/1 +f 400/272/4 394/273/4 396/274/4 +f 397/275/3 395/276/3 393/277/3 +f 392/278/4 402/279/4 390/280/4 +f 401/281/3 391/282/3 389/283/3 +f 394/273/4 404/284/4 392/278/4 +f 403/285/3 393/277/3 391/282/3 +f 410/286/4 384/287/4 386/288/4 +f 407/289/3 385/290/3 383/291/3 +f 414/292/4 380/293/4 382/294/4 +f 411/295/3 381/296/3 379/297/3 +f 384/287/4 414/292/4 382/294/4 +f 413/298/3 383/291/3 381/296/3 +f 386/288/4 416/299/4 410/286/4 +f 388/300/4 418/301/4 416/299/4 +f 385/290/3 415/302/3 387/303/3 +f 387/303/3 417/304/3 389/305/3 +f 406/306/4 422/307/4 418/301/4 +f 389/305/3 421/308/3 405/309/3 +f 380/293/4 420/310/4 376/311/4 +f 379/297/3 419/312/3 411/295/3 +f 420/310/4 422/307/4 406/306/4 +f 405/309/3 421/308/3 419/312/3 +f 428/313/4 432/314/4 430/315/4 +f 425/316/3 427/317/3 423/318/3 +f 424/319/4 430/315/4 426/320/4 +f 429/321/3 431/322/3 427/317/3 +f 451/323/1 453/324/1 445/325/1 +f 435/326/1 458/327/1 459/328/1 +f 441/329/1 466/330/1 442/331/1 +f 438/332/1 463/333/1 439/334/1 +f 435/326/1 460/335/1 436/336/1 +f 443/337/1 466/330/1 467/338/1 +f 440/339/1 463/340/1 464/341/1 +f 437/342/1 460/335/1 461/343/1 +f 443/337/1 468/344/1 444/345/1 +f 433/346/1 458/327/1 434/347/1 +f 440/339/1 465/348/1 441/329/1 +f 438/332/1 461/343/1 462/349/1 +f 433/346/1 468/344/1 457/350/1 +f 479/351/2 475/352/2 471/353/2 +f 7/1/1 55/354/1 54/2/1 +f 7/4/1 8/9/1 56/5/1 +f 9/7/1 57/355/1 56/8/1 +f 10/10/1 58/356/1 57/11/1 +f 10/10/1 11/16/1 59/12/1 +f 12/14/1 60/357/1 59/15/1 +f 12/14/1 1/21/1 49/17/1 +f 2/19/1 50/358/1 49/20/1 +f 2/19/1 3/26/1 51/22/1 +f 4/24/1 52/359/1 51/25/1 +f 4/24/1 5/29/1 53/27/1 +f 5/29/1 6/3/1 54/30/1 +f 61/34/1 62/360/1 65/361/1 +f 62/360/1 63/362/1 65/361/1 +f 63/362/1 64/363/1 65/361/1 +f 65/361/1 66/364/1 67/32/1 +f 67/32/1 68/365/1 69/33/1 +f 69/33/1 70/366/1 71/367/1 +f 71/367/1 72/368/1 69/33/1 +f 72/368/1 61/34/1 69/33/1 +f 65/361/1 67/32/1 61/34/1 +f 85/37/1 86/369/1 89/370/1 +f 86/369/1 87/371/1 89/370/1 +f 87/371/1 88/372/1 89/370/1 +f 89/370/1 90/373/1 91/35/1 +f 91/35/1 92/374/1 93/36/1 +f 93/36/1 94/375/1 95/376/1 +f 95/376/1 96/377/1 93/36/1 +f 96/377/1 85/37/1 93/36/1 +f 89/370/1 91/35/1 85/37/1 +f 43/38/1 79/378/1 78/39/1 +f 41/41/1 42/40/1 78/42/1 +f 40/44/1 41/41/1 77/45/1 +f 40/44/1 76/379/1 75/47/1 +f 38/49/1 39/48/1 75/50/1 +f 38/49/1 74/380/1 73/52/1 +f 48/54/1 37/53/1 73/55/1 +f 48/54/1 84/381/1 83/57/1 +f 46/59/1 47/58/1 83/60/1 +f 46/59/1 82/382/1 81/62/1 +f 45/63/1 81/383/1 80/64/1 +f 43/66/1 44/65/1 80/67/1 +f 107/69/2 108/72/2 115/70/2 +f 108/72/2 97/74/2 109/73/2 +f 97/74/2 98/76/2 110/75/2 +f 98/76/2 99/79/2 111/77/2 +f 100/78/2 112/96/2 111/77/2 +f 102/80/2 161/105/2 160/81/2 +f 106/83/2 107/69/2 114/71/2 +f 122/85/1 134/89/1 133/86/1 +f 116/88/1 123/91/1 134/89/1 +f 117/90/1 124/93/1 123/91/1 +f 118/92/1 125/95/1 124/93/1 +f 119/94/1 126/384/1 125/95/1 +f 100/78/2 101/82/2 112/96/2 +f 101/82/2 160/81/2 159/97/2 +f 164/101/2 105/99/2 165/98/2 +f 105/99/2 106/83/2 113/84/2 +f 104/100/2 105/99/2 164/101/2 +f 103/103/2 104/100/2 163/102/2 +f 103/103/2 162/104/2 161/105/2 +f 121/87/1 133/86/1 132/106/1 +f 167/117/1 127/109/1 166/108/1 +f 127/109/1 126/384/1 119/94/1 +f 171/112/1 172/385/1 131/110/1 +f 172/385/1 120/107/1 131/110/1 +f 130/111/1 170/114/1 171/112/1 +f 129/113/1 169/386/1 170/114/1 +f 168/115/1 169/386/1 129/113/1 +f 167/117/1 168/115/1 128/116/1 +f 239/120/2 238/387/2 237/388/2 +f 237/388/2 248/389/2 239/120/2 +f 248/389/2 247/118/2 239/120/2 +f 247/118/2 246/390/2 243/119/2 +f 246/390/2 245/391/2 243/119/2 +f 245/391/2 244/392/2 243/119/2 +f 243/119/2 242/393/2 241/394/2 +f 241/394/2 240/395/2 243/119/2 +f 240/395/2 239/120/2 243/119/2 +f 227/123/2 226/396/2 225/397/2 +f 225/397/2 236/398/2 227/123/2 +f 236/398/2 235/121/2 227/123/2 +f 235/121/2 234/399/2 231/122/2 +f 234/399/2 233/400/2 231/122/2 +f 233/400/2 232/401/2 231/122/2 +f 231/122/2 230/402/2 229/403/2 +f 229/403/2 228/404/2 231/122/2 +f 228/404/2 227/123/2 231/122/2 +f 20/124/1 146/128/1 145/125/1 +f 19/127/1 135/130/1 146/128/1 +f 18/129/1 136/132/1 135/130/1 +f 17/131/1 137/134/1 136/132/1 +f 16/133/1 138/139/1 137/134/1 +f 21/126/1 145/125/1 144/135/1 +f 177/137/1 22/136/1 144/135/1 +f 138/139/1 16/133/1 176/140/1 +f 175/142/1 176/140/1 16/133/1 +f 14/144/1 174/146/1 175/142/1 +f 13/145/1 173/148/1 174/146/1 +f 24/147/1 179/150/1 173/148/1 +f 23/149/1 178/151/1 179/150/1 +f 22/136/1 177/137/1 178/151/1 +f 185/152/1 186/138/1 144/135/1 +f 142/154/1 184/156/1 185/152/1 +f 141/155/1 183/405/1 184/156/1 +f 182/157/1 183/405/1 141/155/1 +f 181/159/1 182/157/1 140/158/1 +f 180/141/1 181/159/1 139/160/1 +f 208/161/2 224/406/2 213/162/2 +f 213/162/2 214/407/2 206/164/2 +f 206/164/2 214/407/2 215/165/2 +f 215/165/2 216/175/2 204/167/2 +f 223/168/2 224/406/2 208/161/2 +f 222/170/2 223/168/2 209/169/2 +f 222/170/2 210/171/2 192/172/2 +f 190/174/2 204/167/2 216/175/2 +f 203/177/2 204/167/2 190/174/2 +f 202/179/2 203/177/2 189/178/2 +f 201/181/2 202/179/2 187/180/2 +f 193/183/2 212/408/2 201/181/2 +f 211/184/2 212/408/2 193/183/2 +f 192/172/2 210/171/2 211/184/2 +f 221/186/2 222/170/2 195/173/2 +f 220/188/2 221/186/2 200/187/2 +f 198/190/2 219/409/2 220/188/2 +f 218/191/2 219/409/2 198/190/2 +f 196/193/2 217/194/2 218/191/2 +f 194/176/2 216/175/2 217/194/2 +f 254/195/1 253/410/1 249/196/1 +f 250/411/3 249/196/3 256/412/3 +f 249/196/3 253/410/3 256/412/3 +f 253/410/3 255/413/3 256/412/3 +f 255/413/3 263/200/3 258/199/3 +f 256/412/3 255/413/3 258/199/3 +f 263/200/3 264/230/3 260/232/3 +f 260/232/3 261/198/3 263/200/3 +f 270/201/1 269/414/1 265/202/1 +f 270/201/4 267/203/4 273/415/4 +f 267/203/4 268/416/4 273/415/4 +f 273/415/4 275/417/4 271/418/4 +f 275/417/4 278/204/4 279/206/4 +f 279/206/4 271/418/4 275/417/4 +f 271/418/4 270/201/4 273/415/4 +f 276/205/4 280/233/4 279/206/4 +f 327/207/5 312/249/5 311/208/5 +f 288/210/4 290/219/4 286/211/4 +f 285/213/3 289/217/3 287/214/3 +f 293/216/3 291/419/3 287/214/3 +f 288/210/4 292/420/4 294/218/4 +f 304/220/1 306/228/1 305/221/1 +f 303/223/6 310/421/6 309/224/6 +f 309/224/7 310/421/7 330/226/7 +f 306/228/5 307/422/5 308/229/5 +f 264/230/3 333/423/3 331/231/3 +f 280/233/4 276/205/4 332/234/4 +f 251/237/4 252/424/4 257/238/4 +f 257/238/4 259/425/4 336/240/4 +f 259/425/4 262/243/4 336/240/4 +f 336/240/4 254/236/4 257/238/4 +f 318/239/8 335/244/8 336/240/8 +f 272/246/3 266/426/3 265/427/3 +f 265/427/3 269/247/3 272/246/3 +f 269/247/3 335/244/3 272/246/3 +f 335/244/3 277/251/3 274/245/3 +f 254/236/6 336/240/6 335/244/6 +f 307/248/1 311/428/1 312/249/1 +f 306/255/4 304/429/4 329/253/4 +f 304/429/4 309/430/4 329/253/4 +f 329/253/4 326/431/4 307/254/4 +f 303/222/3 305/221/3 330/256/3 +f 305/221/3 308/250/3 330/256/3 +f 308/250/3 324/432/3 330/256/3 +f 281/259/4 282/433/4 307/254/4 +f 282/433/4 315/434/4 311/435/4 +f 307/254/4 282/433/4 311/435/4 +f 315/434/4 328/436/4 311/435/4 +f 307/254/4 326/431/4 325/258/4 +f 312/249/3 327/207/3 320/437/3 +f 320/437/3 321/260/3 312/249/3 +f 321/260/3 322/438/3 308/250/3 +f 322/438/3 323/439/3 308/250/3 +f 323/439/3 324/432/3 308/250/3 +f 340/263/1 339/440/1 349/441/1 +f 349/441/1 350/442/1 337/261/1 +f 337/261/1 338/443/1 345/262/1 +f 345/262/1 346/444/1 340/263/1 +f 340/263/1 349/441/1 337/261/1 +f 361/265/2 368/445/2 367/446/2 +f 367/446/2 366/447/2 361/265/2 +f 366/447/2 364/266/2 361/265/2 +f 364/266/2 370/448/2 369/449/2 +f 369/449/2 359/264/2 364/266/2 +f 358/450/9 372/451/9 357/268/9 +f 372/451/9 371/269/9 357/268/9 +f 371/269/9 363/452/9 362/267/9 +f 373/271/1 374/453/1 357/268/1 +f 374/453/1 360/454/1 357/268/1 +f 357/268/1 362/267/1 373/271/1 +f 400/272/4 398/455/4 394/273/4 +f 397/275/3 399/456/3 395/276/3 +f 392/278/4 404/457/4 402/279/4 +f 401/281/3 403/458/3 391/282/3 +f 394/273/4 398/459/4 404/284/4 +f 403/285/3 397/460/3 393/277/3 +f 410/286/4 408/461/4 384/287/4 +f 407/289/3 409/462/3 385/290/3 +f 414/292/4 412/463/4 380/293/4 +f 411/295/3 413/298/3 381/296/3 +f 384/287/4 408/461/4 414/292/4 +f 413/298/3 407/289/3 383/291/3 +f 386/288/4 388/300/4 416/299/4 +f 388/300/4 390/464/4 418/301/4 +f 385/290/3 409/462/3 415/302/3 +f 387/303/3 415/302/3 417/304/3 +f 418/301/4 390/464/4 406/306/4 +f 390/464/4 402/465/4 406/306/4 +f 405/309/3 401/466/3 389/305/3 +f 389/305/3 417/304/3 421/308/3 +f 380/293/4 412/463/4 420/310/4 +f 379/297/3 375/467/3 419/312/3 +f 377/468/4 376/311/4 406/306/4 +f 376/311/4 420/310/4 406/306/4 +f 419/312/3 375/467/3 405/309/3 +f 375/467/3 378/469/3 405/309/3 +f 425/316/3 429/321/3 427/317/3 +f 424/319/4 428/313/4 430/315/4 +f 445/325/1 446/470/1 449/471/1 +f 446/470/1 447/472/1 449/471/1 +f 447/472/1 448/473/1 449/471/1 +f 449/471/1 450/474/1 451/323/1 +f 451/323/1 452/475/1 453/324/1 +f 453/324/1 454/476/1 455/477/1 +f 455/477/1 456/478/1 453/324/1 +f 456/478/1 445/325/1 453/324/1 +f 449/471/1 451/323/1 445/325/1 +f 435/326/1 434/347/1 458/327/1 +f 441/329/1 465/348/1 466/330/1 +f 438/332/1 462/349/1 463/333/1 +f 435/326/1 459/328/1 460/335/1 +f 443/337/1 442/331/1 466/330/1 +f 440/339/1 439/479/1 463/340/1 +f 437/342/1 436/336/1 460/335/1 +f 443/337/1 467/338/1 468/344/1 +f 433/346/1 457/350/1 458/327/1 +f 440/339/1 464/341/1 465/348/1 +f 438/332/1 437/342/1 461/343/1 +f 433/346/1 444/345/1 468/344/1 +f 471/353/2 470/480/2 469/481/2 +f 469/481/2 480/482/2 471/353/2 +f 480/482/2 479/351/2 471/353/2 +f 479/351/2 478/483/2 475/352/2 +f 478/483/2 477/484/2 475/352/2 +f 477/484/2 476/485/2 475/352/2 +f 475/352/2 474/486/2 473/487/2 +f 473/487/2 472/488/2 475/352/2 +f 472/488/2 471/353/2 475/352/2 +s 1 +f 27/489/10 4/24/4 3/26/10 +f 26/490/11 3/26/10 2/19/11 +f 32/491/12 9/7/13 8/9/12 +f 35/492/14 12/14/15 11/16/14 +f 30/493/16 7/1/5 6/3/16 +f 36/494/15 1/21/6 12/14/15 +f 25/495/6 2/19/11 1/21/6 +f 28/496/4 5/29/17 4/24/4 +f 31/497/5 8/9/12 7/4/5 +f 34/498/3 11/16/14 10/10/3 +f 33/499/13 10/10/3 9/7/13 +f 29/500/17 6/3/16 5/29/17 +f 19/501/5 42/40/16 18/502/16 +f 18/502/16 41/41/17 17/503/17 +f 17/503/17 40/44/4 16/504/4 +f 16/504/4 39/48/10 15/505/10 +f 15/505/10 38/49/11 14/506/11 +f 14/506/11 37/53/6 13/507/6 +f 13/507/6 48/54/15 24/508/15 +f 24/508/15 47/58/14 23/509/14 +f 23/509/14 46/59/3 22/510/3 +f 22/510/3 45/63/13 21/511/13 +f 21/511/13 44/65/12 20/512/12 +f 20/512/12 43/66/5 19/513/5 +f 52/514/3 63/515/13 51/516/13 +f 59/517/17 70/518/4 58/519/4 +f 56/520/11 67/521/6 55/522/6 +f 53/523/14 64/524/3 52/514/3 +f 60/525/16 71/526/17 59/517/17 +f 50/527/12 61/528/5 49/529/5 +f 57/530/10 68/531/11 56/520/11 +f 54/532/15 65/533/14 53/523/14 +f 49/529/5 72/534/16 60/525/16 +f 51/516/13 62/535/12 50/527/12 +f 58/519/4 69/536/10 57/530/10 +f 55/537/6 66/538/15 54/532/15 +f 76/539/3 87/540/13 75/541/13 +f 83/542/17 94/543/4 82/544/4 +f 80/545/11 91/546/6 79/547/6 +f 77/548/14 88/549/3 76/539/3 +f 84/550/16 95/551/17 83/542/17 +f 74/552/12 85/553/5 73/554/5 +f 81/555/10 92/556/11 80/545/11 +f 78/557/15 89/558/14 77/548/14 +f 73/554/5 96/559/16 84/550/16 +f 75/541/13 86/560/12 74/552/12 +f 82/544/4 93/561/10 81/555/10 +f 79/562/6 90/563/15 78/557/15 +f 115/564/15 121/565/14 114/566/14 +f 110/567/11 116/568/6 109/569/6 +f 109/569/6 122/570/15 115/564/15 +f 111/571/10 117/572/11 110/567/11 +f 112/573/18 118/574/10 111/571/10 +f 114/566/14 120/575/19 113/576/19 +f 165/577/20 120/575/19 172/578/20 +f 141/579/5 152/580/16 140/581/16 +f 140/581/16 151/582/17 139/583/17 +f 139/583/17 150/584/4 138/585/4 +f 138/585/4 149/586/10 137/587/10 +f 137/587/10 148/588/11 136/589/11 +f 136/589/11 147/590/6 135/591/6 +f 135/591/6 158/592/15 146/593/15 +f 146/593/15 157/594/14 145/595/14 +f 145/595/14 156/596/3 144/597/3 +f 144/597/3 155/598/13 143/599/13 +f 143/599/13 154/600/12 142/601/12 +f 142/601/12 153/602/5 141/603/5 +f 166/604/21 112/573/18 159/605/21 +f 163/606/12 169/607/5 162/608/5 +f 160/609/17 166/604/21 159/605/21 +f 164/610/13 170/611/12 163/606/12 +f 161/612/16 167/613/17 160/609/17 +f 165/577/20 171/614/13 164/610/13 +f 162/615/5 168/616/16 161/612/16 +f 181/617/17 197/618/16 182/619/16 +f 175/620/10 190/621/18 176/622/18 +f 182/619/16 198/623/5 183/624/5 +f 177/625/19 191/626/14 178/627/14 +f 183/628/5 199/629/12 184/630/12 +f 178/627/14 193/631/15 179/632/15 +f 184/630/12 200/633/13 185/634/13 +f 179/632/15 188/635/6 173/636/6 +f 185/634/13 195/637/20 186/638/20 +f 176/622/18 194/639/21 180/640/21 +f 186/638/20 192/641/19 177/625/19 +f 173/636/6 187/642/11 174/643/11 +f 180/640/21 196/644/17 181/617/17 +f 174/643/11 189/645/10 175/620/10 +f 236/646/16 201/647/5 212/648/16 +f 229/649/14 206/650/15 205/651/14 +f 244/652/11 221/653/10 220/654/11 +f 237/655/5 214/656/12 213/657/5 +f 230/658/15 207/659/6 206/650/15 +f 245/660/10 222/661/4 221/653/10 +f 238/662/12 215/663/13 214/656/12 +f 231/664/6 208/665/11 207/666/6 +f 246/667/4 223/668/17 222/661/4 +f 239/669/13 216/670/3 215/663/13 +f 232/671/11 209/672/10 208/665/11 +f 247/673/17 224/674/16 223/668/17 +f 225/675/5 202/676/12 201/647/5 +f 240/677/3 217/678/14 216/670/3 +f 233/679/10 210/680/4 209/672/10 +f 248/681/16 213/657/5 224/674/16 +f 226/682/12 203/683/13 202/676/12 +f 241/684/14 218/685/15 217/678/14 +f 234/686/4 211/687/17 210/680/4 +f 227/688/13 204/689/3 203/683/13 +f 242/690/15 219/691/6 218/685/15 +f 235/692/17 212/648/16 211/687/17 +f 228/693/3 205/651/14 204/689/3 +f 243/694/6 220/654/11 219/695/6 +f 252/696/22 249/196/6 250/411/22 +f 256/697/22 252/696/22 250/411/22 +f 258/698/23 257/699/22 256/697/22 +f 261/700/24 259/701/23 258/698/23 +f 269/702/25 255/703/26 254/704/25 +f 268/416/22 265/705/6 266/706/22 +f 272/707/22 268/416/22 266/706/22 +f 274/708/23 273/709/22 272/707/22 +f 277/710/24 275/711/23 274/708/23 +f 276/712/24 318/713/27 332/714/28 +f 263/715/29 316/716/30 264/717/29 +f 287/718/31 292/719/32 288/720/31 +f 290/219/33 293/721/34 289/217/33 +f 294/722/34 291/723/32 293/721/34 +f 299/724/5 287/214/31 288/725/31 +f 290/219/33 289/217/33 302/726/6 +f 317/727/30 279/728/29 280/729/29 +f 263/715/29 255/703/26 313/730/30 +f 261/700/24 319/731/27 262/732/24 +f 318/713/27 278/733/24 277/710/24 +f 325/734/22 324/735/35 323/736/22 +f 315/737/36 321/738/37 320/437/36 +f 320/437/36 328/739/2 315/737/36 +f 282/740/37 322/741/7 321/738/37 +f 326/742/35 330/226/6 324/735/35 +f 281/743/7 323/736/22 322/741/7 +f 318/713/27 331/744/28 332/714/28 +f 264/717/29 316/716/30 333/423/38 +f 331/744/28 319/731/27 260/745/24 +f 316/716/30 334/746/38 333/423/38 +f 334/746/38 317/727/30 280/729/29 +f 344/747/39 353/748/40 341/749/41 +f 340/263/42 341/749/41 339/440/43 +f 337/750/44 343/751/45 338/752/46 +f 344/747/39 346/753/47 348/754/48 +f 341/749/41 349/755/49 339/440/43 +f 345/756/50 348/754/48 346/753/47 +f 352/757/51 353/758/40 354/759/52 +f 338/752/46 347/760/53 345/756/50 +f 350/761/54 351/762/55 352/757/51 +f 337/763/44 352/757/51 342/764/56 +f 351/762/55 341/749/41 353/758/40 +f 353/748/40 355/765/57 354/766/52 +f 342/767/56 355/765/57 343/768/45 +f 354/759/52 342/764/56 352/757/51 +f 347/760/53 356/769/58 348/754/48 +f 344/747/39 348/754/48 356/769/58 +f 343/751/45 355/770/57 347/760/53 +f 368/445/59 360/771/60 374/453/61 +f 372/772/62 359/773/63 369/774/64 +f 367/446/65 365/775/66 366/776/67 +f 371/777/68 364/778/69 363/779/70 +f 373/271/71 368/445/59 374/453/61 +f 369/774/64 371/777/68 372/772/62 +f 359/780/63 357/781/4 361/782/72 +f 364/778/69 362/783/3 363/784/70 +f 362/783/3 366/776/67 365/775/66 +f 361/782/72 357/781/4 360/771/60 +f 379/785/73 376/786/74 375/787/74 +f 381/788/75 380/789/73 379/785/73 +f 383/790/76 382/791/75 381/788/75 +f 385/792/77 384/793/76 383/790/76 +f 387/794/78 386/795/77 385/792/77 +f 389/796/1 388/797/78 387/794/78 +f 391/282/31 390/280/5 389/283/5 +f 393/277/32 392/278/31 391/282/31 +f 395/276/1 394/273/32 393/277/32 +f 397/275/37 400/798/2 399/456/2 +f 398/799/37 403/285/22 404/800/22 +f 401/281/79 404/801/22 403/458/22 +f 405/802/80 402/803/79 401/281/79 +f 406/804/80 378/805/25 377/806/25 +f 407/807/81 410/808/82 409/809/82 +f 408/810/81 413/811/83 414/812/83 +f 411/813/78 414/812/83 413/811/83 +f 416/814/73 409/809/82 410/808/82 +f 418/815/75 415/816/73 416/817/73 +f 419/818/77 412/819/78 411/813/78 +f 421/820/76 420/821/77 419/818/77 +f 422/822/76 417/823/75 418/815/75 +f 426/320/1 429/321/84 425/316/1 +f 423/824/2 428/313/75 424/319/2 +f 430/315/84 431/322/9 429/321/84 +f 427/825/75 432/826/85 428/313/75 +f 314/827/30 271/828/26 279/728/29 +f 255/703/26 314/827/30 313/730/30 +f 271/828/26 269/702/25 270/829/25 +f 255/703/26 253/830/25 254/704/25 +f 433/346/6 456/831/15 444/345/15 +f 438/332/16 449/832/17 437/342/17 +f 439/334/5 450/833/16 438/332/16 +f 440/339/12 451/834/5 439/479/5 +f 441/329/13 452/835/12 440/339/12 +f 434/347/11 445/836/6 433/346/6 +f 442/331/3 453/837/13 441/329/13 +f 435/326/10 446/838/11 434/347/11 +f 443/337/14 454/839/3 442/331/3 +f 436/336/4 447/840/10 435/326/10 +f 444/345/15 455/841/14 443/337/14 +f 437/342/17 448/842/4 436/336/4 +f 463/340/5 476/843/12 464/341/12 +f 460/335/4 473/844/17 461/343/17 +f 467/338/14 480/845/15 468/344/15 +f 457/350/6 470/846/11 458/327/11 +f 464/341/12 477/847/13 465/348/13 +f 461/343/17 474/848/16 462/349/16 +f 468/344/15 469/849/6 457/350/6 +f 458/327/11 471/850/10 459/328/10 +f 465/348/13 478/851/3 466/330/3 +f 462/349/16 475/852/5 463/333/5 +f 459/328/10 472/853/4 460/335/4 +f 466/330/3 479/854/14 467/338/14 +f 27/489/10 28/496/4 4/24/4 +f 26/490/11 27/489/10 3/26/10 +f 32/491/12 33/499/13 9/7/13 +f 35/492/14 36/494/15 12/14/15 +f 30/493/16 31/855/5 7/1/5 +f 36/494/15 25/495/6 1/21/6 +f 25/495/6 26/490/11 2/19/11 +f 28/496/4 29/500/17 5/29/17 +f 31/497/5 32/491/12 8/9/12 +f 34/498/3 35/492/14 11/16/14 +f 33/499/13 34/498/3 10/10/3 +f 29/500/17 30/493/16 6/3/16 +f 19/501/5 43/38/5 42/40/16 +f 18/502/16 42/40/16 41/41/17 +f 17/503/17 41/41/17 40/44/4 +f 16/504/4 40/44/4 39/48/10 +f 15/505/10 39/48/10 38/49/11 +f 14/506/11 38/49/11 37/53/6 +f 13/507/6 37/53/6 48/54/15 +f 24/508/15 48/54/15 47/58/14 +f 23/509/14 47/58/14 46/59/3 +f 22/510/3 46/59/3 45/63/13 +f 21/511/13 45/63/13 44/65/12 +f 20/512/12 44/65/12 43/66/5 +f 52/514/3 64/524/3 63/515/13 +f 59/517/17 71/526/17 70/518/4 +f 56/520/11 68/531/11 67/521/6 +f 53/523/14 65/533/14 64/524/3 +f 60/525/16 72/534/16 71/526/17 +f 50/527/12 62/535/12 61/528/5 +f 57/530/10 69/536/10 68/531/11 +f 54/532/15 66/538/15 65/533/14 +f 49/529/5 61/528/5 72/534/16 +f 51/516/13 63/515/13 62/535/12 +f 58/519/4 70/518/4 69/536/10 +f 55/537/6 67/856/6 66/538/15 +f 76/539/3 88/549/3 87/540/13 +f 83/542/17 95/551/17 94/543/4 +f 80/545/11 92/556/11 91/546/6 +f 77/548/14 89/558/14 88/549/3 +f 84/550/16 96/559/16 95/551/17 +f 74/552/12 86/560/12 85/553/5 +f 81/555/10 93/561/10 92/556/11 +f 78/557/15 90/563/15 89/558/14 +f 73/554/5 85/553/5 96/559/16 +f 75/541/13 87/540/13 86/560/12 +f 82/544/4 94/543/4 93/561/10 +f 79/562/6 91/857/6 90/563/15 +f 115/564/15 122/570/15 121/565/14 +f 110/567/11 117/572/11 116/568/6 +f 109/569/6 116/568/6 122/570/15 +f 111/571/10 118/574/10 117/572/11 +f 112/573/18 119/858/18 118/574/10 +f 114/566/14 121/565/14 120/575/19 +f 165/577/20 113/576/19 120/575/19 +f 141/579/5 153/859/5 152/580/16 +f 140/581/16 152/580/16 151/582/17 +f 139/583/17 151/582/17 150/584/4 +f 138/585/4 150/584/4 149/586/10 +f 137/587/10 149/586/10 148/588/11 +f 136/589/11 148/588/11 147/590/6 +f 135/591/6 147/590/6 158/592/15 +f 146/593/15 158/592/15 157/594/14 +f 145/595/14 157/594/14 156/596/3 +f 144/597/3 156/596/3 155/598/13 +f 143/599/13 155/598/13 154/600/12 +f 142/601/12 154/600/12 153/602/5 +f 166/604/21 119/858/18 112/573/18 +f 163/606/12 170/611/12 169/607/5 +f 160/609/17 167/613/17 166/604/21 +f 164/610/13 171/614/13 170/611/12 +f 161/612/16 168/616/16 167/613/17 +f 165/577/20 172/578/20 171/614/13 +f 162/615/5 169/860/5 168/616/16 +f 181/617/17 196/644/17 197/618/16 +f 175/620/10 189/645/10 190/621/18 +f 182/619/16 197/618/16 198/623/5 +f 177/625/19 192/641/19 191/626/14 +f 183/628/5 198/861/5 199/629/12 +f 178/627/14 191/626/14 193/631/15 +f 184/630/12 199/629/12 200/633/13 +f 179/632/15 193/631/15 188/635/6 +f 185/634/13 200/633/13 195/637/20 +f 176/622/18 190/621/18 194/639/21 +f 186/638/20 195/637/20 192/641/19 +f 173/636/6 188/635/6 187/642/11 +f 180/640/21 194/639/21 196/644/17 +f 174/643/11 187/642/11 189/645/10 +f 236/646/16 225/675/5 201/647/5 +f 229/649/14 230/658/15 206/650/15 +f 244/652/11 245/660/10 221/653/10 +f 237/655/5 238/662/12 214/656/12 +f 230/658/15 231/862/6 207/659/6 +f 245/660/10 246/667/4 222/661/4 +f 238/662/12 239/669/13 215/663/13 +f 231/664/6 232/671/11 208/665/11 +f 246/667/4 247/673/17 223/668/17 +f 239/669/13 240/677/3 216/670/3 +f 232/671/11 233/679/10 209/672/10 +f 247/673/17 248/681/16 224/674/16 +f 225/675/5 226/682/12 202/676/12 +f 240/677/3 241/684/14 217/678/14 +f 233/679/10 234/686/4 210/680/4 +f 248/681/16 237/655/5 213/657/5 +f 226/682/12 227/688/13 203/683/13 +f 241/684/14 242/690/15 218/685/15 +f 234/686/4 235/692/17 211/687/17 +f 227/688/13 228/693/3 204/689/3 +f 242/690/15 243/863/6 219/691/6 +f 235/692/17 236/646/16 212/648/16 +f 228/693/3 229/649/14 205/651/14 +f 243/694/6 244/652/11 220/654/11 +f 252/696/22 251/864/6 249/196/6 +f 256/697/22 257/699/22 252/696/22 +f 258/698/23 259/701/23 257/699/22 +f 261/700/24 262/732/24 259/701/23 +f 269/702/25 271/828/26 255/703/26 +f 268/416/22 267/203/6 265/705/6 +f 272/707/22 273/709/22 268/416/22 +f 274/708/23 275/711/23 273/709/22 +f 277/710/24 278/733/24 275/711/23 +f 263/715/29 313/730/30 316/716/30 +f 287/718/31 291/723/32 292/719/32 +f 290/219/33 294/722/34 293/721/34 +f 294/722/34 292/719/32 291/723/32 +f 288/725/31 284/865/5 301/866/5 +f 284/865/5 297/867/5 301/866/5 +f 295/868/5 283/215/5 299/724/5 +f 283/215/5 287/214/31 299/724/5 +f 288/725/31 301/866/5 299/724/5 +f 289/217/33 285/213/6 300/869/6 +f 285/213/6 296/870/6 300/869/6 +f 298/871/6 286/211/6 302/726/6 +f 286/211/6 290/219/33 302/726/6 +f 289/217/33 300/869/6 302/726/6 +f 317/727/30 314/827/30 279/728/29 +f 261/700/24 260/745/24 319/731/27 +f 318/713/27 276/712/24 278/733/24 +f 325/734/22 326/742/35 324/735/35 +f 315/737/36 282/740/37 321/738/37 +f 320/437/36 327/207/2 328/739/2 +f 282/740/37 281/743/7 322/741/7 +f 326/742/35 329/227/6 330/226/6 +f 281/743/7 325/734/22 323/736/22 +f 318/713/27 319/731/27 331/744/28 +f 316/716/30 317/727/30 334/746/38 +f 344/747/39 356/872/58 353/748/40 +f 340/263/42 344/747/39 341/749/41 +f 337/750/44 342/873/56 343/751/45 +f 344/747/39 340/263/42 346/753/47 +f 341/749/41 351/762/55 349/755/49 +f 345/756/50 347/760/53 348/754/48 +f 352/757/51 351/762/55 353/758/40 +f 338/752/46 343/751/45 347/760/53 +f 350/761/54 349/755/49 351/762/55 +f 337/763/44 350/761/54 352/757/51 +f 353/748/40 356/872/58 355/765/57 +f 342/767/56 354/766/52 355/765/57 +f 347/760/53 355/770/57 356/769/58 +f 368/445/59 361/782/72 360/771/60 +f 372/772/62 358/874/86 359/773/63 +f 367/446/65 373/271/71 365/775/66 +f 371/777/68 370/875/87 364/778/69 +f 373/271/71 367/446/65 368/445/59 +f 369/774/64 370/875/87 371/777/68 +f 359/780/63 358/876/86 357/781/4 +f 364/778/69 366/776/67 362/783/3 +f 379/785/73 380/789/73 376/786/74 +f 381/788/75 382/791/75 380/789/73 +f 383/790/76 384/793/76 382/791/75 +f 385/792/77 386/795/77 384/793/76 +f 387/794/78 388/797/78 386/795/77 +f 389/796/1 390/877/1 388/797/78 +f 391/282/31 392/278/31 390/280/5 +f 393/277/32 394/273/32 392/278/31 +f 395/276/1 396/274/1 394/273/32 +f 397/275/37 398/878/37 400/798/2 +f 398/799/37 397/460/37 403/285/22 +f 401/281/79 402/803/79 404/801/22 +f 405/802/80 406/804/80 402/803/79 +f 406/804/80 405/802/80 378/805/25 +f 407/807/81 408/810/81 410/808/82 +f 408/810/81 407/807/81 413/811/83 +f 411/813/78 412/819/78 414/812/83 +f 416/814/73 415/879/73 409/809/82 +f 418/815/75 417/823/75 415/816/73 +f 419/818/77 420/821/77 412/819/78 +f 421/820/76 422/822/76 420/821/77 +f 422/822/76 421/820/76 417/823/75 +f 426/320/1 430/315/84 429/321/84 +f 423/824/2 427/825/75 428/313/75 +f 430/315/84 432/314/9 431/322/9 +f 427/825/75 431/880/85 432/826/85 +f 255/703/26 271/828/26 314/827/30 +f 433/346/6 445/836/6 456/831/15 +f 438/332/16 450/833/16 449/832/17 +f 439/334/5 451/881/5 450/833/16 +f 440/339/12 452/835/12 451/834/5 +f 441/329/13 453/837/13 452/835/12 +f 434/347/11 446/838/11 445/836/6 +f 442/331/3 454/839/3 453/837/13 +f 435/326/10 447/840/10 446/838/11 +f 443/337/14 455/841/14 454/839/3 +f 436/336/4 448/842/4 447/840/10 +f 444/345/15 456/831/15 455/841/14 +f 437/342/17 449/832/17 448/842/4 +f 463/340/5 475/882/5 476/843/12 +f 460/335/4 472/853/4 473/844/17 +f 467/338/14 479/854/14 480/845/15 +f 457/350/6 469/849/6 470/846/11 +f 464/341/12 476/843/12 477/847/13 +f 461/343/17 473/844/17 474/848/16 +f 468/344/15 480/845/15 469/849/6 +f 458/327/11 470/846/11 471/850/10 +f 465/348/13 477/847/13 478/851/3 +f 462/349/16 474/848/16 475/852/5 +f 459/328/10 471/850/10 472/853/4 +f 466/330/3 478/851/3 479/854/14 diff --git a/src/main/resources/assets/hbm/models/weapons/pepperbox.obj b/src/main/resources/assets/hbm/models/weapons/pepperbox.obj new file mode 100644 index 000000000..a138f7e89 --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/pepperbox.obj @@ -0,0 +1,3645 @@ +# Blender v2.79 (sub 0) OBJ File: 'pepperbox.blend' +# www.blender.org +o Circle +v 0.000000 0.125000 7.000000 +v -0.088388 0.088388 7.000000 +v -0.125000 -0.000000 7.000000 +v -0.088388 -0.088388 7.000000 +v 0.000000 -0.125000 7.000000 +v 0.088388 -0.088388 7.000000 +v 0.125000 0.000000 7.000000 +v 0.088388 0.088388 7.000000 +v 0.000000 0.687500 7.000000 +v -0.132583 0.632583 7.000000 +v -0.187500 0.500000 7.000000 +v -0.132583 0.367417 7.000000 +v 0.000000 0.312500 7.000000 +v 0.132583 0.367418 7.000000 +v 0.187500 0.500000 7.000000 +v 0.132583 0.632582 7.000000 +v 0.000000 -0.687500 7.000000 +v 0.132583 -0.632583 7.000000 +v 0.187500 -0.500000 7.000000 +v 0.132583 -0.367417 7.000000 +v 0.000000 -0.312500 7.000000 +v -0.132583 -0.367418 7.000000 +v -0.187500 -0.500000 7.000000 +v -0.132583 -0.632582 7.000000 +v 0.595392 0.343750 7.000000 +v 0.481541 0.431111 7.000000 +v 0.339263 0.412380 7.000000 +v 0.251902 0.298529 7.000000 +v 0.270633 0.156250 7.000000 +v 0.384484 0.068889 7.000000 +v 0.526763 0.087620 7.000000 +v 0.614124 0.201471 7.000000 +v -0.595392 -0.343750 7.000000 +v -0.481541 -0.431111 7.000000 +v -0.339263 -0.412380 7.000000 +v -0.251902 -0.298529 7.000000 +v -0.270633 -0.156250 7.000000 +v -0.384484 -0.068889 7.000000 +v -0.526763 -0.087620 7.000000 +v -0.614124 -0.201471 7.000000 +v 0.595392 -0.343750 7.000000 +v 0.614124 -0.201472 7.000000 +v 0.526763 -0.087620 7.000000 +v 0.384484 -0.068889 7.000000 +v 0.270633 -0.156250 7.000000 +v 0.251902 -0.298529 7.000000 +v 0.339263 -0.412380 7.000000 +v 0.481541 -0.431111 7.000000 +v -0.595392 0.343750 7.000000 +v -0.614124 0.201472 7.000000 +v -0.526763 0.087620 7.000000 +v -0.384484 0.068889 7.000000 +v -0.270633 0.156250 7.000000 +v -0.251902 0.298529 7.000000 +v -0.339262 0.412380 7.000000 +v -0.481541 0.431111 7.000000 +v -0.088388 0.088388 7.062500 +v 0.000000 0.125000 7.062500 +v -0.125000 -0.000000 7.062500 +v -0.088388 -0.088388 7.062500 +v 0.000000 -0.125000 7.062500 +v 0.088388 -0.088388 7.062500 +v 0.125000 -0.000000 7.062500 +v 0.088388 0.088388 7.062500 +v -0.187500 -0.812500 7.000000 +v 0.187500 -0.812500 7.000000 +v -0.187500 0.812500 7.000000 +v 0.187500 0.812500 7.000000 +v -0.797396 -0.243870 7.000000 +v -0.609896 -0.568630 7.000000 +v 0.609896 0.568630 7.000000 +v 0.797396 0.243870 7.000000 +v -0.609896 0.568630 7.000000 +v -0.797396 0.243870 7.000000 +v 0.797396 -0.243870 7.000000 +v 0.609896 -0.568630 7.000000 +v -0.452003 -0.532892 7.000000 +v -0.235497 -0.657892 7.000000 +v 0.235497 0.657892 7.000000 +v 0.452003 0.532892 7.000000 +v -0.687500 0.125000 7.000000 +v -0.687500 -0.125000 7.000000 +v 0.687500 0.125000 7.000000 +v 0.687500 -0.125000 7.000000 +v -0.235497 0.657892 7.000000 +v -0.452003 0.532892 7.000000 +v 0.452003 -0.532892 7.000000 +v 0.235497 -0.657892 7.000000 +v -0.187500 -0.812500 0.000000 +v 0.187500 -0.812500 0.000000 +v -0.187500 0.812500 0.000000 +v 0.187500 0.812500 0.000000 +v -0.797396 -0.243870 0.000000 +v -0.609896 -0.568630 0.000000 +v 0.609896 0.568630 0.000000 +v 0.797396 0.243870 0.000000 +v -0.609896 0.568630 0.000000 +v -0.797396 0.243870 0.000000 +v 0.797396 -0.243870 0.000000 +v 0.609896 -0.568630 0.000000 +v -0.452003 -0.532892 0.000000 +v -0.235497 -0.657892 0.000000 +v 0.235497 0.657892 0.000000 +v 0.452003 0.532892 0.000000 +v -0.687500 0.125000 0.000000 +v -0.687500 -0.125000 0.000000 +v 0.687500 0.125000 0.000000 +v 0.687500 -0.125000 0.000000 +v -0.235497 0.657892 0.000000 +v -0.452003 0.532892 0.000000 +v 0.452003 -0.532892 0.000000 +v 0.235497 -0.657892 0.000000 +v 0.000000 0.687500 6.000000 +v -0.132583 0.632583 6.000000 +v -0.187500 0.500000 6.000000 +v -0.132583 0.367417 6.000000 +v 0.000000 0.312500 6.000000 +v 0.132583 0.367418 6.000000 +v 0.187500 0.500000 6.000000 +v 0.132583 0.632582 6.000000 +v 0.000000 -0.687500 6.000000 +v 0.132583 -0.632583 6.000000 +v 0.187500 -0.500000 6.000000 +v 0.132583 -0.367417 6.000000 +v 0.000000 -0.312500 6.000000 +v -0.132583 -0.367418 6.000000 +v -0.187500 -0.500000 6.000000 +v -0.132583 -0.632582 6.000000 +v 0.595392 0.343750 6.000000 +v 0.481541 0.431111 6.000000 +v 0.339263 0.412380 6.000000 +v 0.251902 0.298529 6.000000 +v 0.270633 0.156250 6.000000 +v 0.384484 0.068889 6.000000 +v 0.526763 0.087620 6.000000 +v 0.614124 0.201471 6.000000 +v -0.595392 -0.343750 6.000000 +v -0.481541 -0.431111 6.000000 +v -0.339263 -0.412380 6.000000 +v -0.251902 -0.298529 6.000000 +v -0.270633 -0.156250 6.000000 +v -0.384484 -0.068889 6.000000 +v -0.526763 -0.087620 6.000000 +v -0.614124 -0.201471 6.000000 +v 0.595392 -0.343750 6.000000 +v 0.614124 -0.201472 6.000000 +v 0.526763 -0.087620 6.000000 +v 0.384484 -0.068889 6.000000 +v 0.270633 -0.156250 6.000000 +v 0.251902 -0.298529 6.000000 +v 0.339263 -0.412380 6.000000 +v 0.481541 -0.431111 6.000000 +v -0.595392 0.343750 6.000000 +v -0.614124 0.201472 6.000000 +v -0.526763 0.087620 6.000000 +v -0.384484 0.068889 6.000000 +v -0.270633 0.156250 6.000000 +v -0.251902 0.298529 6.000000 +v -0.339262 0.412380 6.000000 +v -0.481541 0.431111 6.000000 +v 0.000000 1.000000 0.000000 +v -0.500000 0.866025 0.000000 +v -0.866025 0.500000 0.000000 +v -1.000000 -0.000000 -0.000000 +v -0.866025 -0.500000 -0.000000 +v -0.500000 -0.866025 -0.000000 +v 0.000000 -1.000000 -0.000000 +v 0.500000 -0.866026 -0.000000 +v 0.866025 -0.500000 -0.000000 +v 1.000000 -0.000000 -0.000000 +v 0.866026 0.499999 0.000000 +v 0.500000 0.866025 0.000000 +v -0.500000 0.866025 -0.500000 +v 0.000000 1.000000 -0.500000 +v -0.866025 0.500000 -0.500000 +v -1.000000 -0.000000 -0.500000 +v -0.866025 -0.500000 -0.500000 +v -0.500000 -0.866025 -0.500000 +v 0.000000 -1.000000 -0.500000 +v 0.500000 -0.866026 -0.500000 +v 0.866025 -0.500000 -0.500000 +v 1.000000 -0.000000 -0.500000 +v 0.866026 0.500000 -0.500000 +v 0.500000 0.866025 -0.500000 +v 0.875000 -0.875000 -0.125000 +v 0.875000 0.125000 -0.125000 +v 0.875000 -0.875000 -0.375000 +v 0.875000 0.125000 -0.375000 +v 1.125000 -0.875000 -0.125000 +v 1.125000 -0.125000 -0.125000 +v 1.125000 -0.875000 -0.375000 +v 1.125000 -0.125000 -0.375000 +v -1.125000 -0.125000 -0.125000 +v 0.875000 -1.125000 -0.125000 +v -1.125000 -0.875000 -0.125000 +v 1.125000 -1.125000 -0.125000 +v 0.875000 -0.875000 6.125000 +v 1.125000 -0.875000 6.125000 +v 0.875000 -1.125000 6.125000 +v 1.125000 -1.125000 6.125000 +v 0.875000 -0.875000 6.375000 +v 1.125000 -0.875000 6.375000 +v -1.125000 -0.125000 -0.375000 +v -1.125000 -0.875000 -0.375000 +v 0.875000 0.625000 6.125000 +v 1.125000 0.625000 6.125000 +v 0.875000 0.625000 6.375000 +v 1.125000 0.625000 6.375000 +v 0.625000 0.875000 6.125000 +v 0.625000 0.875000 6.375000 +v -0.625000 0.875000 6.125000 +v -0.625000 0.875000 6.375000 +v 0.625000 1.125000 6.125000 +v 0.625000 1.125000 6.375000 +v -0.625000 1.125000 6.125000 +v -0.625000 1.125000 6.375000 +v -0.875000 -0.875000 -0.125000 +v -0.875000 0.125000 -0.125000 +v -0.875000 -0.875000 -0.375000 +v -0.875000 0.125000 -0.375000 +v -1.125000 -1.125000 -0.125000 +v -0.875000 -1.125000 -0.125000 +v -1.125000 -0.875000 6.125000 +v -0.875000 -0.875000 6.125000 +v -1.125000 -1.125000 6.125000 +v -0.875000 -1.125000 6.125000 +v -1.125000 -0.875000 6.375000 +v -0.875000 -0.875000 6.375000 +v -1.125000 0.625000 6.125000 +v -0.875000 0.625000 6.125000 +v -1.125000 0.625000 6.375000 +v -0.875000 0.625000 6.375000 +v -0.875000 -0.375000 -0.500000 +v 0.875000 -0.375000 -0.500000 +v -0.875000 0.375000 -0.500000 +v 0.875000 0.375000 -0.500000 +v -0.375000 0.875000 -0.500000 +v -0.375000 -0.875000 -0.500000 +v 0.375000 0.875000 -0.500000 +v 0.375000 -0.875000 -0.500000 +v -0.875000 -0.375000 -3.000000 +v 0.875000 -0.375000 -3.000000 +v -0.875000 0.375000 -3.000000 +v 0.875000 0.375000 -3.000000 +v -0.375000 0.875000 -3.000000 +v -0.375000 -0.875000 -3.000000 +v 0.375000 0.875000 -3.000000 +v 0.375000 -0.875000 -3.000000 +v -0.875000 -1.625000 -4.875000 +v 0.875000 -1.625000 -4.875000 +v -0.875000 -0.875000 -5.250000 +v 0.875000 -0.875000 -5.250000 +v -0.375000 -0.375000 -5.500000 +v -0.375000 -2.125000 -4.625000 +v 0.375000 -0.375000 -5.500000 +v 0.375000 -2.125000 -4.625000 +v -0.875000 -2.875000 -5.750000 +v 0.875000 -2.875000 -5.750000 +v -0.875000 -2.125000 -6.500000 +v 0.875000 -2.125000 -6.500000 +v -0.375000 -1.625000 -7.000000 +v -0.375000 -3.375000 -5.250000 +v 0.375000 -1.625000 -7.000000 +v 0.375000 -3.375000 -5.250000 +v 0.875000 0.250000 -0.500000 +v 1.000000 0.250000 -0.500000 +v 0.875000 0.250000 -1.000000 +v 1.000000 0.250000 -1.000000 +v 0.875000 0.375000 -1.000000 +v 0.875000 0.375000 -0.500000 +v 1.000000 0.375000 -0.500000 +v 1.000000 0.375000 -1.000000 +v 0.625000 0.375000 -2.125000 +v 0.625000 0.551777 -2.051777 +v 0.625000 0.625000 -1.875000 +v 0.625000 0.551777 -1.698223 +v 0.625000 0.375000 -1.625000 +v 0.625000 0.198223 -1.698223 +v 0.625000 0.125000 -1.875000 +v 0.625000 0.198223 -2.051777 +v 1.000000 0.375000 -2.125000 +v 1.000000 0.551777 -2.051777 +v 1.000000 0.625000 -1.875000 +v 1.000000 0.551777 -1.698223 +v 1.000000 0.375000 -1.625000 +v 1.000000 0.198223 -1.698223 +v 1.000000 0.125000 -1.875000 +v 1.000000 0.198223 -2.051777 +v 0.906250 0.500000 -1.750000 +v 0.968750 0.500000 -1.750000 +v 0.906250 0.500000 -2.000000 +v 0.968750 0.500000 -2.000000 +v 0.906250 1.375000 -1.750000 +v 0.968750 1.375000 -1.750000 +v 0.906250 1.375000 -2.000000 +v 0.968750 1.375000 -2.000000 +v 0.906250 1.500000 -2.000000 +v 0.906250 1.500000 -1.625000 +v 0.968750 1.500000 -1.625000 +v 0.968750 1.500000 -2.000000 +v -0.875000 0.250000 -0.500000 +v -1.000000 0.250000 -0.500000 +v -0.875000 0.250000 -1.000000 +v -1.000000 0.250000 -1.000000 +v -0.875000 0.375000 -1.000000 +v -0.875000 0.375000 -0.500000 +v -1.000000 0.375000 -0.500000 +v -1.000000 0.375000 -1.000000 +v -0.125000 -0.875000 -1.250000 +v 0.125000 -0.875000 -1.250000 +v -0.125000 -0.875000 -1.500000 +v 0.125000 -0.875000 -1.500000 +v -0.125000 -1.250000 -1.250000 +v 0.125000 -1.250000 -1.250000 +v -0.125000 -1.250000 -1.500000 +v 0.125000 -1.250000 -1.500000 +v -0.125000 -2.000000 -1.750000 +v 0.125000 -2.000000 -1.750000 +v 0.125000 -1.500000 -1.750000 +v -0.125000 -1.500000 -1.750000 +v 0.125000 -2.000000 -1.000000 +v -0.125000 -2.000000 -1.000000 +v 0.125000 -1.500000 -1.000000 +v -0.125000 -1.500000 -1.000000 +v -0.125000 -1.500000 -0.875000 +v -0.125000 -1.250000 -1.125000 +v 0.125000 -1.250000 -1.125000 +v 0.125000 -1.500000 -0.875000 +v -0.125000 -1.250000 -1.625000 +v -0.125000 -1.500000 -1.875000 +v 0.125000 -1.500000 -1.875000 +v 0.125000 -1.250000 -1.625000 +v -0.125000 -2.250000 -1.125000 +v -0.125000 -2.000000 -0.875000 +v 0.125000 -2.000000 -0.875000 +v 0.125000 -2.250000 -1.125000 +v 0.125000 -2.250000 -1.625000 +v 0.125000 -2.000000 -1.875000 +v -0.125000 -2.000000 -1.875000 +v -0.125000 -2.250000 -1.625000 +v -0.125000 -1.375000 -1.125000 +v 0.125000 -1.375000 -1.125000 +v -0.125000 -1.375000 -1.625000 +v 0.125000 -1.375000 -1.625000 +v -0.125000 -2.125000 -1.125000 +v 0.125000 -2.125000 -1.125000 +v 0.125000 -2.125000 -1.625000 +v -0.125000 -2.125000 -1.625000 +v -0.187500 0.875000 -0.562500 +v 0.187500 0.875000 -0.562500 +v -0.187500 0.875000 -0.937500 +v 0.187500 0.875000 -0.937500 +v -0.187500 1.375000 -0.812500 +v -0.187500 1.375000 -0.687500 +v 0.187500 1.375000 -0.687500 +v 0.187500 1.375000 -0.812500 +v -0.062500 1.375000 -0.687500 +v 0.062500 1.375000 -0.687500 +v 0.062500 1.375000 -0.812500 +v -0.062500 1.375000 -0.812500 +v -0.062500 1.125000 -0.625000 +v 0.062500 1.125000 -0.625000 +v 0.062500 1.125000 -0.875000 +v -0.062500 1.125000 -0.875000 +v 0.000000 0.875000 8.062500 +v -0.437500 0.757773 8.062500 +v -0.757772 0.437500 8.062500 +v -0.875000 -0.000000 8.062500 +v -0.757772 -0.437500 8.062500 +v -0.437500 -0.757773 8.062500 +v 0.000000 -0.875000 8.062500 +v 0.437500 -0.757773 8.062500 +v 0.757772 -0.437500 8.062500 +v 0.875000 -0.000000 8.062500 +v 0.757772 0.437500 8.062500 +v 0.437500 0.757773 8.062500 +v 0.000000 0.875000 8.312500 +v -0.437500 0.757773 8.312500 +v -0.757772 0.437500 8.312500 +v -0.875000 -0.000000 8.312500 +v -0.757772 -0.437500 8.312500 +v -0.437500 -0.757773 8.312500 +v 0.000000 -0.875000 8.312500 +v 0.437500 -0.757773 8.312500 +v 0.757772 -0.437500 8.312500 +v 0.875000 -0.000000 8.312500 +v 0.757772 0.437500 8.312500 +v 0.437500 0.757773 8.312500 +v 0.000000 0.500000 8.187500 +v -0.132583 0.500000 8.132584 +v -0.187500 0.500000 8.000000 +v -0.132583 0.500000 7.867418 +v 0.000000 0.500000 7.812500 +v 0.132583 0.500000 7.867418 +v 0.187500 0.500000 8.000000 +v 0.132583 0.500000 8.132584 +v 0.000000 0.367418 8.132584 +v 0.000000 0.312500 8.000000 +v 0.000000 0.367418 7.867418 +v 0.000000 0.632583 7.867418 +v 0.000000 0.687500 8.000000 +v 0.000000 0.632583 8.132584 +v 0.093750 0.406250 8.132584 +v 0.132583 0.367418 8.000000 +v 0.093750 0.406250 7.867418 +v -0.093750 0.593750 7.867418 +v -0.132583 0.632583 8.000000 +v -0.093750 0.593750 8.132584 +v 0.093750 0.593750 8.132584 +v 0.132583 0.632583 8.000000 +v 0.093750 0.593750 7.867418 +v -0.093750 0.406250 7.867418 +v -0.132583 0.367418 8.000000 +v -0.093750 0.406250 8.132584 +v 0.187500 -0.500000 8.000000 +v -0.187500 -0.500000 8.000000 +v 0.000000 -0.312500 8.000000 +v 0.000000 -0.687500 8.000000 +v -0.132583 -0.367418 8.000000 +v 0.132583 -0.632583 8.000000 +v -0.132583 -0.632583 8.000000 +v 0.132583 -0.367418 8.000000 +v 0.000000 -0.750000 8.000000 +v 0.176776 -0.676777 8.000000 +v 0.250000 -0.500000 8.000000 +v 0.176777 -0.323224 8.000000 +v 0.000000 -0.250000 8.000000 +v -0.176777 -0.323224 8.000000 +v -0.250000 -0.500000 8.000000 +v -0.176777 -0.676777 8.000000 +v 0.000000 -0.312500 8.062500 +v -0.132583 -0.367418 8.062500 +v 0.132583 -0.367418 8.062500 +v 0.187500 -0.500000 8.062500 +v 0.132583 -0.632583 8.062500 +v 0.000000 -0.687500 8.062500 +v -0.132583 -0.632583 8.062500 +v -0.187500 -0.500000 8.062500 +v 0.176776 -0.676777 8.062500 +v 0.000000 -0.750000 8.062500 +v 0.250000 -0.500000 8.062500 +v 0.176777 -0.323224 8.062500 +v 0.000000 -0.250000 8.062500 +v -0.176777 -0.323224 8.062500 +v -0.250000 -0.500000 8.062500 +v -0.176777 -0.676777 8.062500 +v 0.000000 0.250000 8.312500 +v -0.125000 0.216506 8.312500 +v -0.216506 0.125000 8.312500 +v -0.250000 0.000000 8.312500 +v -0.216506 -0.125000 8.312500 +v -0.125000 -0.216506 8.312500 +v 0.000000 -0.250000 8.312500 +v 0.125000 -0.216506 8.312500 +v 0.216506 -0.125000 8.312500 +v 0.250000 0.000000 8.312500 +v 0.216506 0.125000 8.312500 +v 0.125000 0.216506 8.312500 +v 0.000000 0.250000 8.812500 +v -0.125000 0.216506 8.812500 +v -0.216506 0.125000 8.812500 +v -0.250000 0.000000 8.812500 +v -0.216506 -0.125000 8.812500 +v -0.125000 -0.216506 8.812500 +v 0.000000 -0.250000 8.812500 +v 0.125000 -0.216506 8.812500 +v 0.216506 -0.125000 8.812500 +v 0.250000 0.000000 8.812500 +v 0.216506 0.125000 8.812500 +v 0.125000 0.216506 8.812500 +v 0.000000 0.625000 8.812500 +v -0.312500 0.541265 8.812500 +v -0.541266 0.312500 8.812500 +v -0.625000 0.000000 8.812500 +v -0.541266 -0.312500 8.812500 +v -0.312500 -0.541265 8.812500 +v 0.000000 -0.625000 8.812500 +v 0.312500 -0.541265 8.812500 +v 0.541265 -0.312500 8.812500 +v 0.625000 0.000000 8.812500 +v 0.541266 0.312500 8.812500 +v 0.312500 0.541265 8.812500 +v 0.000000 0.625000 9.062500 +v -0.312500 0.541265 9.062500 +v -0.541266 0.312500 9.062500 +v -0.625000 0.000000 9.062500 +v -0.541266 -0.312500 9.062500 +v -0.312500 -0.541265 9.062500 +v 0.000000 -0.625000 9.062500 +v 0.312500 -0.541265 9.062500 +v 0.541265 -0.312500 9.062500 +v 0.625000 0.000000 9.062500 +v 0.541266 0.312500 9.062500 +v 0.312500 0.541265 9.062500 +v -0.625000 0.375000 -2.125000 +v -0.625000 0.551777 -2.051777 +v -0.625000 0.625000 -1.875000 +v -0.625000 0.551777 -1.698223 +v -0.625000 0.375000 -1.625000 +v -0.625000 0.198223 -1.698223 +v -0.625000 0.125000 -1.875000 +v -0.625000 0.198223 -2.051777 +v -1.000000 0.375000 -2.125000 +v -1.000000 0.551777 -2.051777 +v -1.000000 0.625000 -1.875000 +v -1.000000 0.551777 -1.698223 +v -1.000000 0.375000 -1.625000 +v -1.000000 0.198223 -1.698223 +v -1.000000 0.125000 -1.875000 +v -1.000000 0.198223 -2.051777 +v -0.906250 0.500000 -1.750000 +v -0.968750 0.500000 -1.750000 +v -0.906250 0.500000 -2.000000 +v -0.968750 0.500000 -2.000000 +v -0.906250 1.375000 -1.750000 +v -0.968750 1.375000 -1.750000 +v -0.906250 1.375000 -2.000000 +v -0.968750 1.375000 -2.000000 +v -0.906250 1.500000 -2.000000 +v -0.906250 1.500000 -1.625000 +v -0.968750 1.500000 -1.625000 +v -0.968750 1.500000 -2.000000 +v 0.000000 -0.500000 8.187500 +v 0.132583 -0.500000 8.132584 +v 0.187500 -0.500000 8.000000 +v 0.132583 -0.500000 7.867418 +v 0.000000 -0.500000 7.812500 +v -0.132583 -0.500000 7.867418 +v -0.187500 -0.500000 8.000000 +v -0.132583 -0.500000 8.132584 +v 0.000000 -0.367418 8.132584 +v 0.000000 -0.312500 8.000000 +v 0.000000 -0.367418 7.867418 +v 0.000000 -0.632583 7.867418 +v 0.000000 -0.687500 8.000000 +v 0.000000 -0.632583 8.132584 +v -0.093750 -0.406250 8.132584 +v -0.132583 -0.367418 8.000000 +v -0.093750 -0.406250 7.867418 +v 0.093750 -0.593750 7.867418 +v 0.132583 -0.632583 8.000000 +v 0.093750 -0.593750 8.132584 +v -0.093750 -0.593750 8.132584 +v -0.132583 -0.632583 8.000000 +v -0.093750 -0.593750 7.867418 +v 0.093750 -0.406250 7.867418 +v 0.132583 -0.367418 8.000000 +v 0.093750 -0.406250 8.132584 +v -0.187500 0.500000 8.000000 +v 0.187500 0.500000 8.000000 +v 0.000000 0.312500 8.000000 +v 0.000000 0.687500 8.000000 +v 0.132583 0.367418 8.000000 +v -0.132583 0.632583 8.000000 +v 0.132583 0.632583 8.000000 +v -0.132583 0.367418 8.000000 +v 0.000000 0.750000 8.000000 +v -0.176776 0.676777 8.000000 +v -0.250000 0.500000 8.000000 +v -0.176777 0.323224 8.000000 +v 0.000000 0.250000 8.000000 +v 0.176777 0.323224 8.000000 +v 0.250000 0.500000 8.000000 +v 0.176777 0.676777 8.000000 +v 0.000000 0.312500 8.062500 +v 0.132583 0.367418 8.062500 +v -0.132583 0.367418 8.062500 +v -0.187500 0.500000 8.062500 +v -0.132583 0.632583 8.062500 +v 0.000000 0.687500 8.062500 +v 0.132583 0.632583 8.062500 +v 0.187500 0.500000 8.062500 +v -0.176776 0.676777 8.062500 +v 0.000000 0.750000 8.062500 +v -0.250000 0.500000 8.062500 +v -0.176777 0.323224 8.062500 +v 0.000000 0.250000 8.062500 +v 0.176777 0.323224 8.062500 +v 0.250000 0.500000 8.062500 +v 0.176777 0.676777 8.062500 +v 0.433013 0.250000 8.187500 +v 0.366722 0.364820 8.132584 +v 0.339263 0.412380 8.000000 +v 0.366722 0.364820 7.867418 +v 0.433013 0.250000 7.812500 +v 0.499304 0.135180 7.867418 +v 0.526763 0.087620 8.000000 +v 0.499304 0.135180 8.132584 +v 0.318193 0.183709 8.132584 +v 0.270633 0.156250 8.000000 +v 0.318193 0.183709 7.867418 +v 0.547833 0.316292 7.867418 +v 0.595393 0.343750 8.000000 +v 0.547833 0.316292 8.132584 +v 0.398698 0.121935 8.132584 +v 0.384484 0.068889 8.000000 +v 0.398698 0.121935 7.867418 +v 0.467328 0.378065 7.867418 +v 0.481542 0.431112 8.000000 +v 0.467328 0.378065 8.132584 +v 0.561078 0.215685 8.132584 +v 0.614124 0.201472 8.000000 +v 0.561078 0.215685 7.867418 +v 0.304948 0.284315 7.867418 +v 0.251902 0.298529 8.000000 +v 0.304948 0.284315 8.132584 +v -0.339263 -0.412380 8.000000 +v -0.526763 -0.087620 8.000000 +v -0.270633 -0.156250 8.000000 +v -0.595393 -0.343750 8.000000 +v -0.384484 -0.068889 8.000000 +v -0.481542 -0.431112 8.000000 +v -0.614124 -0.201472 8.000000 +v -0.251902 -0.298529 8.000000 +v -0.649519 -0.375000 8.000000 +v -0.497718 -0.491482 8.000000 +v -0.308013 -0.466507 8.000000 +v -0.191531 -0.314705 8.000000 +v -0.216507 -0.125000 8.000000 +v -0.368308 -0.008519 8.000000 +v -0.558013 -0.033494 8.000000 +v -0.674495 -0.185295 8.000000 +v -0.270633 -0.156250 8.062500 +v -0.384484 -0.068889 8.062500 +v -0.251902 -0.298529 8.062500 +v -0.339263 -0.412380 8.062500 +v -0.481542 -0.431112 8.062500 +v -0.595393 -0.343750 8.062500 +v -0.614124 -0.201472 8.062500 +v -0.526763 -0.087620 8.062500 +v -0.497718 -0.491482 8.062500 +v -0.649519 -0.375000 8.062500 +v -0.308013 -0.466507 8.062500 +v -0.191531 -0.314705 8.062500 +v -0.216507 -0.125000 8.062500 +v -0.368308 -0.008519 8.062500 +v -0.558013 -0.033494 8.062500 +v -0.674495 -0.185295 8.062500 +v -0.433013 -0.250000 8.187500 +v -0.366722 -0.364820 8.132584 +v -0.339263 -0.412380 8.000000 +v -0.366722 -0.364820 7.867418 +v -0.433013 -0.250000 7.812500 +v -0.499304 -0.135180 7.867418 +v -0.526763 -0.087620 8.000000 +v -0.499304 -0.135180 8.132584 +v -0.318193 -0.183709 8.132584 +v -0.270633 -0.156250 8.000000 +v -0.318193 -0.183709 7.867418 +v -0.547833 -0.316292 7.867418 +v -0.595393 -0.343750 8.000000 +v -0.547833 -0.316292 8.132584 +v -0.398698 -0.121935 8.132584 +v -0.384484 -0.068889 8.000000 +v -0.398698 -0.121935 7.867418 +v -0.467328 -0.378065 7.867418 +v -0.481542 -0.431112 8.000000 +v -0.467328 -0.378065 8.132584 +v -0.561078 -0.215685 8.132584 +v -0.614124 -0.201472 8.000000 +v -0.561078 -0.215685 7.867418 +v -0.304948 -0.284315 7.867418 +v -0.251902 -0.298529 8.000000 +v -0.304948 -0.284315 8.132584 +v 0.339263 0.412380 8.000000 +v 0.526763 0.087620 8.000000 +v 0.270633 0.156250 8.000000 +v 0.595393 0.343750 8.000000 +v 0.384484 0.068889 8.000000 +v 0.481542 0.431112 8.000000 +v 0.614124 0.201472 8.000000 +v 0.251902 0.298529 8.000000 +v 0.649519 0.375000 8.000000 +v 0.497718 0.491482 8.000000 +v 0.308013 0.466507 8.000000 +v 0.191531 0.314705 8.000000 +v 0.216507 0.125000 8.000000 +v 0.368308 0.008519 8.000000 +v 0.558013 0.033494 8.000000 +v 0.674495 0.185295 8.000000 +v 0.270633 0.156250 8.062500 +v 0.384484 0.068889 8.062500 +v 0.251902 0.298529 8.062500 +v 0.339263 0.412380 8.062500 +v 0.481542 0.431112 8.062500 +v 0.595393 0.343750 8.062500 +v 0.614124 0.201472 8.062500 +v 0.526763 0.087620 8.062500 +v 0.497718 0.491482 8.062500 +v 0.649519 0.375000 8.062500 +v 0.308013 0.466507 8.062500 +v 0.191531 0.314705 8.062500 +v 0.216507 0.125000 8.062500 +v 0.368308 0.008519 8.062500 +v 0.558013 0.033494 8.062500 +v 0.674495 0.185295 8.062500 +v 0.433013 -0.250000 8.187500 +v 0.499304 -0.135180 8.132584 +v 0.526763 -0.087620 8.000000 +v 0.499304 -0.135180 7.867418 +v 0.433013 -0.250000 7.812500 +v 0.366722 -0.364820 7.867418 +v 0.339263 -0.412380 8.000000 +v 0.366722 -0.364820 8.132584 +v 0.318193 -0.183709 8.132584 +v 0.270633 -0.156250 8.000000 +v 0.318193 -0.183709 7.867418 +v 0.547833 -0.316292 7.867418 +v 0.595393 -0.343750 8.000000 +v 0.547833 -0.316292 8.132584 +v 0.304948 -0.284315 8.132584 +v 0.251902 -0.298529 8.000000 +v 0.304948 -0.284315 7.867418 +v 0.561078 -0.215685 7.867418 +v 0.614124 -0.201472 8.000000 +v 0.561078 -0.215685 8.132584 +v 0.467328 -0.378065 8.132584 +v 0.481542 -0.431112 8.000000 +v 0.467328 -0.378065 7.867418 +v 0.398698 -0.121935 7.867418 +v 0.384484 -0.068889 8.000000 +v 0.398698 -0.121935 8.132584 +v -0.526763 0.087620 8.000000 +v -0.339263 0.412380 8.000000 +v -0.270633 0.156250 8.000000 +v -0.595393 0.343750 8.000000 +v -0.251902 0.298529 8.000000 +v -0.614124 0.201472 8.000000 +v -0.481542 0.431112 8.000000 +v -0.384484 0.068889 8.000000 +v -0.649519 0.375000 8.000000 +v -0.674495 0.185296 8.000000 +v -0.558013 0.033494 8.000000 +v -0.368308 0.008518 8.000000 +v -0.216507 0.125000 8.000000 +v -0.191531 0.314705 8.000000 +v -0.308013 0.466507 8.000000 +v -0.497718 0.491482 8.000000 +v -0.270633 0.156250 8.062500 +v -0.251902 0.298529 8.062500 +v -0.384484 0.068889 8.062500 +v -0.526763 0.087620 8.062500 +v -0.614124 0.201472 8.062500 +v -0.595393 0.343750 8.062500 +v -0.481542 0.431112 8.062500 +v -0.339263 0.412380 8.062500 +v -0.674495 0.185296 8.062500 +v -0.649519 0.375000 8.062500 +v -0.558013 0.033494 8.062500 +v -0.368308 0.008518 8.062500 +v -0.216507 0.125000 8.062500 +v -0.191531 0.314705 8.062500 +v -0.308013 0.466507 8.062500 +v -0.497718 0.491482 8.062500 +v -0.433013 0.250000 8.187500 +v -0.499304 0.135180 8.132584 +v -0.526763 0.087620 8.000000 +v -0.499304 0.135180 7.867418 +v -0.433013 0.250000 7.812500 +v -0.366722 0.364820 7.867418 +v -0.339263 0.412380 8.000000 +v -0.366722 0.364820 8.132584 +v -0.318193 0.183709 8.132584 +v -0.270633 0.156250 8.000000 +v -0.318193 0.183709 7.867418 +v -0.547833 0.316292 7.867418 +v -0.595393 0.343750 8.000000 +v -0.547833 0.316292 8.132584 +v -0.304948 0.284315 8.132584 +v -0.251902 0.298529 8.000000 +v -0.304948 0.284315 7.867418 +v -0.561078 0.215685 7.867418 +v -0.614124 0.201472 8.000000 +v -0.561078 0.215685 8.132584 +v -0.467328 0.378065 8.132584 +v -0.481542 0.431112 8.000000 +v -0.467328 0.378065 7.867418 +v -0.398698 0.121935 7.867418 +v -0.384484 0.068889 8.000000 +v -0.398698 0.121935 8.132584 +v 0.526763 -0.087620 8.000000 +v 0.339263 -0.412380 8.000000 +v 0.270633 -0.156250 8.000000 +v 0.595393 -0.343750 8.000000 +v 0.251902 -0.298529 8.000000 +v 0.614124 -0.201472 8.000000 +v 0.481542 -0.431112 8.000000 +v 0.384484 -0.068889 8.000000 +v 0.649519 -0.375000 8.000000 +v 0.674495 -0.185296 8.000000 +v 0.558013 -0.033494 8.000000 +v 0.368308 -0.008518 8.000000 +v 0.216507 -0.125000 8.000000 +v 0.191531 -0.314705 8.000000 +v 0.308013 -0.466507 8.000000 +v 0.497718 -0.491482 8.000000 +v 0.270633 -0.156250 8.062500 +v 0.251902 -0.298529 8.062500 +v 0.384484 -0.068889 8.062500 +v 0.526763 -0.087620 8.062500 +v 0.614124 -0.201472 8.062500 +v 0.595393 -0.343750 8.062500 +v 0.481542 -0.431112 8.062500 +v 0.339263 -0.412380 8.062500 +v 0.674495 -0.185296 8.062500 +v 0.649519 -0.375000 8.062500 +v 0.558013 -0.033494 8.062500 +v 0.368308 -0.008518 8.062500 +v 0.216507 -0.125000 8.062500 +v 0.191531 -0.314705 8.062500 +v 0.308013 -0.466507 8.062500 +v 0.497718 -0.491482 8.062500 +vt 0.241282 0.246079 +vt 0.233209 0.265596 +vt 0.225136 0.246079 +vt 0.660448 0.437693 +vt 0.664133 0.453126 +vt 0.660448 0.468558 +vt 0.215016 0.297589 +vt 0.209423 0.257024 +vt 0.215449 0.269500 +vt 0.238802 0.328051 +vt 0.227616 0.328051 +vt 0.233209 0.312437 +vt 0.256994 0.257024 +vt 0.251401 0.297589 +vt 0.250969 0.269500 +vt 0.251401 0.155536 +vt 0.256994 0.196101 +vt 0.250969 0.183625 +vt 0.227616 0.125074 +vt 0.238802 0.125074 +vt 0.233209 0.140688 +vt 0.209423 0.196101 +vt 0.215016 0.155536 +vt 0.215449 0.183625 +vt 0.212702 0.242176 +vt 0.212702 0.210949 +vt 0.217496 0.215618 +vt 0.227616 0.289017 +vt 0.219726 0.293125 +vt 0.223089 0.278072 +vt 0.246692 0.293125 +vt 0.240234 0.308739 +vt 0.238802 0.289017 +vt 0.253716 0.210949 +vt 0.253716 0.242176 +vt 0.248922 0.237507 +vt 0.238802 0.164108 +vt 0.246692 0.160000 +vt 0.243329 0.175053 +vt 0.219726 0.160000 +vt 0.226184 0.144386 +vt 0.227616 0.164108 +vt 0.221740 0.235167 +vt 0.217496 0.237507 +vt 0.225136 0.207046 +vt 0.221740 0.217958 +vt 0.229254 0.272456 +vt 0.225695 0.263851 +vt 0.237164 0.272456 +vt 0.243329 0.278072 +vt 0.240723 0.263851 +vt 0.244678 0.235167 +vt 0.248922 0.215618 +vt 0.244678 0.217958 +vt 0.240723 0.189274 +vt 0.237164 0.180669 +vt 0.241282 0.207046 +vt 0.233209 0.187529 +vt 0.225695 0.189274 +vt 0.223089 0.175053 +vt 0.229254 0.180669 +vt 0.000000 0.625000 +vt 0.208955 0.671875 +vt 0.000000 0.671875 +vt 0.000000 0.406250 +vt 0.208955 0.453125 +vt 0.000000 0.453125 +vt 0.000000 0.187500 +vt 0.208955 0.234375 +vt 0.000000 0.234375 +vt 0.000000 0.515625 +vt 0.208955 0.562500 +vt 0.000000 0.562500 +vt 0.000000 0.296875 +vt 0.208955 0.343750 +vt 0.000000 0.343750 +vt 0.000000 0.734375 +vt 0.208955 0.781250 +vt 0.000000 0.781250 +vt 0.249994 0.351563 +vt 0.248356 0.368116 +vt 0.244403 0.374973 +vt 0.249994 0.351562 +vt 0.248356 0.368116 +vt 0.244403 0.374973 +vt 0.244403 0.328152 +vt 0.249994 0.351562 +vt 0.244403 0.374973 +vt 0.249994 0.351563 +vt 0.248356 0.368116 +vt 0.244403 0.374973 +vt 0.249994 0.351562 +vt 0.248356 0.368116 +vt 0.244403 0.374973 +vt 0.244403 0.328152 +vt 0.249994 0.351562 +vt 0.244403 0.374973 +vt 0.276412 0.187560 +vt 0.328065 0.187560 +vt 0.302239 0.374880 +vt 0.276412 0.437560 +vt 0.302239 0.375120 +vt 0.328065 0.562440 +vt -0.000000 0.125000 +vt 0.029851 0.093750 +vt 0.029851 0.125000 +vt 0.007463 0.062500 +vt 0.029851 0.062500 +vt 0.029851 0.031250 +vt 0.007463 0.031250 +vt 0.029851 0.000000 +vt 0.037313 0.031250 +vt -0.000000 0.062500 +vt 0.619403 0.031250 +vt 0.597015 0.062500 +vt 0.597015 0.031250 +vt 0.037313 0.093750 +vt 0.223881 0.125000 +vt 0.037313 0.125000 +vt 0.619403 0.062500 +vt 0.597015 0.093750 +vt 0.037313 0.125000 +vt 0.231343 0.000000 +vt 0.276119 0.031250 +vt 0.231343 0.031250 +vt 0.037313 0.031250 +vt 0.223881 0.062500 +vt 0.037313 0.062500 +vt 0.037313 -0.000000 +vt 0.223881 0.031250 +vt 0.223881 0.093750 +vt 0.231343 0.125000 +vt 0.223881 0.125000 +vt 0.231343 0.093750 +vt 0.626866 0.093750 +vt 0.597015 0.125000 +vt 0.223881 0.031250 +vt 0.231343 0.062500 +vt 0.279851 0.093750 +vt 0.291045 0.125000 +vt 0.279851 0.125000 +vt 0.276119 0.125000 +vt 0.276119 0.093750 +vt 0.276119 0.062500 +vt 0.294776 0.093750 +vt 0.332090 0.125000 +vt 0.294776 0.125000 +vt 0.332090 0.062500 +vt 0.332090 0.093750 +vt 0.332090 0.000000 +vt 0.294776 0.031250 +vt 0.294776 0.000000 +vt 0.332090 0.031250 +vt 0.291045 0.000000 +vt 0.279851 0.000000 +vt 0.294776 0.062500 +vt 0.597015 0.000000 +vt 0.589552 0.125000 +vt 0.626866 0.031250 +vt 0.626866 0.062500 +vt 0.589552 0.062500 +vt 0.402985 0.031250 +vt 0.589552 0.031250 +vt 0.589552 0.031250 +vt 0.395522 0.031250 +vt 0.350746 0.000000 +vt 0.395522 0.000000 +vt 0.589552 0.125000 +vt 0.402985 0.093750 +vt 0.589552 0.093750 +vt 0.402985 0.000000 +vt 0.589552 0.000000 +vt 0.402985 0.062500 +vt 0.402985 0.031250 +vt 0.395522 0.062500 +vt 0.402985 0.125000 +vt 0.395522 0.125000 +vt 0.395522 0.093750 +vt 0.350746 0.031250 +vt 0.350746 0.062500 +vt 0.350746 0.093750 +vt 0.335821 0.093750 +vt 0.347015 0.125000 +vt 0.335821 0.125000 +vt 0.347015 0.000000 +vt 0.335821 0.000000 +vt 0.347015 0.093750 +vt 0.570895 0.828125 +vt 0.548507 0.671875 +vt 0.570895 0.609375 +vt 0.656716 0.562500 +vt 0.641791 0.578125 +vt 0.641791 0.562500 +vt 0.641791 0.593750 +vt 0.656716 0.609375 +vt 0.641791 0.609375 +vt 0.660448 0.578125 +vt 0.656716 0.593750 +vt 0.656716 0.578125 +vt 0.638060 0.593750 +vt 0.638060 0.578125 +vt 0.735075 0.187432 +vt 0.727628 0.156250 +vt 0.735075 0.125068 +vt 0.679105 0.421875 +vt 0.690298 0.437500 +vt 0.679105 0.437500 +vt 0.682836 0.406250 +vt 0.690298 0.421875 +vt 0.690298 0.296875 +vt 0.682836 0.296875 +vt 0.701493 0.296875 +vt 0.694030 0.406250 +vt 0.694030 0.296875 +vt 0.690298 0.406250 +vt 0.679105 0.406250 +vt 0.679105 0.296875 +vt 0.701493 0.406250 +vt 0.694030 0.421875 +vt 0.675373 0.421875 +vt 0.675373 0.437500 +vt 0.641791 0.593750 +vt 0.656716 0.609375 +vt 0.641791 0.609375 +vt 0.656716 0.562500 +vt 0.641791 0.578125 +vt 0.641791 0.562500 +vt 0.656716 0.578125 +vt 0.660448 0.593750 +vt 0.656716 0.593750 +vt 0.638060 0.578125 +vt 0.638060 0.593750 +vt 0.119403 0.828125 +vt 0.126866 0.781250 +vt 0.126866 0.828125 +vt 0.104478 0.828125 +vt 0.111940 0.781250 +vt 0.111940 0.828125 +vt 0.119403 0.781250 +vt 0.134328 0.781250 +vt 0.134328 0.828125 +vt 0.041045 0.859375 +vt 0.026119 0.875000 +vt 0.026119 0.859375 +vt 0.078358 0.828125 +vt 0.093284 0.812500 +vt 0.093284 0.828125 +vt 0.026119 0.828125 +vt 0.041045 0.812500 +vt 0.041045 0.828125 +vt 0.093284 0.859375 +vt 0.078358 0.875000 +vt 0.078358 0.859375 +vt 0.067164 0.859375 +vt 0.052239 0.875000 +vt 0.052239 0.859375 +vt 0.052239 0.828125 +vt 0.067164 0.812500 +vt 0.067164 0.828125 +vt 0.000000 0.828125 +vt 0.014925 0.812500 +vt 0.014925 0.828125 +vt 0.014925 0.859375 +vt 0.000000 0.875000 +vt 0.000000 0.859375 +vt 0.018657 0.875000 +vt 0.022388 0.875000 +vt 0.022388 0.812500 +vt 0.044776 0.875000 +vt 0.048507 0.812500 +vt 0.044776 0.812500 +vt 0.070896 0.875000 +vt 0.074627 0.875000 +vt 0.074627 0.812500 +vt 0.104478 0.859375 +vt 0.097015 0.875000 +vt 0.100746 0.812500 +vt 0.097015 0.812500 +vt 0.690298 0.203125 +vt 0.694030 0.187500 +vt 0.694030 0.203125 +vt 0.675373 0.171875 +vt 0.675373 0.218750 +vt 0.716418 0.218750 +vt 0.701493 0.187500 +vt 0.716418 0.171875 +vt 0.697761 0.203125 +vt 0.701493 0.203125 +vt 0.686567 0.281250 +vt 0.694030 0.296875 +vt 0.686567 0.296875 +vt 0.705224 0.296875 +vt 0.697761 0.265625 +vt 0.705224 0.281250 +vt 0.694030 0.234375 +vt 0.697761 0.234375 +vt 0.701493 0.265625 +vt 0.697761 0.156250 +vt 0.697761 0.187500 +vt 0.694030 0.156250 +vt 0.690298 0.187500 +vt 0.690298 0.125000 +vt 0.701493 0.125000 +vt 0.697761 0.296875 +vt 0.694030 0.265625 +vt 0.574405 0.179713 +vt 0.619624 0.179713 +vt 0.597015 0.343699 +vt 0.574406 0.507787 +vt 0.574406 0.398463 +vt 0.597015 0.343801 +vt 0.671642 0.484375 +vt 0.667910 0.468750 +vt 0.671642 0.468750 +vt 0.667910 0.500000 +vt 0.667910 0.484375 +vt 0.671642 0.500000 +vt 0.667910 0.515625 +vt 0.671642 0.515625 +vt 0.667910 0.531250 +vt 0.671642 0.546875 +vt 0.671642 0.531250 +vt 0.667910 0.562500 +vt 0.667910 0.546875 +vt 0.671642 0.453125 +vt 0.667910 0.437500 +vt 0.671642 0.437500 +vt 0.667910 0.453125 +vt 0.640568 0.398416 +vt 0.656716 0.281294 +vt 0.672865 0.398416 +vt 0.640568 0.164085 +vt 0.672864 0.164085 +vt 0.656716 0.281206 +vt 0.600746 0.609375 +vt 0.623134 0.765625 +vt 0.600746 0.828125 +vt 0.729809 0.178299 +vt 0.735075 0.187432 +vt 0.735075 0.125068 +vt 0.690298 0.437500 +vt 0.679105 0.421875 +vt 0.679105 0.437500 +vt 0.682836 0.406250 +vt 0.690298 0.421875 +vt 0.690298 0.406250 +vt 0.690298 0.296875 +vt 0.682836 0.296875 +vt 0.694030 0.406250 +vt 0.701493 0.296875 +vt 0.694030 0.296875 +vt 0.679105 0.406250 +vt 0.679105 0.296875 +vt 0.694030 0.421875 +vt 0.701493 0.406250 +vt 0.675373 0.421875 +vt 0.675373 0.437500 +vt 0.671642 0.484375 +vt 0.667910 0.468750 +vt 0.671642 0.468750 +vt 0.667910 0.500000 +vt 0.667910 0.484375 +vt 0.671642 0.500000 +vt 0.667910 0.515625 +vt 0.671642 0.515625 +vt 0.667910 0.531250 +vt 0.671642 0.546875 +vt 0.671642 0.531250 +vt 0.667910 0.562500 +vt 0.667910 0.546875 +vt 0.671642 0.453125 +vt 0.667910 0.437500 +vt 0.671642 0.437500 +vt 0.667910 0.453125 +vt 0.671642 0.484375 +vt 0.667910 0.468750 +vt 0.671642 0.468750 +vt 0.667910 0.500000 +vt 0.667910 0.484375 +vt 0.671642 0.500000 +vt 0.667910 0.515625 +vt 0.671642 0.515625 +vt 0.667910 0.531250 +vt 0.671642 0.546875 +vt 0.671642 0.531250 +vt 0.667910 0.562500 +vt 0.667910 0.546875 +vt 0.671642 0.453125 +vt 0.667910 0.437500 +vt 0.671642 0.437500 +vt 0.667910 0.453125 +vt 0.671642 0.484375 +vt 0.667910 0.468750 +vt 0.671642 0.468750 +vt 0.667910 0.500000 +vt 0.667910 0.484375 +vt 0.671642 0.500000 +vt 0.667910 0.515625 +vt 0.671642 0.515625 +vt 0.667910 0.531250 +vt 0.671642 0.546875 +vt 0.671642 0.531250 +vt 0.667910 0.562500 +vt 0.667910 0.546875 +vt 0.671642 0.453125 +vt 0.667910 0.437500 +vt 0.671642 0.437500 +vt 0.667910 0.453125 +vt 0.671642 0.484375 +vt 0.667910 0.468750 +vt 0.671642 0.468750 +vt 0.667910 0.500000 +vt 0.667910 0.484375 +vt 0.671642 0.500000 +vt 0.667910 0.515625 +vt 0.671642 0.515625 +vt 0.667910 0.531250 +vt 0.671642 0.546875 +vt 0.671642 0.531250 +vt 0.667910 0.562500 +vt 0.667910 0.546875 +vt 0.671642 0.453125 +vt 0.667910 0.437500 +vt 0.671642 0.437500 +vt 0.667910 0.453125 +vt 0.671642 0.484375 +vt 0.667910 0.468750 +vt 0.671642 0.468750 +vt 0.667910 0.500000 +vt 0.667910 0.484375 +vt 0.671642 0.500000 +vt 0.667910 0.515625 +vt 0.671642 0.515625 +vt 0.667910 0.531250 +vt 0.671642 0.546875 +vt 0.671642 0.531250 +vt 0.667910 0.562500 +vt 0.667910 0.546875 +vt 0.671642 0.453125 +vt 0.667910 0.437500 +vt 0.671642 0.437500 +vt 0.667910 0.453125 +vt 0.657842 0.464038 +vt 0.656762 0.453126 +vt 0.657842 0.442213 +vt 0.663054 0.442213 +vt 0.663054 0.464038 +vt 0.214890 0.251728 +vt 0.218845 0.280412 +vt 0.226184 0.308739 +vt 0.229254 0.305577 +vt 0.237164 0.305577 +vt 0.247573 0.280412 +vt 0.251528 0.251728 +vt 0.251528 0.201397 +vt 0.247573 0.172713 +vt 0.240234 0.144386 +vt 0.237164 0.147548 +vt 0.229254 0.147548 +vt 0.218845 0.172713 +vt 0.214890 0.201397 +vt 0.208955 0.625000 +vt 0.208955 0.406250 +vt 0.208955 0.187500 +vt 0.208955 0.515625 +vt 0.208955 0.296875 +vt 0.208955 0.734375 +vt 0.240450 0.368116 +vt 0.238812 0.351563 +vt 0.240450 0.335009 +vt 0.244403 0.328152 +vt 0.248356 0.335009 +vt 0.240450 0.368116 +vt 0.238812 0.351563 +vt 0.240450 0.335009 +vt 0.244403 0.328152 +vt 0.248356 0.335009 +vt 0.240450 0.368116 +vt 0.238812 0.351562 +vt 0.240450 0.335009 +vt 0.248356 0.335009 +vt 0.248356 0.368116 +vt 0.240450 0.368116 +vt 0.238812 0.351562 +vt 0.240450 0.335009 +vt 0.244403 0.328152 +vt 0.248356 0.335009 +vt 0.240450 0.368116 +vt 0.238812 0.351563 +vt 0.240450 0.335009 +vt 0.244403 0.328152 +vt 0.248356 0.335009 +vt 0.240450 0.368116 +vt 0.238812 0.351562 +vt 0.240450 0.335009 +vt 0.248356 0.335009 +vt 0.248356 0.368116 +vt 0.287328 0.358149 +vt 0.276412 0.312440 +vt 0.272417 0.250000 +vt 0.287328 0.141851 +vt 0.302239 0.125120 +vt 0.317150 0.141851 +vt 0.332061 0.250000 +vt 0.328065 0.312440 +vt 0.317150 0.358149 +vt 0.317150 0.608149 +vt 0.302239 0.624880 +vt 0.287328 0.608149 +vt 0.276412 0.562440 +vt 0.272417 0.500000 +vt 0.287328 0.391851 +vt 0.317150 0.391851 +vt 0.328065 0.437560 +vt 0.332061 0.500000 +vt -0.000000 0.093750 +vt -0.000000 0.000000 +vt -0.000000 0.031250 +vt 0.276119 0.000000 +vt 0.223881 0.000000 +vt 0.626866 0.125000 +vt 0.291045 0.093750 +vt 0.626866 0.000000 +vt 0.402985 0.125000 +vt 0.350746 0.125000 +vt 0.548507 0.765625 +vt 0.660448 0.593750 +vt 0.742521 0.156250 +vt 0.740340 0.178299 +vt 0.729809 0.178299 +vt 0.729809 0.134201 +vt 0.740340 0.134201 +vt 0.705224 0.421875 +vt 0.660448 0.578125 +vt 0.104478 0.781250 +vt 0.041045 0.875000 +vt 0.078358 0.812500 +vt 0.026119 0.812500 +vt 0.093284 0.875000 +vt 0.067164 0.875000 +vt 0.052239 0.812500 +vt 0.000000 0.812500 +vt 0.014925 0.875000 +vt 0.018657 0.812500 +vt 0.048507 0.875000 +vt 0.070896 0.812500 +vt 0.100746 0.875000 +vt 0.104478 0.828125 +vt 0.690298 0.265625 +vt 0.583961 0.329052 +vt 0.574405 0.289037 +vt 0.570908 0.234375 +vt 0.583961 0.139698 +vt 0.597015 0.125051 +vt 0.610068 0.139698 +vt 0.623122 0.234375 +vt 0.619624 0.289037 +vt 0.610068 0.329052 +vt 0.619624 0.507787 +vt 0.610068 0.547802 +vt 0.597015 0.562449 +vt 0.583961 0.547802 +vt 0.570908 0.453125 +vt 0.583961 0.358448 +vt 0.610068 0.358448 +vt 0.619624 0.398463 +vt 0.623122 0.453125 +vt 0.671642 0.562500 +vt 0.666040 0.426995 +vt 0.656716 0.437456 +vt 0.647393 0.426995 +vt 0.638070 0.359375 +vt 0.640568 0.320335 +vt 0.647393 0.291755 +vt 0.666040 0.291755 +vt 0.672865 0.320335 +vt 0.675363 0.359375 +vt 0.647393 0.270745 +vt 0.640568 0.242166 +vt 0.638070 0.203125 +vt 0.647393 0.135505 +vt 0.656716 0.125044 +vt 0.666039 0.135505 +vt 0.675363 0.203125 +vt 0.672864 0.242166 +vt 0.666039 0.270745 +vt 0.623134 0.671875 +vt 0.740340 0.178299 +vt 0.742521 0.156250 +vt 0.740340 0.134201 +vt 0.729809 0.134201 +vt 0.727628 0.156250 +vt 0.705224 0.421875 +vt 0.671642 0.562500 +vt 0.671642 0.562500 +vt 0.671642 0.562500 +vt 0.671642 0.562500 +vt 0.671642 0.562500 +vt 0.656716 0.531250 +vt 0.652985 0.515625 +vt 0.656716 0.515625 +vt 0.656716 0.484375 +vt 0.652985 0.468750 +vt 0.656716 0.468750 +vt 0.656716 0.453125 +vt 0.652985 0.437500 +vt 0.656716 0.437500 +vt 0.652985 0.546875 +vt 0.652985 0.531250 +vt 0.652985 0.500000 +vt 0.656716 0.500000 +vt 0.652985 0.484375 +vt 0.652985 0.453125 +vt 0.656716 0.562500 +vt 0.656716 0.546875 +vt 0.000000 0.359375 +vt 0.208955 0.390625 +vt 0.000000 0.390625 +vt 0.000000 0.171875 +vt 0.000000 0.140625 +vt 0.208955 0.171875 +vt 0.000000 0.125000 +vt 0.208955 0.140625 +vt 0.000000 0.468750 +vt 0.208955 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.718750 +vt 0.208955 0.468750 +vt 0.208955 0.687500 +vt 0.000000 0.687500 +vt 0.000000 0.250000 +vt 0.208955 0.281250 +vt 0.000000 0.281250 +vt 0.000000 0.609375 +vt 0.208955 0.359375 +vt 0.208955 0.718750 +vt 0.208955 0.578125 +vt 0.000000 0.578125 +vt 0.208955 0.609375 +vt 0.208955 0.250000 +vt 0.208955 0.328125 +vt 0.238806 0.343750 +vt 0.208955 0.343750 +vt 0.208955 0.406250 +vt 0.238806 0.421875 +vt 0.208955 0.421875 +vt 0.208955 0.406250 +vt 0.238806 0.421875 +vt 0.208955 0.421875 +vt 0.208955 0.359375 +vt 0.238806 0.375000 +vt 0.208955 0.375000 +vt 0.208955 0.437500 +vt 0.238806 0.453125 +vt 0.208955 0.453125 +vt 0.208955 0.390625 +vt 0.238806 0.406250 +vt 0.208955 0.390625 +vt 0.238806 0.406250 +vt 0.208955 0.343750 +vt 0.238806 0.359375 +vt 0.208955 0.421875 +vt 0.238806 0.437500 +vt 0.208955 0.375000 +vt 0.238806 0.390625 +vt 0.208955 0.390625 +vt 0.208955 0.328125 +vt 0.238806 0.343750 +vt 0.208955 0.406250 +vt 0.238806 0.421875 +vt 0.208955 0.359375 +vt 0.238806 0.375000 +vt 0.208955 0.437500 +vt 0.238806 0.453125 +vt 0.208955 0.453125 +vt 0.208955 0.390625 +vt 0.238806 0.406250 +vt 0.208955 0.343750 +vt 0.238806 0.359375 +vt 0.208955 0.421875 +vt 0.238806 0.437500 +vt 0.208955 0.375000 +vt 0.238806 0.390625 +vt 0.208955 0.390625 +vt 0.208955 0.328125 +vt 0.238806 0.343750 +vt 0.208955 0.406250 +vt 0.238806 0.421875 +vt 0.208955 0.359375 +vt 0.238806 0.375000 +vt 0.208955 0.437500 +vt 0.238806 0.453125 +vt 0.208955 0.453125 +vt 0.208955 0.390625 +vt 0.238806 0.406250 +vt 0.208955 0.343750 +vt 0.238806 0.359375 +vt 0.208955 0.421875 +vt 0.238806 0.437500 +vt 0.208955 0.375000 +vt 0.238806 0.390625 +vt 0.208955 0.375000 +vt 0.238806 0.390625 +vt 0.208955 0.328125 +vt 0.238806 0.343750 +vt 0.208955 0.406250 +vt 0.238806 0.421875 +vt 0.208955 0.359375 +vt 0.238806 0.375000 +vt 0.208955 0.359375 +vt 0.238806 0.375000 +vt 0.208955 0.437500 +vt 0.238806 0.453125 +vt 0.208955 0.453125 +vt 0.238806 0.406250 +vt 0.208955 0.343750 +vt 0.238806 0.359375 +vt 0.208955 0.343750 +vt 0.238806 0.359375 +vt 0.208955 0.421875 +vt 0.238806 0.437500 +vt 0.208955 0.375000 +vt 0.238806 0.390625 +vt 0.208955 0.328125 +vt 0.238806 0.343750 +vt 0.208955 0.328125 +vt 0.238806 0.343750 +vt 0.208955 0.406250 +vt 0.238806 0.421875 +vt 0.208955 0.359375 +vt 0.238806 0.375000 +vt 0.208955 0.437500 +vt 0.238806 0.453125 +vt 0.208955 0.453125 +vt 0.208955 0.437500 +vt 0.238806 0.453125 +vt 0.208955 0.453125 +vt 0.238806 0.406250 +vt 0.238806 0.359375 +vt 0.238806 0.437500 +vt 0.238806 0.437500 +vt 0.238806 0.390625 +vt 0.257463 0.625000 +vt 0.272388 0.687500 +vt 0.257463 0.687500 +vt 0.257463 0.312500 +vt 0.272388 0.375000 +vt 0.257463 0.375000 +vt 0.257463 0.125000 +vt 0.272388 0.187500 +vt 0.257463 0.187500 +vt 0.272388 0.750000 +vt 0.257463 0.750000 +vt 0.272388 0.437500 +vt 0.257463 0.437500 +vt 0.257463 0.500000 +vt 0.272388 0.562500 +vt 0.257463 0.562500 +vt 0.272388 0.250000 +vt 0.257463 0.250000 +vt 0.272388 0.812500 +vt 0.257463 0.812500 +vt 0.272388 0.500000 +vt 0.272388 0.625000 +vt 0.272388 0.312500 +vt 0.272388 0.875000 +vt 0.257463 0.875000 +vt 0.406716 0.406250 +vt 0.332090 0.500000 +vt 0.332090 0.406250 +vt 0.406716 0.125000 +vt 0.332090 0.218750 +vt 0.332090 0.125000 +vt 0.406716 0.500000 +vt 0.332090 0.593750 +vt 0.406716 0.593750 +vt 0.332090 0.687500 +vt 0.406716 0.781250 +vt 0.332090 0.875000 +vt 0.332090 0.781250 +vt 0.332090 0.312500 +vt 0.406716 0.218750 +vt 0.406716 0.609375 +vt 0.414179 0.515625 +vt 0.488806 0.609375 +vt 0.406716 0.703125 +vt 0.488806 0.703125 +vt 0.421642 0.906250 +vt 0.488806 0.796875 +vt 0.488806 0.906250 +vt 0.421642 0.406250 +vt 0.488806 0.312500 +vt 0.488806 0.406250 +vt 0.414179 0.796875 +vt 0.429104 0.312500 +vt 0.488806 0.218750 +vt 0.488806 0.515625 +vt 0.429104 0.218750 +vt 0.421642 0.125000 +vt 0.488806 0.671875 +vt 0.488806 0.765625 +vt 0.496269 0.562500 +vt 0.503731 0.437500 +vt 0.548507 0.578125 +vt 0.507463 0.328125 +vt 0.548507 0.328125 +vt 0.507463 0.234375 +vt 0.503731 0.125000 +vt 0.548507 0.234375 +vt 0.503731 1.000000 +vt 0.548507 0.875000 +vt 0.548507 1.000000 +vt 0.496269 0.875000 +vt 0.727612 0.140625 +vt 0.716418 0.125000 +vt 0.727612 0.125000 +vt 0.727612 0.234375 +vt 0.716418 0.218750 +vt 0.727612 0.218750 +vt 0.727612 0.203125 +vt 0.716418 0.187500 +vt 0.727612 0.187500 +vt 0.727612 0.171875 +vt 0.716418 0.156250 +vt 0.727612 0.156250 +vt 0.716418 0.140625 +vt 0.727612 0.250000 +vt 0.716418 0.234375 +vt 0.716418 0.203125 +vt 0.716418 0.171875 +vt 0.014925 0.781250 +vt 0.000000 0.781250 +vt 0.022388 0.781250 +vt 0.018657 0.781250 +vt 0.026119 0.781250 +vt 0.044776 0.781250 +vt 0.052239 0.781250 +vt 0.070896 0.781250 +vt 0.093284 0.781250 +vt 0.078358 0.781250 +vt 0.100746 0.781250 +vt 0.488806 0.125000 +vt 0.548507 0.437500 +vt 0.548507 0.125000 +vt 0.630597 0.187500 +vt 0.623134 0.125000 +vt 0.630597 0.125000 +vt 0.630597 0.750000 +vt 0.623134 0.687500 +vt 0.630597 0.687500 +vt 0.630597 0.437500 +vt 0.623134 0.375000 +vt 0.630597 0.375000 +vt 0.630597 0.562500 +vt 0.623134 0.500000 +vt 0.630597 0.500000 +vt 0.630597 0.250000 +vt 0.623134 0.187500 +vt 0.630597 0.812500 +vt 0.623134 0.750000 +vt 0.623134 0.437500 +vt 0.630597 0.625000 +vt 0.623134 0.562500 +vt 0.630597 0.312500 +vt 0.623134 0.250000 +vt 0.630597 0.875000 +vt 0.623134 0.812500 +vt 0.623134 0.625000 +vt 0.623134 0.312500 +vt 0.641791 0.437500 +vt 0.645522 0.453125 +vt 0.641791 0.453125 +vt 0.645965 0.438018 +vt 0.649254 0.453125 +vt 0.645522 0.546875 +vt 0.641791 0.562500 +vt 0.641791 0.546875 +vt 0.649254 0.546875 +vt 0.645522 0.562500 +vt 0.645522 0.531250 +vt 0.641791 0.531250 +vt 0.649254 0.531250 +vt 0.641791 0.515625 +vt 0.645522 0.515625 +vt 0.641791 0.500000 +vt 0.645522 0.500000 +vt 0.645522 0.484375 +vt 0.641791 0.484375 +vt 0.645522 0.468750 +vt 0.641791 0.468750 +vt 0.638060 0.468750 +vt 0.638060 0.484375 +vt 0.638060 0.500000 +vt 0.638060 0.515625 +vt 0.638060 0.531250 +vt 0.638060 0.546875 +vt 0.638060 0.437500 +vt 0.638060 0.453125 +vt 0.649254 0.468750 +vt 0.649254 0.484375 +vt 0.649254 0.500000 +vt 0.652985 0.468750 +vt 0.652985 0.484375 +vt 0.649254 0.515625 +vt 0.652985 0.500000 +vt 0.652985 0.515625 +vt 0.652985 0.531250 +vt 0.652985 0.546875 +vt 0.649254 0.562500 +vt 0.649254 0.437500 +vt 0.652985 0.437500 +vt 0.652985 0.453125 +vt 0.664179 0.468750 +vt 0.675373 0.484375 +vt 0.675373 0.453125 +vt 0.664179 0.484375 +vt 0.664179 0.500000 +vt 0.675373 0.562500 +vt 0.664179 0.515625 +vt 0.675373 0.546875 +vt 0.664179 0.531250 +vt 0.675373 0.531250 +vt 0.664179 0.546875 +vt 0.675373 0.515625 +vt 0.664179 0.437500 +vt 0.675373 0.500000 +vt 0.664179 0.453125 +vt 0.675373 0.468750 +vt 0.570895 0.265625 +vt 0.555970 0.250000 +vt 0.570895 0.250000 +vt 0.570895 0.187500 +vt 0.555970 0.171875 +vt 0.570895 0.171875 +vt 0.570895 0.140625 +vt 0.555970 0.125000 +vt 0.570895 0.125000 +vt 0.570895 0.281250 +vt 0.555970 0.265625 +vt 0.570895 0.203125 +vt 0.555970 0.187500 +vt 0.570895 0.234375 +vt 0.555970 0.218750 +vt 0.570895 0.218750 +vt 0.570895 0.156250 +vt 0.555970 0.140625 +vt 0.570895 0.296875 +vt 0.555970 0.281250 +vt 0.555970 0.203125 +vt 0.555970 0.234375 +vt 0.555970 0.156250 +vt 0.570895 0.312500 +vt 0.555970 0.296875 +vt 0.638060 0.359375 +vt 0.630597 0.312500 +vt 0.638060 0.312500 +vt 0.638060 0.453125 +vt 0.630597 0.406250 +vt 0.638060 0.406250 +vt 0.638060 0.218750 +vt 0.630597 0.171875 +vt 0.638060 0.171875 +vt 0.638060 0.640625 +vt 0.630597 0.593750 +vt 0.638060 0.593750 +vt 0.630597 0.359375 +vt 0.638060 0.500000 +vt 0.630597 0.453125 +vt 0.638060 0.265625 +vt 0.630597 0.218750 +vt 0.638060 0.687500 +vt 0.630597 0.640625 +vt 0.638060 0.546875 +vt 0.630597 0.500000 +vt 0.630597 0.265625 +vt 0.630597 0.125000 +vt 0.638060 0.125000 +vt 0.630597 0.546875 +vt 0.716418 0.125000 +vt 0.727612 0.140625 +vt 0.727612 0.125000 +vt 0.716418 0.218750 +vt 0.727612 0.234375 +vt 0.727612 0.218750 +vt 0.716418 0.187500 +vt 0.727612 0.203125 +vt 0.727612 0.187500 +vt 0.716418 0.156250 +vt 0.727612 0.171875 +vt 0.727612 0.156250 +vt 0.716418 0.140625 +vt 0.716418 0.234375 +vt 0.727612 0.250000 +vt 0.716418 0.203125 +vt 0.716418 0.171875 +vt 0.641791 0.437500 +vt 0.645522 0.453125 +vt 0.641791 0.453125 +vt 0.645965 0.438018 +vt 0.649254 0.453125 +vt 0.645522 0.546875 +vt 0.641791 0.562500 +vt 0.641791 0.546875 +vt 0.649254 0.546875 +vt 0.645522 0.562500 +vt 0.645522 0.531250 +vt 0.641791 0.531250 +vt 0.649254 0.531250 +vt 0.641791 0.515625 +vt 0.645522 0.515625 +vt 0.641791 0.500000 +vt 0.645522 0.500000 +vt 0.645522 0.484375 +vt 0.641791 0.484375 +vt 0.645522 0.468750 +vt 0.641791 0.468750 +vt 0.638060 0.468750 +vt 0.638060 0.484375 +vt 0.638060 0.500000 +vt 0.638060 0.515625 +vt 0.638060 0.531250 +vt 0.638060 0.546875 +vt 0.638060 0.437500 +vt 0.638060 0.453125 +vt 0.649254 0.468750 +vt 0.649254 0.484375 +vt 0.649254 0.500000 +vt 0.652985 0.468750 +vt 0.652985 0.484375 +vt 0.649254 0.515625 +vt 0.652985 0.500000 +vt 0.652985 0.515625 +vt 0.652985 0.531250 +vt 0.652985 0.546875 +vt 0.649254 0.562500 +vt 0.649254 0.437500 +vt 0.652985 0.437500 +vt 0.652985 0.453125 +vt 0.664179 0.468750 +vt 0.675373 0.484375 +vt 0.675373 0.453125 +vt 0.664179 0.484375 +vt 0.664179 0.500000 +vt 0.675373 0.562500 +vt 0.664179 0.515625 +vt 0.675373 0.546875 +vt 0.664179 0.531250 +vt 0.675373 0.531250 +vt 0.664179 0.546875 +vt 0.675373 0.515625 +vt 0.664179 0.437500 +vt 0.675373 0.500000 +vt 0.664179 0.453125 +vt 0.675373 0.468750 +vt 0.641791 0.437500 +vt 0.645522 0.453125 +vt 0.641791 0.453125 +vt 0.649254 0.437500 +vt 0.645965 0.438018 +vt 0.641791 0.546875 +vt 0.645522 0.562500 +vt 0.641791 0.562500 +vt 0.649254 0.546875 +vt 0.645522 0.546875 +vt 0.645522 0.531250 +vt 0.641791 0.531250 +vt 0.649254 0.531250 +vt 0.645522 0.515625 +vt 0.641791 0.515625 +vt 0.645522 0.500000 +vt 0.641791 0.500000 +vt 0.645522 0.484375 +vt 0.641791 0.484375 +vt 0.645522 0.468750 +vt 0.641791 0.468750 +vt 0.638060 0.468750 +vt 0.638060 0.484375 +vt 0.638060 0.500000 +vt 0.638060 0.515625 +vt 0.638060 0.531250 +vt 0.638060 0.546875 +vt 0.638060 0.437500 +vt 0.638060 0.453125 +vt 0.649254 0.453125 +vt 0.649254 0.468750 +vt 0.649254 0.484375 +vt 0.649254 0.500000 +vt 0.652985 0.468750 +vt 0.652985 0.484375 +vt 0.649254 0.515625 +vt 0.652985 0.500000 +vt 0.652985 0.515625 +vt 0.652985 0.531250 +vt 0.652985 0.546875 +vt 0.649254 0.562500 +vt 0.652985 0.437500 +vt 0.652985 0.453125 +vt 0.664179 0.468750 +vt 0.675373 0.484375 +vt 0.675373 0.453125 +vt 0.664179 0.484375 +vt 0.664179 0.500000 +vt 0.675373 0.562500 +vt 0.664179 0.515625 +vt 0.675373 0.546875 +vt 0.664179 0.531250 +vt 0.675373 0.531250 +vt 0.664179 0.546875 +vt 0.675373 0.515625 +vt 0.664179 0.437500 +vt 0.675373 0.500000 +vt 0.664179 0.453125 +vt 0.675373 0.468750 +vt 0.641791 0.437500 +vt 0.645522 0.453125 +vt 0.641791 0.453125 +vt 0.649254 0.437500 +vt 0.645965 0.438018 +vt 0.641791 0.546875 +vt 0.645522 0.562500 +vt 0.641791 0.562500 +vt 0.649254 0.546875 +vt 0.645522 0.546875 +vt 0.645522 0.531250 +vt 0.641791 0.531250 +vt 0.649254 0.531250 +vt 0.645522 0.515625 +vt 0.641791 0.515625 +vt 0.645522 0.500000 +vt 0.641791 0.500000 +vt 0.645522 0.484375 +vt 0.641791 0.484375 +vt 0.645522 0.468750 +vt 0.641791 0.468750 +vt 0.638060 0.468750 +vt 0.638060 0.484375 +vt 0.638060 0.500000 +vt 0.638060 0.515625 +vt 0.638060 0.531250 +vt 0.638060 0.546875 +vt 0.638060 0.437500 +vt 0.638060 0.453125 +vt 0.649254 0.453125 +vt 0.649254 0.468750 +vt 0.649254 0.484375 +vt 0.649254 0.500000 +vt 0.652985 0.468750 +vt 0.652985 0.484375 +vt 0.649254 0.515625 +vt 0.652985 0.500000 +vt 0.652985 0.515625 +vt 0.652985 0.531250 +vt 0.652985 0.546875 +vt 0.649254 0.562500 +vt 0.652985 0.437500 +vt 0.652985 0.453125 +vt 0.664179 0.468750 +vt 0.675373 0.484375 +vt 0.675373 0.453125 +vt 0.664179 0.484375 +vt 0.664179 0.500000 +vt 0.675373 0.562500 +vt 0.664179 0.515625 +vt 0.675373 0.546875 +vt 0.664179 0.531250 +vt 0.675373 0.531250 +vt 0.664179 0.546875 +vt 0.675373 0.515625 +vt 0.664179 0.437500 +vt 0.675373 0.500000 +vt 0.664179 0.453125 +vt 0.675373 0.468750 +vt 0.645965 0.438018 +vt 0.641791 0.453125 +vt 0.641791 0.437500 +vt 0.649254 0.437500 +vt 0.645522 0.453125 +vt 0.645522 0.546875 +vt 0.641791 0.562500 +vt 0.641791 0.546875 +vt 0.649254 0.562500 +vt 0.649254 0.546875 +vt 0.645522 0.531250 +vt 0.641791 0.531250 +vt 0.649254 0.531250 +vt 0.645522 0.515625 +vt 0.641791 0.515625 +vt 0.645522 0.500000 +vt 0.641791 0.500000 +vt 0.641791 0.484375 +vt 0.645522 0.468750 +vt 0.641791 0.468750 +vt 0.645522 0.484375 +vt 0.638060 0.468750 +vt 0.638060 0.484375 +vt 0.638060 0.500000 +vt 0.638060 0.515625 +vt 0.638060 0.531250 +vt 0.638060 0.546875 +vt 0.638060 0.437500 +vt 0.638060 0.453125 +vt 0.649254 0.453125 +vt 0.649254 0.468750 +vt 0.649254 0.484375 +vt 0.649254 0.500000 +vt 0.652985 0.468750 +vt 0.652985 0.484375 +vt 0.649254 0.515625 +vt 0.652985 0.500000 +vt 0.652985 0.515625 +vt 0.652985 0.531250 +vt 0.652985 0.546875 +vt 0.652985 0.437500 +vt 0.652985 0.453125 +vt 0.664179 0.468750 +vt 0.675373 0.484375 +vt 0.675373 0.453125 +vt 0.664179 0.484375 +vt 0.664179 0.500000 +vt 0.675373 0.562500 +vt 0.664179 0.515625 +vt 0.675373 0.546875 +vt 0.664179 0.531250 +vt 0.675373 0.531250 +vt 0.664179 0.546875 +vt 0.675373 0.515625 +vt 0.664179 0.437500 +vt 0.675373 0.500000 +vt 0.664179 0.453125 +vt 0.675373 0.468750 +vt 0.645965 0.438018 +vt 0.641791 0.453125 +vt 0.641791 0.437500 +vt 0.649254 0.437500 +vt 0.645522 0.453125 +vt 0.645522 0.546875 +vt 0.641791 0.562500 +vt 0.641791 0.546875 +vt 0.649254 0.562500 +vt 0.649254 0.546875 +vt 0.645522 0.531250 +vt 0.641791 0.531250 +vt 0.649254 0.531250 +vt 0.645522 0.515625 +vt 0.641791 0.515625 +vt 0.645522 0.500000 +vt 0.641791 0.500000 +vt 0.641791 0.484375 +vt 0.645522 0.468750 +vt 0.641791 0.468750 +vt 0.645522 0.484375 +vt 0.638060 0.468750 +vt 0.638060 0.484375 +vt 0.638060 0.500000 +vt 0.638060 0.515625 +vt 0.638060 0.531250 +vt 0.638060 0.546875 +vt 0.638060 0.437500 +vt 0.638060 0.453125 +vt 0.649254 0.453125 +vt 0.649254 0.468750 +vt 0.649254 0.484375 +vt 0.649254 0.500000 +vt 0.652985 0.468750 +vt 0.652985 0.484375 +vt 0.649254 0.515625 +vt 0.652985 0.500000 +vt 0.652985 0.515625 +vt 0.652985 0.531250 +vt 0.652985 0.546875 +vt 0.652985 0.437500 +vt 0.652985 0.453125 +vt 0.664179 0.468750 +vt 0.675373 0.484375 +vt 0.675373 0.453125 +vt 0.664179 0.484375 +vt 0.664179 0.500000 +vt 0.675373 0.562500 +vt 0.664179 0.515625 +vt 0.675373 0.546875 +vt 0.664179 0.531250 +vt 0.675373 0.531250 +vt 0.664179 0.546875 +vt 0.675373 0.515625 +vt 0.664179 0.437500 +vt 0.675373 0.500000 +vt 0.664179 0.453125 +vt 0.675373 0.468750 +vt 0.652985 0.562500 +vt 0.208955 0.125000 +vt 0.238806 0.328125 +vt 0.238806 0.328125 +vt 0.238806 0.328125 +vt 0.238806 0.328125 +vt 0.238806 0.328125 +vt 0.238806 0.328125 +vt 0.272388 0.125000 +vt 0.406716 0.687500 +vt 0.406716 0.875000 +vt 0.406716 0.312500 +vt 0.716418 0.250000 +vt 0.041045 0.781250 +vt 0.048507 0.781250 +vt 0.067164 0.781250 +vt 0.074627 0.781250 +vt 0.097015 0.781250 +vt 0.623134 0.875000 +vt 0.675373 0.437500 +vt 0.664179 0.562500 +vt 0.555970 0.312500 +vt 0.630597 0.687500 +vt 0.716418 0.250000 +vt 0.675373 0.437500 +vt 0.664179 0.562500 +vt 0.675373 0.437500 +vt 0.664179 0.562500 +vt 0.675373 0.437500 +vt 0.664179 0.562500 +vt 0.645522 0.562500 +vt 0.675373 0.437500 +vt 0.664179 0.562500 +vt 0.645522 0.562500 +vt 0.675373 0.437500 +vt 0.664179 0.562500 +vn 0.0000 0.0000 1.0000 +vn -0.8660 -0.5000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.8660 -0.5000 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 0.5000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 -0.7071 0.0000 +vn 0.0000 -0.7071 0.7071 +vn -0.7071 0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 0.2425 0.9701 +vn 0.0000 0.2425 -0.9701 +vn 0.1499 0.9887 0.0000 +vn 0.7813 0.6242 0.0000 +vn 0.1499 -0.9887 0.0000 +vn -0.2208 -0.9753 0.0000 +vn 0.7813 -0.6242 0.0000 +vn 0.9550 -0.2965 0.0000 +vn -0.7813 0.6242 0.0000 +vn -0.1499 0.9887 0.0000 +vn -0.7813 -0.6242 0.0000 +vn -0.9550 -0.2965 0.0000 +vn -0.9550 0.2965 0.0000 +vn 0.2208 -0.9753 0.0000 +vn -0.1499 -0.9887 0.0000 +vn 0.9550 0.2965 0.0000 +vn 0.9312 0.3645 0.0000 +vn 0.9312 -0.3645 0.0000 +vn -0.9312 0.3645 0.0000 +vn -0.7343 0.6788 0.0000 +vn -0.2208 0.9753 0.0000 +vn -0.7343 -0.6788 0.0000 +vn -0.9312 -0.3645 0.0000 +vn 0.7343 -0.6788 0.0000 +vn 0.2208 0.9753 0.0000 +vn 0.7343 0.6788 0.0000 +vn 0.9659 -0.2588 0.0000 +vn 0.2588 -0.9659 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.9659 -0.2588 0.0000 +vn 0.2588 0.9659 0.0000 +vn -0.5000 0.8660 0.0000 +vn -0.9659 0.2588 0.0000 +vn 0.9659 0.2588 0.0000 +vn 0.5000 0.8660 0.0000 +vn -0.2588 0.9659 0.0000 +vn -0.2588 -0.9659 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.9474 -0.3073 0.0890 +vn 0.9239 0.3827 0.0000 +vn 0.9239 -0.3827 0.0000 +vn -0.9474 -0.3073 0.0890 +vn -0.3827 -0.9239 0.0000 +vn -0.9239 -0.3827 0.0000 +vn 0.8995 0.4220 -0.1137 +vn 0.3827 0.9239 0.0000 +vn 0.3595 0.9099 -0.2070 +vn -0.3827 0.9239 0.0000 +vn -0.8995 0.4220 -0.1137 +vn -0.9239 0.3827 0.0000 +vn 0.3827 -0.9239 0.0000 +vn -0.3933 -0.8620 0.3198 +vn 0.3916 0.7677 -0.5072 +vn -0.3595 0.9099 -0.2070 +vn -0.3916 0.7677 -0.5072 +vn -0.9259 0.3078 -0.2189 +vn -0.9481 -0.2244 0.2254 +vn 0.3988 -0.5746 0.7147 +vn 0.9481 -0.2244 0.2254 +vn 0.3933 -0.8620 0.3198 +vn -0.3988 -0.5746 0.7147 +vn 0.9259 0.3078 -0.2189 +vn -0.4348 0.6780 -0.5927 +vn 0.4348 0.6780 -0.5927 +vn 0.9530 0.2142 -0.2142 +vn 0.3909 -0.4393 0.8089 +vn -0.3909 -0.4393 0.8089 +vn -0.9530 0.2142 -0.2142 +vn -0.9414 -0.1935 0.2764 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.9239 -0.3827 +vn 0.0000 0.3827 0.9239 +vn 0.0000 -0.3827 0.9239 +vn 0.9414 -0.1935 0.2764 +vn 0.0000 -0.7486 0.6630 +vn 0.5293 -0.5294 0.6630 +vn 0.5294 -0.5294 -0.6630 +vn -0.5293 -0.5294 0.6630 +vn -0.5294 -0.5294 -0.6630 +vn -0.7486 -0.0000 0.6630 +vn -0.7486 -0.0000 -0.6630 +vn -0.5293 0.5294 0.6630 +vn 0.0000 0.7486 0.6630 +vn 0.5293 0.5294 0.6630 +vn 0.7486 -0.0000 0.6630 +vn 0.7486 -0.0000 -0.6630 +vn 0.5294 0.5294 -0.6630 +vn 0.0000 0.7486 -0.6630 +vn -0.5294 0.5294 -0.6630 +vn 0.0000 -0.7486 -0.6630 +vn -0.6483 -0.3743 0.6630 +vn -0.1938 -0.7231 0.6630 +vn -0.6483 -0.3743 -0.6630 +vn -0.7231 0.1938 0.6630 +vn -0.7231 0.1938 -0.6630 +vn -0.3743 0.6483 0.6630 +vn -0.3743 0.6483 -0.6630 +vn 0.1938 0.7231 0.6630 +vn 0.6483 0.3743 0.6630 +vn 0.7231 -0.1938 0.6630 +vn 0.3743 -0.6483 0.6630 +vn -0.1938 -0.7231 -0.6630 +vn 0.3743 -0.6483 -0.6630 +vn 0.7231 -0.1938 -0.6630 +vn 0.6483 0.3743 -0.6630 +vn 0.1938 0.7231 -0.6630 +vn -0.7231 -0.1938 0.6630 +vn -0.6483 0.3743 0.6630 +vn -0.6483 0.3743 -0.6630 +vn -0.1938 0.7231 0.6630 +vn -0.1938 0.7231 -0.6630 +vn 0.3743 0.6483 0.6630 +vn 0.3743 0.6483 -0.6630 +vn 0.7231 0.1938 0.6630 +vn 0.6483 -0.3743 0.6630 +vn 0.1938 -0.7231 0.6630 +vn -0.3743 -0.6483 0.6630 +vn -0.7231 -0.1938 -0.6630 +vn -0.3743 -0.6483 -0.6630 +vn 0.1938 -0.7231 -0.6630 +vn 0.6483 -0.3743 -0.6630 +vn 0.7231 0.1938 -0.6630 +s off +f 29/1/1 13/2/1 53/3/1 +f 61/4/1 63/5/1 58/6/1 +f 73/7/1 74/8/1 49/9/1 +f 68/10/1 67/11/1 9/12/1 +f 72/13/1 71/14/1 25/15/1 +f 76/16/1 75/17/1 41/18/1 +f 65/19/1 66/20/1 17/21/1 +f 69/22/1 70/23/1 33/24/1 +f 81/25/1 82/26/1 39/27/1 +f 11/28/1 86/29/1 55/30/1 +f 80/31/1 79/32/1 15/33/1 +f 84/34/1 83/35/1 31/36/1 +f 19/37/1 87/38/1 47/39/1 +f 77/40/1 78/41/1 23/42/1 +f 39/27/1 52/43/1 51/44/1 +f 37/45/1 52/43/1 38/46/1 +f 12/47/1 55/30/1 54/48/1 +f 12/47/1 53/3/1 13/2/1 +f 14/49/1 27/50/1 15/33/1 +f 14/49/1 29/1/1 28/51/1 +f 30/52/1 43/53/1 31/36/1 +f 29/1/1 44/54/1 30/52/1 +f 19/37/1 46/55/1 20/56/1 +f 20/56/1 45/57/1 21/58/1 +f 23/42/1 36/59/1 35/60/1 +f 21/58/1 36/59/1 22/61/1 +f 69/62/2 94/63/2 70/64/2 +f 68/65/3 91/66/3 67/67/3 +f 76/68/4 99/69/4 75/70/4 +f 73/71/5 98/72/5 74/73/5 +f 72/74/6 95/75/6 71/76/6 +f 65/77/7 90/78/7 66/79/7 +f 135/80/1 136/81/1 129/82/1 +f 151/83/1 152/84/1 145/85/1 +f 125/86/1 127/87/1 121/88/1 +f 143/89/1 144/90/1 137/91/1 +f 159/92/1 160/93/1 153/94/1 +f 117/95/1 119/96/1 113/97/1 +f 165/98/1 169/99/1 161/100/1 +f 181/101/8 179/102/8 175/103/8 +f 186/104/9 187/105/9 185/106/9 +f 187/105/8 192/107/8 191/108/8 +f 192/107/10 189/109/10 191/108/10 +f 190/110/1 185/111/1 189/109/1 +f 191/108/10 189/109/10 196/112/10 +f 188/113/11 190/110/11 192/107/11 +f 193/114/9 204/115/9 195/116/9 +f 194/117/9 197/118/9 185/119/9 +f 203/120/8 219/121/8 204/115/8 +f 185/106/9 187/105/9 194/122/9 +f 197/123/8 206/124/8 198/125/8 +f 189/126/10 200/127/10 196/128/10 +f 185/129/3 198/130/3 189/126/3 +f 196/128/7 199/131/7 194/117/7 +f 191/108/12 194/117/12 187/105/12 +f 197/132/9 199/133/9 201/134/9 +f 220/135/10 217/136/10 219/121/10 +f 200/137/10 198/125/10 202/138/10 +f 207/139/13 209/140/13 205/141/13 +f 201/134/9 205/142/9 197/132/9 +f 202/138/1 207/143/1 201/134/1 +f 198/125/10 208/144/10 202/138/10 +f 210/145/7 211/146/7 209/147/7 +f 210/145/1 216/148/1 212/149/1 +f 211/150/8 213/151/8 209/152/8 +f 216/148/3 213/151/3 215/153/3 +f 209/154/8 206/124/8 205/155/8 +f 214/156/1 207/139/1 208/144/1 +f 206/124/11 214/156/11 208/144/11 +f 200/127/14 201/134/14 199/131/14 +f 217/157/1 193/114/1 195/116/1 +f 219/121/10 217/136/10 222/158/10 +f 203/120/15 218/159/15 220/160/15 +f 221/161/9 223/162/9 195/163/9 +f 195/116/9 204/115/9 221/164/9 +f 223/165/8 230/166/8 224/167/8 +f 217/168/10 226/169/10 222/170/10 +f 195/163/3 224/171/3 217/172/3 +f 222/170/7 225/173/7 221/161/7 +f 219/121/12 221/161/12 204/115/12 +f 223/165/9 225/174/9 227/175/9 +f 226/176/10 224/177/10 228/178/10 +f 227/175/9 229/179/9 223/165/9 +f 228/178/1 231/180/1 227/175/1 +f 224/177/10 232/181/10 228/178/10 +f 226/169/14 227/175/14 225/173/14 +f 212/182/16 230/183/16 211/184/16 +f 230/185/8 215/153/8 211/186/8 +f 215/153/15 231/180/15 216/148/15 +f 216/148/1 232/187/1 212/182/1 +f 259/188/12 263/189/12 260/190/12 +f 267/191/7 266/192/7 265/193/7 +f 271/194/3 269/195/3 270/196/3 +f 267/197/8 272/198/8 268/199/8 +f 266/192/1 270/200/1 265/201/1 +f 268/199/10 271/194/10 266/192/10 +f 283/202/10 285/203/10 287/204/10 +f 299/205/3 297/206/3 298/207/3 +f 294/208/10 300/209/10 299/205/10 +f 292/210/10 294/208/10 290/211/10 +f 289/212/9 295/213/9 291/214/9 +f 291/214/8 296/215/8 292/210/8 +f 290/211/1 293/216/1 289/217/1 +f 293/218/9 297/219/9 295/213/9 +f 295/213/8 300/209/8 296/215/8 +f 294/220/14 298/207/14 293/221/14 +f 302/222/7 303/223/7 301/224/7 +f 305/225/3 307/226/3 306/227/3 +f 308/228/8 303/229/8 304/230/8 +f 306/231/1 302/222/1 301/232/1 +f 307/226/9 304/230/9 302/222/9 +f 312/233/8 315/234/8 311/235/8 +f 309/236/1 314/237/1 310/238/1 +f 310/238/10 316/239/10 312/233/10 +f 311/235/9 313/240/9 309/241/9 +f 325/242/9 322/243/9 334/244/9 +f 331/245/10 318/246/10 338/247/10 +f 335/248/10 323/249/10 328/250/10 +f 339/251/9 320/252/9 330/253/9 +f 329/254/9 341/255/9 326/256/9 +f 327/257/10 344/258/10 332/259/10 +f 337/260/10 346/261/10 336/262/10 +f 333/263/9 348/264/9 340/265/9 +f 345/266/9 334/244/9 322/267/9 +f 336/262/10 321/268/10 335/248/10 +f 326/256/9 324/269/9 325/242/9 +f 342/270/10 328/250/10 323/271/10 +f 343/272/9 330/253/9 320/273/9 +f 332/259/10 319/274/10 331/245/10 +f 340/275/9 317/276/9 339/251/9 +f 347/277/10 338/247/10 318/278/10 +f 355/279/3 359/280/3 358/281/3 +f 352/282/10 355/279/10 350/283/10 +f 349/284/9 353/285/9 351/286/9 +f 357/287/3 353/285/3 354/288/3 +f 359/289/9 362/290/9 358/291/9 +f 357/292/10 364/293/10 360/294/10 +f 362/295/17 355/279/17 358/281/17 +f 361/296/17 354/288/17 349/297/17 +f 364/298/18 353/285/18 360/299/18 +f 363/300/18 356/301/18 352/302/18 +f 349/297/17 362/295/17 361/296/17 +f 351/303/18 363/300/18 352/302/18 +f 361/304/3 363/305/3 364/293/3 +f 381/306/1 385/307/1 377/308/1 +f 375/309/8 373/310/8 371/311/8 +f 421/312/8 429/313/8 416/314/8 +f 421/312/8 423/315/8 430/316/8 +f 418/317/8 424/318/8 423/315/8 +f 420/319/8 425/320/8 424/318/8 +f 422/321/8 425/320/8 415/322/8 +f 422/321/8 427/323/8 426/324/8 +f 419/325/8 427/326/8 417/327/8 +f 419/325/8 429/313/8 428/328/8 +f 481/329/8 477/330/8 473/331/8 +f 487/332/1 491/333/1 483/334/1 +f 258/335/12 259/188/12 260/190/12 +f 258/335/12 262/336/12 257/337/12 +f 506/338/9 505/339/9 509/340/9 +f 519/341/3 521/342/3 520/343/3 +f 516/344/9 522/345/9 518/346/9 +f 516/344/9 514/347/9 512/348/9 +f 517/349/10 511/350/10 513/351/10 +f 518/346/8 513/351/8 514/347/8 +f 515/352/1 512/348/1 511/353/1 +f 519/354/10 515/355/10 517/349/10 +f 522/345/8 517/349/8 518/346/8 +f 520/343/14 516/356/14 515/357/14 +f 555/358/8 563/359/8 550/360/8 +f 555/358/8 557/361/8 564/362/8 +f 552/363/8 558/364/8 557/361/8 +f 554/365/8 559/366/8 558/364/8 +f 556/367/8 559/366/8 549/368/8 +f 556/367/8 561/369/8 560/370/8 +f 553/371/8 561/372/8 551/373/8 +f 553/371/8 563/359/8 562/374/8 +f 613/375/8 621/376/8 608/377/8 +f 613/375/8 615/378/8 622/379/8 +f 610/380/8 616/381/8 615/378/8 +f 612/382/8 617/383/8 616/381/8 +f 614/384/8 617/383/8 607/385/8 +f 614/384/8 619/386/8 618/387/8 +f 611/388/8 619/389/8 609/390/8 +f 611/388/8 621/376/8 620/391/8 +f 671/392/8 679/393/8 666/394/8 +f 671/392/8 673/395/8 680/396/8 +f 668/397/8 674/398/8 673/395/8 +f 670/399/8 675/400/8 674/398/8 +f 672/401/8 675/400/8 665/402/8 +f 672/401/8 677/403/8 676/404/8 +f 669/405/8 677/406/8 667/407/8 +f 669/405/8 679/393/8 678/408/8 +f 729/409/8 737/410/8 724/411/8 +f 729/409/8 731/412/8 738/413/8 +f 726/414/8 732/415/8 731/412/8 +f 728/416/8 733/417/8 732/415/8 +f 730/418/8 733/417/8 723/419/8 +f 730/418/8 735/420/8 734/421/8 +f 727/422/8 735/423/8 725/424/8 +f 727/422/8 737/410/8 736/425/8 +f 787/426/8 795/427/8 782/428/8 +f 787/426/8 789/429/8 796/430/8 +f 784/431/8 790/432/8 789/429/8 +f 786/433/8 791/434/8 790/432/8 +f 788/435/8 791/434/8 781/436/8 +f 788/435/8 793/437/8 792/438/8 +f 785/439/8 793/440/8 783/441/8 +f 785/439/8 795/427/8 794/442/8 +f 53/3/1 37/45/1 29/1/1 +f 37/45/1 21/58/1 29/1/1 +f 21/58/1 45/57/1 29/1/1 +f 58/6/1 57/443/1 59/444/1 +f 59/444/1 60/445/1 61/4/1 +f 61/4/1 62/446/1 63/5/1 +f 63/5/1 64/447/1 58/6/1 +f 58/6/1 59/444/1 61/4/1 +f 81/25/1 50/448/1 74/8/1 +f 50/448/1 49/9/1 74/8/1 +f 49/9/1 56/449/1 73/7/1 +f 56/449/1 86/29/1 73/7/1 +f 85/450/1 10/451/1 67/11/1 +f 10/451/1 9/12/1 67/11/1 +f 9/12/1 16/452/1 68/10/1 +f 16/452/1 79/32/1 68/10/1 +f 80/31/1 26/453/1 71/14/1 +f 26/453/1 25/15/1 71/14/1 +f 25/15/1 32/454/1 72/13/1 +f 32/454/1 83/35/1 72/13/1 +f 84/34/1 42/455/1 75/17/1 +f 42/455/1 41/18/1 75/17/1 +f 41/18/1 48/456/1 76/16/1 +f 48/456/1 87/38/1 76/16/1 +f 88/457/1 18/458/1 66/20/1 +f 18/458/1 17/21/1 66/20/1 +f 17/21/1 24/459/1 65/19/1 +f 24/459/1 78/41/1 65/19/1 +f 77/40/1 34/460/1 70/23/1 +f 34/460/1 33/24/1 70/23/1 +f 33/24/1 40/461/1 69/22/1 +f 40/461/1 82/26/1 69/22/1 +f 82/26/1 40/461/1 39/27/1 +f 39/27/1 51/44/1 81/25/1 +f 51/44/1 50/448/1 81/25/1 +f 11/28/1 10/451/1 85/450/1 +f 85/450/1 86/29/1 11/28/1 +f 86/29/1 56/449/1 55/30/1 +f 79/32/1 16/452/1 15/33/1 +f 15/33/1 27/50/1 80/31/1 +f 27/50/1 26/453/1 80/31/1 +f 83/35/1 32/454/1 31/36/1 +f 31/36/1 43/53/1 84/34/1 +f 43/53/1 42/455/1 84/34/1 +f 19/37/1 18/458/1 88/457/1 +f 88/457/1 87/38/1 19/37/1 +f 87/38/1 48/456/1 47/39/1 +f 78/41/1 24/459/1 23/42/1 +f 23/42/1 35/60/1 77/40/1 +f 35/60/1 34/460/1 77/40/1 +f 39/27/1 38/46/1 52/43/1 +f 37/45/1 53/3/1 52/43/1 +f 12/47/1 11/28/1 55/30/1 +f 12/47/1 54/48/1 53/3/1 +f 14/49/1 28/51/1 27/50/1 +f 14/49/1 13/2/1 29/1/1 +f 30/52/1 44/54/1 43/53/1 +f 29/1/1 45/57/1 44/54/1 +f 19/37/1 47/39/1 46/55/1 +f 20/56/1 46/55/1 45/57/1 +f 23/42/1 22/61/1 36/59/1 +f 21/58/1 37/45/1 36/59/1 +f 69/62/2 93/462/2 94/63/2 +f 68/65/3 92/463/3 91/66/3 +f 76/68/4 100/464/4 99/69/4 +f 73/71/5 97/465/5 98/72/5 +f 72/74/6 96/466/6 95/75/6 +f 65/77/7 89/467/7 90/78/7 +f 129/82/1 130/468/1 131/469/1 +f 131/469/1 132/470/1 129/82/1 +f 132/470/1 133/471/1 129/82/1 +f 133/471/1 134/472/1 129/82/1 +f 134/472/1 135/80/1 129/82/1 +f 145/85/1 146/473/1 147/474/1 +f 147/474/1 148/475/1 145/85/1 +f 148/475/1 149/476/1 145/85/1 +f 149/476/1 150/477/1 145/85/1 +f 150/477/1 151/83/1 145/85/1 +f 121/88/1 122/478/1 123/479/1 +f 123/479/1 124/480/1 125/86/1 +f 125/86/1 126/481/1 127/87/1 +f 127/87/1 128/482/1 121/88/1 +f 121/88/1 123/479/1 125/86/1 +f 137/91/1 138/483/1 139/484/1 +f 139/484/1 140/485/1 137/91/1 +f 140/485/1 141/486/1 137/91/1 +f 141/486/1 142/487/1 137/91/1 +f 142/487/1 143/89/1 137/91/1 +f 153/94/1 154/488/1 155/489/1 +f 155/489/1 156/490/1 153/94/1 +f 156/490/1 157/491/1 153/94/1 +f 157/491/1 158/492/1 153/94/1 +f 158/492/1 159/92/1 153/94/1 +f 113/97/1 114/493/1 115/494/1 +f 115/494/1 116/495/1 117/95/1 +f 117/95/1 118/496/1 119/96/1 +f 119/96/1 120/497/1 113/97/1 +f 113/97/1 115/494/1 117/95/1 +f 161/100/1 162/498/1 163/499/1 +f 163/499/1 164/500/1 161/100/1 +f 164/500/1 165/98/1 161/100/1 +f 165/98/1 166/501/1 169/99/1 +f 166/501/1 167/502/1 169/99/1 +f 167/502/1 168/503/1 169/99/1 +f 169/99/1 170/504/1 171/505/1 +f 171/505/1 172/506/1 169/99/1 +f 172/506/1 161/100/1 169/99/1 +f 175/103/8 173/507/8 174/508/8 +f 174/508/8 184/509/8 175/103/8 +f 184/509/8 183/510/8 175/103/8 +f 183/510/8 182/511/8 181/101/8 +f 181/101/8 180/512/8 179/102/8 +f 179/102/8 178/513/8 175/103/8 +f 178/513/8 177/514/8 175/103/8 +f 177/514/8 176/515/8 175/103/8 +f 183/510/8 181/101/8 175/103/8 +f 186/104/9 188/516/9 187/105/9 +f 187/105/8 188/516/8 192/107/8 +f 192/107/10 190/110/10 189/109/10 +f 190/110/1 186/517/1 185/111/1 +f 188/113/11 186/518/11 190/110/11 +f 193/114/9 203/120/9 204/115/9 +f 194/117/9 199/131/9 197/118/9 +f 203/120/8 220/135/8 219/121/8 +f 197/123/8 205/519/8 206/124/8 +f 189/126/10 198/130/10 200/127/10 +f 185/129/3 197/520/3 198/130/3 +f 196/128/7 200/127/7 199/131/7 +f 191/108/12 196/128/12 194/117/12 +f 220/135/10 218/521/10 217/136/10 +f 207/139/13 210/522/13 209/140/13 +f 201/134/9 207/143/9 205/142/9 +f 202/138/1 208/144/1 207/143/1 +f 198/125/10 206/124/10 208/144/10 +f 210/145/7 212/149/7 211/146/7 +f 210/145/1 214/156/1 216/148/1 +f 211/150/8 215/153/8 213/151/8 +f 216/148/3 214/156/3 213/151/3 +f 209/154/8 213/151/8 206/124/8 +f 214/156/1 210/522/1 207/139/1 +f 206/124/11 213/151/11 214/156/11 +f 200/127/14 202/138/14 201/134/14 +f 217/157/1 218/523/1 193/114/1 +f 203/120/15 193/114/15 218/159/15 +f 221/161/9 225/173/9 223/162/9 +f 223/165/8 229/179/8 230/166/8 +f 217/168/10 224/524/10 226/169/10 +f 195/163/3 223/162/3 224/171/3 +f 222/170/7 226/169/7 225/173/7 +f 219/121/12 222/170/12 221/161/12 +f 227/175/9 231/180/9 229/179/9 +f 228/178/1 232/181/1 231/180/1 +f 224/177/10 230/525/10 232/181/10 +f 226/169/14 228/178/14 227/175/14 +f 212/182/16 232/187/16 230/183/16 +f 230/185/8 229/179/8 215/153/8 +f 215/153/15 229/179/15 231/180/15 +f 216/148/1 231/180/1 232/187/1 +f 259/188/12 261/526/12 263/189/12 +f 267/191/7 268/199/7 266/192/7 +f 271/194/3 272/198/3 269/195/3 +f 267/197/8 269/527/8 272/198/8 +f 266/192/1 271/194/1 270/200/1 +f 268/199/10 272/198/10 271/194/10 +f 281/528/10 282/529/10 283/202/10 +f 283/202/10 284/530/10 285/203/10 +f 285/203/10 286/531/10 287/204/10 +f 287/204/10 288/532/10 281/528/10 +f 281/528/10 283/202/10 287/204/10 +f 299/205/3 300/209/3 297/206/3 +f 294/208/10 296/215/10 300/209/10 +f 292/210/10 296/215/10 294/208/10 +f 289/212/9 293/218/9 295/213/9 +f 291/214/8 295/213/8 296/215/8 +f 290/211/1 294/208/1 293/216/1 +f 293/218/9 298/533/9 297/219/9 +f 295/213/8 297/219/8 300/209/8 +f 294/220/14 299/205/14 298/207/14 +f 302/222/7 304/230/7 303/223/7 +f 305/225/3 308/228/3 307/226/3 +f 308/228/8 305/534/8 303/229/8 +f 306/231/1 307/226/1 302/222/1 +f 307/226/9 308/228/9 304/230/9 +f 312/233/8 316/239/8 315/234/8 +f 309/236/1 313/535/1 314/237/1 +f 310/238/10 314/237/10 316/239/10 +f 311/235/9 315/234/9 313/240/9 +f 325/242/9 324/536/9 322/243/9 +f 331/245/10 319/537/10 318/246/10 +f 335/248/10 321/538/10 323/249/10 +f 339/251/9 317/539/9 320/252/9 +f 329/254/9 343/540/9 341/255/9 +f 327/257/10 342/541/10 344/258/10 +f 337/260/10 347/542/10 346/261/10 +f 333/263/9 345/543/9 348/264/9 +f 345/266/9 333/263/9 334/244/9 +f 336/262/10 346/544/10 321/268/10 +f 326/256/9 341/545/9 324/269/9 +f 342/270/10 327/257/10 328/250/10 +f 343/272/9 329/254/9 330/253/9 +f 332/259/10 344/546/10 319/274/10 +f 340/275/9 348/547/9 317/276/9 +f 347/277/10 337/548/10 338/247/10 +f 355/279/3 356/301/3 359/280/3 +f 352/282/10 356/301/10 355/279/10 +f 349/284/9 354/288/9 353/285/9 +f 357/287/3 360/299/3 353/285/3 +f 359/289/9 363/305/9 362/290/9 +f 357/292/10 361/304/10 364/293/10 +f 362/295/17 350/549/17 355/279/17 +f 361/296/17 357/287/17 354/288/17 +f 364/298/18 351/303/18 353/285/18 +f 363/300/18 359/280/18 356/301/18 +f 349/297/17 350/549/17 362/295/17 +f 351/303/18 364/298/18 363/300/18 +f 361/304/3 362/290/3 363/305/3 +f 377/308/1 378/550/1 379/551/1 +f 379/551/1 380/552/1 377/308/1 +f 380/552/1 381/306/1 377/308/1 +f 381/306/1 382/553/1 383/554/1 +f 383/554/1 384/555/1 385/307/1 +f 385/307/1 386/556/1 387/557/1 +f 387/557/1 388/558/1 377/308/1 +f 381/306/1 383/554/1 385/307/1 +f 385/307/1 387/557/1 377/308/1 +f 367/559/8 366/560/8 365/561/8 +f 365/561/8 376/562/8 375/309/8 +f 375/309/8 374/563/8 373/310/8 +f 373/310/8 372/564/8 371/311/8 +f 371/311/8 370/565/8 369/566/8 +f 369/566/8 368/567/8 371/311/8 +f 368/567/8 367/559/8 371/311/8 +f 367/559/8 365/561/8 371/311/8 +f 365/561/8 375/309/8 371/311/8 +f 421/312/8 430/316/8 429/313/8 +f 421/312/8 418/317/8 423/315/8 +f 418/317/8 420/319/8 424/318/8 +f 420/319/8 415/322/8 425/320/8 +f 422/321/8 426/324/8 425/320/8 +f 422/321/8 417/568/8 427/323/8 +f 419/325/8 428/328/8 427/326/8 +f 419/325/8 416/314/8 429/313/8 +f 473/331/8 472/569/8 481/329/8 +f 472/569/8 471/570/8 481/329/8 +f 471/570/8 482/571/8 481/329/8 +f 481/329/8 480/572/8 479/573/8 +f 479/573/8 478/574/8 481/329/8 +f 478/574/8 477/330/8 481/329/8 +f 477/330/8 476/575/8 473/331/8 +f 476/575/8 475/576/8 473/331/8 +f 475/576/8 474/577/8 473/331/8 +f 483/334/1 484/578/1 487/332/1 +f 484/578/1 485/579/1 487/332/1 +f 485/579/1 486/580/1 487/332/1 +f 487/332/1 488/581/1 491/333/1 +f 488/581/1 489/582/1 491/333/1 +f 489/582/1 490/583/1 491/333/1 +f 491/333/1 492/584/1 493/585/1 +f 493/585/1 494/586/1 491/333/1 +f 494/586/1 483/334/1 491/333/1 +f 258/335/12 257/337/12 259/188/12 +f 258/335/12 264/587/12 262/336/12 +f 505/339/9 504/588/9 509/340/9 +f 504/588/9 503/589/9 509/340/9 +f 503/589/9 510/590/9 509/340/9 +f 509/340/9 508/591/9 507/592/9 +f 507/592/9 506/338/9 509/340/9 +f 519/341/3 522/345/3 521/342/3 +f 516/344/9 521/342/9 522/345/9 +f 516/344/9 518/346/9 514/347/9 +f 517/349/10 515/355/10 511/350/10 +f 518/346/8 517/349/8 513/351/8 +f 515/352/1 516/344/1 512/348/1 +f 519/354/10 520/593/10 515/355/10 +f 522/345/8 519/354/8 517/349/8 +f 520/343/14 521/342/14 516/356/14 +f 555/358/8 564/362/8 563/359/8 +f 555/358/8 552/363/8 557/361/8 +f 552/363/8 554/365/8 558/364/8 +f 554/365/8 549/368/8 559/366/8 +f 556/367/8 560/370/8 559/366/8 +f 556/367/8 551/594/8 561/369/8 +f 553/371/8 562/374/8 561/372/8 +f 553/371/8 550/360/8 563/359/8 +f 613/375/8 622/379/8 621/376/8 +f 613/375/8 610/380/8 615/378/8 +f 610/380/8 612/382/8 616/381/8 +f 612/382/8 607/385/8 617/383/8 +f 614/384/8 618/387/8 617/383/8 +f 614/384/8 609/595/8 619/386/8 +f 611/388/8 620/391/8 619/389/8 +f 611/388/8 608/377/8 621/376/8 +f 671/392/8 680/396/8 679/393/8 +f 671/392/8 668/397/8 673/395/8 +f 668/397/8 670/399/8 674/398/8 +f 670/399/8 665/402/8 675/400/8 +f 672/401/8 676/404/8 675/400/8 +f 672/401/8 667/596/8 677/403/8 +f 669/405/8 678/408/8 677/406/8 +f 669/405/8 666/394/8 679/393/8 +f 729/409/8 738/413/8 737/410/8 +f 729/409/8 726/414/8 731/412/8 +f 726/414/8 728/416/8 732/415/8 +f 728/416/8 723/419/8 733/417/8 +f 730/418/8 734/421/8 733/417/8 +f 730/418/8 725/597/8 735/420/8 +f 727/422/8 736/425/8 735/423/8 +f 727/422/8 724/411/8 737/410/8 +f 787/426/8 796/430/8 795/427/8 +f 787/426/8 784/431/8 789/429/8 +f 784/431/8 786/433/8 790/432/8 +f 786/433/8 781/436/8 791/434/8 +f 788/435/8 792/438/8 791/434/8 +f 788/435/8 783/598/8 793/437/8 +f 785/439/8 794/442/8 793/440/8 +f 785/439/8 782/428/8 795/427/8 +s 1 +f 3/599/9 57/600/15 2/601/15 +f 8/602/11 63/603/10 7/604/10 +f 6/605/16 61/606/7 5/607/7 +f 3/599/9 60/608/13 59/609/9 +f 2/601/15 58/610/3 1/611/3 +f 1/611/3 64/612/11 8/602/11 +f 7/604/10 62/613/16 6/605/16 +f 5/614/7 60/608/13 4/615/13 +f 80/616/19 103/617/20 79/618/20 +f 87/619/21 100/464/22 76/68/22 +f 88/620/23 111/621/21 87/619/21 +f 66/622/24 112/623/23 88/620/23 +f 85/624/25 110/625/26 86/626/26 +f 78/627/27 89/467/28 65/77/28 +f 67/67/29 109/628/25 85/624/25 +f 70/64/30 101/629/31 77/630/31 +f 79/618/20 92/463/32 68/65/32 +f 84/631/33 107/632/34 83/633/34 +f 82/634/35 93/462/36 69/62/36 +f 71/76/37 104/635/19 80/616/19 +f 77/630/31 102/636/27 78/627/27 +f 74/73/38 105/637/39 81/638/39 +f 83/633/34 96/466/40 72/74/40 +f 81/638/39 106/639/35 82/634/35 +f 86/626/26 97/465/41 73/71/41 +f 75/70/42 108/640/33 84/631/33 +f 29/641/6 132/642/43 28/643/43 +f 56/644/44 159/645/45 55/646/45 +f 16/647/13 119/648/9 15/649/9 +f 43/650/45 146/651/46 42/652/46 +f 30/653/47 133/654/6 29/655/6 +f 49/656/4 160/657/44 56/644/44 +f 9/658/7 120/659/13 16/647/13 +f 44/660/44 147/661/45 43/650/45 +f 31/662/48 134/663/47 30/653/47 +f 18/664/15 121/665/3 17/666/3 +f 45/667/4 148/668/44 44/660/44 +f 32/669/49 135/670/48 31/662/48 +f 19/671/9 122/672/15 18/664/15 +f 46/673/50 149/674/4 45/675/4 +f 25/676/2 136/677/49 32/669/49 +f 20/678/13 123/679/9 19/671/9 +f 47/680/51 150/681/50 46/673/50 +f 34/682/47 137/683/6 33/684/6 +f 21/685/7 124/686/13 20/678/13 +f 48/687/52 151/688/51 47/680/51 +f 35/689/48 138/690/47 34/682/47 +f 22/691/16 125/692/7 21/693/7 +f 41/694/5 152/695/52 48/687/52 +f 36/696/49 139/697/48 35/689/48 +f 23/698/10 126/699/16 22/691/16 +f 50/700/50 153/701/4 49/656/4 +f 10/702/16 113/703/7 9/658/7 +f 37/704/2 140/705/49 36/696/49 +f 24/706/11 127/707/10 23/698/10 +f 51/708/51 154/709/50 50/700/50 +f 11/710/10 114/711/16 10/702/16 +f 38/712/53 141/713/2 37/714/2 +f 17/666/3 128/715/11 24/706/11 +f 52/716/52 155/717/51 51/708/51 +f 12/718/11 115/719/10 11/710/10 +f 39/720/54 142/721/53 38/712/53 +f 26/722/53 129/723/2 25/676/2 +f 53/724/5 156/725/52 52/716/52 +f 13/726/3 116/727/11 12/718/11 +f 40/728/43 143/729/54 39/720/54 +f 27/730/54 130/731/53 26/722/53 +f 54/732/46 157/733/5 53/734/5 +f 14/735/15 117/736/3 13/737/3 +f 33/684/6 144/738/43 40/728/43 +f 28/643/43 131/739/54 27/730/54 +f 55/646/45 158/740/46 54/732/46 +f 15/649/9 118/741/15 14/735/15 +f 42/652/46 145/742/5 41/694/5 +f 163/743/5 176/744/9 164/745/9 +f 170/746/10 183/747/6 171/748/6 +f 167/749/7 180/750/54 168/751/54 +f 164/745/9 177/752/2 165/753/2 +f 171/748/6 184/754/51 172/755/51 +f 161/756/3 173/757/48 162/758/48 +f 168/751/54 181/759/4 169/760/4 +f 165/753/2 178/761/45 166/762/45 +f 172/755/51 174/763/3 161/756/3 +f 162/758/48 175/764/5 163/743/5 +f 169/760/4 182/765/10 170/746/10 +f 166/762/45 179/766/7 167/767/7 +f 242/768/55 236/769/56 234/770/57 +f 241/771/58 238/772/59 233/773/60 +f 244/774/61 239/775/62 236/769/56 +f 247/776/63 237/777/64 239/775/62 +f 243/778/65 233/779/60 235/780/66 +f 240/781/67 242/768/55 234/770/57 +f 237/777/64 243/778/65 235/780/66 +f 246/782/68 240/781/67 238/772/59 +f 247/783/63 244/784/61 255/785/69 +f 245/786/70 255/785/69 253/787/71 +f 241/788/58 251/789/72 249/790/73 +f 242/791/55 256/792/74 250/793/75 +f 243/794/65 253/787/71 251/789/72 +f 248/795/76 254/796/77 256/792/74 +f 242/791/55 252/797/78 244/784/61 +f 246/798/68 241/799/58 254/796/77 +f 255/800/69 261/526/79 253/801/71 +f 255/800/69 252/802/78 263/189/80 +f 250/803/75 260/804/81 252/802/78 +f 256/805/74 264/806/82 250/803/75 +f 254/807/77 264/806/82 256/805/74 +f 254/807/77 249/808/73 262/809/83 +f 249/810/73 259/811/84 257/812/85 +f 253/801/71 261/526/79 251/813/72 +f 280/814/12 287/815/7 279/816/7 +f 278/817/14 285/818/1 277/819/1 +f 276/820/86 283/821/3 275/822/3 +f 274/823/87 281/824/8 273/825/8 +f 273/825/8 288/826/12 280/814/12 +f 279/827/7 286/828/14 278/817/14 +f 277/819/1 284/829/86 276/820/86 +f 275/822/3 282/830/87 274/823/87 +f 332/259/88 326/256/89 327/257/89 +f 331/245/90 339/251/91 330/253/90 +f 333/263/92 337/260/93 336/262/92 +f 328/250/94 326/256/89 325/242/94 +f 330/253/90 332/259/88 331/245/90 +f 336/262/92 334/244/95 333/263/92 +f 340/275/93 338/247/91 337/548/93 +f 325/242/94 335/248/95 328/250/94 +f 345/831/88 347/542/89 348/832/89 +f 322/833/90 346/544/88 345/834/88 +f 322/835/90 323/249/91 321/538/90 +f 324/836/91 342/270/93 323/271/91 +f 341/837/93 344/258/92 342/541/93 +f 343/838/92 319/274/95 344/546/92 +f 317/839/94 319/537/95 320/840/95 +f 318/278/94 348/841/89 347/277/89 +f 255/785/69 244/784/61 252/797/78 +f 253/787/71 243/794/65 245/786/70 +f 263/189/80 252/802/78 260/804/81 +f 251/813/72 261/526/79 259/811/84 +f 254/796/77 241/799/58 249/842/73 +f 256/792/74 242/791/55 248/795/76 +f 250/803/75 264/806/82 258/843/96 +f 262/809/83 249/808/73 257/844/85 +f 372/845/54 383/846/7 371/847/7 +f 369/848/2 380/849/9 368/850/9 +f 376/851/51 387/852/6 375/853/6 +f 366/854/48 377/855/3 365/856/3 +f 373/857/4 384/858/54 372/845/54 +f 370/859/45 381/860/2 369/848/2 +f 365/856/3 388/861/51 376/851/51 +f 367/862/5 378/863/48 366/854/48 +f 374/864/10 385/865/4 373/857/4 +f 371/866/7 382/867/45 370/859/45 +f 368/850/9 379/868/5 367/862/5 +f 375/853/6 386/869/10 374/864/10 +f 397/870/97 404/871/16 403/872/98 +f 398/873/7 405/874/99 404/871/16 +f 413/875/13 397/876/97 414/877/100 +f 412/878/101 398/879/7 413/875/13 +f 391/880/9 414/877/100 390/881/102 +f 412/878/101 391/880/9 392/882/103 +f 408/883/104 391/880/9 390/881/102 +f 407/884/15 402/885/105 401/886/3 +f 410/887/11 402/885/105 409/888/106 +f 403/872/98 395/889/10 396/890/107 +f 395/889/10 409/888/106 396/890/107 +f 396/890/107 409/888/106 389/891/1 +f 409/888/106 402/885/105 389/892/1 +f 408/883/104 389/893/1 402/885/105 +f 389/894/1 408/883/104 390/881/102 +f 389/895/1 390/881/102 414/877/100 +f 414/877/100 397/876/97 389/896/1 +f 403/872/98 389/897/1 397/870/97 +f 389/898/1 403/872/98 396/890/107 +f 404/871/16 394/899/108 395/889/10 +f 410/887/11 394/899/108 411/900/109 +f 401/886/3 411/900/109 400/901/110 +f 393/902/8 411/900/109 394/899/108 +f 411/900/109 393/903/8 400/901/110 +f 406/904/111 401/886/3 400/901/110 +f 391/880/9 406/904/111 392/882/103 +f 393/905/8 406/904/111 400/901/110 +f 392/882/103 406/904/111 393/906/8 +f 392/882/103 393/907/8 412/878/101 +f 412/878/101 393/908/8 399/909/112 +f 405/874/99 399/910/112 393/911/8 +f 393/912/8 394/899/108 405/874/99 +f 430/316/13 445/913/9 429/313/9 +f 416/314/10 437/914/11 421/312/11 +f 417/327/7 432/915/16 419/325/16 +f 423/315/7 446/916/13 430/316/13 +f 424/318/16 440/917/7 423/315/7 +f 422/321/13 431/918/7 417/568/7 +f 425/320/10 439/919/16 424/318/16 +f 415/322/9 433/920/13 422/321/13 +f 426/324/11 441/921/10 425/320/10 +f 420/319/15 434/922/9 415/322/9 +f 427/323/3 442/923/11 426/324/11 +f 418/317/3 435/924/15 420/319/15 +f 428/328/15 443/925/3 427/326/3 +f 421/312/11 436/926/3 418/317/3 +f 429/313/9 444/927/15 428/328/15 +f 419/325/16 438/928/10 416/314/10 +f 450/929/9 461/930/5 449/931/5 +f 457/932/6 468/933/10 456/934/10 +f 454/935/54 465/936/7 453/937/7 +f 451/938/2 462/939/9 450/929/9 +f 458/940/51 469/941/6 457/932/6 +f 448/942/48 459/943/3 447/944/3 +f 455/945/4 466/946/54 454/935/54 +f 452/947/45 463/948/2 451/938/2 +f 447/944/3 470/949/51 458/940/51 +f 449/931/5 460/950/48 448/942/48 +f 456/934/10 467/951/4 455/945/4 +f 453/952/7 464/953/45 452/947/45 +f 482/954/51 493/955/6 481/956/6 +f 472/957/48 483/958/3 471/959/3 +f 479/960/4 490/961/54 478/962/54 +f 476/963/45 487/964/2 475/965/2 +f 471/959/3 494/966/51 482/954/51 +f 473/967/5 484/968/48 472/957/48 +f 480/969/10 491/970/4 479/960/4 +f 477/971/7 488/972/45 476/963/45 +f 474/973/9 485/974/5 473/967/5 +f 481/956/6 492/975/10 480/969/10 +f 478/962/54 489/976/7 477/977/7 +f 475/965/2 486/978/9 474/973/9 +f 509/979/7 502/980/12 501/981/7 +f 507/982/1 500/983/14 499/984/1 +f 505/985/3 498/986/86 497/987/3 +f 503/988/8 496/989/87 495/990/8 +f 510/991/12 495/990/8 502/980/12 +f 508/992/14 501/993/7 500/983/14 +f 506/994/86 499/984/1 498/986/86 +f 504/995/87 497/987/3 496/989/87 +f 531/996/105 538/997/15 537/998/104 +f 532/999/3 539/1000/111 538/997/15 +f 547/1001/11 531/1002/105 548/1003/106 +f 546/1004/109 532/1005/3 547/1001/11 +f 525/1006/10 548/1003/106 524/1007/107 +f 546/1004/109 525/1006/10 526/1008/108 +f 542/1009/98 525/1006/10 524/1007/107 +f 541/1010/16 536/1011/97 535/1012/7 +f 544/1013/13 536/1011/97 543/1014/100 +f 537/998/104 529/1015/9 530/1016/102 +f 529/1015/9 543/1014/100 530/1016/102 +f 530/1016/102 543/1014/100 523/1017/1 +f 543/1014/100 536/1011/97 523/1018/1 +f 542/1009/98 523/1019/1 536/1011/97 +f 523/1020/1 542/1009/98 524/1007/107 +f 523/1021/1 524/1007/107 548/1003/106 +f 548/1003/106 531/1002/105 523/1022/1 +f 537/998/104 523/1023/1 531/996/105 +f 523/1024/1 537/998/104 530/1016/102 +f 538/997/15 528/1025/103 529/1015/9 +f 544/1013/13 528/1025/103 545/1026/101 +f 535/1012/7 545/1026/101 534/1027/112 +f 527/1028/8 545/1026/101 528/1025/103 +f 545/1026/101 527/1029/8 534/1027/112 +f 540/1030/99 535/1012/7 534/1027/112 +f 525/1006/10 540/1030/99 526/1008/108 +f 527/1031/8 540/1030/99 534/1027/112 +f 526/1008/108 540/1030/99 527/1032/8 +f 526/1008/108 527/1033/8 546/1004/109 +f 546/1004/109 527/1034/8 533/1035/110 +f 539/1000/111 533/1036/110 527/1037/8 +f 527/1038/8 528/1025/103 539/1000/111 +f 564/362/11 579/1039/10 563/359/10 +f 550/360/9 571/1040/13 555/358/13 +f 551/373/3 566/1041/15 553/371/15 +f 557/361/3 580/1042/11 564/362/11 +f 558/364/15 574/1043/3 557/361/3 +f 556/367/11 565/1044/3 551/594/3 +f 559/366/9 573/1045/15 558/364/15 +f 549/368/10 567/1046/11 556/367/11 +f 560/370/13 575/1047/9 559/366/9 +f 554/365/16 568/1048/10 549/368/10 +f 561/369/7 576/1049/13 560/370/13 +f 552/363/7 569/1050/16 554/365/16 +f 562/374/16 577/1051/7 561/372/7 +f 555/358/13 570/1052/7 552/363/7 +f 563/359/10 578/1053/16 562/374/16 +f 553/371/15 572/1054/9 550/360/9 +f 589/1055/113 596/1056/53 595/1057/114 +f 591/1058/115 596/1056/53 590/1059/2 +f 606/1060/116 590/1061/2 589/1062/113 +f 604/1063/117 590/1061/2 605/1064/49 +f 583/1065/48 606/1060/116 582/1066/118 +f 604/1063/117 583/1065/48 584/1067/119 +f 599/1068/47 582/1066/118 600/1069/120 +f 593/1070/6 600/1069/120 594/1071/121 +f 602/1072/43 594/1071/121 601/1073/122 +f 595/1057/114 587/1074/54 588/1075/123 +f 588/1075/123 602/1072/43 601/1073/122 +f 588/1075/123 601/1073/122 581/1076/1 +f 601/1073/122 594/1071/121 581/1077/1 +f 600/1069/120 581/1078/1 594/1071/121 +f 581/1079/1 600/1069/120 582/1066/118 +f 581/1080/1 582/1066/118 606/1060/116 +f 606/1060/116 589/1062/113 581/1081/1 +f 595/1057/114 581/1082/1 589/1055/113 +f 581/1083/1 595/1057/114 588/1075/123 +f 587/1074/54 597/1084/124 586/1085/125 +f 603/1086/126 587/1074/54 586/1085/125 +f 593/1070/6 603/1086/126 592/1087/127 +f 585/1088/8 603/1086/126 586/1085/125 +f 603/1086/126 585/1089/8 592/1087/127 +f 598/1090/128 593/1070/6 592/1087/127 +f 584/1067/119 599/1068/47 598/1090/128 +f 585/1091/8 598/1090/128 592/1087/127 +f 584/1067/119 598/1090/128 585/1092/8 +f 584/1067/119 585/1093/8 604/1063/117 +f 604/1063/117 585/1094/8 591/1095/115 +f 597/1084/124 591/1058/115 585/1096/8 +f 585/1097/8 586/1085/125 597/1084/124 +f 622/379/49 637/1098/48 621/376/48 +f 608/377/54 629/1099/43 613/375/43 +f 609/390/2 624/1100/53 611/388/53 +f 615/378/2 638/1101/49 622/379/49 +f 616/381/53 632/1102/2 615/378/2 +f 614/384/49 623/1103/2 609/595/2 +f 617/383/54 631/1104/53 616/381/53 +f 607/385/48 625/1105/49 614/384/49 +f 618/387/43 633/1106/54 617/383/54 +f 612/382/47 626/1107/48 607/385/48 +f 619/386/6 634/1108/43 618/387/43 +f 610/380/6 627/1109/47 612/382/47 +f 620/391/47 635/1110/6 619/389/6 +f 613/375/43 628/1111/6 610/380/6 +f 621/376/48 636/1112/47 620/391/47 +f 611/388/53 630/1113/54 608/377/54 +f 647/1114/121 654/1115/47 653/1116/120 +f 649/1117/127 654/1115/47 648/1118/6 +f 664/1119/122 648/1120/6 647/1121/121 +f 662/1122/126 648/1120/6 663/1123/43 +f 641/1124/54 664/1119/122 640/1125/123 +f 662/1122/126 641/1124/54 642/1126/125 +f 657/1127/53 640/1125/123 658/1128/114 +f 651/1129/2 658/1128/114 652/1130/113 +f 660/1131/49 652/1130/113 659/1132/116 +f 653/1116/120 645/1133/48 646/1134/118 +f 646/1134/118 660/1131/49 659/1132/116 +f 646/1134/118 659/1132/116 639/1135/1 +f 659/1132/116 652/1130/113 639/1136/1 +f 658/1128/114 639/1137/1 652/1130/113 +f 639/1138/1 658/1128/114 640/1125/123 +f 639/1139/1 640/1125/123 664/1119/122 +f 664/1119/122 647/1121/121 639/1140/1 +f 653/1116/120 639/1141/1 647/1114/121 +f 639/1142/1 653/1116/120 646/1134/118 +f 645/1133/48 655/1143/128 644/1144/119 +f 661/1145/117 645/1133/48 644/1144/119 +f 651/1129/2 661/1145/117 650/1146/115 +f 643/1147/8 661/1145/117 644/1144/119 +f 661/1145/117 643/1148/8 650/1146/115 +f 656/1149/124 651/1129/2 650/1146/115 +f 642/1126/125 657/1127/53 656/1149/124 +f 643/1150/8 656/1149/124 650/1146/115 +f 642/1126/125 656/1149/124 643/1151/8 +f 642/1126/125 643/1152/8 662/1122/126 +f 662/1122/126 643/1153/8 649/1154/127 +f 655/1143/128 649/1117/127 643/1155/8 +f 643/1156/8 644/1144/119 655/1143/128 +f 680/396/43 695/1157/54 679/393/54 +f 666/394/48 687/1158/49 671/392/49 +f 667/407/6 682/1159/47 669/405/47 +f 673/395/6 696/1160/43 680/396/43 +f 674/398/47 690/1161/6 673/395/6 +f 672/401/43 681/1162/6 667/596/6 +f 675/400/48 689/1163/47 674/398/47 +f 665/402/54 683/1164/43 672/401/43 +f 676/404/49 691/1165/48 675/400/48 +f 670/399/53 684/1166/54 665/402/54 +f 677/403/2 692/1167/49 676/404/49 +f 668/397/2 685/1168/53 670/399/53 +f 678/408/53 693/1169/2 677/406/2 +f 671/392/49 686/1170/2 668/397/2 +f 679/393/54 694/1171/53 678/408/53 +f 669/405/47 688/1172/48 666/394/48 +f 706/1173/5 711/1174/129 705/1175/130 +f 707/1176/131 712/1177/46 706/1173/5 +f 721/1178/52 705/1179/130 722/1180/132 +f 707/1181/131 721/1178/52 720/1182/133 +f 699/1183/51 722/1180/132 698/1184/134 +f 700/1185/135 721/1178/52 699/1183/51 +f 715/1186/50 698/1184/134 716/1187/136 +f 709/1188/4 716/1187/136 710/1189/137 +f 717/1190/138 709/1188/4 710/1189/137 +f 711/1174/129 703/1191/45 704/1192/139 +f 704/1192/139 718/1193/44 717/1190/138 +f 704/1192/139 717/1190/138 697/1194/1 +f 717/1190/138 710/1189/137 697/1195/1 +f 716/1187/136 697/1196/1 710/1189/137 +f 697/1197/1 716/1187/136 698/1184/134 +f 697/1198/1 698/1184/134 722/1180/132 +f 722/1180/132 705/1179/130 697/1199/1 +f 711/1174/129 697/1200/1 705/1175/130 +f 697/1201/1 711/1174/129 704/1192/139 +f 703/1191/45 713/1202/140 702/1203/141 +f 719/1204/142 703/1191/45 702/1203/141 +f 709/1188/4 719/1204/142 708/1205/143 +f 701/1206/8 719/1204/142 702/1203/141 +f 719/1204/142 701/1207/8 708/1205/143 +f 714/1208/144 709/1188/4 708/1205/143 +f 699/1183/51 714/1208/144 700/1185/135 +f 701/1209/8 714/1208/144 708/1205/143 +f 700/1185/135 714/1208/144 701/1210/8 +f 700/1185/135 701/1211/8 720/1182/133 +f 720/1182/133 701/1212/8 707/1181/131 +f 713/1202/140 707/1176/131 701/1213/8 +f 701/1214/8 702/1203/141 713/1202/140 +f 738/413/52 753/1215/51 737/410/51 +f 724/411/45 745/1216/44 729/409/44 +f 725/424/5 740/1217/46 727/422/46 +f 731/412/5 754/1218/52 738/413/52 +f 732/415/46 748/1219/5 731/412/5 +f 730/418/52 739/1220/5 725/597/5 +f 733/417/45 747/1221/46 732/415/46 +f 723/419/51 741/1222/52 730/418/52 +f 734/421/44 749/1223/45 733/417/45 +f 728/416/50 742/1224/51 723/419/51 +f 735/420/4 750/1225/44 734/421/44 +f 726/414/4 743/1226/50 728/416/50 +f 736/425/50 751/1227/4 735/423/4 +f 729/409/44 744/1228/4 726/414/4 +f 737/410/51 752/1229/50 736/425/50 +f 727/422/46 746/1230/45 724/411/45 +f 764/1231/4 769/1232/136 763/1233/137 +f 765/1234/143 770/1235/50 764/1231/4 +f 779/1236/44 763/1237/137 780/1238/138 +f 765/1239/143 779/1236/44 778/1240/142 +f 757/1241/45 780/1238/138 756/1242/139 +f 758/1243/141 779/1236/44 757/1241/45 +f 773/1244/46 756/1242/139 774/1245/129 +f 767/1246/5 774/1245/129 768/1247/130 +f 775/1248/132 767/1246/5 768/1247/130 +f 769/1232/136 761/1249/51 762/1250/134 +f 762/1250/134 776/1251/52 775/1248/132 +f 762/1250/134 775/1248/132 755/1252/1 +f 775/1248/132 768/1247/130 755/1253/1 +f 774/1245/129 755/1254/1 768/1247/130 +f 755/1255/1 774/1245/129 756/1242/139 +f 755/1256/1 756/1242/139 780/1238/138 +f 780/1238/138 763/1237/137 755/1257/1 +f 769/1232/136 755/1258/1 763/1233/137 +f 755/1259/1 769/1232/136 762/1250/134 +f 761/1249/51 771/1260/144 760/1261/135 +f 777/1262/133 761/1249/51 760/1261/135 +f 767/1246/5 777/1262/133 766/1263/131 +f 759/1264/8 777/1262/133 760/1261/135 +f 777/1262/133 759/1265/8 766/1263/131 +f 772/1266/140 767/1246/5 766/1263/131 +f 757/1241/45 772/1266/140 758/1243/141 +f 759/1267/8 772/1266/140 766/1263/131 +f 758/1243/141 772/1266/140 759/1268/8 +f 758/1243/141 759/1269/8 778/1240/142 +f 778/1240/142 759/1270/8 765/1239/143 +f 771/1260/144 765/1234/143 759/1271/8 +f 759/1272/8 760/1261/135 771/1260/144 +f 796/430/44 811/1273/45 795/427/45 +f 782/428/51 803/1274/52 787/426/52 +f 783/441/4 798/1275/50 785/439/50 +f 789/429/4 812/1276/44 796/430/44 +f 790/432/50 806/1277/4 789/429/4 +f 788/435/44 797/1278/4 783/598/4 +f 791/434/51 805/1279/50 790/432/50 +f 781/436/45 799/1280/44 788/435/44 +f 792/438/52 807/1281/51 791/434/51 +f 786/433/46 800/1282/45 781/436/45 +f 793/437/5 808/1283/52 792/438/52 +f 784/431/5 801/1284/46 786/433/46 +f 794/442/46 809/1285/5 793/440/5 +f 787/426/52 802/1286/5 784/431/5 +f 795/427/45 810/1287/46 794/442/46 +f 785/439/50 804/1288/51 782/428/51 +f 3/599/9 59/609/9 57/600/15 +f 8/602/11 64/612/11 63/603/10 +f 6/605/16 62/613/16 61/606/7 +f 3/599/9 4/615/13 60/608/13 +f 2/601/15 57/600/15 58/610/3 +f 1/611/3 58/610/3 64/612/11 +f 7/604/10 63/603/10 62/613/16 +f 5/614/7 61/1289/7 60/608/13 +f 80/616/19 104/635/19 103/617/20 +f 87/619/21 111/621/21 100/464/22 +f 88/620/23 112/623/23 111/621/21 +f 66/622/24 90/1290/24 112/623/23 +f 85/624/25 109/628/25 110/625/26 +f 78/627/27 102/636/27 89/467/28 +f 67/67/29 91/66/29 109/628/25 +f 70/64/30 94/63/30 101/629/31 +f 79/618/20 103/617/20 92/463/32 +f 84/631/33 108/640/33 107/632/34 +f 82/634/35 106/639/35 93/462/36 +f 71/76/37 95/75/37 104/635/19 +f 77/630/31 101/629/31 102/636/27 +f 74/73/38 98/72/38 105/637/39 +f 83/633/34 107/632/34 96/466/40 +f 81/638/39 105/637/39 106/639/35 +f 86/626/26 110/625/26 97/465/41 +f 75/70/42 99/69/42 108/640/33 +f 29/641/6 133/1291/6 132/642/43 +f 56/644/44 160/657/44 159/645/45 +f 16/647/13 120/659/13 119/648/9 +f 43/650/45 147/661/45 146/651/46 +f 30/653/47 134/663/47 133/654/6 +f 49/656/4 153/701/4 160/657/44 +f 9/658/7 113/703/7 120/659/13 +f 44/660/44 148/668/44 147/661/45 +f 31/662/48 135/670/48 134/663/47 +f 18/664/15 122/672/15 121/665/3 +f 45/667/4 149/1292/4 148/668/44 +f 32/669/49 136/677/49 135/670/48 +f 19/671/9 123/679/9 122/672/15 +f 46/673/50 150/681/50 149/674/4 +f 25/676/2 129/723/2 136/677/49 +f 20/678/13 124/686/13 123/679/9 +f 47/680/51 151/688/51 150/681/50 +f 34/682/47 138/690/47 137/683/6 +f 21/685/7 125/1293/7 124/686/13 +f 48/687/52 152/695/52 151/688/51 +f 35/689/48 139/697/48 138/690/47 +f 22/691/16 126/699/16 125/692/7 +f 41/694/5 145/742/5 152/695/52 +f 36/696/49 140/705/49 139/697/48 +f 23/698/10 127/707/10 126/699/16 +f 50/700/50 154/709/50 153/701/4 +f 10/702/16 114/711/16 113/703/7 +f 37/704/2 141/1294/2 140/705/49 +f 24/706/11 128/715/11 127/707/10 +f 51/708/51 155/717/51 154/709/50 +f 11/710/10 115/719/10 114/711/16 +f 38/712/53 142/721/53 141/713/2 +f 17/666/3 121/665/3 128/715/11 +f 52/716/52 156/725/52 155/717/51 +f 12/718/11 116/727/11 115/719/10 +f 39/720/54 143/729/54 142/721/53 +f 26/722/53 130/731/53 129/723/2 +f 53/724/5 157/1295/5 156/725/52 +f 13/726/3 117/1296/3 116/727/11 +f 40/728/43 144/738/43 143/729/54 +f 27/730/54 131/739/54 130/731/53 +f 54/732/46 158/740/46 157/733/5 +f 14/735/15 118/741/15 117/736/3 +f 33/684/6 137/683/6 144/738/43 +f 28/643/43 132/642/43 131/739/54 +f 55/646/45 159/645/45 158/740/46 +f 15/649/9 119/648/9 118/741/15 +f 42/652/46 146/651/46 145/742/5 +f 163/743/5 175/764/5 176/744/9 +f 170/746/10 182/765/10 183/747/6 +f 167/749/7 179/1297/7 180/750/54 +f 164/745/9 176/744/9 177/752/2 +f 171/748/6 183/747/6 184/754/51 +f 161/756/3 174/763/3 173/757/48 +f 168/751/54 180/750/54 181/759/4 +f 165/753/2 177/752/2 178/761/45 +f 172/755/51 184/754/51 174/763/3 +f 162/758/48 173/757/48 175/764/5 +f 169/760/4 181/759/4 182/765/10 +f 166/762/45 178/761/45 179/766/7 +f 242/768/55 244/774/61 236/769/56 +f 241/771/58 246/782/68 238/772/59 +f 244/774/61 247/776/63 239/775/62 +f 247/776/63 245/1298/70 237/777/64 +f 243/778/65 241/1299/58 233/779/60 +f 240/781/67 248/1300/76 242/768/55 +f 237/777/64 245/1298/70 243/778/65 +f 246/782/68 248/1300/76 240/781/67 +f 245/786/70 247/783/63 255/785/69 +f 241/788/58 243/794/65 251/789/72 +f 248/795/76 246/798/68 254/796/77 +f 242/791/55 250/793/75 252/797/78 +f 255/800/69 263/189/80 261/526/79 +f 250/803/75 258/843/96 260/804/81 +f 254/807/77 262/809/83 264/806/82 +f 249/810/73 251/813/72 259/811/84 +f 280/814/12 288/826/12 287/815/7 +f 278/817/14 286/828/14 285/818/1 +f 276/820/86 284/829/86 283/821/3 +f 274/823/87 282/830/87 281/824/8 +f 273/825/8 281/824/8 288/826/12 +f 279/827/7 287/1301/7 286/828/14 +f 277/819/1 285/818/1 284/829/86 +f 275/822/3 283/821/3 282/830/87 +f 332/259/88 329/254/88 326/256/89 +f 331/245/90 338/247/91 339/251/91 +f 333/263/92 340/265/93 337/260/93 +f 328/250/94 327/257/89 326/256/89 +f 330/253/90 329/254/88 332/259/88 +f 336/262/92 335/248/95 334/244/95 +f 340/275/93 339/251/91 338/247/91 +f 325/242/94 334/244/95 335/248/95 +f 345/831/88 346/261/88 347/542/89 +f 322/833/90 321/268/90 346/544/88 +f 322/835/90 324/1302/91 323/249/91 +f 324/836/91 341/1303/93 342/270/93 +f 341/837/93 343/1304/92 344/258/92 +f 343/838/92 320/1305/95 319/274/95 +f 317/839/94 318/246/94 319/537/95 +f 318/278/94 317/1306/94 348/841/89 +f 372/845/54 384/858/54 383/846/7 +f 369/848/2 381/860/2 380/849/9 +f 376/851/51 388/861/51 387/852/6 +f 366/854/48 378/863/48 377/855/3 +f 373/857/4 385/865/4 384/858/54 +f 370/859/45 382/867/45 381/860/2 +f 365/856/3 377/855/3 388/861/51 +f 367/862/5 379/868/5 378/863/48 +f 374/864/10 386/869/10 385/865/4 +f 371/866/7 383/1307/7 382/867/45 +f 368/850/9 380/849/9 379/868/5 +f 375/853/6 387/852/6 386/869/10 +f 397/870/97 398/873/7 404/871/16 +f 398/873/7 399/910/112 405/874/99 +f 413/875/13 398/879/7 397/876/97 +f 412/878/101 399/909/112 398/879/7 +f 391/880/9 413/875/13 414/877/100 +f 412/878/101 413/875/13 391/880/9 +f 408/883/104 407/884/15 391/880/9 +f 407/884/15 408/883/104 402/885/105 +f 410/887/11 401/886/3 402/885/105 +f 403/872/98 404/871/16 395/889/10 +f 395/889/10 410/887/11 409/888/106 +f 404/871/16 405/874/99 394/899/108 +f 410/887/11 395/889/10 394/899/108 +f 401/886/3 410/887/11 411/900/109 +f 406/904/111 407/884/15 401/886/3 +f 391/880/9 407/884/15 406/904/111 +f 430/316/13 446/916/13 445/913/9 +f 416/314/10 438/928/10 437/914/11 +f 417/327/7 431/1308/7 432/915/16 +f 423/315/7 440/917/7 446/916/13 +f 424/318/16 439/919/16 440/917/7 +f 422/321/13 433/920/13 431/918/7 +f 425/320/10 441/921/10 439/919/16 +f 415/322/9 434/922/9 433/920/13 +f 426/324/11 442/923/11 441/921/10 +f 420/319/15 435/924/15 434/922/9 +f 427/323/3 443/1309/3 442/923/11 +f 418/317/3 436/926/3 435/924/15 +f 428/328/15 444/927/15 443/925/3 +f 421/312/11 437/914/11 436/926/3 +f 429/313/9 445/913/9 444/927/15 +f 419/325/16 432/915/16 438/928/10 +f 450/929/9 462/939/9 461/930/5 +f 457/932/6 469/941/6 468/933/10 +f 454/935/54 466/946/54 465/936/7 +f 451/938/2 463/948/2 462/939/9 +f 458/940/51 470/949/51 469/941/6 +f 448/942/48 460/950/48 459/943/3 +f 455/945/4 467/951/4 466/946/54 +f 452/947/45 464/953/45 463/948/2 +f 447/944/3 459/943/3 470/949/51 +f 449/931/5 461/930/5 460/950/48 +f 456/934/10 468/933/10 467/951/4 +f 453/952/7 465/1310/7 464/953/45 +f 482/954/51 494/966/51 493/955/6 +f 472/957/48 484/968/48 483/958/3 +f 479/960/4 491/970/4 490/961/54 +f 476/963/45 488/972/45 487/964/2 +f 471/959/3 483/958/3 494/966/51 +f 473/967/5 485/974/5 484/968/48 +f 480/969/10 492/975/10 491/970/4 +f 477/971/7 489/1311/7 488/972/45 +f 474/973/9 486/978/9 485/974/5 +f 481/956/6 493/955/6 492/975/10 +f 478/962/54 490/961/54 489/976/7 +f 475/965/2 487/964/2 486/978/9 +f 509/979/7 510/991/12 502/980/12 +f 507/982/1 508/992/14 500/983/14 +f 505/985/3 506/994/86 498/986/86 +f 503/988/8 504/995/87 496/989/87 +f 510/991/12 503/988/8 495/990/8 +f 508/992/14 509/1312/7 501/993/7 +f 506/994/86 507/982/1 499/984/1 +f 504/995/87 505/985/3 497/987/3 +f 531/996/105 532/999/3 538/997/15 +f 532/999/3 533/1036/110 539/1000/111 +f 547/1001/11 532/1005/3 531/1002/105 +f 546/1004/109 533/1035/110 532/1005/3 +f 525/1006/10 547/1001/11 548/1003/106 +f 546/1004/109 547/1001/11 525/1006/10 +f 542/1009/98 541/1010/16 525/1006/10 +f 541/1010/16 542/1009/98 536/1011/97 +f 544/1013/13 535/1012/7 536/1011/97 +f 537/998/104 538/997/15 529/1015/9 +f 529/1015/9 544/1013/13 543/1014/100 +f 538/997/15 539/1000/111 528/1025/103 +f 544/1013/13 529/1015/9 528/1025/103 +f 535/1012/7 544/1013/13 545/1026/101 +f 540/1030/99 541/1010/16 535/1012/7 +f 525/1006/10 541/1010/16 540/1030/99 +f 564/362/11 580/1042/11 579/1039/10 +f 550/360/9 572/1054/9 571/1040/13 +f 551/373/3 565/1313/3 566/1041/15 +f 557/361/3 574/1043/3 580/1042/11 +f 558/364/15 573/1045/15 574/1043/3 +f 556/367/11 567/1046/11 565/1044/3 +f 559/366/9 575/1047/9 573/1045/15 +f 549/368/10 568/1048/10 567/1046/11 +f 560/370/13 576/1049/13 575/1047/9 +f 554/365/16 569/1050/16 568/1048/10 +f 561/369/7 577/1314/7 576/1049/13 +f 552/363/7 570/1052/7 569/1050/16 +f 562/374/16 578/1053/16 577/1051/7 +f 555/358/13 571/1040/13 570/1052/7 +f 563/359/10 579/1039/10 578/1053/16 +f 553/371/15 566/1041/15 572/1054/9 +f 589/1055/113 590/1059/2 596/1056/53 +f 591/1058/115 597/1084/124 596/1056/53 +f 606/1060/116 605/1064/49 590/1061/2 +f 604/1063/117 591/1095/115 590/1061/2 +f 583/1065/48 605/1064/49 606/1060/116 +f 604/1063/117 605/1064/49 583/1065/48 +f 599/1068/47 583/1065/48 582/1066/118 +f 593/1070/6 599/1068/47 600/1069/120 +f 602/1072/43 593/1070/6 594/1071/121 +f 595/1057/114 596/1056/53 587/1074/54 +f 588/1075/123 587/1074/54 602/1072/43 +f 587/1074/54 596/1056/53 597/1084/124 +f 603/1086/126 602/1072/43 587/1074/54 +f 593/1070/6 602/1072/43 603/1086/126 +f 598/1090/128 599/1068/47 593/1070/6 +f 584/1067/119 583/1065/48 599/1068/47 +f 622/379/49 638/1101/49 637/1098/48 +f 608/377/54 630/1113/54 629/1099/43 +f 609/390/2 623/1315/2 624/1100/53 +f 615/378/2 632/1102/2 638/1101/49 +f 616/381/53 631/1104/53 632/1102/2 +f 614/384/49 625/1105/49 623/1103/2 +f 617/383/54 633/1106/54 631/1104/53 +f 607/385/48 626/1107/48 625/1105/49 +f 618/387/43 634/1108/43 633/1106/54 +f 612/382/47 627/1109/47 626/1107/48 +f 619/386/6 635/1316/6 634/1108/43 +f 610/380/6 628/1111/6 627/1109/47 +f 620/391/47 636/1112/47 635/1110/6 +f 613/375/43 629/1099/43 628/1111/6 +f 621/376/48 637/1098/48 636/1112/47 +f 611/388/53 624/1100/53 630/1113/54 +f 647/1114/121 648/1118/6 654/1115/47 +f 649/1117/127 655/1143/128 654/1115/47 +f 664/1119/122 663/1123/43 648/1120/6 +f 662/1122/126 649/1154/127 648/1120/6 +f 641/1124/54 663/1123/43 664/1119/122 +f 662/1122/126 663/1123/43 641/1124/54 +f 657/1127/53 641/1124/54 640/1125/123 +f 651/1129/2 657/1127/53 658/1128/114 +f 660/1131/49 651/1129/2 652/1130/113 +f 653/1116/120 654/1115/47 645/1133/48 +f 646/1134/118 645/1133/48 660/1131/49 +f 645/1133/48 654/1115/47 655/1143/128 +f 661/1145/117 660/1131/49 645/1133/48 +f 651/1129/2 660/1131/49 661/1145/117 +f 656/1149/124 657/1127/53 651/1129/2 +f 642/1126/125 641/1124/54 657/1127/53 +f 680/396/43 696/1160/43 695/1157/54 +f 666/394/48 688/1172/48 687/1158/49 +f 667/407/6 681/1317/6 682/1159/47 +f 673/395/6 690/1161/6 696/1160/43 +f 674/398/47 689/1163/47 690/1161/6 +f 672/401/43 683/1164/43 681/1162/6 +f 675/400/48 691/1165/48 689/1163/47 +f 665/402/54 684/1166/54 683/1164/43 +f 676/404/49 692/1167/49 691/1165/48 +f 670/399/53 685/1168/53 684/1166/54 +f 677/403/2 693/1318/2 692/1167/49 +f 668/397/2 686/1170/2 685/1168/53 +f 678/408/53 694/1171/53 693/1169/2 +f 671/392/49 687/1158/49 686/1170/2 +f 679/393/54 695/1157/54 694/1171/53 +f 669/405/47 682/1159/47 688/1172/48 +f 706/1173/5 712/1177/46 711/1174/129 +f 707/1176/131 713/1202/140 712/1177/46 +f 721/1178/52 706/1319/5 705/1179/130 +f 707/1181/131 706/1319/5 721/1178/52 +f 699/1183/51 721/1178/52 722/1180/132 +f 700/1185/135 720/1182/133 721/1178/52 +f 715/1186/50 699/1183/51 698/1184/134 +f 709/1188/4 715/1186/50 716/1187/136 +f 717/1190/138 718/1193/44 709/1188/4 +f 711/1174/129 712/1177/46 703/1191/45 +f 704/1192/139 703/1191/45 718/1193/44 +f 703/1191/45 712/1177/46 713/1202/140 +f 719/1204/142 718/1193/44 703/1191/45 +f 709/1188/4 718/1193/44 719/1204/142 +f 714/1208/144 715/1186/50 709/1188/4 +f 699/1183/51 715/1186/50 714/1208/144 +f 738/413/52 754/1218/52 753/1215/51 +f 724/411/45 746/1230/45 745/1216/44 +f 725/424/5 739/1320/5 740/1217/46 +f 731/412/5 748/1219/5 754/1218/52 +f 732/415/46 747/1221/46 748/1219/5 +f 730/418/52 741/1222/52 739/1220/5 +f 733/417/45 749/1223/45 747/1221/46 +f 723/419/51 742/1224/51 741/1222/52 +f 734/421/44 750/1225/44 749/1223/45 +f 728/416/50 743/1226/50 742/1224/51 +f 735/420/4 751/1321/4 750/1225/44 +f 726/414/4 744/1228/4 743/1226/50 +f 736/425/50 752/1229/50 751/1227/4 +f 729/409/44 745/1216/44 744/1228/4 +f 737/410/51 753/1215/51 752/1229/50 +f 727/422/46 740/1217/46 746/1230/45 +f 764/1231/4 770/1235/50 769/1232/136 +f 765/1234/143 771/1260/144 770/1235/50 +f 779/1236/44 764/1322/4 763/1237/137 +f 765/1239/143 764/1322/4 779/1236/44 +f 757/1241/45 779/1236/44 780/1238/138 +f 758/1243/141 778/1240/142 779/1236/44 +f 773/1244/46 757/1241/45 756/1242/139 +f 767/1246/5 773/1244/46 774/1245/129 +f 775/1248/132 776/1251/52 767/1246/5 +f 769/1232/136 770/1235/50 761/1249/51 +f 762/1250/134 761/1249/51 776/1251/52 +f 761/1249/51 770/1235/50 771/1260/144 +f 777/1262/133 776/1251/52 761/1249/51 +f 767/1246/5 776/1251/52 777/1262/133 +f 772/1266/140 773/1244/46 767/1246/5 +f 757/1241/45 773/1244/46 772/1266/140 +f 796/430/44 812/1276/44 811/1273/45 +f 782/428/51 804/1288/51 803/1274/52 +f 783/441/4 797/1323/4 798/1275/50 +f 789/429/4 806/1277/4 812/1276/44 +f 790/432/50 805/1279/50 806/1277/4 +f 788/435/44 799/1280/44 797/1278/4 +f 791/434/51 807/1281/51 805/1279/50 +f 781/436/45 800/1282/45 799/1280/44 +f 792/438/52 808/1283/52 807/1281/51 +f 786/433/46 801/1284/46 800/1282/45 +f 793/437/5 809/1324/5 808/1283/52 +f 784/431/5 802/1286/5 801/1284/46 +f 794/442/46 810/1287/46 809/1285/5 +f 787/426/52 803/1274/52 802/1286/5 +f 795/427/45 811/1273/45 810/1287/46 +f 785/439/50 798/1275/50 804/1288/51 diff --git a/src/main/resources/assets/hbm/textures/blocks/playground/deco_steel_kit.png b/src/main/resources/assets/hbm/textures/blocks/playground/deco_steel_kit.png index 066efb53e350bc3d3d4565f8fa09bbcaab1088c8..ab24ddc3c7b35353ca7291f8568ae3fd2fd81229 100644 GIT binary patch delta 2304 zcmV+b3IFz#4Vw~>Gk*xuNkl8{h@R=Hzq2zdGb<|x z>eZ`Pl^fJrQA**QBgQDVF~+pOy{?fx$E<-5qlowKYMh*$vj1gnZ-h8W+VjM@j_kpHrwW16OxQ0ACt@_qU1^}1DWyYRjDq?GpJ z+j$`))^W~JN@)*DDK!GnsyK12efW~3cIBs(NPj8q&9}gv>S(E__|j4}rLjxcPjw#ohMh8)LR!{;~XNnn)?_&9^Bf-n@Ck z`}gm+Dx_L#TPYDFwe(`KXjNEBY0KK)`^F!~vF*RsTC~<}HH826?c2uRMShI2t@Mi* zFMoEHe|~;W&KdjDPd{;fe%_9Wu-PLehD4aes~m*pFYTPeIY$VA7-KuAIOjM%K4u)p zmYiy>48zb~{_5%q=iHO!fBEH?eD&2=ym|9xXZfqu3U#mV{EqnHhaajGG;*GI&XH1T zZYtg|jw3NfhGA$)Y<^7Mr5_-$553s$1%JunK-)@VjIFv$DYfg|?InanDXsNR{ebrU zS+u?f^P*@R$5vj;K}L))O;bDa-rk0#A8`A=%$4eMo)hjE;Oy+I-uM0G%a>c%`Mj4e zUsm~>kIlLB@%te0d3ANQb+%Zq*KPI12&EJ*FE1H};lX|cY&TQjZa-j}ru#kMwtoU2 z!|T_t)%^Oe<=Zlau7!c&}f- zRu6fA^b+5UM&8n?dE3CDI5Sk}Q0u!U`+Yfj!3ErptZ3SkYqHf(+^YIV4z8t1v zj2q=sqEg8zx2;gJ{V)uaS}3`+B7aQ!0rOqKSkn}p_X9!*D6LvQz8Nj)G%ktiZ~Qa|8Xw4UMW>Z%=3r1INx`I|6MN^NavEn)824}Z90fGT?k z@Z*m^R=Fpb-~Z6K{M|P`M@os`e)|orHP_eITwY#sadEM6Ppw;M48zb`>EZ$Neu5NH z>-D;|yrmxiFpguZAaCC3!%6Tql$2h#j3Z;U)+%$p{q|dR-<d9*E)em?`(Z}5T z7#=dv98%Riq`aKt$8l`QOpNj=`T@_r4SxUq_f?dZs!vvJnxJQkC^^$F z7Sxi_O5qGFyrC+GRXgvDTTnN6Xlx(;W1&xuJV%{Dl|o6C5Pu^nSFVOi7}jWGKyA+7 zS}BZH3|DJZNgL1E6Fb%yTXSXgXGT!$m=tZv2`ad*L;FoRy6~VXlw>j1GloiuiE0g1 zRqW9*A!qu9|G0z?X>(WkDhk{hQ?s!)Xa1ZUBkb&wc34kLA#ieX1jb=~C5C|W9a(|3 zntIR%MROF zbO~s!@YaA2Lm9!aB`jxqw>m-jZsiqR~b}&KRReF;RgqtTDTL z+-C=CsI0D5IPaL&6LAczro`X>_7|*o#4uuwBF4=1)qjAp2H$yB7b{}=xPZ?cHkFL; zEZP{RG2)!&uiXM;Z;qkbkfuN?ip9cFl*Spu(NRYXe|!sA=RH~*;xyol!Yw=@W`_01 zFjbrZML{`FC_vp5MM@c_@+ZgvMl05fq-E4ogP_x2T!!S;u6uMUW{@H(9-5c7d#G><* zl+oH^RUubR*Li&JIr+;8&KQO%vASMi&1Ur%eselJ;D7@TIN*Q-4mjX|0}eRgfCCQr aqv3xhoPfjb_H$+c0000z&37z)Jd^jz9RpSPjR(P zzAW7qK|UZ^?-tv{wroj!h_|q3F7358D=WALE_47xw!|ZHhV$ZB+}zwm>=9#x5CU3j zIOpg#vMl50F-C+C002LJ{J_VLAF*1kuvje6wk?DZ$nzZ5T7Q0@QVIajwk=|e@ZRI` z@eyTN;`8UvICp*kkW!vK|JBtMRE!bJkl>>tLRj&Oe<_ z5ki2qmdEv(e>$Dw;o$*_v`LdxRn=*VZQB9>gb>(nw{XtkZ}0*1=9gs&DJ7(o!}xTA z{7P#L>=#8E&+{Bw>jPiRvWyph2|iiSP`)(A@PbHVVt@alx~@?a1=_Y{QzNr7#_)9r ze=?bz#V4VL@}+YQd7i@pR;${_@f#8OHaZT>a2J%;dw5NMjFH$TsF_VpornF^9+8A1psih_5Dv`A(~ zzD9mGlz(rGIh*gjAIz7|xr5z!^X3glP|C>wV2pt=hJSnSA*IAnzO|Nx=)-r;AtC0zwGL^Bj4eqiGrrC@IoNK9s-RZn=8v!#Bpjdq0S;(n5x`qqRoc zw)`URJre+M6-TBugik@LFW-9)@BLuD0`R1IN`GtZwr$zh$fTTeTwnhU{;OB7u-$HZ z@r$D1B4-F+N-3Y12Z2n7%sky~GPj}pEXxiS|5AR_H1OUJ<}2?#?(XjJ`1p8GA;lPZ zr)VOor6-dKS7F}!18o~)m|xd5=U=51q?EiH#J|74XMUggopZd?S65fP=U*%q2q8dy z|9}1+i^YPEiNG#Lk`K{j({SQ*EI*H7$d5x;>EAm zYiO;{p8wsucX(@vH4V~w;*6`l5nUXcsbq(hns;c53 zmL8M)^aBX0YhnKtD2fB%RO+1L>dt%5*MHRP$%RNLDP^yI0RO&-)F+S@MRi?sc})iy zQbN--eB?b&!_*HrzE5MR`b=ZO69vrY^LXm__4W0^H63?-eI4nOK1;dj^HU)IT(8#$ zXN&E2%ezlXXxkR6)e2Qrb@n5G!)6Nbv>(tk&1nlb7T`~~y}cFbwQEe*bE?ZpXn*S* zo4d6ZQc5;i+ClPp;-B3Q=um)|&*yPIpPwBhQ{~;>-ij^@pnd`gu-RC6rRI z*0Lo~03)Rg?FV!Q!BfH?3y@ffIJz&==g*lw9j2UfJK?=YL`3j`Qz1qBs;bb&7Hw#` z2%~;LniVpYv7l)`z*-9-1@{AtF@Kj&gEu!f(OS#7nfx8t6yJwQbf2|_rlA8-+= z6Rg*3KA=$LcVO~+HxNP`q%;ng1N#9_6c8zg0QmOpTcmr0^!{_t>2vCN3V-iCe*gXr zDJ3?W4OXiamdoYNJf&pUsH%!v>0|+EKY@yX7-`I>PoKo8F{j>32;!bn1f9-S zs}%<-x~9s=vW$=2w0pFhgMaz~U4p*k-k;E=pcGWqbqP=B_`0q+n2}QcMnB-?LCLD1rEYNS4(Zr2GmIE9 yV#J6MBSwrEF=E7s5hF&77%^hRh!G=3bm1S4Cm+Hf%^sWp0000ovad-9F_kQ3%QmTzEz6W-Uz43=Uq{LwvV;gBgzSuc$&yM)mce8l zA!C=Z&-|b1ec$i$`=8&hGv_3o!{>RP`?>GyzOL*3MCs|M(bIC%LLd-&4R!b(2!tXU z0wF7-J_)`p`lL={sdA#h=f4+AsTQMec#tBEkVzD7K0Y|OLv3$9?O;U z+^JGGO5o{sf1yD6rOf3*C_T=gav&iI^Yo`-M0?bnHq&bk+76g?Z1Qzup)t{1c8Zl> z996QKj~Z&{v^vZNJ{Hz;iCe!HQwe24*?%dpXRzx!O@FQP*Q>I+vf{(M13yEvyOSd$ z_eR{d4M|s78{wrbbr?2{B2#`n{2Ai zE-qFNAD+xwv^xGM6Q`@Y>4Mvl=WQk`$5TW+fJebInhxLTUu05c-tlkgBZiL4@w2oX zjFi)4AMM?IMIH9MCG=q4IiTGd)xP| z<@;^k{8dYnKCSWH3TyM2`Z78Q69pOU$5_Ye_Ek2cgNJK`L2|r@he!S3H_5YODP6g1U~e#uVXt1DmWvzmK7w>b!yy%= zCa=ySL;0!y{>ZI74_baz;IN?>A4B1-C8Wnj8E*9`p}k7fRZxRP|6Z6V-|*+$@885M z_H@(^!!PM^8#96*+mtf2xz}>ozZ;+_+k3Fb`ma6ivU<3(o_x7C)CKd-pu}D#BRExb zd_D2J28%A|T{g-TTNNhC`m&gv9k1Kk+NyD<*^N9`w-_amhehQ06kDrll%!UI>RGVu z2GdO+jyaWsaj8>l4Z;ZCp6tJ$`C~#VaZ*bOR?&)6n~IND-l#0wy_BcStHQJ|fxnT! zzsIZuehZswWG*$@JqJn)M?7=EfMxYPWX*+cy-NxU3o9#9Ls$=fWE7u8HLW>R+if>R zhZ@rhafC&(M48t5wj)>e&ND}a9L2%@KIG?TMjY8=dN}ZYw>4)B=3qjP9_7 z5iJsh#!#`38=fB@2id28%+oaVPsGYW0-xlJJA0p1&=hTaym?u4%3Y*RoQ<|_K^(0| z9;Nymnm`?PWu`HKU~>4OyKAyVKALvzn-E{xn64= zw&(}eQQ&Z6ND4&2y?f`VPdH=3agAeRW7qTVM4fHB`^1Uu3%CkY3*vkk)Hi#nH#qsJ!@>cw z5gTYqULAUuY`7e|IvsG`m+00yIHW2+jq0t>r0(Y=#Pv;YHYqP)Jx&CTCkDCU#fjNO zy0{b2-}?&aF-)gSNcO>+PZ*K#gz>j0Zq8_zk}!oDkj{e3hr>BE=4NgetrqLMQjEV{uoytueRlr9e2?tUcjIlbV6l(zYp z+^65arOGW>)shYM%hBifuAS&{XZX5a+f) zo)tKN&hvWN5@{2YC`BP7k)Ut2+|(S_sLB90^H z#-E%fx%|9EucoO<;oH7IckZOi%vdEk=3?}TPIo39qYQZEyCn4oTqlJz9JP)Ug)Xor zK;@>b&T}F3#Zp-#ezQc-8Kn$5%UBt4uzQG5=U$3X;TL`qPf7;4rvq~AxjZjET7^=I zii%!mq5zd5=T6ae1lxNz=UM#zt0?xETzIZeoe!e&SY`)@!=+_pJcUNrd#`fCwFclq z0!OCnmdi#GRk8dXpQ=t_P*&-}&KO?&V^Vsw7RnKGqEO-S1{b{;9g$QrQPl3$Vy;$c z2+zMWEB&~ju+V+T+1l}hAnBKcU*Z`<8raJ_B}B%mFm*j(=FGW%!M+R1lsb2d`67j6 zmR_oKC_jV3mI#dSB6Z;*hV8-E{(fs$*Rs{^zCP{d-Kl_Y&7QyL{o=F3)hq26<)gb< zn+XwRxaP5~GWN{yl%MGjb$(2ZSeV>Lrv3DUOsM9b?F5%2;jpc)Ho;G5aKgB80uCc? z!`6TPDsPUDu;K#A0#pnHo2H0Bqczt_?%0!_X0UHGFTm2qPHFzxMd9pAsndA;?k+}o z$cwyt?!y)OjP({ZgcSwz4V^OycQegG3LHR%1Stjr`8qIgb4co4arES_>+|1x4j`ma z(=D{Rm#qB#xpSe`PEK^7Qf??R;$%_of&S5M8PdhY-aGfrrGp%6xn+EI5k>m^(E`gm z{ulz?L%~$f>YBr(y0$HzHuLgMDQ$27_wM-}p9Xi-A>9;uMcZSn_Z&Eg$b<)*dneW! z4%e*2pDrc!IhABtae$0& zK>zD&oq{~Kf{sL&lEV$4JQ2CjX4?j6^fxK`xW!FZdm~mn`pXwuG4tlMk~YKH<)C?ul20A-}u=JO_{nTqyy5D3biX5fgFFfGRc zjMOb0CE8UkBH>2xR4%jN<)&$N|J8>n4=}-}e~LL%s0d+6NyL!W==(>0H?#T>54XV1 z0H0%S2vKERyDH*J1DWwf6CjcVUq3w$Tkx~?et+vbl-4YJACsB|14Eh5@BRpqJ=NK+ zP>QRS1BvoqNhxtMLr>|g^FEP)U)L*2#wcSj7`34C;F;>3S}&F;>RfV{8;DYa&cSZh z3gvUa_vg#|kCuloye}7v_3wb@-+& zD`4#!#C{vyYJ7X1XugpB>eUmhoC_ZEm@^7uX;OEmlo+?aMkwwzez@p1yoaMfum1{g zIUMM>Qem3$oB9MFXU>aq!I(n79PIJ|fRK=-8?<~ktGM_`WeAU#30)_%_+96cp~fsS zP8c8_4R}P|vO@5*Y>bA{LHs$DzTevGlDx>68MU%^93Om&GxbSR%JFX7K{kQ!wbG&2 z(G=s<2MgjyPIpjLuk!kCYHNF)wHT@?!@F-oA^~%x3}h zoko?k1)+<6k9Z}pm{0Bb9JdO3)3~P4XNF-l+!REV@DZE%Y1_<$_(vRp2_6!CVJ3jsI=QTk4K}rRD??1EHWg4r&=@~ncP;Th|K$_+ep}O ztFVM4^6y-e5K*C!)MhQi<&Hb!FSCUSp4y6pa(ObFSszgszM&WV={($6!JPD=u63sr z<*~on!?&9_%%$0=B-tP#8QDT0Z3Ys*f)1J$IwyJ~0!`ekKC{^eBY*4hYc%zq<2)>2 z9$DZKd?QMWj4n7^s^eYiD&rZdXSt5GUt;Fc3uv^5K&KraT;X!23}gBd++>Nr=>IFi z4Ld;WwKzBvv~B}QjOU!MCgQ|vT6B$jBGUrrzJKkQj-a{46gIufnjrNHL_L5eJUvee z96(hraMnq7GUi?JqM=b?z4CEGGRPl$q5Ph;@fk=a zc$Dgn|Jkhs!OFwzVWd03S~jBPpe=Pj;yeqPde9N+ii>2k(}tmjtF0^3;`5@SuBX_J zq3DOCJT5Hg0)YA;#sw4Qcr4mvyx?;^z{8T2@11l&Y>HT7+vzwll22{j9Y_3>&=A^R;~EqC_g{>mv)ZgSoGl2;K`SENLOqTTV644on|p zS+U2M^}z1vHBR)DB45C7ahOe0Kvqmmw4`OK#itIjE(BvEqYwF7sgN34A@jhJlAt@` z7g)&JgEfgp+uLTxUZAe{a~BRBx%UYEI(XG~I@}5XaL@_In6tt~PIX?-8w6AbRqi~1 za^Zb%DCQ6xds)X}i~%o0qm?>CiT>m-i%iyGs4>DZY=4SZ=e90(IraN86?0+jrE{Ofn>S7n#c=x}vr+JNm06(+eutOVH?@ZVn$x@Y5}kc6QYWq8bC|%8 zR74983HP^Cgq;)K2wb|!r+F^|`-F-&EmEF$cIo9?>Bok>0RWI{@L$;xr4g-t7#z&I zIFQ}5zr834gT=?j#@=?coL3@9P{*hmvHV6S=_=De8V;P&1P~natL4o-Xs@#XNu}6E z=BisQkkag55OQ5%N9O1)Y+w%c!F@X`f=j$3fxmMlnB%q27>@sA_RA6m{gEfOJNN@P zLPYs>1lTNPyj^>p0#FXysMF9ao}cCK z7svr+=KrYJG%*?X{B4g0f zO>=`HyLHpnmGiOf8pgAj#~E(CZU zDnAE@3nLKsI_^AW0$?0}>vh^1J;A&FyTv?l75Uw6)IfjMu{^KeycI!{$*7WNbNuR)rEI$s*|n%eSX-}sJi+fIQwmwU z%i(QxUs@!e^sU1EsLm&^Wp;|>n;_aldQi5C%1W|!-O@oR`r=~i-IgcwREy1Z7X}zwskK2(_7F~N_Q%J_(Z10u@|@mi4dFWa=(a`V4hR?vC$hC(W?ynX zRP|y)xuE^lW01FL3VJyhr7H?^6VN6opq(WH!FV-&YoeM4w?y>w25z?Cl(I*Fk^Q@ zTi4t0HW^_`l5)!KH*VzfTMaC&?qnaWF1pX%DKYe7EdRw@?!7>wH)cW0vh-^am&X`* z8xn#TCuGAm8pzvrryBytIon!yB_XQVDK`L9bYWQFjMBJ1SkJ9X1Y5PWOecr>DXkhI>He`;%z8V>mxs zoc%=VxhzCE06~EeO9h_`JI|M*ZH*KUPC=N|Rrsmr9(mx22j?MVD$*NgwT_pC-{A!m zeb^ap-muJo>`^T$Ol`n^R}-`7o`B8EFQW{*E_^Xq;<}QdZFg~8(hHXc8xak<(zk)YMBo9kJ+u}uzz17a7%cD5zZge(t z{b_h9I#KJNAPTOw0(@|;{zbrWywHPtc2|k|W>J9-sd23$^(KjEaS0?^OkI9`#L4-% zMbdVzFOw)g?YGA>if(jeEsOY_01Ko+9-j$*;40S=yL?Vtte2T+$E^HeH8h*@Sw1=H z!$4x|x(v+S_l4F_HE5^+$)6|$=mSF(JsDsDzImPPwq`EFfzC`Wj(lJnfI?5R#Ug1? z-2l1Yd8xcP^lqV!m5U4MDiH8@%~mN@mgGU9c0lvVBB$_}#+Sd2RFF!$KRh7c7RrNa zZX2>gV0P+fwX?%G5&UDo zLVL&;j%YAlpyZ}$y= zn$k+}n%$2Ne2WWw&wEFIH7|Ji+~$GiX~|`*HZ8(ssVOMM^UMK>hd??Dm;>IO zur(9=`+&*?wzlY&qi3(BbcrK|Cip0-GhDP6{OAIQ4%DiZcm&|ss5dQK?;|c4j+OBC z--qlE*c!fL((H>h?uh1=HsV0t!lieQ#OhbkA^v8@Og{d=2EZvfQ?sUI0}@bF-bS3ZCSucCwLGcq!c zZprm4y8_rdREGS%(n+|O+Ur8#CY_9OzlBkD+bsBxZ2m~X-a6l22>LR;*jhj+yvB6yYo+!T`J#Ei zsx$%FTXjSoB?icXo>&msNe}scqhrKdsUZnHHu`9o{h|5s%kKR%(!mou83i;(DLKU# z%V9T}G9|Q==u`_F7y_<=3`8;bk(^O+rV{F8ePw@14HiwuDfYW&b<$@#)?=~%XLIi0 zxo_Ri>707&N4^K2u3KijEW#sVS{KPb_kxl{_Al(*0et{g4)g(kQT>LpB&uJ$$|+qK zkV`8oq7Y({*M@LIMhjNXZ1LY4Er*mmXZ7bX-C;;Cvj}MP3)|DV&``0mNLRy@Fd)q= zH8Pl?ub$a0Y&|r~K}(eiVHUdOd>jN17D)ofk~IDMRG00Q+*>^6!TYI5zcDQ?KQXh$ zeJ{@VTD-0^XLsuHb-1;s@3qW9J z!zU@6(!)X9G_d`qI5>#SC8oO`$&*tokiwmhWN#pP z`cZ1PO&dLFbQL!#KndRbJ)}#%;ikEApmRTfn9;v&(rt|fmj&iZXkJB+mXSe#aB+_Q zYpd^ieBHj2t!>A>bix+rUTqo*!tUa*qZN(#q{mk;JYu#_M~GB zzi_K~cA#9u*lbUOHGma8<)?cR0T-}li*oefJ5n55R<1Xzs6Op=O|S|+H94s*d)+p= zu&Kg&Xr;vk!?m*+pQy!) ziHqH?QJwTLGfQlUD_>OOXaG+C{IFr?3q|%jgI#c?N1js%2r$mqkXH<+@9+D)h9Uo8 z_oE|485tQ%jQ29-f)e2^^WUg_zFh1NVi)I#0i_VI&CR3CDxRSu-CND0N?ZN?k2t|{ zBtP7~!HGf$#?(k^Dhb|t`SY989x){Q7V4DmEVt?hb-~b2CmPJl3%Rdnq%TMt78Ddf zYB+Ic!K(Vcf4@_Jef4DSGlEb&;`pjxc5U8;EcwenUI0?F;3jjMBwJ~o*T2Zl5*=A) zm_j+QJtN0piaz^CponBD)XC(=v)oD-NACBUPsr;SJy&7!tN7s`dr`mTd4GifdJ=Um z^6jS)N9mD1N7HM=H8<3!ux&v7reD24Qulwup>3VNXP@p)r+$gJD&o3+pmgcFQZZJS z5BB+Qtw&3mS8_b9fClXaG#C%o=#C5ad1;SjT+JpTS7-{~?63|dcyR(@qj7r=8&3z> z$QKW~-~~r;V42{fo|p7nenfL^ohZNY?$OQ_Rd(jniSoJc{x9roDS#N2PC2<+Zd@AP zqrC0lW@wE7K#3$HprP>=<>(v-?szCj?Ld<#8r8ZjQze==?%Yu&DwWYks#uZC4}VaM zAXwLKHPD?=Van@y{MD|PIooR@oWF`6U{6)V8wYN0Z|{xaySi5H?#!SV0ovh}r{$M` zBdZsw>J&V`|B(YS+Pr;yBE&fI&ygT}@IQ63s7FYc(C=in*9+6)B<_*49R$a^It zInk;PPDfBl0(bXjPsOKu^Op>4zV;D@v0FL>$DPH5w=>abj5^ zwiqUeefmi=G(gC+jbf(gFsvLI^UTyTSp zjF>Y~fS>}&MI-SIR1)If2))oL)Va*)H3Y0BkB1$7>@wQK}B{M7gXs6@VfCXQ%(% zi5;kgB<}w5Vt*#i&jbh&*1kOT+n~2h6eZhmi!`$10bIKg2L&Po*Jx;A(K9@(Z&Eo0 z%rcPn&q*SFQmU_8{*A-7+rdWmjQ8}xsB_^0_jjB=zcmA_Yrh3=Gn}w)8(iznwlle! z6R8UDm+PY29+d&w3!oXJlylJnqP<^6rn`J?j5vS{mxJ?nWqvvP=_z6@_~di7R2hMQ z4rURD#%#*f?;x$ieX7*Y5D=q`F z5)={Mor;QzZz=w$hK49Lz96=km>A#vpQ-z?6`*_qe15&u060jPR5$;A{!*A5kTQXF zSd3Tj&oRkn;QXKhSHtW-DdZt3uo@u^(1|zm zvZ%lTL#)ciOp%c0&Z@7bQje>n!xY^u+%g+WOHw`Oc=4e&69w}CS~3Abi<6isgp=I_SLr`u55n?jY7hgU90~u3jZqVPg3D7t?pJEubkR zzw?AotC{GIW5iG$@65%BpSV81`N@gUq`b#kzZZ{$NmK$wB4Fn}2T66(K)Z#ntr8d9 z2oK+8FMH2@I9%Tbg~GyY@1U0MipQMy{}hkM8V@@4vGL^GA=Bxa`wA7dMBv8Sj9Hyt zu5b{?2)()*>+$bpETPmF;R6o)0)4a&#!-SL=eS7hPKSS7ieTN|?)!ZRdvu z*A#r$fT`y}-_cQE?rM<^v&yLm@*4<1<^7-FtgTvy1kRLVEUkBpd3qcGz6n%e0?cAx zHdW^LzEItbfXP2f3};O4XQ$vE_X^*hOmeN8S^*@URw*q|ChL!zEIw#q$h_153lnL% zQ!;X7y)oiAy-nq$R!R2)l{%(A?)yvRKMW*9&&93iDd_ZHgj3-KdXYi4U0V z0!FmGQ8)Z=%TO0Oh{Z3vs^`Fsv=`InA5=rB4H-~AbQX5{>iC-fI7>XQy`BfqM<+W! z$Y^d1S&eB|{A1og!xC&?p~os+GN!4^OH0WhDJdzIB!fU)t&dr1-AOxX!_dDp7g^*e zNJJuQN6hB-^1lcoI~F7^_p?{MB0z?p9Si{yhXSK3lY`V77Yf2H9SqM-oPNPn8(1$P*Gm zzmF)p9viWoXPNXyD+Sw0-1`|8;ez=H^vVUtpJT`I7RaWcF^fx=E?H6@0`;f5E#nih zj9dHd&}MuT%;2E z+IZBZ?XaN&!4^h`eD6IB^rC$q&q@*id_bm@2G|>kZ8s!QR52q2ym=~b<9rzWC-!Jghay4*HZ>e)p@OpcF z3Tvk-lJH65lzQTDN~4el3s{foDDQ91CbHn!Fiyz)V)?i+JwhWeI@fXyrBLDbGxJAR zZcPVJaLtaTm$AAhGP`njCy(iChUaY#IXt6;_ec-Huq3^WAr^iR-7rc|~j5wyV zXl|ffZl>5yUDH9Z5uVlk&4j$3VV!ctd*g(YM&dQ)VdF_k^4Y*oroVqpa=d-f17Q&*R3Lto$_`=)LAfA{X zlBVS(2n3uZ6ZmN_v*9|KE1WUkl}jbby9@G;NaxD}tbVneR;W!qhqvBT8TkPvpE-Qw88!RWP6iKhJDnG=Jx|snD{>jPZS7gL@k0N6*=6j z6p7?d+OrJ(6z|UTkw!q5ts6EV+C-zlmIEyor`8B|8NHQ9R;o9HsUC2_ghB_e$={yO z&(GHNA8gO3Zdw8aOa=81ZxSGza>Do%GkImbj^;BqrdJ*rF;^IGM+p|MML*NS& z6B9W}kKZBczx&+UE(C628Eq$Sd3>9cCd`$abCP_z;;)UprE7?PnS*XrCOU8%PaK2L z!w#=L&BiyGtL$Hl{>=sgwd8iVhH`uCO z6jg-;y%ag=ifku&{^FlseQmrpuM`aPylCozk%{gW@HFcIKHvQVx<>-4xr(D4cr<^b z6R9roGR5e8GF|g5m+?#+4D5sAr$@e~s&p>^z<10qxJmmrLa}ULI*}$NI&~0IL_8 zAz1)Ymx1-RJlH0WWdCFQxw7giv9!jmA|Iuyx$}wau%Y4FQe)f!-r!;-w3N7(w!T*G z-?1h<*+2bm6MYx3jKA)QewU&L5u3H>Zl#lA3wUueG&t^ENxGJYH<(LUYinvK!1@in zWdqtd55^=l{xeq&Q?bI8rMP1&nLa*!K%z$yeJk*KDtE2YIEqJTL1O8xB2x*$Ngc0W zVmGgj%%hM6mKf zQ?p*+AbXU2Ia{)eGL2hu{*%ATB%~QQ6gFG zBrlv^lcyw8kIe`5zy7B;~)m5dG!u zF!18}M?}3wH3pl?M#vr31Axy5$6%ldpYFv#n69;1%J`RQBzyThRq;Vb=Gt(l7pj(7 zl%7=$@@W#UjO?H8RM8WS7I1i1?}BN@P-)Qwf^xs-lgHz4Q8L1GRQ(yQs*yO6#T2)t z%!H-OM0Qy%NGPVstxOtL{~!u2YNc7xV*LuTGOu}rJ93=8!e*qBH%KyB+scyl-fGYf z#nxB2^y;dzQb42qFU`Hv3&H7Kjj|FfEG^?(TOi5lsTRSnrm00%8JM#Gjn|Bsx)lYF z@%i!j<>AJW23!F0%14&V(4ba6})k>yi-= z5v6MMygO^7e_#OnStOfc#wQOmHpUgBep&dU>%SbWpjf%O#xA#8Hf~35TeO{d^!$CcQZN{rObIw^UBIC@(_#OPn^jYB~Ep&hur#QcT@G@ zFZJsOsLJ?KPE+24LqE{{%UbP;+vEF&X2N*JdR`gOcEFw`?S9jZ= zLgki=Mdaqwepu*IwmVXS)OnvYcs=262BW+jVpSub{pzG?A+WksOxwSCv%h;k**O6$d@6@40M34{Zn((hc``5U4s|sS0`}_ z3ER^ zYK-Wi||MQGT{8g~oRd5+6x6+(lk61K&s-0cP&>^%uA zNnZg=x462t)^U#(u;ajO3!VvBfpVd_=H)j3!+#4bmZpIZ+Ugp;Vg)00hH+lW44eC$ z_tH|hc=8@~nw6vPW>Wp3`;MU_6ae_8rNbBowjXUTkSyJKYVljR)52WU3*5kP6cBKx z?_u@2R6gP+)Zor4vZYl9-zE#)dHyL8;DugSud7a~wBsnso`g5W(bHso8xWQG1ho-I z`fw{fpO5GMTo-iTITtS=%v8GuoH@^uS--93o3m6Ar2P_@-XRaBCM^M0@Xx>7mwQ&h zpI|=pZRzN|@Jpck50D?7$p?o4seflE%8~QOmCMi$vm4t7M8kT42=xhySv^Wi=4&&4 z!44Ag#K=y~bor|v3OL?lh5)TweoszQ+8OX=fE+8s$$77Eg`^moUd+*hwv)7^PsrAC zi?+C5zZ@XJ53J;V2J?KjCaV2P6Sm!zk5Yi6484cSWrd>a}bd9yO((pH}o$OpL8>9o+HNlvEedG)v zp#v2Ru(_$9a%%|H{}ArKrF07Sv2kh!J=tlZY3f~KGQiy!dq&n*Tht7_A9nH5qkhYT zhoStIUS1=*2z}R)@7xh0nIB?SL`O4reEpIq|$7g?G~L&ie_d9weln(f23?Mqp#pR6riR?bm}EUMgNH`j`+tw|MP22P>m z2S=kr;)VX!zss}sLklln!JmmW$sFXN@*cXSa;b*>vlts~$YKX7Lyzrrq7W9HeQ?v? zdPL;$#G^+ISGt?7{jC%fb@pxZW)ErzMLQl|(zqim!2IHva`+u694s*pZ?2}C{&)8W zK*t~OnHQ`WIVdQ~A_<-yu=5EU2QX)cEAJ!_Vj8du_7C( z@)u{z^=l_SJt!!^$(k^_lSIq;yxs;)mMU(sFio$}A{JOy4Q&S^*=(%r6l8{|B>#9` zJww7dT^K;d36u?50ed^;5Vm52VRSnwp=ROjr9j{n>OGigXH6bQzOFx@jTkmS$l33UFan_e9 z@1{sXWd2q~hE$VR(#Pfdl^IgKRlchvYPr~P-Y;d?JmshU_O6ZY;q)Ovi%Rqp(P)h* zSB6Ypi5JUi2NQlGw?rMk7zj0@Re=-d;!uBXX}ZEi*&G5~iRKQ*yt2Yc=kyf(&z!ox?71G85;5)%ZDKNYg~Y z{L$-dq`+a&f*RwsIC8|+(B~uP3}Lo=JLMY2`BD?|PYc0FQRKP%Z09ry(`k;iv^`#a z#wIy$a$4(p1fT2Qdtxj5goddcAQYKr#u@2r6Ma_0J@G72fPJ^WbdksTFryZb`9tCE zzeoUhQpV>LTA{|w+l+IkG?pC1m>1BG+^_L=ZTu2qA)7h7^~aqoOu|ElTOmRkij!)j zMzrzoMpP}lL!?$$0eRo9+DBd5K*Gmcj&dVJjI_K4%rg&;6EMRM>`0poU0%kESRP(YJ= ze@3bIe)T8zXpd2nA}GS^oQ-tYYlEPBcx2xBZ(QL|EThxFXobDw@;?30b(Kr)sLSo! zma;By*h}Z-#MZ%ZTLv6 zRH4EPrVWq7B4$S&rNI}Jb(7vECS!P9d0Uoac4B`oYQSd7+^WMYC0NeclQjxL{8(d9 z0=SmQ(n8rXENIcqWq~{{m7xvtv^WDN2Zum5lklJY378;0JLGeu&AoW>pWP{LdA!0^ zt{~Sh#6B9@{r*1a;vqoVp6`A?MBC&L)*?~h@c7AFQ?WyQX~qo|CSUgejYQCkEi5cP z@>pExq9!+5C)U$6LA;bQ;H`w6@__d-hI`o#>4xU!Yrd0W8Uk$HoPj(&KYu+SSsV51 zOVd>ng>uZNu?b;`(A?I#RR7i6kUMN6x;}UH+qd~Oue=|nWYP+{dK;;Ya#2Zy5959< z!oI%Mk^2(QOyfM+q&TcWJKG{<#;+0$iH3YeQ>PMs8<<#D>>FJ09 zhoiZ8CDjKF;{cb8JDvgN=0I#(M{;c;QHOj#rxE5vD27TQ zJ?>H*R)}RZO|Rx}&L41kV?Tb(-#{2!$ue3^NNIxsp2rPeaW5+Mg}rYsHI}s@OV6ll z4+#t8E8~v&WUW&9J0cTLvCmMJkhLWl73pscahi?CIuJ;&-YF>O#Y1RFHAWNwib_P|!8O}cS5Fdx# z=x?hM-NtX64V#q|`Ln{)Z-%c5aQC<$>DXO9HMA9WW&n$Tp;px{$Z*p~=03aero^ia z8a=^c?`F0t7l$isdc_fMng|~(*VVu1{z3hFRZ)_s;kg`Ofh?oQqX~u6aKqOK|*VmW_0?l=f4H^k%|!CWGlqxAO+o9}I|j9%jOdf(-ZG9Iv+$Q6pu} z6){0uNSQ;JD~^xq5U4La7%3^?F8sykMy1AKB$Ecoh|#XAWMXFa6T#QXhVL*;>Aw3S z4a_7k^gT>Mwh84OCf<>YvF!2?-V4Q(THN`3*Sl6#`E#@zS`En81NRaqfT0* zD_^bKJaGjNiv}@TKNj!AZG6Y-IgM(#m8G{g$Mt}_F*O~oKaN@^u2QG~v+#`5dxH`{ zpj3$h-VtN~-lANbJZRzdfcRVN*h8g-g^z-*>bRl;Kc{hJIUwL0E#7;Vm#E}S;2XdONQLg})NXqGkIYgzwWYO_(C5acrsAA+zliZ*SJ-<(b2YD* zkTv;jpM zC=y(OCP;X@m|eKO<3*sr*`1mos@yt0IxTYO{v1T{^Kn#cmILoUUH~9d0WBBO{{1`4 z?V+s7flU%J%H91ozC(WZ9@xbb z!mb3N9$DOW`83w3gsg1BeBF|Xu>SE~77Y6U=7Tvq*1Xkk7^wthBL7G#f`HJ0)HT|=xVhQb*%i7pY1A`(dQ41u zElxEm`4-Elw|sg~$3#RDF<nE?WdEahjBZVOfiXNgD97& z@GSOfk`w~C5!Ap+eWrpB1Ia=Ud1GFFbErnfYU5xB_d=)$YzOpV<_;l#Vl&p}PYa{~ zD)Ht0%sw9U4y9me`(1YWp&PZvPjkRXsx)hI?ssgGby}&q4Y*XA67;Y{nkvBjbug=P zg}d{Ij#p*8>8kbwMpYioMCG4LLRl+oYYPWm4~7?3;ZwNNK8;auQMN#T|8z7fHP(+8 z^k}$7kT$`1HE4Cf40{4T|4tEZbLk;0|Fet0jTZBP@9YiCUXoJ|s~X3tqeP9>+B*RU zH(o2oScLJVHNmnt=-(>(RGzBXVMF-{)&}%h-7c# z&T8rGWo1F=j`No9-fYC-nv7|w0jT)2r3}`I2KG$`FX7B(LlhKbpztTK6Yn9cWQT}x zB?cEIZd*9lWyt&?_U>JJ?{L#|5|yr6EYRt0%1fsDn~_GfD@RB}&P8@mXg~socrB}y z(Rs^I$g%zek~%gn{rhVAngEV#tK(yyV8M>6!Uk7m+ z+!S<1zI}7MYtzq)Fon*hL>I zIU-?Z=x#7R05T5n75?#!f>Mje-9EZ=j~$Rdq5QX>sZ+e2Ce|$WRv0z4-UPMiOdPhO z>iEP+%H%Vl=!y&(T1xsv+<|noDVozZ*+fz?+~JY?1@_QL0B7m!tNZOxwmE>ecI{&v za4L!FqPUcc{5wzI7Gfd2?c?79L>idkT=YxuHYy0MOlkeFPxt8K9XRAj`c@RpP%XE2 zsmWOjIHGH9P3+=J&HF?*H@EH4j>a;^AId+@cX>^g;e-9wO(;wRtM}tMMxqp2?>@=S zS3KquUjAzz>ITwDW~BJ27`P8G1xZRHd4Lh%4~gK`Y)J6|C==@t;pjOss{@bh!`F*` zyslHtz%u3jdkFzdI)L-G6z?UhQeEPibe3s=Zi*ncM2dn%@-wr&q;NjOo@2$s9Sfot z$&*JCbW6%x{bvjV_j@hy{>OwJw1uv-?sMMg;u9&|F?SDDC+~5E)7-lkNcOo30mQG1 zspp~ugb-m%jjx7JJv93Kh@! zPYHrH$ib`8JWBp-jb+%qO)T)jGK~fa;TpwSzVeAVE9wZG$V*BCZrn$Cvlf;WDIdD6 zD@%yd+E`iedWwwZ@}F5p?Tk+`U6O&_dZfH@Dd`O-L;Y-1+tNA zwsd*$juTaXrnwc8_?>!ZWSr7IJ^V&aNNg-UB$)K>5zy;3txqlmth_HmNR^6xE5))b9 zoKEv2aq1I*p!ECQ8GGhwHKWBSb?CPdx*dyBdR%Y+kjEA>2fp`skaT?}cgBz+e z2lWcT1*x4jAJ-(HFmY2GpI=;+Kjp$3LH77a@M9KV-o)B1tywRN;klk-agV_brn3MH zjnqq=RzkT~11bLSwaeH4!bS+X+`naL2dM8KEaJzA%(2=Ds_*AHxieBF$R=GTHd(_r zQCKusvfZa>A=k(H8~I1sg~t`?0eae}`mo&UoEGk}{KPL@FN)!h5q9sd%h=rXTQq0C zNkym~AUCiN!q1OxEdBY}h1hqq`$9p|w)fdy^+6EF}op~*BwW!=r`YRh4Vvyr!sVg>hyPl^&mzYc z$zf$Uw`x*&{KQqc1fXMRBgjouo_`xluqw)2k{l7F;Eg2HXD_lyeX@0&13`Ud_l)E2 z8D(XMX`|9nx6g)p?@t|9oO*McgYsTgmtz80h^wdvCtw$bcmpA=*ZM!=OymJfTBj`_?{grxqHRddQ&y}j7lt%T$3qg zs!?`-hSJj0aV7Wwgw$oGO`mI|02GA*g$)_8gr$n01AL{;3BT#&=TnBd&#HB#ccHa6 zXX!Wx`8C$3oDtcmRyQu=v8c=&`MSr!gnOO$PRqcz%zo&qzt=gN9D8IZr*HMLn7DK8 zwe_tUVKtgJXj}5T*~eK=M0Cm*v4q z<%s=8KdYJcMXLq8pbsm)-7#Bi#_h4viz55yg`OK~VM6~6mn4PO!QKP$H|qHh0qVAZ z5#&Y{gMh{DODXUIFm<*9_3N_Qv}FMX=pE*n3uZf! zDV@7{OYKGPX4$%rF2f^=61Kvqy#Cb*Z{Ecj)!B_O@}Xdk3$~&R&39gG|GHbufz=by zNeUj#P|t~C5c2*3__jdhS?boOPXO&Qq>zf&7(B8ko{)T1gb(}UvQy1^C8xs;HF0|t z8l~D;AU7d6$fAd6xIGXYmiWIi$+i3|GlJ>CKyam`G%1v{N z<(SRoU)#iGM%~?b^FOk<$5Vk+?x&-C*^2}_I3mfy2;0^_Fo}%!IWCR#f=@>hT}<>({zZuW5a&@cS4PsvNDB4L^k4Gz%E%ay`ggY6otXv6?5G7Y4V= zagC%v|7&m8gI-IOMY$G*`UX%MJx6p_-AN@7@x~Z~fqM;h*pKJ>}?Wb!>;#u^WB4;MGsuNBZ@Z{xLsPdv!LYN=7ae?C!92pFn}T$iVTqd@Ju|$eBp8y5;@$ zV$0@}S@Cj*6ThWZb3Y!*J5VMGvp7X)V@&`#_@b%)n2B5Z`#LnDH@ufbvbD|}p`nTJ zy%>6piqz!`d<=j{LL|+QC>U8zCgEAugR3|>$z2zN99rxAIOGe1gkk?gE_ZZRLA zs}7S85y8mF2qOfbNbofhT0=mT_)iqregE+((R=L!Ezx$74Or);7xK~r4r8^9Zw-lF z9N2f+wB`+eU%{XC@cj}I{!#h({Xg!f4WCYi%1u_YtLfg{>kHhhRKRDhf3b`^{PkDen&5Wv<18bbfV@xdtb>Tf^ zSSnN%AAL?6L1!|Q#Cd)&sJ^TwpSe8!q3HoSE})jqJ|loivUy-?Ws`Y*8P5xWVpb^c z1Oi|z#7#s0=m9{(h+uO%u>Cx}yT%)r=BSxvmC?`Tvb%mo0*oPoc^5 zF@%{|3w;iJayjC=_tKlr(AWMyFPJ85Y}Mmu%vfi+`KcA@JTDO)+T&noL{A+D zfI@1iyJ-79e%x=2Rjmx$jg{chQndO}ddWo0)1&5Nfq~_CM)EOY(k>DguFDs1Kkb}& z%G*_7_vD@bEej$`B4W~`RxDGFesj$TS8i|&9 zsx*1`WV-&6{n>_M>{F2vB+TQn{RNsR`Gl{ME=N@je0;5BRs{8$bJvbLeU%r-=zQEO&sS7iA7Es; zdwQzU8kbJzI_7&e>_BZD#AR3rfII%6nQ?-+q04eYXA* zd3(6)ofyXav&!QSp7iR9$mi&g^|?J?WVTebkrchL$XRtMMZ0fE3-{V{Qs-KqwMO5; z6X6(|sJ55(rXh6JS;O{K@Ap1qT^`4K_{}~0-IG;dM}4u0uE6a5`;l4UinsNnbuOc# z6o6xu8k~q0N>a~%u*Yx(XSXqRU0r2?WXu3NsbqZltz$(!&N=}1!vuBVdpE(f`FeV% zYzRSG$aRbaA&Hpk*TNHvd#xf6Ux)Su;Y0LZC@OSbp18cUyzGISt4F3)#rwL{JVikdx?ZUpz@;5EbQrQ{+=g7iFx-AOMqeLl|>Ei9@DW!K0`Ictui&F;fH`R7zh zlxO%)Z1^q@UtLhVc~maAdgxIZqYjSa!~O7Rj;i~LZ&W$YFUu}WeEd@%zg9am%r9*I zX(BK09LUr`4ipkX0{ZW0eHKZr*BlYw>8-heUw3YA+uZaNr8PH=^lXTMzY9TRF--W| zHIDg%ThxWLp63>Z=qa+-$+OV`C1#DNp+$k^eS!MGQTJ@Akmkt*<-UqPx^M5F)382R zs_Y}4|4|ixkwGjYgi*}#8=x}?Ni=(b-6oyiY9scfsOIAMrHsYv0+nhs@{YFh}-8@ZpO$DccH{~&Ab0$*yF z?eW{K6-UL?UAW&X-MTjLyH*#esJ;j7BA1(EjbTJ4`h9gj}sw4h1m}N9flZQS2hhjKUdemN|ReIAj$mM z#z{6lKF*%K_Z6e)wa2r9r<3TViEM=bx!=AjH@nj?@V?>buRlg4(!ZbEWqwtZ>lezB zj3^1X-lI}}5SDK#FcWKVkL_X&i5O`(#oE-T|Jk-e!blk3FRHuWS zGWA-TnqtiM-=86JXK}rTxpIe2xiGqjiY;_~snXtd;C8?7NsaKhfNceiXojLJgSv%F z*jJg{#oVF6Zn2}8H3LmD{d=Qg-EyZ+H`AXB4c29dS$nyr{c4q4%dALG@FNvH?KsAZ zK}oD0v&CQ5VwjEc8SA=wi$XkFG=s*??(%0H8iSz)E$fT7Cyw<>fXG}j9+7pdgHF0n zfy!O>=7}(Qt3dikL|qkEkr5gky%Nm_%T8S)@s@vjoB|W2H@{eNIN*n}1jxef+op|L zp7s#2-+41DUYL#L<{jY(;gt^`;v8kp#AI@JUpXP@ewM4%p!?+E^N4?0{_7X@)8W#w z#akvONAhV@R8*h2t<1MFQEec3yFb|h z86HIL(;tEO@BB1y>eXs}e2=_<6lhy@NOinLNZ9!3_YDHp>zE5``0xGLepc{I9gV`d z_*M@YzC8kVr4OkvuFborL>FTZ*L+6Wf z3Uwmcknen)(}Kbu+B2V!w^=nhm4#`utI;V+dagq@B`B#@env!rUWrVJ_W2v3A{UV& zA&yCx#Ku#M?l%g^a|gauGs~!kIa$cpqnkB~LQva z^qorvZ$Rr*gV(BI!c^1#Hhw#(`LSoiRFUVE))q?X-@#DC+9(5mlWg2~=~$;z;-ihQ z(0OK{sErT&PEP$SPHH9O$EQ!9WU`snCM#`Wvff&s3D=##R$FHr%NGy$`lDb3L&Q!B zlGxlDBba@_epCNUEiaC-<#)`)i`|vA*Lr*}jgA`dTi*H6zcygrw{a6tF4M_SDq;v9 zsCJ-|zhh{SbnMZbIB}6tsm0Ic6V5V}q``J+_kA4$Ms7oL~LsTgHGnE{rf&XKHoR_>s@|i%KmtyhGzI~@Rg}}rLha#Hc$;mHB-<3b6KpL z(gH?-%!ADI3~BhOt~iC>OsQiahHGrhm`8*9=I4!Wd-pCF`RbP%%+#;kI*1yA3_kB! z(IVNh#y>CjrH1BPmb!QM`+RYX1lhv_>a+(Hq(=7_c)9jq{b=iDF8KnBcW#-ig zA4|}BF|vo_=R8!T4|ibxDAJP$deJUz;P!^IkFrrf#A4+Y9QRW z8CUuIK_8S)sqeVG)zzIT5GR~Od~9F!^7Nd$R3(4wlk4Em&dB|?;8?XJPn9a8WtK|S z=TDODxE-_gPkWCi^mUE0JR`Il@{slf(%&J`RtYfi%PiLMj7SNcw}qwP@o)F=_6~Qg zBk#jPye=R#S4Ouxeu3%|+o-W&xMk*P)e=~dh4&dFRA6~vK|X*nm}W;}<brPbw&#iq(EK0zs?L*h6rGOU8Up zx9GY{lo;W^?{2TGuV)C8BWMvH361*hhzC%STK1S3?AGo?+zXn<+=MqlaTLoV;QPVq z{YA}8ud_{fvJY?BL*IE!z04i2?TVvlpI7rO{m5FPTcp8tItLXwPm6LcYrn~`b;9AZFF2z#9A|W{9-!gr`LnM!cq63Sa z`?KBrr-)LZPG#YB-bWRUjV05)cdw?B|DK;mLdgJZ9zJE5XDu&Mq*a-Ef=BdCQxo&X zhphm?j(*1)7kBs2+O69zyQQV2@v~lwqoo=fDOY;)?SnE*J)t}A{6)Buu?vH5<|TY# zak1~QeJGUYn|!tIjFK&szzdVWl8*wPdDGkg5aes)Z0F(O*{)&D@!l>BJRP(lh7aCC z)yAOkT`jE;Ts!3bOB+Xy+FHx*$i`z@I$E|Pj;&?myW)QT);{3GEeQlZvE7S1Fbg_! zaS?Q--fK$wL;|ZXIY)*HA>y@yA0$Zg*E~HuF8kg{G;liGqp?wOga53btMzgAcM``i zOaLq{Cl17)aM`V0gEylZ?*m(v$|hFDvk9L5`-{gI3+QX414j3<#Uejg#QhTK{bO0R z#E<9Avu%Yc5UTsNbmUHIiViPLj?kmz5&ii`4Fh0G~r+|C_UBN@QSSU%U1@y_C+@Xp- zD&iP%S=mRcdpe?Z1$NsLW6f78{ep3P-D-!xL4jS-uJ#QBip&lPv5U>y9|Xt{wf;N8 zAZpCTx1qy=R=HPJUG~sZQ~FzR2?I_3wTC@kkF|(!6rE*G5`+!idOCu&um|TI2$_Bd zpw?O<$Dc>%9)aEE^^`IwHNmY}W%Mlr=s2L&0oRp(L+6mMRmEX~0zC9zl-iyTEELIvY9fNuLqXSePWXJohG6HN6mUCc>& z;Dp!8S9-cDG7->RcIgJ4JxHM+f6aPz1S5f$BRWtjiL82&}aF~(Hl2- zQVWvzB2Df~_37 zM7B^WPM&+mL92afcM@fXzpyLqA2OFxk`mm5JzZ%I8<;<^gJF!7KI|y%&B&rVHO#gQ zA&WcCOk%q!*D02(-RgUjlqR{ROof8T8{#$ho_fR&crdU0YCn}vli_yj>6xZCYOmtl zjt?zhgQx%ySbJ;bdPE!miwi#L6c)vHf z6q#DT+Prs2Ln6Ce7VBjPWDC`TQ0>Q>{+{0lt^l(l(~&hR4iKo!WL+7fQdnjh&ma%J zDe$14ZWO1sOL<_T5IE|VZUfYaYC^HqbLFQ8ebgCPy{@=3J4!O+0(2Q9G0N0W^&hSt zvz21ue-%DE+aO3z9Zg@p>`7S6Gh|BAS(pdkrZ|IV6cQHebyi58ZTNsG6*h`K>^r&; zDh^*&%~z~8`xV2-EcuzQy-IoZSDjMo?~Byo*7-Q+cZpK8!+0#rVUjKMT}8<}MZ+On z2tuRn&o`Tia}pEp0x9yy{9E&}X(?S+hI^!$cj>Afcq9WeOuxirrO3ivf_~$0s`vkK zjX{U4u_%7tAa`gD*kN_wXG}O}T{R$9H2Cike z?K{y^c|jnvc@KVU_7UpY69SEF5dC#)S$hy4cutnG<9>}P*xUc8oxb^5HYVb)CP20L zu+3@SYg*Ob_|f9KQH(@uWMpJ~Lk9+bpUK`;+aE#ilT72kUBT@O;E#d{MSC_MwIj0s zwKIr;^#ElS}WO22XY`;QT_x#t0fdBs^Csn$EghRGJmrKBbIm*eTx&wIZE^8|1H zZ)pKO&1l zm5#RXTzEXN0T3e~DxHq2GOJ2x%ISCKVHz8OB3zwPdq;Yo(){PqfBihW1f)f_X$NjP6g%T%y<(earLY==5=rT1`a3`ILmx77sOZMe7$ z+ig@(lM)5@Qq-^R$*5&?GNW~T`>@KfW}~}oclT!3E6(k0oZH(u*MKWgvp7wZxub0n z9i}|6JXy0g-WPb5;GBk^&*j;UcDSQLsbFty7rf4woO`U*`TULT@{ba$>)NYdFQgZY zN0`z-$M24{TngN{8RStwIoNVA*>VxdPF)q0f!jLQAT;^-HNFHDj)0QYSr`R?3o0w6NOlqTuL{0f`2x+!P^hY)Ygv*m_-x~v zKoiY@<7kI*i;%s06DP%%6CFhC5?S)|QKFW%pWclb?h~$KEvcDbU)iNPJUKDo?LQQ}(-18EeOs+xL3+=BMgfaJf>QE0T~ zsKBra3SI)#Ei%;Kd2w3xRZ8Y>Yp}ImCJQ;4C>Wba!llJZ+IkC{k}T^O_)5`Jy%$|a$bNTT`>x~<^x%fj}B z)dw!OJl;zjcSk=?HwQwuo93;r>ZQfqYgeG(SD&X2`g{nv=15RXYusG`+2T~`_2>s> zivtQtc4@x@SmndtP%P-|x)dA14ijAlpF14C@}+vJ^8TF+Cf?ck**SrG0kCJ22%Dj< zZbDDBTS9Mjdi-ImzQ@HPp|cE1%btvoT#g9#Yyd_8LL0kde&Mu9<&j3E2E!eIo~uh) zw$p{c4ZVnj7&kOp1!x#^x`FoZ;=7d^&IfHLfCl@hH;K|fpwGFtk+=a9+2P{M4e~WATb9(I|7JF9p$;I*|KT<& zMdx;7bb2KSWgUWtl=B_{NN!x~Omx*LkQ=>47*W6&FORgZGNLIJF2kKL+kUwHC#5B$ z$Z(ypWsNa+#QyFePHtE3qhq({;@vy9Tz@t02Tottv5&eo*GJ-V>U^d0=B6g2{)R?8 zP4WxL+ihZgX$6{Z*DXeU4Iz5ulwNUs-oIG1o7*kIfVC3%8L^`h}x$|AdLj#vkS9)$q3uQ^t36)sVpkTkguRjVLcT2kM#!!yTxmcrp2(-=3>IxEx#6Qt_5)k z5$YJcoJW-OWfB_$hLrVX774Od^2YOZu0KEPk;zg_;svdwR^BGu;Bn~7rQ#-$2EqvJ z9bjn_7k}5$(Q)fqh&4 z30l#1(H<7dRcKVf874Cs<_4&FW#zd76N7zVD883Wpi5P<$2lhVKlkP;{`wK&6Rvwh z<596Mx6k1=ekHB{OX_g#vthdU<=PQ@k0maf5XXl}a-wOzO(zfQY@WdQ$jHdNrlwJo zArmvjGk|$Oan?CcBOmN`vR48c@(G?i&1FCkx9^r}PvRT@+0tcCJbI>RBUihAA3_kc zQ3s+3VD+gVKYpzHH1^W}m1h9|A0fIYF)?eo&6qoJ9<^217vU6$O}|m+wcTwad#<=Q2qF$p+UbB-HMfl zq@rXq${vAsL5QnDvd4c)P{sp49f97-M5}q6-v1+juPEog$Gv<^a!aeC=U3xz*h<#- z_n}YuVUPC-(@g`qfTIO^s)QP+3C>cBr!YJTUJOxwI&0p%}J7KifHe{p_+%8RG2sYzz7xlpszAd15}lqx4lxx*3nnn+>GI{n@+`5XM2oP$~j#B5w%j0ItA@h)n*{!1Qo!hdb3fK zIU*hAq_g5?C2w{&ZHKOu9*%`BXFeBM!~R;(#J9XF$jJsFE;ae zh;=`}lzqPTB30n*1+^`&4g1yf@?`r9L&Y`+9TVUssqK$HNA`j3aMEk9sbQbh3lASU?41d?6lhoJ zl>|UG&of}O0~K#h;M#%Vx|uaVm592&Z0UK-ag(t;|0{jcSn@LP3yzukT~v?dX9Rv5 z)YS7ubNbLUgBA@jkipE%3~9yd_h~Pcc8S>SnGIlO81-b^GUR|qcqh}+)sDk<@2%W^ zM3qVA`|yMyGWF^4PLEbmW+GnqCQ|6Kf6HB_cz|g=As%{tOd%`ca%4j7_Ye-11cNiz z7y>x__N;Oy>8R!V-Yyunyn&S76{Rtc+CoZ|BwgoTP>`&5aF@#VPH6)(0%+U)`-*48 zV910JqPNk9?e0Uik9vO(uzxR`h}z1tp0enzSdWij z2ou_5>V%|#`SD97D^G27x6FdZo@8%)?PUbM{=Lkn0_XS!a;QaO6;+Cuc`*vmYhNy=KU&m z#tofl7{CsC`1pY8O{REmBR8xzcwzrTf0D)0R=_2o_!x(Srf{y6}f2&sR%Rb-k&pizYC6G{cR z3?c2GAWE>VgfpE!N!jh8o!(c)6>l7*JFt*?El^b6l?6veYtMDD?`u!RM0}nJ##~d4A&WsCO&y%_K0TMVuMRx=B zMk-I*B|dx%dJPTg>QA0u&8?=gd_r`|Se#*4P(Lr-7sXc?o!IR$>N_s9-b=AMI%=@~ zsLH6c&134#E^Q%!Qk#>$@DF5p2m~MAb2Kj>4Oy)Z7SzEIJ*FePXvjEpKuH`st9Vqc zNN-_YJEg>vhi6Qb0*>6YbR+T7Ug_ZDv z6(r*}Mj!J=P?52a^6IPGHpq&`TpdH046z|e&izTpN6uI|(tJ>Q(akVEDdu3Uv!S7! zkmSjFH_fWS&}? z;513=-IhS>K->>w0zt$n+##Pg4ftTi+6bG(k|J5;i&gy_(GW~yJ)Ti@~HPD_-Ol#nV7@>6ha!w%KKfF^V~Fyg7Ne);v(wP5)Wuy~OP zacSxn~JgVmbpKi2$xX*}8f!mF#rb0=B0gAwjS zq?aX6*&ZQbBmO2E(n0>#glJ`lN+X1gxJ2&}BWXDqHl^ckeE8+a!Ak>bM*8>rWtG=D z7@bt7WXDyFKJfqAjNGyC@sSwAG?ctGx=1RAfFoMcxS2X5{v6X#V5OZ*fv#<)XJui* zKB=TqkFQlQ`i*PO`(Gh!boX%FBZbU(;9vp*VV&fyJ#gJorUvroJdG{836b(4QM3Zz zUzr{71@{hC5}-yM*2*gd4K5~PMh|Hg9>o6owilR0@>u9-yI}51&OWT`sZ(cFCU9E~ zOcjik2fp<1xvuW)EZ3k}w)bjV9=F_l(e5bWYz!e8$NSv{72dg-%s+|=49TD z{w7Et^4r8&T@Le2#5|r*S*#rh@XLH)xp7govhs^{RCx3D_o!#hT9S*KCQZKjd^X1V zGB-GtxQcoqb~W!YFDS`^4x{h{ydLSGNiR6Rx z4V^&=Kg#X)vX5Cc2L`)iU$46+4%3~8$@Oetmibsc=>T}cm`A=y!EtuLvUM0QB$M&x z--&)8bQHanr+Nm?^=WB|gFYGV{Kr=xZU_7xN*30(OOfvQ<@qi4cAV_|*3g|(Zjdy6 z{Ih5HP*HQxKImxx$OT4QthO~ko7<^zv;9GO z=GTd1!SfV8rl&mfc={5&b{q4Ekd2=A@&6K#@DvHn`IuVKEU$W%wJtBiBclEp75^di zs3g|K-#PFd^gQGfKsC{$C`+W=~3&qJtE$LtCz`UcKS6a$}kED=jF3+zjg`=0912Wcw8i& zoy}hu7nHZO)Sb1~wN$L0g>m^!%z)e}mCtMp+5c$g{+kUf!OXd)?V8V~7@#Tg-Cs2C z$qB4-UuPPMb?#o+eYUZa=+#sLTY~pSufiQ$4dSbat17Af&6UG#b$-VX-;Boo9zO2jN{~G`hAX z1b@M|I{h(iF*IJ6r%mi{6zN&SIItb;Yu*$%*4~{ZPR)BQ(N<@Gt^cK14x?noQL)Fd!$RXQ(9kN<>?iS->IFI zeUh1x@zu>O6(lvvw<t%v+xp9*Z$*8 zF#PoSnvUaJfVC?7WKZN!H}OvXS#dt;__g-I;@E4FdHx5NH7h&6_+c`=a_o%yJcT(G zw5~1Sww_(A=y779dwQGq66VQgwIm8z$~&p#dPCpd%FIiCs4xufkd*i$THNYoyq%GA zy}$K%SeYGfvWB;%!9D$t5r;QA_~!woKLQR%tl$T2T-x24IQ|o(HnL$YZ~1A0G&+Mw z-(3nk8btJM5WmTbV|usH(j0k{sHA!8=5M~>{4E?A?gZjMj&kfi<7PYlbj!WTa?~32 zHri>jJZQ;n`?ZsAgqu-Mq#eCz1ryJ!*;uk{W*Sc^N58XE;>BZ&pdk9`DnWL{%)}(- z&+!){=^qBNO#l%jP^P^m?4;tDZy9-T9!P+&q$|4?G&pt}2eYh&kF_x0HF3P$pGIf~ zQCC2mR0&LFS+-bPz6~6c;Jy2+kO%=k07aElk>OuwtPH0w0tFMS_3%zt1*jBq_piVw z4F`;6WUSv8qm+o$-9jDC!UX2{H%_pOVM1^U_lk!xRRufpivt#IzzU;=uyFke03-k5lkMOGK+|qm{^~@tJz=jCJ z1dEgW0TJraAhMdvX?x6I>9G;ReglPQ2##Qi?U(z zLP4Qi9_{MqXVTR=zT6U0gdIlpJuH$e`k2Ra0G;+ zt1D68O&;|)js9~ZmhmjRPz_R7-@VGtv9}e!$#)eC0=nr3=-Lx+(`}iU+nm0Jl{4m) z#kl1Y8$@xxycg0dC#pGt!|eEfx)$4@TSRkE_>raW82OFIc4zymncpsHy?;`6kM}Gc z9~bk}-c}?LHA7?diNfUvWDgROxBl=(Y0g#hgwp-Tef$Ss%JYzGzmc9tMI|H4E!H;x zRsRbjC?Q#wz#dyTb9?^65R7LZBl-urtI4Yl*PotLOjne18%NI=BgXcWgKCJ zi8oXWBsAq&o(gtCE!JR-+3u$x$-;!_9_14!ex7H=@S9%l`Sq)>rr%FJB|&?cFOc(4 z&|bJpV%*gB`SRhOe#5FAR@`Re1K%WVJ%JsWtj;@DB#4$%-Ez$p-G!k@U>eYb>(&DZ z%2_;!yIZQdNMsw|Gc2dksZ=IdFM zG-a^eB7`%B;b4s_UWp3%=XBYI=?YP)dGpIsmyrWSIXt1kM~T3EFSYhg^bvw4TIVYA zizA|wk}WiDlE(qbUbyp`j`DCeJYT{7i7}7Bf7Cd^>|<;NLkNNmp{6LOM;C=VD|{Tb zCYbgl0f<BqPPeLrvh?q zn|5V$Tf3Nbo!Bu+R^v?3oY(e#)?{;%{eA<;V`xnTL=yc`o+=t)`hBKB2OINFm4TlI z@l%sS+)EoZ94&7S+nuaQG7R-jwC&#x`=k*@HK5>_u$HZd)~rpkNo{VRt4u@tVZ1;L zSk%#yeJHc*itg)v(2=?b)(gf^Dxi6}=1-<%f%ktF>|11rZ(txK#H^Up*)ohC&cW`o zC+<&bx$lby1O&C%6b*w$;r>yB(}SBqK|w7Tn^L_VcU*xCzH%;vbw7vBsspr^ZZ8~f zRiR%8EZ>s}(%utsb{aviRQKN1H*3|YaGx(YGKMKHAr75HX3ccy?fk|1vPI`9Lc=BV zoHWA?dLB4GiRd zS>lw>f+tAL{u&|v=h&N4h)m>9^~5I&rDxRsG!afHtmgh;MVusb6`6XJWabhw4@r#3 z3Z8TfSzzF`yuvC;dlt9e)tCCx-vE zw+(+ZWSZ@F;%l(0G50cq@at!Trv>}AnpOjz6*TRx7ow(ydRY?3wRIpJAHd#|s}rw?=wN7psHZUxx$~K}`-$^=5hFFL z%kc6@Ub!SAn7p>ivq+GQE^%J&s80m8?i8(nX>@|&3FO`G9-+^vn!PXK(Fni3)+_IC zku$QX^CtM+hB=K!Z8PO>1RISs@_KPnzh{6g!-F!S`hw@n^LG^QR`!bAPde_t^XG2k z{+}+Jah4*V{k6^y=i;PYHC5Nlp3OZYZrbec^9}tdrt_3Y5R49Zy(C|Ho@!KaXKNV?2^qYR(`hdMF1n<}PiK=_G0ehZSH1zfC$wGy$G@3Pd zxYyW7-h`-x{JcB%Y#AYYq-B^^Oz_m%exDQFf`~zhvGYV%k283s=R`lW=Q9t=iWiv^ z?3BjuV>v{{;mfhk$~03xs+2{v%Aow2Ga*WeQlal5P#^51aANkXIEWQ9+(4Ni|2-Qs zyAB1}Ew;T~0k&E1tjE9~0kqtR$vzOr?Zx3d*}HSix!d+|ok2otupjHj;KhAASC&;W zn)eJ){vQp0>@;no_UZi5*%RAaz*&K=)iZ&?aw_ywiJ9-O{CTemdN=gJ^w!VpP;#|N zJVCG{V_Lb?0h#dO9ChF15Y9)ZgymwiNN=|y!V$H7IYJ~3H-r6TNr%|N5f_qYzGw=9 z5ZlL^BX6FN&4vJ*zFl!le3;KFnxFnI!h`X?p$Px@*K#ZGp^1N}n!dZbE$6|d0Lure z7rQiPCZ5l%f|>_}!FZ{HFc_0V)Z&TN0~>EFYoO?ub=ynT#J97wq;dtjIIqUgC-J_0 z%N|$Gvb)|N-ro%@{QUWC2N36d***hZ>bHs<{{Ls@&#CEVNkZvNXLLAewI;(>eKWr{ zrJb}!dY7G;572BB#A)DWu_Swpy3jqo6@? zo@oo?pSUctySMebowBc9%}s#?l9B#<4obyK;)O)mS-;T;x>r0@?jN6B6k49{Vs6 zG^&EQLswa^B5FR$C#e}l3|>DimdMY-3mb`Hsf35n?Y`d-(GX}ua9IgR{mWLC+58vv z>JM8|x)ZE6IbpT4XmfPm0#7k?{-q&;^s%|%b|6As^m>fEx2)(55JXWSq$iKY^z0Ts zdG=m;01kA8yl4^xA;!e*6jwqh4tKu7+{x)R56?hO=%}IazZf7hf3@j#-dS7mnRFS= zp^m`z6mBQICQ}t32a#Q$ERHDUWK~v!quyV(;m|9vYQsHs(1Ggw*+Rqfq}XA~$l!?B zKDvcY6*rj{#uOF=J7?t@Ygh@vBvb*1J6uOy_WLegH!|MqJ5K@#*1wHnRrAy19wvm> zMrDDAtJE|;3sQSgQPOz6T-8gwq-inS>d9pPuc_5*!1lADp|%hUwGvHF!vo>f1F3sQ zxn8eac?3wfzc$SPe{LjA$gi^6VK`_?Kcb9>li$z}$Ssg;n~b?QJ3~rEj7X9EV9>tX zWXkVe9An)T>POFzqn{c4(Z?*wfz$`j%ojKeKmu3eIQ5qc%%*geN6T!$@ABT>o=j(r z!Kka#S&DS@LPr329fqLBtn6kUq5w;wV*|C`S+vRQl!=C@y`{MaUzads`(`iu4%1;8)fNZZEL_n^Li;Ca%@l^?8xVqs&2eSm_lOmhO@L zN8CE2v*@@b!a8D=|0ntSTiU6k^ak$_1-OwTLmsyEL}<7FeMG#pu^h&6bdzv`l;_bF zkc#qElDvb+mhq{nOb-#)&K%q4D`<*H7Tp2GNS{2@*J$jMz_D2bY%_To#398`kd@&H z<`14|8S2U-VWz|QP{{{VoldU%*;v^pD94A;i?Z%h@WfZotf@RZKEx7dH^e$+P^5Rg z3G={Ap>&E=OtMaQcMmOto0{#Ui^^5y%^$d8xX=(Ww3WBG`))R6?1~ObQbV)_&RcKe zSH_HUV$k-{Yr-cFxCcH5(B?i~D(P&=HXn=AIP|~4i3A;&Rs@lS7oKeZUmHAaHEOq6 z`XufxCQ2S2$x$v+&&n{1d}Q$=l9;IVI4P3NSe)gm2TAwV^V{U#7{aM+Cr(n4H*4$s zAi46Hv>r6Ga4_A^%KLG{grjP{!x`!H_7-5JH23nl+1$W%{8yij`=|!?n!kYa(6a&L@S)Enfz1>??hhs2v~bZ4`dF%$#U`eqcLHhY}30x-$KKmS@E9^ViOf zn=sVjw|j$0$MT@l#LsU z4$xyxA&Big)_tWH_yIHK0!dsPZow}e*D}?7JcfR|0l&Hz&vN~gQpL=%s{_MCM8jGu z4@2a}E(AoNbogQremkET|HAjJUyIoH_4#YoP0-@(Zqo`_ ztUBR+mv%BYcf`&^*2I>~?`aWMe4rI7=udGrrjO~v5`6us%I3+D!380@L}=`tGw!6# z;AQ{)F8Cb@?;Sz1u?@C6Z5W~q13!x<^9AR$E5_*bYXMEBAqA)C3|#m+YcjRu{Rs7e zVeOPNapAy2jN8?1XMg6OxkRi?+#)ko_lMIj(ft&pQz-puUi8u{H?c4#FQ+lKktI$0 zJnK+049YbU-{&?#v-1j-wrAZ@`~{zSL~Vnv{#naQDqz6B*bRIo=!iR}FB2t&8$F=> zKDvk(ANAJU+fR4bTJ`(ZM9qv^-rfT7UZP5qa0HE^d77lViOQQ>!39FjEA7U`V45?x zJ%W_)cWhvLfhf?SiV3zOCt??uEz>L!pouDXIF^5gITjNlYjF{b}pV$2my@esCGKxfH~eXo=ezAHF_ULFZU`=9VoUt*BY zeW{kYzFNPc=xZ+K%P}1JYOyF5otC_MGreNwt8IkD`y{$#HH5*?godoS%Q7t;z) zQI^oth3&+7eSGICK8GA(zh5|pm##($?2h4ATFxh`#-FDlF14oa9x|Ui>EEd|L{VO0 zOe7+@?MNL;wOtnFTX`hcuAhQ=xjM?aOR4A`_aM4y^5H7U&)it$(v#NR*``Bu{(TRu zZ`oGeE{dfjEx&y-@L()R#@CT9Y3s7aTKrf`(C-jdnxWX#g;-nPjgg!B>v0zLu;>K3 z72F$$ckPrYX)ns1gM%9{^3a?M_;h(k5WncZy{;TB9JR}u0orJc4+Kl-Y_P?6ED?e7 zn3wbLzz5{AUZJG8czE%Wd!im}S85vvW*Wu#yp4IR1!*V){`@A&X}K>77c&<4QiDTj zj`SgkF`M%dV==@Kq65kFI;NmU?!4SLpWh@z3S(@cS9!{wv+RnCS_K^rkT0{rj$p@yGYjD^t_`6qj)~mV%}yvX33~jN!DNDMpIS+(z%Lyx$7V z#*N3F=<2`v^3gkwcf3R*bkf=Fb`8$P4`OZjuF{3{J&2W)N662(#`=umaoM=XMbmCU z-$hy&YIeo8;24Y-*EJG9lsoo40p79#LxKgCT;$;0qL|U#viEHDbF{SY&*avhj<129 zO5UXWPi-8B@JIdym9dR^2q_D}_yD^L+H65h5#Lv=msXJvwMH4_kbl335KyF%kW^xj?oMf>1|$_kqy;3DW&{DHk?!sgB?Kgf zP(Y9_MPQJjQHIW8=6A;@-sg?q`udj(mrL*c+oIQR=&* z2O?`wgmaUJzEss?K2VC>5`6DbDEP$pBrOCC5dbcYvRn4q4E66Y5<^Izyq=!v>-Z?f zn@Nn4NsPDan42tW;@X#=8W6;Yyh)^VxZ(G&G8lBTDva5}UIGY+iKx^m)C)8Lm571Y z-C{O!XXm}q^UC<*vxYwXN}s1wSdI%+d!n#EH9CwGmIxcktT+b9FO>e#(yu#{mNWy`Q3YY`n9( zMBEOWw347Bnkz7QETK0aqSYY~HHE;;o0pIJSgPfg! zwCB<#pd|0%Ej-A@Mz?SzXcO#_ zj1FTsK#Avt7Ef8k1}I*J3gZ!99>%Ar3^`W_9F`q?S>D;U1>Z%%Zx6{|7Qgp2S^H50 zStZ?~$K|F!%J~yS>csb6<^OODb&_#@hyPIWeOvWy;y?r4p1R(}D@-Z|JJO>wF1ih~ zWEOuU#P9-<#~DG{3~Qt^#kgSCYG zLxUvZOC6`L1(Wo#-}(qBnbfL?!Mq4vX2OwIeIbSK*mvX|jq&M7!zc*kF3nsUeIAwi z2cLp1^c98c_Q8%kdR*`UCBoO~NH9SGdrk4SD#gqFOOIsk<>dd^V`o#6CMsYI`^p9( zETVZgVna`mYkRkdG3-(^F+~Hj(u8cpH>UN6k}pxsiyfWtEYH17HB~hlo;{VvMddK9 z(eP_@b&fONH0zdm$YY{rBcsIK__t( zp#+_OpNA4eOMfqekfG{Wvrg#VK-;mqA$>}Dkcmz=O_T@8P@zT5mAs5c zF$ME(NYLyBXe(RT;{WLS<|i*r*H{AYWR|MQCKXB`*WE-LL7;oFX_(|d3?0m*!9tv( z>e7VJBP!Iew zPIJ@u(N%>$H)s!fE0!hQ)M`D_S3CBe&Dr!%=lU(SBF+{3KnrXs$Npxv*I#cG;8qO= zpaM7KalWML)+@*x^b@(0Es@E>_9mVVyZ-xno1YqPx!tOiYWt7!V;<+8`P}IJ z#uqQ?cJpkgh+~jwi8P@)^;WRuPc^fqzP?tZc2f4-d8V7~SsY;POnhLY!eRp6CQtGdC_WiXY z$0b$iK2S_qv>B;e;hKdF6Jdyp$h>_yw~1SS9D=bezT-!a=zBYN;Q_wSM!uKjV1r-4 zu<>7u6k%#i^R7jYrE-vOhpF_nFBydP&U00JQYLReXs;8M#^9l$MW(O(4+xg{U?-FG25=R6Cjo>y{L)w zY?0eRbL#PWB|(-gVFy=F=eTQ$`;Ki+n0#)Md8@FcUr{D7t00vmend;U(@8{-pT$+K z+$pW`-{9`xcZZA+a9~F8n=kKV=m$RtJeU2!rHA>=jp0@nXO81m3M0?kXkms|Y({ee z?w8Ojo+JqVKNFqQjeZKwTlhHcr;m@%^pNJ~;;*Gi9EW;Iqy8p+u&tV=-h~&*PKhf& ztr+5Eb##^}B*oUAWY?UzrelZQ_>{2}H)g`*DA51b_X2 zn@>lVhj4btTtZ)Xt$bfl`qj6>Yc9Nt>c4V#L4R0k*q?@WEw0}+& zGx7;5vc8M0KX&W#e7F|0=01P4{c{69lX*6bnXXhtSHADv7|U#eYwMGdBgR`+iuMS)!C(Dk&GuxQSx?{B)6OBl`atz z-y+kqK6+jwP9E!)<271_3OWnD2zdLw40};?Q8RzD9UBmYsEZTZPT=5CZa#y*o__mS z&9LiJ{_6}S;BL@{Ioslv&P`bbZBNX2iB8{AYe)HnXkmhPjansP>wP~m`@23rie#X(XARZZ)Zw$lWf*S?-;Fpa z6O>04=}~X!5U4AcD{J1Fx@yQ>@PO>CMF<7thb!hm&D0xYx+mx7YsxGo#5|*b2Ix{l zr){L=)vX;KaC~%n7!T{mVrJm-Gp8pGg0OF8S_2z>o5pwS+O~q%On#lDRWwPIC2^^G zXjeRVd|XvqGbuk*YETWiV@4M>UN5~5WHu+clwby;V^iAsljq4ip4lMTF+!;q2`BB= z{XQY=k$%28IUewYR5a2*I{-zt;@N_DHe(TeoGYdqSxC%Ifct?4Cox{P&@!N*1p=Wq z(WkW~Fo20T^d&dq7*pVHOX`%${!)lEve2>cWPkjw4`Ha+c0$LCRi>%Fk$32mYZv}o ztSS5Mxl9f>GHQ&-zbFPA{nlo}maf+{lIOq&#UlOD+oo_H%-24}W!XPu%K7gX3X9oe zWgr~9!{Rdk;sR)`LSC~w~E5XYc(iE(W(({ zbsMXX)dkG(W$Maw*i^kxuK}q}#WA0q!(fy(y-w1HZ!8QzMyrJ7V%Ifl*tVMXk1$BJ zbFA52ICiJ0-l;ENs8POwXTA*$l2MscNKyJ^}Yua{(6rG}{vj#yfu%RQ_OM#g5Wm9@`w>kL)Q zf`OHGcJWw_Ly3{~&&-*B2nsl0C$;t?UR{rZ_a$NV*n|KBT5b2Pu0o8Jfe;DxO*M^x zJ}?B!gA!@Mm~_y~W9Hhs0e_zCkQekq;G%iK*R~G!#FT%#Ez?L}Cihj03ssl?fOw2> zv6Bx;qgNcDvjQhT-OSP_=DpL?pt?IYr2+2N@2ufuoxlfr%H96Y?%hKb;^gh^#G>R( zso(;^gYe*>gXqQYB4VuX=62l+G4@D!b&S>|k{59zy1T^+8!q$H%e1GzO&r7Flgc)! zS)#c_YRgg9O{INpTue<%Ew^}C&)^P2b^?7#xyju+F>9BgM>HOphP9@V6ESHDXl3k_ zyDnn!tb`mk%1fA{-F%}D_V|piTSl3}F&Mjr;Q1CF8jAO5fL0B86lZQKv2hXyjFjB& zDGX#wNA|8y(5uS(_x3jQ4mI@lSANNPBDrG)jF>t>rqhxFkDVs6-dM-J=CIKsg-`I;HtLt>pgS5#eu_A!OFHKBKRqS)y*%0E zLT~$QdTjf9iXujBD`)5plFZQUt(RQdwX0XB^CDvli`s1^YGNGb7NoYiwNPeFS7n#4 zGxk9C9j$o%M9JAJDyh%(^CJf%=l{HmNqA$)lzoJ zl-|xXwez$U!s$!$AZLTHcVT)OY(*No31@_@4Av?fleg2oZ@gbZ6S3UFt+(GOjZxeD z>2WVnHu*hzOtQ?n=DvZ!d%t^)g^tvu$u>{Vc4G(Y0>p&%}j=(7t^X8 z0YC5d`@MRt7cTTOQjAZi{-B$%%wI2jUIz!)7PwIm5VQB!k*+Z{xg$zVs=$;QpzacN z7-m!TX?dQ=A$K@w6u290P4KD2VW!p^rTCns6fry79S|=Z!J$Rm^Q`bByaVjX;h111 za$wZ$!q=TM4rX*`_E&)QEU9XMx}6dcwq9DGuS({z=PtZD8K3~wMQM;XXms?Av_QQszCM;b(OjAX$|K~|adX!-9{cG2#fnP@vqdQug1nz%4eE;F@ z-nEf44!5F4;7Tj9)#<>|QeYur=1yX)G#lyYBhqj{U*o7IZE2?~J7Aa?I}u<9Vd!y3 zZ)%`X7rRph`{nN)Z5^9rcttVy$4#ASI}V7ftv66A%F11yqsRj<^Kj3?`;S0h38V)C z0rb?u)nd<*0sc{2>NH56Mhlx5;FJte<{JBQjLiu~I%ScesKNi+FBjPkJd`grOq;oY z$8n8G`+1Ye_F=<1gBmdTxP;?rb7+mDe1z|jKg6%`p%!sMgXn+l;%r?%3h962kKI-d z+-@sN(cj_Ey+RfcuCMQYwQgCiZ)jbSeo6JHfi3P<@+6=x)Ld`O?3IpAh{`m6G8~fT zi~8~8Vvsdp!G*u`yklWS`V>E?V+mwAuyHx0(8OS#2HOIc)JZt`#tQ3n%gt|Ers+3>yUJOdCIX>f)AQs##=x-?RPz( zmw-D=f95<@%PUmV%ggujSaTFtzz^E}8(}OZPEoEX@~Ly8JVcS? zXODlra#}D?Qjusqc_GPZNtn)bZH3n4ZC&OS=*t~4b{ekH^ihKW5fLKVqW69giC5Re zRfwzWrHs1iwYUc^!{45r|Dm@f2uZ|0G|#2_qK2{mY7IVCk&dCigoBme3N51b*HbaZ zhM#{*;vBwL<{0w&_ijvy>HPRnwpBO4GnTl_F+>^;g-YZPXH}!w9JtwUIbi0?If#0|xI&@R*xD|3k!7mVg zqp#XK$m`xBPS&_{eZi>qzCm{gk4;UF9m|?$vY{q3)nhHA*J^CVowEAvg(P?G?}-%| zLvI%7w-NAk1=NXg5{nTlH!>xb#_44upQ>j*A&3GiS+32`UmUZ0T(s_(^b2TJ1Rg)o zu}$O}*y=Q_e=>Gas(#oe6B%rZJeX(vm^H%|C#ny;y0|gb&*K7^lH%6(YTMV3kB^-s zvXaPZSluo7m70S-A&MNqfK{ovZ~mzx0uTr!orq`%Z2ieu6A`MRh0Kg{RLcvGP(qhj z8zgtH>e)DkEh;VVFNtaJgct%@;kDQsJS~v7Ulj2vy_?tM`E(nTv{4A z?R$ZQQnP?&#YhtWQ}xvF(GO1F{TSG&9H?aGK0S9?9pN(*s86;9ZuImK;Mjswaot;I zq+5uCIJ9uGC_g`6zy3$|Mg%OAR{79BXf-8?@S*+J6+W){HWo)IhpvEo^o6=_yyBpj zx?c^7YZHC0=(Cfy;%(bmcaEL37$~{q;I;Fpn}XrZ^)a1+knU2(3R10AN(Jtj(yChH z4R4usCDtssnBLd+9?S18Tqk^Yox|yFRN-eDs_=+;%P_YQ@eo*%fRD#((0unyDXN79 zCK|;R1q|v^#=TE*+v}aNdG-Cql>shhM8i-iH&0jA-xr2Xeash(#dN-%XMfX{xF-SJ zpy2Z+SQc*h<+PRcsRqm9DTrIJ9Gp%eJ zQ5_yqgAjG1`3?~-;tzNYsl}RMG*V0j(a*qSfLEKRBK>f_ro8aqxS$` zi?%AtzNpD-PN?4Td-lBnIo(??g~aBG=vDHI`&OiRD_91q=y>HeHmIpu0g4EruQ&H#^3;Q2VzF*pWO?u z8uhWK{SIt%0F*Mw(yJOHq82CW(#zlFBE~4nAUGI>?Y;Txrlnrp%~`QL7*o{^AFH7{ zZsw7OWf?Hw5}Dm2{kri6O5Q0G%tulo2CiD#Jju|D@%n3Y0z0Q8FqZY)Xz&=b5#!A& z`;{-y-_5imW+S~@2+4%}tK=wSO_$skiU#?5yu9BBR_ru+2W;J4L$?q}|HVrhhY@v$ zLjgXoGu00LbNU43=4Y@w=UBhY3PKi%$kp9Z_Ce-G?U%r7KZ$e#LLU{WK0a1~%h$Tgo_jwS|$!QGXYe8V4FxCf1P5srg4PGhUWpEl=yu=sQMa!(#r_>=hvMIAB{!V@2ipkA&B4xJH5a zr527k(~5H_X$d^7gL`j`f9O>$8UrbiPsxjE`j5^IlTo=I+B^0KNlGZ?vGAeOJ|ZpP8yvMjwxbYF4zx#rei+E*?_s?_ zB)dN0K<);O5uPtAr0xZEUdL!{dm(7>HbN+u6#Qp!SoNpGvnrIF05JF16 z))UYsUp}S|dejVqYqcgp`8PsNtEL9ZiPmm-TT(qSS8sX16;&9FA%C~<7P^$(6M(ZC zCGNtWc89;KC=}Cn0*yo!?aIcz2Ub|cg$&m~D*e_eAimN2=VdQEcsks+H^AHBpbC_E zvww~fH4fHAhMikj_ASP|4!qPExT=_Z<`U}xv*Pu=60JT_-eKwd^H)5&tvcUxya2;K z2}u9O#W)8=aLLy`+CX#*r})~LG}1rJG7mr-v{T@fwCc2{K&kuwv6X2ZId*cw-1VBo zT|>Pv1}CbA*s)e#FZ9+s^3C|MIk@B;U*+A^9<4HJ`lnQftL`S%KE|OGCA3b7wlT}b zW-3m~nWd15{-oqN5^c^`)Ko<@Q_h;HtINYwVT=_tTG_5)!2!G+#|at?&^u4)-$V9qmVAD7#hLxskzdNW*NoG$lI|Mgd}f9UpQCc7ghYO3Q@kJtG_E zLw@l06R3^O^Ybs=HAfNmZ13tP{UbnD#1z`0A{rh4S#S&7X0jX3R%Jj+T^Va5&AcC3 zU*6o4`a`eov(H%X+r}HVqySAwb8s-nIar^U0Au?cG2OS&qu4@OpY5G-9YK%7&HLMP zEfbPac+{j*Iy@fJHZjWDTB&x_U;eRUc?%48+Z8NFKsU|XwpeQ!^m>@FpSFgO@yDhf z%KQNP1|dY3OKB49Q_HETIa!L77Ad&cp1*8jBT#`*IaH*Q zLhsaZbVEK+o;ABh$_nS`MVPSZTrRCX_upbt(S&kCh&I#FoDDx8-c}_JX*@D;x{ZDk zKAbE_gzXgWIKcO}AK-7L2{wT{y)!h=m-^$LC6EDY_T7xkrkzi@r{&S*g8 z+_}f3%Q7U4ZNv*uR11z-if6u^HO^RV!6mfw?7-;G6yS6n1eLV;M{Sb1S@nGLoBfSg zkx0n>u9hh|jQEV=#f0J@z%eB!!8;ow9~t)zQLV}IW|rBzJ(QGm+P{t3m*6Cs1K$bH zJJ)uAFiNmB`oQR35%{i zw7bbAvD!SCTG;s-(1?!DQTGX35Y3&AVS9e`ZF%|0pX6biGJ4C3*_@jyrnQYgh6M4a zp{3!As4$_4ZM`}5scxfBQee=^Tzuq&XsAfNsH?`Z$sY49bgJOkn4dTlL*@E^*5d*H zM?K#7?|OW`HxbmOH2**-I?gtc4k16j6@pa!+4;c$D>yB%GdPyjcME$SZ~G@gA_fGf z{L`$IITcQ^Fl9|9PAM_vd?AZlWAjj1)Q(Ah`>iNy3cL;Zl{&6LcH-+?Lf*4u>g$wv zt{gU_55=jSU*9-5)JkPK})r)Ky$z8yt*oTvBCjF0ONT%kGO{OySTi ztwhX3i(|}Bb@0I zT$C$}3n!j>!IKi!cnZdTH$qve2&KriSJTu25%g4=|u2siPD5Rf_z4 z6gf$0%#({gFQUT>*qbgZVSTzdN@9EI3n5F2=#}ICx|litFypyapS(W3ywWG>gIf=L zNA4kwZk5qYKWoXk10y6Pj2AGffy@%%+tFuv2lm9Y8D1G|=B+9fzm`S|A9MU>H#p0( zkFI|HCV**>NuNGq*)Q%mmu(%hGhty{!x?oe+iRZlyY?Z>>@cPf7+PKe(g4Cljty)l zW9jSdiPi<({^DH#*a;qN)%K-F4vxl&Myj?%z(yTm5946-heZRUakdFsVox#loX4S% zpOocAFT_<{K#uz7lP#RtCdg;&MESH8@zl0P(b!7S$*HI@6@DBI2lE*CnmDwyTOKGo z#eN=MIRw1ar^vyad};>*8=?P-8ju(AS)w?PRk91EKpdtsTknt@iG%;Q2Py&lKT%m{ z_a(2GybD)(2Kk$S%9F3k8aQw(3=!FnK#mqRI%?7TaHT{J@T}o9G@gf>Qy9PGQl6QG zvju~ThHrO)@s`@3Z!MU3<@Igv@t;HdT8SMDFHj5Z!LT^Jvb!x0wq1Is9ERHO?m94I z3lG*{n;GE%_TO^9SUm6JMiUQaWAicJwO8XwOl~kcP*pfL8ScyEDsH{Y^R^pfOLF{< zW^N1C)5(-c{x+uRt@Z0}Y#J3mr_(kuo^q-xq+*99yXm{sWxG!i_qh8&lazhgew{ME zq}Y|Ymv~RCmmxB(3qR;8Sxf{(K>_BGc*sh2nL0({$YiJO6o!4heR{tF^bI@`!K@A9 z#=OC;ALqj(VjUdMeLagED$zCgYVn1kpnRT)C1fd9kP^Ts2G3{1v~kr`NS@@qJn>@_89E}rwLkEc-xH`U?6F)NY~rx} z=JNCW78p4T3|%l|dJ8*!q?@m7KL%vw21$+^NZ98?hrD1`pLZ9J^3A;yK-l_Xt;n2G zS73aV5^B>;k@eXZm7w{o&@wKJAmXC}pG4>=DfTX(_{#QB#zH6ArLX061;wNy4zk_K=cVSer( zcYiTY)v*(I^X!`nxdR9aIHdjpJve;owsQE$*)y04_*v9Y_%x~fH-cI4XTU&O@#}82 z7+_i*0Y4|1Bb{kSF;ErocU}A%9G^Yj$EQjK82^sb<%nsiy7cyB#O0!k;j^IR4c30IHKf)yA!36uPMVYL)10@@n>wW>Sojun9#_-B>?8L}7u?~ZPVu{yrutYTN zw>-NH@%HBEb$(g0!6-{1d6&BKXF)g<@IX{F7)R#V^izj<1P9+#^{7jK;r<{~^Q=lT zZ-M&ENsCOZ9$->e$Rz8n#F1N$=GOH;K!s&gHFc&)qo1cR51TcsFeaU0^%_ zbA_UBQoVDFRNTV#vw2pG>76o`yp0owAw=aCd8X=?1ROBSH%?{sV2WRVD7>#DUc^B{ z?sLt%30jjLk5_uJ4&NLEPT>u8OG5E4iBj#Rqka35Bvb^)YhFnS}MN zp)RlN{Zd~>CQBTBEW{GQuxb5E^cDX-h2N5`j}@f5oFi3amH3~T1;|LZ3ljiLPK5^ z%}C?Sopf~L<9MCN#mVF;u7~s{v)@IpAkZ^dGJpU$7fN+WYu3l~ZLYMm3Bb04L}P0$ zB9&jw>wMwc&TnO1zJWPew!QuKfCO6CJv;cNaupYO|F8XWX;jqF*M`Rpq z8eQ`Vvrxn8_6@zzdU!X`%={}l{;?qfp#o>zmvqmrUzFz}9V`9W+)VRwXVEiu{IbWU zhk4x0RYAE=7PlKyJ$X8RFv+D0sa|<}_aM(=Pi@z1}WMvU8-VuvZ)QJV-^hprq|DSl-uYwv+ z)094zfEY-W??}J`zIS}tOcvN``iOb%B$Wf00Uqeeg|e*++A5Y~cVk^#oNgV^KjE5d zIl|v`$Ya|2$E}{3;@A`(C4DNvld@3ndCL0bRtG#h`1z{)0*6P$5MPOq5+NhA_xV6N z+vlsJ7Kyhgp^MMLERg#&+^v>58bf4SnRSi#3GF0QSevLCNDM5%on{?#p-N8nrP1OB z^#F5NIp0bxX0sNj$y_+cXg4hAJ(iy+X-YD4zj+3XX!2NVI7Nt+wGt?xbibwk#RbSr z;LzKp@Ag!h+e|2CXtW?KA=Oq+Ej4zzETJ=MkyLPH^X)ge4k_(O@b6`3{xd_wb-0`O zt?iEw)P%M_{@&_-f68F@KE@?oH-L6;Bp>m1h$ zowSi;nD?kZ{zpeY-H)*!e|xqXRyBizi6CaMB@ zJ*~D&57b+j3ZI(_CM2`OU?-1mXr&f4syM~gOCR>>`}l}d5&E*fDWaidnl7R}KDKzu zt8+ScG$6{YxQVPG z+bzC8${Na+&z$^vGgi3RJR<-6iC|P=DxN4P9*Qb9iGaf`lcN}4 z7(9KNC2780em~Uh$J@94?+F$t2{PrHz+4>drFtgXJL7zP_)e3`>{=ok(xh7Z;7Rw$ zevGG^%t3yDSFOe~HsjzC^BK5(r=xj1c@m)P;oT0>Hk@ojp51IpGCI=h+X5fk?{f`_ zYNuS{8Ms6c!ZE@O&;+rq-aO>4gQ3_9v>{S3{B=Bd+-vZ+CW{lZDIvQ>k}U;B2sc(-qi+}3Irm!RLY`x_6?C%xjipy<)~@%g>t?0;xK{sCvPq)X>aMHzqyBOF8Uk~B zC&}AkCImK0TfxzMul>dIr=Hs2)eE2bSW=ciUqUnGbPSXko+*wIMVudJHOTTzB`Qe3 zN-DW@Y`e9UZUpR27B-ebH@-AYR)Ol3>dF-x_E@Ct!Pf`zim^!~NOD$e!zpjN;Gjq( z$TGqF0UgoEREE|^{s&U6$~E13CRIRV`3@wP508Yd_CERE($0tPz%2dFK_A8CO1m!q zMZ7nmbe{9~ur%-m{R(^}oiY>c7y#S%!u3gj`q<&t%w^nQ$Freo`QUOZ;*jzA*`Sii z&$}8M8p81>k~gt-w{^o<`fB7_cE0Hg27--(A>9%F%V6e36E@WgHE-^Z(fB~NHd0ib z2gX9i9>!@?6gJ$_^^AF&eN_j-uQ@@(N$Z!GD63rYh=*ax1bv zcGTTHe3@kra#uTih_A)axazW=W}BDs0H8b3o@NQd2=~{DuP0fx!7wA(mS*pbL`A3i zO1j$bA^sPmJ@@i~?g!^@lEgHk?FB3vU>oBlw)2bXMIKL+mOYw%P%N-LZkXqKqat=+ zG4BZZ@-;j;TH-?eA%R}EH=lrNJfK#^2!lL2xehydft*AnS_nzRW=XQtmQXKS3CCa^?s~>Qo<7L}d?(!Va`LmO`2+*6A3e4F z7;I!3#cVfu2GTOwwN;<4N&I`?8aLq>QlPlJHdmG8;T7 zk?%DXwy;|ssm@=$2a6Jki#~%!&PUGe&)zZ&79o6u>2=#%HD1K*S~>Yl<+zsSU+{=o ze}qHEV%HOTu$|%1q9|a-qPFoP+Ye;PXL_zhV?b>$_*{;=o$)EHN#1qFyEZJY676N5 z+V}8W_(y~Gvex|Ikxr;~q7Cu-;6IHsXSK284(95O7A5m;)Dge_9t4}392rb$t(f!x zo9M6C2<%83b`54@v)^>@qUbSLx)>ak%`EyIsEeDY7Y`5j-Kh^iuy1<{rD&90_YWu4 zzrnfOf;#Hb5_wEMPH%j}@D9%o)f!*Ti_oTAgS)L$szl`X8m^B9a9<*k8fPNCl4a?c z6Pl)Z`45C}D*;M(n#B&=>XbQz$Y@Rrj}i>t zjaF(p_zgU;FUp2{4#36mMd5lDTCl2F4aS(M z?KW7&so(c`*hM5)-aP!fZlk~J{>pExa@S41W?F$PR+y@Wb74)B=b2xe7h4;9q!9&P z)*3;`YVd@QX@=PcbN|~U_~8_x2C{V=(#2^DMpy5@g){7%zR#uMGVGEA=;$ZlLxdB5 z`R)%%0!Q(yz|iEu=jPPjF{I@&^Jr#g-e}mqJ7(xRirMZZU#0#?Wv_gk z-4U;LVll$(fUQhFZyObARAWLC>SolJYe>^4jGIq;$%6^7A3#J{J2k)|Wc)VtRJd>6 zH^r(^HjyEPDRQPdlyY17s(c z;5+3tQ^b8)D?nIUACg2Yw<0dKvtQTAfadmf7c+^0M+}nW6B25mc>}p>)+>-PEa13 zJ<`stvyV|<(SA7=Divh_ofsBrkeGC4T;o%@;|zT(O=Pts`2bs@h&dZ|ndgSBBwDZR z)`nuHV5d2anB&5A!vkvEf^+XZrIEiln0V0QNx1H2-BIm|x$y;jSs(SG5gePv55#-X z9Q?s3MJ?uip@}DNS4^tteR4DXfT5)Re#j5esCJ)EC|)dD5H#8T2Z?0>hjAM#^4D($ z9OS+^2K(XTrIT3f9)TMT`PN#?JK4svihRJj7Oqt`QSdyC-CK)NS@jIcbMM z&0yx>Q5q(ksF&=Xt>7iCt=WMVgp2Q4q`i<8Ga?xph=HXXEHePomN|CQ#l89u{3b3B zaBy(=)tY-JQ6%zxMFawc33_hkZpB5K5kO{8Aqt>TLa28j0eZ;Jj4W|Hn^iRwQ2?#-ty$ZyOaI`k2=N{Go|13e_9hHmx zehkLlj@;N6xl*Q=W6@IjWB>oA+32v$JMPJ85aVWqf;lGiwz!6@!$_{0_E%X{+pBv; z-KzB6AkYstvOZf~3h)E2jLpw}sle}Xj(9apfA;tW{+=`pgYE~X1zWV`PPZ=`hGcwT zX=HH%PD}PbP75v>uwN-z6FmK9Ua5XN{83f)zlb`JU!BSCr+ulv$a>+D#*-gQMj}61rnuaU^2cDf8~0M&7<(F6Hy1iew$fl9|;Ly2=r+?oJAa zIQ<~BG&ZHS)`wxXvc7*xRlaDwnZA97&d&JoG3)W^mse+pcjJ-2Yr0d{{v%D|T3Sa7 z_zP&{=yQ7r(7GK4n%gIBB5~A4Jp;7eXbS`R^6(u4j<6 zV;5#;ZyiXdXs?V?d7qld1K2+{yAj>wyQs^b4J_7&24L30;k(Hnhfde>*suCuz+lYaM5MVBa7_6v`0$h1B+tXfPv4RxPEERunZzQBR>$&JiiF@P z>U}{Nk7|oKKk>3$Z#m@Np?j@6|AkoKVj65?RE}qAzHYi@JO0yOKq&ra?&;!nuPz&) zuq^PrYkLp2Cc7@t`={ns0`$mBjt?6>N&a|j|EFjS81)0F@}MK zU2RX1hwJFL{fms}m|{uhHt%e`-bzN7chC6HnH8(G zMHs3N`z?)K5qEcc2uO0QI0?Z-m0I{ak4d+tG`Yf!7Vy%Jy7IMe?~-R~^pLjaeh{wl z5UmlebN1LeJo_%`14sh=18jHJ!CIi&fFKM`gu3=u+-(40&Vpj#)taTs_xDTxnPX6> z8cte^vz0snEq~Bv7sDQJ&s&ybAl&lsq7itHeu?QH^i6S$`I`HWe=gn%^IfBD$aA3a zs?86!D$C+&r~si<)+-|Fh<+vD6#9R_JC*@KqEWjGRBFP$Cj&8DWBLipeo=-A0b0$4 zz_Qq1P%LEpgsqqvWU=9EXj8ahx*B0LvMG40iR+UYW*CLm^H2~7!8NRJ5=Yx7#ktQ~ zd5ivL;QwzvE(aE&v)v%-Iv=} z(-%H|+h2dXTkeHHpJKEb*j2HswSQZ4E1rIim>!`Ac555%M#Q5n!_0>+HqE+nDx{BO>Nr|E^r9?p_o;azOE35rpRFI)^$oK3J5K(Z6n*J!rROxp#c^fuGN3 zJSMd@-@O^z8!29IWis*G?+dd@u*6rj4xzYJ9U8TZo9wpV3a-qxd%k%kmNk^bw4e?& zmAKS$iU>@YbAwg=@z{fFUKr~62W!N_8{zQrwK=VC|5|-Bdcrzr;WishrgMpEBNUHE z>3?c!6#kc{=3TqOR}mSHDEzu_!vN0O-E^sq27#t$!C&)fT$E*U_cK7b&N!>l&Jdd^ zuK0qNhhBe;X6-oovvh3HHFr{jIOA80)$(2$poKRznO5`3*no#uZ2LO;FGlwlOLPa$fgdS7zu*k^1_zrgx8I(AU;qLHqxG0vhyJD)Zr0m7+S&qQ8qNEFWT zm1#wYV@R~&f8!gKjnivpM_H~i9x*gKuc^1)BuM_jLWiGFBI2mcafPQ&vu)ylNqqt>y zXM#6Xom5H6a<*UKO=kK!G0>Dr{n0qxG%Gyx;$E_yqwUEay!q2k3O*dmZTbbs53)@G z6ahF%Et~i~7w5XOIm!C%JJr|$$*B8_`%4@Wk&GYD_jzmEmgrnfu1706xfh16i2Mun z+UPqj7y7NzSe^JjG}I5+Tx@I)P?Z>Cc|Hn9i0QKW!~Us{F@YWD+4!@!UKe!#3ppJ1 zZpAO{^2%e1_+$Y%r8rQCjDI}8cU-;!kQGCmM##VTkxNyKVU(vdhd$Jk8P_$cChZ5Nu|#MLh@ylu%e;)@R00uTT zV5_rRc%=#Ithqy7fO>uQNosDPh^doq zU3KlqdNNy5sCFISmivZ6c}68g=wJ9?p5I$zJwShcBu^0`cmWvhhIrJ~2Pg55YaVWa zv`KN}*kSslJ{V@o4~x$XUYJ3=3fw#;_h)vDAxTim3~eI8do6Ui0>6!rokHcUluqN5 z1n65%N_CQZJZwXJhTL4*a_S$Z{T)P?n(roCa_nrnAY{gFenXrmRV|go2X?M4zj<-* zi+{PvG#4y-Jgr-#rqfU|0`k=tC}vJf;nLV(L&AMKkaY9aI~szablrTjYzI=3Q`{b2 za5A78hys?DcI39V^!&F?em!6SIl|g0NBeVi2Da$UiTX;9_@Z@FZ%;E9pw3JQ@IeFX|QDN%8^Iop>x{a2Rybh=x$Nz}Fx9`{bdd z6i&N|+9so*^i=8Ze`;_=M#^j28knnA6nE-m*Eh_PEcmNj{|})I`N5Cbt^d-wq}4mG zRGDJ$p*KM?q{UcN{CPc$&&zkq5IXACI2NMH_^OcwMZj`df%B_U=B1pq^tvl$6bloZ z94@uw#f8Qq9EK_aixWVK1v>?LDL0I1b~oRhbUOd+N!|7>!aN3zO|+>E_~IA1vC8fSIL{f$DA&oewVG2sVn1AjTf*FXM43q!HS zq)fr~xhE~3ZxGA~$OiB&`)5rcACg)F-klPS7Ou!cjScbghf}+(k_*p=u!V<7!7%$+ zMG*0(a93q5=z`Gq)HL_d!i9t4OWYinBmb^~hIYuHS2q5y>sr~N6yN2ziN%hyI$8&M zu3FRtF)`XM_pTGB8U$Dcxwe$(!q6Zog6~GgpMZrw_c%h|P5Ku; z+#BL1%m5j8Zq%kAD0Yf!e8G3IF;V6*e3+N-UWtLU--lGm{5yU$Bl66VtbJO505_Ne zXUW5WOwZ+RuI1zZhm?k@K>`32A4ATxYr4}gi(9-Nw@(ACTkj|wb`u53YF8+-EXhMM zY(s&T;w|)cdyoHJank-qFfnw@>0=8*tA9Uv)bYrICw>ZVE@E9rSt+rB61wZc3c^cK zl^VS8dA<-3F4)~Ea{R%odt(T&z~4vM6_KXmQYlpMajWPT`rf)Fy4GCUr+B^T7+r&Z zadn7U{A<0)NW?Xg54VEth_SwMjKWeVOZ2Is`q^o z1mPyX=^OR>*;Lo0kC9=CX~x1h#m3IU;6Rw^Npq$BUbxYd^- zjvLEn`tHHy2o&CoqnN#jRVp+5krb#i@0eVxVQc4JlF#;9_5;qe_&ODODWBw{63@025mXJhcuq3f#Mk9rda1fqV^~z+?Hvq;lt8`Hp$q zpjY8%DuO7E?QND-^s5Ck!x*D^s@eoac4Mu%%yji* zjt5m%dS@LK4mTbG=iZH=r`Nb_D}iA0-GLcSFd6YMLH%KMukcsiPN^|50A z#=j^-9DfjG^_k~i=RKJmG7Fc=sm;z~<}_^5_+4Rm{rmD$%NJ-B_#D8t+%Y>p-J=jE z{~u@X0SssRwhymf!|Ek^T`fw8)q72%6C_$hk03(y)q4pcMRXAn1VK8h6JdoYL3FV~ zbfRtfu1%ij_rCvk-v4~_eb0^=$vm0az4yM)>pYM1C|yYr)lB>eWfpY)jB-z6@}3?Z z?#wRSTYlWNv}0QnNC|n!Xz1B&xhOOZixi_Ze_UB8@)6S^j9*i9lpZKkDDhyGTIYH0 z!ODWXGM+}zHA<*m*mxHHJx`LXdI+v^!u?~?qqs0_8ryUBzLbJf^V>ad6Sbcq)IEYj zf$`AqE#VLCYZGM?ftdC7?_ZM*ukW5?M**!fVYt_L7+O@`ERyNEIokqu9_XYMJV*+( zdmgpldWo!){m&NxzVa{9cX8Ag;^t1L-gIk3ZSsbd%LxcKgl68$$=rC!892UF+pCl| z%2-O=mgB**E~%BDEy7y<%}`A{R)RJ8Qm5P?r!DHmGso}9qco(g@vqpQkG%DUpPhvP zUYo&Sj-H>BMt_0b9ZW!vO#1(rzChey5gjx6@O2=-0XD@9drZ7R-1K5S9cAza#xO34e>eCY4xEBf~>l`P90xxNSt0DLgC`v zS3|b7ZQ{I_Zd_}e^8+SaKRztwZ~aZaC-t7{plrvYT$)k|Ma-P)8#JNC~dy|taJGLH;-JN2)Akb4cM52<;e7~7+`HT zj%!Vy$4?@$hkCfA?HDIqg$}w}_8D@IzrlicLIk0$nIw(wc(D$_HrvUqk)%;k0xNbD+~xoP==ed>Z}fz}p@ zo~`&&!3;Q%A6xl0%3=J-`18_d3~rLa$dttlX1HriV77#j%b}vG(F( zLobhDs=(}C(II3;Y0dZZwf(+Fg+L;`gvAfde&{yLDfGBL_pV#m&)UJ^>&$tz%bEEj zvFi@5$Ij3)R@U&Y23_M)i;B zXmfrcxTk_wLJuVm94#W@P;E`hPkuO{1_3eJ?1@Z=bBEZx-L0S(q5)~nQ^$?Z@u{z! zcG3=<5^nRSu%ydTM$kJGUxUMh`BixnAqAF(W>8~imxc3ml`QNP{?3LcJ5@&y7|r^j zL4tKdX(4&{V&$jYtNfe>9L6CQdzG}=43bXkXkGN`X7sOu@TwVXH=4n z!3Y&!^Vem+{OpN-QxEZ!!TSB;-}-X%gh|2 z;{#Jz-(j0Hz3DnL7jFLeXw_Dw(%cUFG#T2x*jg6Wq(B1ePLo*=5)GEE?5=I>Pu}Bu z9_8&yNG4jJ{^vci<-RWI5-<_^s2OcRJ+sxRoCa$s$<>k|t32~jQ`3vYm1|LmoGfN! zb2K8l#E(0I|3Z#m0f{he!=(rAh_B}Rk)MJ4FU@+GjSE)hjhTD_)~nf zOZ7R4wyI5-`(-NoD>qM0idZg*kE)wCpuLFuUaalsj%~uN4pLEc@lcr}{Rc8VyOrOx zDGkNa3a0ei_uid`ub`aQ&lkM54z8)d5z$hjBWbs>e+2JkYyWJFxRn)5{zC9 z(=gm56JD8+IB`>J+pM78<1i?Q%UM;KQ&Y%X1X4`aR2rg_pfITq^PpE zSxL6C&}q3$CezH!Oq;32hMU2?E@OLD{*1X6wyylToISO<{a4>#>9%4^5*;y&zxePR zf2sgf8+gt0RghNPS;Kjl(^M~Bv8Ap4?KJ#bBB}xRgykSQI*_=QsEXxj&T2PtMm~iO zGkk|XPrq`4qLP&d4PTSEIYujKxPb9EqqlYUM;&#gmIz}DNWo5spp+|g9(Fgab39&3 zsY7^Ww@ajVR|%wE(9(Pyf7yP{j`F1xW{JTe~GKo=BM^Cegk<-{-kM5Wj0 z5+42`l~tVo1goAd3*K?-mY`A2$9nIC?(8ulKo|b>0XDWC1U`kBaJuaI4g8BEQ1xoi zLuELLsiV;0q`#gb>i89}&i&>AUsziesqTO^0W}9~|D_ zzix4+%8U4Ojb4lC)yfyJ(TYH>w0(GjQ%nfW)I^v;dV2rn9C(%^u zgOjt+<_7xf^Hn6sl6DyjrNj>zm16pxd^YQ-As4O)*j^Mz5!f0evB2HgoF@8>3_DD?AX;W_*ku{CZ|Xekn_5^4Ga)_`%1$Dw(sd zL>D<~n!nhCP#Pg4i}`^IB*tQ}3UE3+no#_CcuLtRgBW^>9ismJGRJ9Q|4}eba_!%W zL8pFK^j3NjzU7wUS|`S!OGjheGch`w({WzM`;09Kl-h@OZBY4oRXcl(bF?#UfIwSH zoJbVmBdl-K1+{}KeP#CGW{zRgYUH$}t=^aTNW`R|%_Fi(##F#uX!O20aw6i8{>HTx}9@huhFRV0m7*76rZD0G?5~Z)lWlcOh$$t^#L|a#RTqJd+t+kPm zV(wQ07Ib}w8PoX2KXqdFpE_}tOzn=VI%X^AgE{ZYgicJG2j6&yH*pnn6It0et#9gY z(L_SELWOIFLrKv)R=V zY$dG+s$~W&&sJ)`lf8(orTv_`%E9B2?`+}zq48OPTG;-on7P;NvDG7bdtj7S4-yhV z$UHwO7(mj1+SRJc=wch--}r+thY0EB@%aM5Ojm%gECJp<(;*&6OC^3>i5z0>Y})fM z$Fuk%7unX40qm`^PKRd?Tv`>#>$wE>wbTH|g_xd?u0B65fWF~Qy>Vv%xdB&5ON`K3 zOn8}p)Q`G@-xKeh^M-XFo5`c}gCnf9t=+>dQXYJMC|%d}d$2CD@cYsClMDC6B}`aA z_UOi=pl*>`KU+z=AeUXQ#Q{5J{bD^n`v;nqtSZ&7RK&11!^2NU_p0K{yTAOr15M=T z%+PlfboKBMl^(Tskp(R-Q*k7ktERbryv(uAbOvv|w`5?w{7t~N`JYB?4o*AAZjiOu z+zP%#-h(h_1!_00*!+j7?sW653FADlA7&P@P>Q+Ad;PHt6j_%0g7?RB#P2yB`?O%K z7bf+E8EeV^egzk5WwvXY1IEcbW*T17a_{O7x)iOJQH%0-t%@qv+Ek0*ae%U4bTzJN zhD5_scdyr$Pn}0%QnJ{h9A5&*=1}x`KB@F4dJJa9dul~Z`08c)^4+b7M?d~st!K`$ z)xJo!5DH;3#XbqAGd89iO5%s0nHibm8EtKk3Oc>0F2lG;avZOTt0(BxP3yEw>W-L} zTu-@G)({>=^PR~|j@*OPm}6g=fzo3;f_|nqYk0#*UfUc7%2(KFwRVD@Kl*&}Cxk)d zZXRAv1Bac%te%g=hrCEGy9_lGarru-D3SVdtm)Ee+#(@e1Q4rPc^b77%H~6Vetlz7 z83)i^Gh;xO$O0`J{IJO#y&rjB_Sc*jp%6bwwEla#abem>JZSky)8AL(e4F)KhBdi*DSgzr_`hV6f^a9x zXvS!>_zWloMd8R!M&t8P9(E7I>ty_}*H}n8lc88UEY3uz2^fwMU4)UkJ|BzlbfrdL z!P)yEtV3R#R}|HfTTe6!yS^R49ISUod73_7);5gVyHYm+f@nKr3f|&dx9V~cb&Vkg9UdHCQN?=y zR_7iqu{d`S1WI@9OC|0y7UIuZ)LYt2ButxY4zFmBAg_|=g0Se7_?z`V0PQ`5iKi(C znyyL8^HeVRM7FF;OD4K4mXdyi*q@w_G+svNLCMOV_HiC^eACL^#8@lGXbCgv4CAs}hpGWw~&5zyX5(P~l(a_lGH-6}03h-ZO^~RrG*2M}} znC^lvO2CVht`3=YJGJ2TUEpJ)r*HU~?`~?uXLDMGg#7H^3#{0@w1n{g)?WT0GTOXg zZZbAA=bZ(@{fDJC^x)*Vf=`Kd8#{#u6&K~a5F?q{LX6KDhTCm&Q1q8H#&b!JK*iu)%osWXl z)Jg;FbZ>P0aWK>C7s_gG%_?-(EoF^yP~zRAm3RwkAE^$R0h-rzOENj&WU4FA-l2lb z9Wv+*Q?<&Hqm&HAz=oBQ|Lh<|Q55x$f=*yw3)N$Q0EIhS&m$&Gz-jTM6AOYp|J0`i zU%fIEPB_f;hUTmhQQ|mntRh`!)rB5A_6mL}=;kx-`0_))^0NnKI&jN1lsvATA}M6_ zXZa2$i3ox%PjZ%dPImLzXmRM#6hy%ZLI)4qXJ_Tomhm@fFKOq9QHW%xVYlsSAf+S< zqAMMu2BU8s#Y_|VxSos2kGcTNP2?dHMH?UOqUEschThin zGncWYI_ihWag?;Vv(y`Mw9WrC zcl98QKx)k?*YR}y@_Yi?OBJ=5_pnes%24K;Rhv@MmqV9=I4duP{V=HZ**#`_ajzO? zzZw69K|9(HgFfo}tnt(R2QaEi#(H6#upY>m!`X0p0KNc+Q@FBn$6@QC8s=v)?x(S7 zq9v7{9-ES*!iC7lA!-qa=PO>k8b0XZR@#+tsUJ1s@*!Uti$9?fd3b-=d*`x)l zvs0pmi|l6#E;XB4`VCyFQu%sB{Zo~~DeI~3{qR3m8;`Av42;~GHE=FKLU;++QB>pD z2(*TS8+ArtByIpPjLd|(YzX(C8SU~pY9<6x5k$r z?e>4YkOc$zwHrqSetP#u>P}U?+zF!2>z`h%U%qUaJybS3CYSe%nx&u8SgfW2DuBIi zZv4ZEr#!Wa@jv68xJLL|6yPYU9(de8?%a;Q0=9mg?2Y4KkivZgC(Um*fK|Rm3~?eR zC+2AJyFirv39;jYTz+MB)|c}2oBUPvBbOp?q!brtsYW1pdZQ$s!Xvf{F$YraW_voM z=bzyQ`Vm+pZtKG4-3d72*aAdC(SuJPatBTE?Un+#(S*Q1;p2 zDo{1Dnn$sk-Jzb9+n`T10NGLm%1_9E2bp#D+HUFO%@zLV;C?%dwDnmColW_^LTfB` z=Ys>-x5h%{^6GM9n_203R5izg)-FO|BB>d4@zqqg8on>58^W=eFYhGjrFEM_Z(_x|;QLC{cUNT*6#r zL!l$e4=f`n+WySvkJIp{2#m*BX=N+ii~7uOLJa`0`%&edUU6Bg}$Jf8~@NIu=Uc^6*9I>_( z%Ny^1!cQD*ZsjoaAbo*p0Wf?Lq8cxy9_5SF59G(*oqGPN?3Za6LgZ$F&0D2f8H)=a zYHfU0avRMV4DvLa!YKK7pYY8cmNq8_(#`HX9OA2KKDK-$Srf!r90=$HWw5Cb-18Qx zQw+u5PfK0>TI0-m6JkgJVU9l|kj?7Cr&*i87mYqO(=X@ch>y`kPU}dUw81+=v&yY$ zN@=wQ%Vq3Kd4)s1Z^S`k?^(*{*IMlK)~4Chbim*CE>IB1EQ|KI<+dw7ct*+TU<~G< zT>uu`xEX5;NQ~R<6uiskPqd)X7Bp4NsEIdObvq!HeOKU1t_4(ko~rH8e${}1^8n=J zWI!%6zO#v_RRHL6txa4Y9car0E!Q8OQNOtHKyI{9j0A{IjKGiGzWhpuJcC<-?Rg(+ z#}6}(Fl@c&DaQkr;q$5}`Szy+!5){D!uMB)Ez3p-(>w3q>HYX&-*c-MvlPH@J8N^! zu5YukkXxgj_ z-KUbT9gi3wnuqODNA?}cxv?6z93}&*K&KXcU$#KBjf)ITi(>M3{xTj->`Ys+oV9m_ zjrfb^mo$UTiPB4m-Cq_ew~=X!eov9(wAGto7f|ltT$-INx;h^DRkg3H>}#@h!JcZ) zlv2{IH#BH2INI|9r)k;EbaG)KX<}}2qB6LCxs8q_(`bi`H0_M{1?O}JiKy2&FxG^% z&{Z(QogzQd7Yh*+pjE%t3R}A3a6R8^Pf>jV;X|-O?XMgLf_^92S>VK|HxX6(ohs(!bmfCQz*Nqk*6N4En_+5*>F>PRwu zIu+OD8Goh^-c#PoJt`fs+O@9F%fB6GvE5rMp|Tmy)nyDdaiN9$;9Fw1k}*SpPBWMF z*;9-;ZffhlH&4o^TZP~14o`n~ttZ`WMO;UwE&G)rpXpU$s_|=wyGSRH`BHr1`>}uG z$>56R-qj|@p;xlrm#f>rIy0)@v2n7i7~8#k8q@xq!86%G+T&^QZNwg?EL4KHa?65X^e#4Up$j#SdKnD^V-W(d zRQvg`U|BKymoOp^ZrPXE>(yf~s2$iyYZWN@K|--X`EWFp80@vWLDTN;y>-n+4qzs6 z0AWCfS2dHPxdOOc5eQ!36OjKFf4DX0B!)P!`+2`%vl!{M=kzbGx>a?^M31#C=OB*h zg^Cgvz&&$jq4F}h-hO8^AwIMb8Z8{`5i<;qoVd3^ZoL_!+r+#U>q`M*HL}kY*OM#A zT}fk!V)O26^gBVin|&s>Kbb}`g0{eP>xzc@&dGKZ+b7Tk491r6T&uY_F)z0T7OAaU z06O!mb*UvQB~1^6)tYN;My;GDXH#MKn5QE0rS0I09^uRgJ7XbkSTTQ7+|c4)^Pp9it8@48mNXblPoNXhUWl+w2)?O5Q@wFb^WUJYfAclF+QI+~8X2wea68KAFMsd9TM98&)KkRfzxZw{pEI1Q&1Qt;mYlx5VvK_!#=_M=qe*C^ zW|H3Uhir63Imn+wV7HUzbgF~E^G&$_#BW}RhbEU%?!H}Z45S;k#mpQ|-!m52k6=gh z<;6R5O+6(WQp@UOzbh#&Qr}xB-dHxQoeYkXaD2OIbb}S&hyD-+CAd0x?0=@WYNdT|u`|rk_Ys@tee}1fup}u{CXcGNJe@ zpLlhD%za}2F=s~r3KXe4T>ckxR#ZiD}0LZNdI4?ZeD~>|mwT zTZgjXf6$`TV%7^C1^EylYZNGY0Dif>?O%Zj96}~@2IV0topTYqJO?(LNG||GzdYHq z+_|!jbP;NZe?Z-_*XB|}mEfv5l2%&LaXiC4$~o;kpk+j*uf|U7Z^ExN?5*%+>Q);Y zt&t={?<*@zz&c|Qg$&VV#S-<9hU~dgQdU-Vw7>m>9H--I3@)Ed=;kv0wRG9zxY8Ov zwR@?bXKpEO<-_9JfQep?kkU?@J2Ns6ZBiAbgG!Uz%nCfmwwh-V9T*z0I>1`7AOGAX zQ!o&AIWz_@bRxoZfL`#K=~hG@Ac-MSKfmG`@-t2zPYumJtksx)XzhBd)bs7xF}o`! zP73ZDuba=oeH(s;3RK&ew zEM+Ke15tYCA@;oaDqHuvKs3NS977h!AV0%iN&6d%MQEIH^KG_3-Y_@Hd$dhju1mU} zK$&$o^lsmXj$a5b_i|!=Ta_LdU(Mhf=da+nv&?aB2du#@{yzYsXNQ^#I>Pvh6I!ZH zdR6}(2#7UfxS-9&b;pFuW3=5nBdk0Ip2;vC0oN`Oq|&B>S3;zuku`fS#+#4VmCxi_ zybCE1qKb#|#V>nl8H;(=1_lrt`hEX;VdbVcV#fS6Hh{$ID(Ir1u~PxQ#f4MBvn=W6 zGao=!W`m% zxd7790l^}_V??uSCJ(Q?MpyUzw>_Q^zh8cvoX?FhukMaNcv{NLM}3!qklT0e$RFCS z-@MCZqgHGL&!|^8>ckzRi+d|IuwKA(6~Oj2Q&q)Q`?KSM@_7Qq?=z)xY0 z@a*CrluQt?|4S`<_sew2lxA@7Nb`hL<&>D?H3GPDaqSEK;;JmQzTV-V)Vak}`5iXJme;98u#?)l`0v=URhWL7y$~eYQzW8<=&GQ zI1?RkPU^R+ZFyz`CUV?98cJG3Q8j86#oT*@0t=yYf40z&XyAAo@#A1(r_M3_jK)Eh zMvP5)E8}S#2BBIXHFr3?bvU%V*W)3!do_``+pTTziQ*^llUCGo?GbbHd8smw2YoN} zMo_7*kX}D?SnlBsA6l$P37yw66eB|c+j7bHKFc9cunp9Avm*-HM;nbIf+Tk-`A4=_ zl{SVtisM5!4y8W%u&RB&-T`B1PlmWaC1(&GpXkLKDBC>oJVy657OqX~z4=v)yu2*E zhSXyBFyB*^LGgh|)fJtyfr}xG5|mmE8x+n3n#NT69CrjtrL>@wVE6G^di~>zAYa`3 z6*5;^bLRF#>^?^IW%>P-fyp_Pl0T|6xBqLDTtg`1pL#HCuR}>>EY>uB%wFrBpFid; z5A6;(v6CYoS3V-qL)8X7Px$HgQTJKL^%ff)=K*PRO~9=d1_9)T{K1WN}Xdj5UPZVFxgRje;d%*0ycN935j5*2N-|q zmKp<}(~SgHE7cFGj4=g7K){n=Krhx8X#FjA*zzxzjNpgp@rDYKv@K_x@3&CYnyY%etGnhY^R$i05Pwccb# zigpMwjex2lO&dq_J&WDyAnSGUR1N8xX6J$*iZhc+1vAMPg|#&O@wiAp_-KFE6wn1C zf9Y!vtUz73d3t|L$-?+Yb85P*Cpi(c_sazq6JiaBE2*)U{Cbd3Z(%!m@29c=7=Jw~ z<3}eEzOxuVBswyv55kw(oI_}-9BXesKx?J_~7n+ zNM-bS^JNexZJKa(CfyU((qPtMuSVTZ){nT?&7OwUH)^v!c#+!y?C5t#>p+6Km@us3 zo!S2Of(|g>#>>ryES*t}IFeyYRb9BeY-#M0F<5;2hOf9svqpx-naXCrgb)#*sdPpL z=xCsmpw^Bg0KhLq>1qK5)I_da1;YM( z(f19RH4`XaD(LnReK!8D`!XSr&i>~$|GqMZS9|dF3kMxE(j@@mL9$ik9yh!Fy)QY^ z3pmon83i;Oqj+Ybc(uMJjaPYE)P*~z^OrDdZ+}eQw_G9?JRYyA^kyXTdOzvBW|w$L z^5hNSh&t{r?)+`z!+&~zrMQ+igwdEGMb>zu2RXzfOizWV1BldK6o;d7t!LF)nqi zE1y^gkJh^lP%`6WSN4AwH}u^P5YSemy|RK7I9}#pO6y69hDXJ|3qbpQ(m*_E17lO? z7xL%F#QvJ-0E$ticy*Nk%<8bKtv_XZn-W9HNxlBj0*8S2Qhb3HvKSB^~>>}BdC8n-7n+@^Vbq`aG_EPK`XoeR5BzgfY6UOlX- zk$SrUcdb0d)|lOO`};Ass(RRaomm-t`{`B|b4s-6Pxnp)iD_3EBJ$e&luxSVWU)N{ zFKjry%jOgjz_KS!yVvA4cZXT(kraXKA}^*V!*sz!;(LJ&yV#Q%n`(u?{>kUb<&BKV zayQ8I)P_EPkhAsK`JY^uk&lN$M*cv_h1uM~or{(~_yueajxEtf7y!v9MT;2au>E>6 zhLgw1OL`-taKzDrY)twolph=NCTi^R@YLx0E9d#agIkAewmia_>ipEu7=jbJqd0~$ zu2eaY&@Ut7RG{Z%RX;2}VNh11GLce61&m&)SiZ9UV%(Y; z;RvgMpre{8eR|UI{e2`w4|_;~ z&RG&SdDZOT^Q`F$;{h)oG_&?_j>bV7a!cZ$I&?=@9@$w9$-FWw`-PvJivtHCfLMEN zDg(s94Tx_jeoJmF#_k%r{Od7uqxu=I@z+1rQvuD%EA8@-;3FyET`&3j;s1^~*)bdC z@JUE2Cxa+n)vPy;bzt~46bmecWxA>!eh-9zsE=$RBV6tc#yKvw!aV|wXUG>}gM;s% zViPv}!h8+_1cvQS>dbKGSDn@qLLW+$gy1tey{e^Z9xwi`DhNE@1q^{jC&9Zt-fe`)WdWPz#_Ag9VV8 zu?rv+Am-%%R=yN|_mZNgvLajZtfEvMGJPuM?%R(w=TFV1G{sWdOs{_NFt2P6XxMPU zc{t*XBKDdmo{fugc7fR?3jDtP_#uLEy4j!qbZNzJGy4vc+ z{nXv}bL+WB%f$qOQ0%0a2FafloQKW8`{!kopZ|;XVE5X8`Bc4W+#l7xXQ5a07s)hE zTj$nD=<_zdp-r$;fk1$u21T<%#V@i;v>ZAyd8SkKx5t8Mr`#`{r5x)iB&gxT-2?1v6N80Wp0{E+gTWnHf+a zlai7`_e;U7BOcbm19*F1Jmp1pC%E0d1L1BWz4{Sf))Z|lgr9;@ECBai$<}B1I&JQ~ zkCgIm%(?fPP(wB}plYg2PgCmff{cy;x%@ecx46f}JrhY?Wec2olXH&^_kAW1MA8ap z)24Ylhd6hD83`Os=%zJB9fbk2q=|~SUkI>*p8eeylQjl^Xt`%=+k~b5D*MvbKA6N_ zp76GmSi_$!3}g2r7c?*ihB>5Q!$7c)+5x_4%f*6X!n2X5ADE6SyUQ@NlT156REfC= zTIy@GDypgj>w){Hpji#MP76897Aj|~8^T7aGszemzzGq;N9y8;p=9k_M z2|H-r-wwk!FMK_h67L)yt^#sJJmmoqZ}0GY&+Z`=|1-iRo#sV_&R!lNK%P&=Djy&(TaqaCTrnnrFp z@Cpei^S85Ci?RLadT#QIjo`?xMFN8d$2uL*6JD9SU$X|dV;=zpQZy>U2^rO578+_X zifT$OvLkKO8);2_6!)%-PF|&Nz^+eq;O&-*}x{T?1hAHUk}p??`@d0e^5P zR3cl5QC;*nU~Y-eCf1+Y6#}E+=q-tjxlMVV-tz*Re1HBg&a^#%00|i; zjb|L~gj$FfsGNH&o5_3O$2^x7~>c4|Av2P1c`JHqex1Lqz zxw1N;*Y4pZ?3id`^WWNT{R9r#pN$Sy#2~%?B(v`QqC^+ZX_b7c=7k(3}B2y^?9;7yG!tOn4@NcmoKoYJ-USEPAK!4p(Je za+CS0Aom7dP|2qNCEBmY5fBHqB%BSQH!5ql~k!MXa91iarnj-*Yz)9naefji8ER>kQ0u0$- zHIKrw_h!)@qKhman}Jy!)qWTmQuNS3n8A4ajUPgT&E(agSOo+m*}~x=9T(S$$atFM zzVtv)F}KNy<(Tk4ijM*!d<-S~b;}+i7JG+}<{?`M|9ZJo4t#G`c@m*(8*m zpv{*mU?|2PZ&-)!DKn?ZHcXMBbgtDC5cYO~xQ@i4TOX!M76j@B(DGBRHOokIZcxcG zAwG@U=bs*$*UX1HiX9?9;OD!pod@3t;3RW#b1y_xC$u^Y4Glfp>phn493Ey^G@)=g zTGTy_+oFH%6a52PN^hbnWKRE`slI2qx9Z{R96Hr#c$+s}k6PDAyZD)24z7Ut1AVdM zvG*^6Sh}4^jm1c{K<-W~U!PAphwDh-;gLuy=-&@e?hAg@{q-7lh2@t#8MWK^TV5)j zJ+prjDS!6NsPB}%L`4EAIu!1f?Q-z8gFy9f;)D3A{i>IKBGIO@hity`V>GGSG` zdPfl^dZsMcd`suTLm?|jH&v;TAV0+7Ho zIp)t_CmFPK9Qtt;3t=mD6Q4MpDu*63@!ow5dzb>Y_B300H*rJCh;N9;#jOWd5SMR7 zoU2uQTzEd|a5iqwM{whQeL&e{oCSG}erY<1ARSNTs)1KE`d5hA#k!yVkVC1a-yT}>4N zfco1dJ9b=elAx3t*eVptuaVQMN)LYcNsLjO@~Ab-Ad6=q%?Tqw7&!^q&fAgrOUx&F z*^yev?G75q$ia<-4Oqo?q=q#7QL_wLG*~4L?LiY4tXc!kZ6&^@1LEX*$7Fw_bp-3t z`ihf{pUVWz#YRLNhJN#-iiHrd$+LdCR6Xg*MdqL$}a?m4%E~8kR@|g0am%e+uYW%E=($_Vn*MFT# zOz&AQSuyC%9i#4UZ}=g?KUs>=U+{{&uN-k1kP>H-z6LW$^hb>y+-&sc%=X?+iX1=q z1?0=eK5lHSe?&{Kq=#tjlu7^Um5Pgaxww`~+Z%TgA=l=^xSd;?4i4ldkUt~V6JW;% zYQ5p7Ng)g0dfg_G>G;j*Ic^C?qCT=D^Xul-WVE>hhdMm2n--LHA01Bk_h+1zeI-cfm2@N6fG&M@!pTMNH-?~5+#y9tMQkR^9!edg(Oaj|6U9R5{OKRtbIeh8hkp5n z^2w5UR3Y|~jDs7^7)*@{BF9jkda0}Iq527ZkE4e47}=xkk~~s&5`Nkg;pfMy8t2$! zC{+#Jpa-tHDRIt_7%~Q)r)2X3J7;u{kN%e7Vm5Gm9E4%xlZjNT67K8qIerY0t?L9Z zAL?BdCdgp&calXujo?m0pFn){#B&V>425#69fc=$d4b4P3#aZQm7k$ZJZB*AV```I z;IuU>3W*RYenViJ_e0m_t-xyo08F!#x%KQJfgP4`^5Ei7L>Ar*6*jp1jCCvX?h zN+|7Q)dNXN;)rEI-cP+8m(-qgUFlVPXJ?QU3Zzb{PCFCDh%E}B0u}0)v5_Qp)~&Z$ zce;zK$3IKa4uipa;`BL;Y)bXlnOvcS&!IN3zN9uL#rYE^spZ2c+Lj=X6cs!d?i z1-15G9Ta(L^X=9Ju(b0mFAd7at)$4HulktRRdkm$GS}(XCbk_;q!v?Mo;+!^YMMK# zox2^U&CE~Qx}`%$X+C+F)69x`$27>p?)s>!?tPIIM;*v6N#RW)!1Ixck1u!oS2o&h zSD8k7i{ZjRO8LqwhkuzxCTahLY|j3l$mSROVwig*FxiK+5&DP zzqf9F55QDuc&qo_a_ygcms-cu6wDtc+DAw%3v@8(*_^ei91 zK)X?FOb}&-Dz+5kkBfVOF?Y7aFG4E-LiyCPiyfRBSIcWI|EK}nyzaWA_0PyX)O28q zZrnt*Ryrf>RoRT2aofIVK)z`5Q9#RXtaB!=t!Gw*|Fc*Aa; zjoB)nUXKeTueCH!3nXt>`qe3n+7B4V*JiX8ATG#coE9JR+lU*6|F00{-^cX6Mja?hqUFi@ zm8I=87vJH6(56f&=-=YK7oO!R2W*h0{`9~3 zm)v-CIQ0f{V=r$z{%#qag%l-UmY`p3n+}pUiwog!RPLPqX|6a$tMNkkYVe0pY^4## z_@7T|`AKa^XFRXnJ`FT>CBvSYVhOk2qycpWG$(ijKoUR!-%f}IB{sAiBIGxUxv9^> zqZ%g%iakaD0+59Jg$02u}k_~2;g=5}h^N(0O#_4`{8LR(RoI!>C-&@C6X!lL< zmv@04FGW|EsILh=FCX^g%clN6$ZwA^a2KxcOWPzdnzvy(W_z%78)pKqjoMWIVa`7b zE-%n=hN3^|0c@f;Reivs`~sPA)km5M*upxh@Yq}Ra!1X?WKFewj*zpYZ)(7;YBFD1 zRsNDD`dS6fW+?~+ty=5599lo##vX@8ZSk4p$Oj$Ua@mQtqC-n^V`U$(?W1(dewFIl zB>6pXr?=Z^_4?1{GGe66X1&1O1?VkNE;V2s{n4snC>{h9?R*a$B7!W!^>c*oS*&<@ zE*y>m3k_UOpW8Te0jD?Ao;p5zKRR(dxusGY5C=(q5C-U|}KYN^eH4!9vksYk8Q&f-b zpdC8wM`rdq#wqh};ddXbu<#gMtfkRl3X2|<1{&QSC@Ik*T-~~n!j%?|W;zD^pHl6F z=A^Ak?~j3WMGq4_Z=?1&82~UP27ox@s%x^b4fwmd15iCOGf`pSkjy=jsyZc00IXE<;OVy z6j+jb9q_SKR8;g#DInlk|I3Fg2lhR*#9eajfhuU{nogT)B4bZS(tLAr8nDw&Drdjezc1=f*xmM$@SAxTrT}`1jMX2MxHiW3715~2cgX3M()z?dBCo1l-)u( zEqfiq8Vvsjooo^P4{OY)jWgQJ*44~!oZ;e`9!gRYQi*^2@~`#3IQ2TgQx2Agp`tH> zl5!b~&;(v{LMBDS8kUP3ty&CZ@-w&CP)fiC_T^Y?11l{ciDlZ#=r3rM@FcG4F#uX| z89Y&xG#VNpfs<+{tT)a+yH-=e>baS^F|c6hYx>Plh|yO&7?CE``>gQ)0Pma+9Lhb}?KTP| zI|631Yhx^wZ>v?$4!PW@;CuB>7I=T_s$D8C{KJk;ytnT+XZm$CQ}9xGOzw>e1yVHl zT+fph2%VnCuqI?T_vZYaL4qKwulUiW(2c3)YcH_hdewv1Lf(59{C&ysUsRi(o$X<3 z-6q2TTSmIqZ{F;UHd3>QTlLjTW_#M)xNdHP27BR0LX5T4lOBMJ)Xqs_OR;b|e?Xoa zG+zV{_+EDmDWz0R%^zwbrC8#*{Z!d1ohubt4cLD_e5POZiVLa9>7Q`KnZnWDa!Awe;v&R!9ARFwT%;CCeAeuDp590efBi{u!2C)Lohf)c0n!deFb36JHA7EyRqLi z!+3L3Zrwj(5=;fMNc)7-BYdTvg2|s3O0L0k)#ne;C9xqVV>|FZnY9Fbe3&#VONxo$ z(TxIQNqa86Uv8{+xm}F*;*>)qNiibKnM6j?sH`|D{~^GLS~!*=oiEUieWoDnybwrN z>Gm&*BF&jD3mlf+1j|w&%duU6-oPKexM14r#%yyCDkit2Y;a?KyFCn~j`e~?PRHjXn8C%h^sc1=o6SciUcTpS&yO((d(oT6G` zEkl2*>e)&s12K0+w}H}s=O*PRT2G8p#qw=g+inA44>k%ykVC?$erNQ?z%Bx^epaf-#N!La>KZF6V~f0Y&P zt__>dEcjM;*1Rw&+QW00!8yLnrH=7Q?t1Del9+GTfN34l?i~Hvp^+` z5)blcH|CJ{;V%gEhgdPkbZCjCxl45|nXsjpOmq8rWw@6=P`4HV5=2$?h;-YFFjq5r zZ%Q>AalmI)Lbs8T9gwuyh45&|{y%)Z1yqz>)CH^vItbFzH3$Mq2+}ECN=iydgNR6X z2t!DhNRPCFfW)A*(j6iLf^-ZpA`Ch7e^KA}d%u5u|Ie(Y=yEN2?sM+Fd+)Q)Ib}Mu zeYWwcuT%c`*}|-&+IR!!7uch ztj)fLwYt+0%#Wk^6*0aL>n17x{5dl-u=U=jX~h^AzHS5~as!&BKl{%MJ2+1BajPll zs6q)_jUkzB@N^#`?Ab`}Kd{-9WNWd0rJ7r*gs&KUvitdv46VX9uB*qrU)IsGApKkI z3ZwE`kqU@@rjbi}Rl@5N@wMQI(AyV+JOeg~q;^{HerC>uCGvq3pjabM3jx#RD=pwgSBi=@wgqTvXB05P!)6LM)Yet<6ov9S ztdZAmle0&Lx$Xr%H!y*JxlzX3Wc4M-+zOm9oiY`*=pTh~<;o9a@S zJTVSTx!3T?51PzF?9u2MWD|;knS+Rewy#*tY8(*R_>K2Z6yJX9(Ry>W-8hXE_l5>8v+_*oz z0Q}5Z!}0FJgQ(r$ z+&f-S&y+x^&%*a-o&H*4Y=D+7woL_0P!F_QY<+c!fD8*k0lWrpnHwC&m<+^-Gm&J z!Zhx;VhfU6XC@Bmy*IimpLzupqkTxmtC7l_;VZdi=rFgMC@j@g1$^)|*+$j4s(3nL zP<>N6k*PcGWXqDt*@zYNOA*o0Okq2pFfA8@Bh#$>t~hclpV{X9ZEzhpJ}NGjgDU|5jg!x zJ(iB`j)LN(XtC~tQQT;p7fPwo$V*>dkcf9nyEZ-LZSy-po1vx~eQiz4cL$m3rzaO@ zJ|9d7S;V|HP_v!kgAdZgb;>;)u7MWN!xHMsz&P9l{s%F{7ddg47k&GDHOO1SusI0Y zfk#~W5d6G`H_tK}=gZ@y2VKEXCCz${>9dKN0<@T79_fH+G~a#oHUD;&Q78<`!g-oO zg&BT?Yf_M#~Ac3@esL+$r&2%W87#<6dOJP0_tHuup)?Y2deY zY1$jbFzvr@(j@TpK07%iw$PPgfksLCU~coEq>8>^cVKgnPG5rOZiwrPS-gv)O=UexH54XhSLqTdXvGlia_Qo-lB*RYxwb{jYYrJ*w{BMw?nU9P$Io-ucr54Dz1KMJ z6-S0^82GL3_u!zX)PFBhfS(sk$ue5j;blwitIze<2SQqP#<(FBNyppE=u_fTinw{? zm&HCb;<%gGZZfvp%WZjgn)2-Cz*r4wbI81Gzzk?TZjXSfJ|)-gfnMW5-f|hx;!Y8G z(CeZ*>`s|?#PTDnDmp50FTaH9&bI@aCkzaO8eh?S;Y@iiqWR=L@}uad_un~at48L& zDZZ6nxEh6o)5i@z!!#m&yqMOrJ2hmrWdD4%q&!biUaU$yZ?B@<2sT-@qd08N7Zq-T z9KShcBo15hG z&iQV4^^e6Li1_nTlSMmAVvQ%W=HbF+HWj&5jKKvJVci^)AH>aS>{h$0m%T>US*82O zehq@BzF{)IKh$&s7PS78x$7w%8li3(!+@f9YCOFjDPdb-oP%hYNP@>UfEh6JG;P%VQWg3W8>a^q8X{_}xzw%QL9aM|i3|10E*C(5~?x7l&Oe_T!TwI9@LXU4g1lG zd7ZHzO_V0xDGb#|za@KrDK6XmGUCBdg`q}C^y;=-8M_FWW!hVsVQs&N3QOE>uT#|3 zz1Ci_P}qHlfSpc%GT;h}c^!qVAKvGILZNdMO?Fp%?N3K4la7@GSfxE?;`~1wvS}Kc^p;IEz~X-^CZ~s&VTir6aqVU`Ah4KiDI8< zIKE8IwI#bYJ7d$AXOCu%ON5&y{J_IUeaNOo5Ri(PQJ9QgJSpPut!Ta4_?@3h3p-~G0|-Px4c5#sSyBGQLaH)fwf z=Jv0KgOLkd(kB=2?|0}_>%sa+Gz~W5gS450Y^G&5H5Qo=+`1@H?AD_TTvDe}wT_sJ zkZfoBh|^?i89N7A8%-J0^s||>u`^vP9OzEdU1#s@o5-?ZyKiGSv^VY|b>fhDS~a0q zdJ;6IZKkA-N{BLw?Yj!aLxcx0iLBZRqYT4DaB1#P1p1hzeMcKGO*KMk~uaC{Rnpg$^6e8pG~=Z0>hD zU3S{SeC0PAoxQZKa#06%@AeD#7fAexvON0n^^=@%%5C$Y(x=f|h;4Y+d|4 zmH8Z3W2w}ne7z#7V%v*byp=Xz6s{YT-O>YLIn39)M1~_FB9V*c%FNeYr<*ZSOR)ccE(+K7PMn&o|kk>v#D>gk_3Xfd3N8z-9|4_N~uIaHOE$3-Df#v>J>#2Bj^ z-^V?{HTn+o)C&^(?xD#T1~_6((_>yp88?XfTmVDDk>vDsNw(g2pOS=$?gVu|oX^9$ zHRWL;EZPOd>U~BSR zagtOr*EO~0rlqkbF`^pV2(xVjx4?r|Fo8Wx{ozrp7jL?H zQMF^eqvwzjaR3-~!$k>ZWNsIkS{kQ(qPDi=){e-5?0n)f)Vp5Qov*P`>A^whkAB=S zH;ggGEMQUFq6?T*0M2$Q3hkc{n7sQg_v5iQ+1dS^6@U}xHa9o>@O_WgKeiriGzY#r z%j{OKO!~GVq5ZCft(`&l|weGqTIO(p_%w`21w+6mK5 z+`QihT*LMpE}@%@PIwDn;*QCui(oL3C>%PdQ$C5 ziIUKUNclcjPDndPYt6;CD!J%lI~9qv-u7*0);JnE5#}NkRYl!YqUJNS*JS@j6KAqD zO>R%)sZNUZ+u}8CAlYPxSFw<9Nf196G44_P1MsD#J+9lnlxLEZu=%jP402*;v@TWbUWRQh`mdYvCa^F(o{nzwRT#CD- zN>aG#h31_45ZvCS;&RLa*Ft5RxW<$KF7d>U#fTKf(jU4Zsk%R}e!r9m%3J_;d2w;B zJ*_OH6;tC#DoeOw$*NuLObSBIjz8^jspS4{NRgG7Vf6g7>46tq;a`_oweRpJDEjN2S-b*D&1d zy$9-6*2Q`G(|^dmyEj(Dkv4~G$88S=c5HgNl;YR4Uscf@;zFxoY^(6A9+A7`*{!A2 zJrl+bGiB}iB`v|D0>yOE@Bc(y5{SBH5OtcW7#-JldJ>9E*Z38v2r=iNy%tYXrSIpk zPI6*dAMoJ10?XqF0V7^T#yC$C;RqQmYM@Mspu%>)dmrBoWwGoVQeA&PR&xK@?~T|! zp!@T4zu{jRh2FOu+q@EpRXUOkf)xcfbPcJ#AmN~4^xY`6mPp&ldZH*Q19>{il7G(u zUppv1IVtf9@v?ZQbXKvu-ji=h+Eq2(;Dnh0Ck%xG;E>>#5rIh$)H@5Ry6kql)ZM-H z7fs5(3D!RXH{jjSMA37eU3M}342^&Kq&Zny#sJmo@{JP4MN7b*a zX$C~AkyKlQ|5Y>&{_~pD&$&g*D06||t$O72QGSo)jZd>Q)-i^|Pi31?6oL{=^WAqS+f}#e*fBxEe&+34psLw1I%8EZ7%Z!$O#UV-UAJOoMW9f& zep^<{uIAQAb0?ZQPU*eb%s9XB+^QU12tQ4Y1D~qI-ZTY`BkHZ5pf35HtGJBj{6@sM zSHM8bTuiW5nP+6PgKU@XKk@d7Bo5)GZYh?_2dcyolH5vxS4721`k=}{B9KSn<9l=82W|# zot|sBB2p49VilO_JU+!7guMB%>g?22)R(z;XiC_?42z2@a^iv9EnC!zMt?-+d5_T*&f3m9(VT@~a zscm>Z>h=6NiADChp$BLt-7-8p9QrRm#Yo)nD8`3Ag~(Q*yS*(YS6#`o8InJU@Y+${ z7DMx;$L!;(Szb%h3Tsb7XFk*A`ft+7Z0G9mWZq-ll@>+ z+I0?poCoGIL8JaH38u(W_%A62S>|5;_Xw)3B+cab_z!nU=8tLFFzn#SJ3sl%$tx5S zNKVT3d@6dWJs3mtz5IY*+iUNG>5!m*@7D7UUp8jp6S-!+bcL~8gt^$L*UVU4DyITU z0;(KLEZ#0`@evkZvNhtjzVGKqpsTBu!e*F~MWa>iBp7MoyEAV7baHe0E^Q2>c$1N? zzr1=%g>f0jR_0oM81ZK-0l*8~NAB>bEk`Y-3GIajQi6kR#`p&pj*vEVTcXoQ93nR) z&D%CVsxi-=!vVNdul=TQ3k#OZ+oI)7yQ6pWoaRyWMtLh-ZF?&hX3mn%oRl*r3&#=0Je=ofR8uu4 zxn+XLmnGQ^Sy}8e-0mBPOmAJV^t-UZuze7Wv6G(?fIv0bgS(_KRa|naq7X5@bO<1; zRbnrdafD7O8}|(y!ij7vKD!&H$m!QdVO4%J8JeG*nJn^NVz$ zxm6xDc|p~T3KSzZSxo(RM>mI+mV36|io zCz?E~hRT|xS_i(%2Wn~dj%vhkW0_}1M zL1Yhj7@+OyiApJuqLE1}>Hc%R8{rsFlW-CXl76H@wtHLh-GXn5YiZh%h4!0G8_zsQ zrSX4@eW6}DA{)C=Tkw=DpoQKz0KGaT;v&rFhX|xA`q%B{wN|P{+|uFCC8?=!O7W1g z4&oDK)`t7y(>)+#G__&Cqkh<_WM)CfK8TumA2k1GY22Vp=1hxa7rEhtjb|_)uL!Pef2uL znhPaqbUQy@j?}JzVr#KBhYN66f}Y&R61OnZRmE$K^PO*jB}E?c0zm4=r3|^jK{2_b zP~5dTMtP3XUCjlK-pZI zOLJno`R=xXbw1uc$i#R_L`YBj z_Eb{A|CeZelN|imkq^U3-WEUk)bw{FnHN3Rp*)wU2Xez+{Nn{s+FCd~@nR%xXY%?6 zy-8UfE2~M!7v~;{#LG4K>5~NqTD&<4Y#i8Z4lAxfq41?!#bZygH_I(zO0>NlE5m1rxuSCXA_li1;kHOlCUz1iL&6=Vk zo`8BuH0?hznGqqYN}-o)u(Q?6yO0U)U~<`U68j4iNfdclscfg{x!KtZUKBE0TnCtA z6N;B_nB=lit&QEjaq+#xXVL&qk$U)6JLe8S^$8S`=Oz;fHbJcSC*4>$$CaYYhGeAfKt(>P*CwopbjS!S5@WZL-J zWYe^LlLwWp0;T_P$Oiw(*V}Tq%Gsz3A*tk(aex}^yNx%P@Jw9@?zI zQu77H#WLTnLT9sVwe+h^)Y6tdk=WH!<_YXA2E4XT2g(pf`^g~VtcF-nN4i8uYUBJP zhww0p8uXZUQQnJ^;#{uYm~Z?AKzY2T)xmedRrtEy9dM^>IbGCue+ro_@8+sJ_?wlB zWEjutg8c^VdxPL*a`g(qn4oPR9tSB+4Is>>hH37c9&PB12`XqAukA|w4~bIa zZKRmLc5$FwYwN2TZ>WaU!D3&=I8cpRlCZLnXH#|8iHL~@tIq)ztMuMr9O}AL^NB}9 z{d=@{$be{M?zoq7bmv@x2=4RrGlJ$#g1NXeY}|-@Ko2&??5Kc5wz;brKlsNg#(<6y z;q>~6-OR7a*a7@L#iPAbry(F*r6uicc$6GB?-K`@84EP|cRqlZn|wC37!IE~sZw)h zyK}aq#o9?6%ak3srL(wEsZ2qNUj6d&4JnS}7&Np^th4oQU9WD94Cl*4$-yfclim|a zE40uyQ;aZfR?2e zo?=jq9=A?__{gv-c2X$3APF8Vwm=kz%@1DCR%t+wR1_}oAw?-i$sUV1@zYj_sFY5y z|KVfvVVWjmAzdTx48Z}H-j<iRg=a&-@Ipcm^+X3=IVgxe7a;^#y zRJ+FrTzw~Kgg=2?$h?OImwq>5{2Wzg4~`MdRU1_Ij=Lvtw1_Ghru=9QWP;-Anvl!B zd6qtRy8Cvr2xRuCnLdk(XX-DC!u|HXYgReIv3&e1pfft%RJTQ^m;*P`2u8v&RgSPo zhh~10e=-S;;r3AXC6jh!I?v?b!n|B!60u1D+yH)-Ff_&-ivIO zI+YkSEY)ju)fy3Ky_}Hj|1goy-*e=X%sDNa^10H${^t@uzuV$Jgd1pZZch_u-M0`k zjGm7s4&uXkhZalLgS4fAfFt&OVjggK(!~8uW4p5;r|Wu)Z^QL!lki>5(TfZED_obH zw?1-Q;54A;PB3D5mGguD53qNi18}9|)x%<@Gi>Kz&#R)a=Hu6=^97wd=c14J?OT#@ z*vY^nC+U#`<@4-ci~3`I7Vgw(`->%gM>AVd| zppi~C`b6*s0Qy&cTs{SQ^78$WmAeOY*FXRICiZ8$9-%t7BRME8g8d_=BG_9=2*m|% zTjkrml~0ugqa57_7uY5IcL)}Ox?Q)lPRD&=`CY7e#yNd?p_Pu@$jkI6vbEdhjya9u z$7QY@oU6vnw+Zu9RP>UgZP}Kd%1ZIXx8%t)53*@Pk|9<`^CshBzZY4*r9VtNvbdNd z65u9ltvk2WhzfOja^G~hb}W#3r+9puJ)q5C@s?4{itww@W;GFqaBXNq#*j>i=h|JEjS7ryVHjkQ{ zebL5@QO8f^ajgM= zwz|FEHIu1IJ1);>OmFVWjUnyWR>V48Org~*y>}^E4E**>3(A1Q92Nwu-E+R&DM&*Tt3Mt155M$LbgaA4ifofHk;< zU3TJ1h~jtYL0Zh4kfdQBW)TvcKc1GxzvmTNwph!pF=80l<&1b_8Pe8$vAf^pDtnvc2G~@HCI^Mi7i7y3?{a$s!Fy z@AYk$>#CyTBujxGi}c*;oLjMm-v(^4Q~CgR%qYM6Jnz(~y*7}9g@fUX*tx68i+fR5 z#*1sU*9NT*v?0Yyk;85W(sSSbfhnNT}+-`t!Q9P%cQ3 zR@45P8>IdF#ARe!&rPjle$(Z_q8QZmicPooCh;h5c%`%A6pkgKy9x0-TRxwa%3~OB z?8rMI9xr2Cd&y+aCY*b_t8oSo)fAIot4@K0*cV%3(aiGHhQrGjN)|LUMHEBp9QE$EsKV_Rp0_ivgcp@PBEg}-u`a6_XzuazZ&(=-HWT{g+CS!f z?A5p-eDQg*!b$Bin*Z3*Y@%LOgOdOdyz~!9RzYV zWZh|d+IIspAigo%Drf2^V{*$KbZog2PEc6>EFggWN*2{?)sxz*X82Lt!T)i6wEi)M zr1Czh-mx-rZCDebroq8s``Fw3({HN$5-1K`0<7vsy=R<;^uh3}Wi-oaNGl#(Faypj zb$AN?TzQ-!1Xe;C+bUhRBYg@)2ut3Hs*{0@lh&-pijK0(O%7eLUVa!wbX4$HsuOQL zVwUKykQTi7h#6PIt>)!HlTe zgJTNEr#_Q0gXL0YuNP*j4<-cV6IO}^W6J2NzDGOxZ_}CUx3f5`D^4{6!bKAN-AZ;! zAi9?fC7Gx7f+Dfb(SDMWxYhPb6(?Zw-r1OWf-C;M2P%Lh(4V=9v1NV}H*&gh)Mm?MYZ`wB+bWsB` z2%XkFYeOQ2fn;rvVlXaphrTT?Zn`X+GVDI3IWsG9`mt%ZRFeV^c&$ZHACN>WI`6M* zjR{_OFf!ZNX;lB}m(x*D^HK8&(|q#@Z=hh?Lpn6>N1{StlDN3huuXK~_0yvw=(}c^YRL{y#akA!{`va4)Pe;Ewx5jWwu=Ktv+*O0%zr1wsd1qxtj$Bx8VS z^W2A5GC^t~{3Pq2e1Qj^cF%L8pN40{M#L5xKP5b-y{eHRZ$||BH}6r0W~S2CoK91> zK0%0$n7-G_Po{0lV#mDFMoo+u>F8dU-PzSbM%kSG7(6llz|I{oStF@qwKYBBKJ~m$ zG<^TjQ){;eSn)HoG+E$DMl(GSerdNV->h@hK9ad$c%QR3c);`bS=8LcPvjqJPeol| z*SNgbH+$)PHxiz0{5ZNI>@hu%Q66`CJaaDyv$*}|v;xg%xTOHxE+wtnX1mu2Sy+Wub}dY&X|d2o-S zN){3VVQtG3+C`hFTHtCNOZHaEJbW^lA~EPZa1F;7Vh;JTKTW)0DKK;xySPfL0M6z5 z6eDzwBG`l@8wg};Du7tW4^^)P5BoU(93ieiTg)8pdQWcxhqy-D$AH~(Tr{4EW%pJv zueE68y%gK`dbg{;a@A3mUK@GWanxkJb)QoVg`dN_;zM(Kn|F#4J226Sy$A^+i>GsD zJ9Roc3G`cF=Q}s6IHxG@EH!VAaFmijfQalFK=Cz{0)i`jiir~y5utAKHS^!q&7D2v zI$%1RtrzE|jOnxlqTt;ib4wXp+R~%>!Cd>)2R9$OOa8EQ>bDUv3Ez%&Hsm+s0$8#2 zmlS5QrrlRMx*1(3Bk!9+4a)_7wB&f~A!wNMCV3u|t@jNMszQHzK!I<#ILqYa{one! z<=NApR~z={x4-QjgqmSPFT_3JgA9A#+|G~bEb zp^6*DolH8}H)yfbB|sJG#Z?}Cb~>Km4JA2jZ`8x_t$e-__ft6Fgsz!FJx;Cr9=#L9 zoJ9Vxnjl6l7Xc#?!i_OmEIODtIXKJ;+|lruKUxOq_rn7HFdp3w>ip!^eY>AhG8W5~!nxg$J?FWp|K z@EM(A-WDI-QJXZu*u?J7+1VffA9IpvP0hUKLSv45z+fFGzW_9{w3G1WKlx#zpX#Ma ze?;KGfS-3yu|Sz{y|y+Mcrw=N!`J%>Of`*r965GNagXb@8W2I{wIDB|u+2yH?_#@0 z?v42Lv@kbzLb|px2MqOI<#7>~v?p3my{Vq}C`^k{6=SEiCbJdS(`_BL2qg*DR=YX! zT^%z>_j-phM?h?3F*L_+H_U|Xy423F9rAnDpT(KL1BRl;;|{Y~EY@p98)N{wx9JPM zF~2WYdVCf70r^aR>UP0O-LJH*7``6|J#;_LX0M2IQkE(ec68|#P$XeefjS^YGa|s9 zq!p{3Sc4WxRcE>$N|fCvv9@eT(LQAIl<9!4Qs3dkz$DN11;Ah+b%BmZz|lYWYiaVz zCe4e6k%X*}%idE}$wocY736}$oP0bPT&14dZbMb=Ai4J$D?-7J?Lp)gThxc~T zMT3CDi)5+MMIagU*mtO3kH72{w|aAm&CtFI~ilV93-s`NhZ?cX&%Pgl|s^> zZ$3;zFBXieoO*8~J_m(b7{a|98Ea1VzcH*1HcU^>&vYG3@DGr^H1$W9`0WfU-M^U> z!=w9PBp!93_~iNhlN0PhT-yDc!2M@YF$;QDK%m*8p!aZmyT$O)apT6%OoPQnrmy9e z`R}zOrH{5Z%(E={8MVgP`zh2}tjB;N3Q6{kC3sPTJ~Qo5c^PuI$&wtpm#K52h~04@|Dg5g8&(8h$t zS`LM;@lq1>RQ^!rj*=Zd+@QjcXA`+F#Dfl*)#}WCY9rN)MjzhO-Q;cj^0E2E5uky_ zrux*kY02ahb<3M}1K5HwP%X2U%EIdr3=HSFo--N9&sbR`BhCU1D!Mwb@ zyE^@pQSBeZ-yx<~JZetky%_-y_#7Fn>zJ0JX%$(=XGi*hrRW*m&Cg(cIzi`I?S*{^-lRtCZc_MsZ+fSu@zBFUa zr|tkP?qhe2M(N=2rgJ}j+rb3od1RfX!SQ^Yo_IEnoXm|vU>41oJfVSBr=s1wx zq2TM^4xke9(5MC5&Fv1)HH9*g=_;d9W$uI?&6KeF8ixMICsK)5KHb$;HW|{p?Uurq z5qt3SixNOUxt2z;39`R%&l;TD7pAXHl(qW2T?@iAn#i9CbN=?kEvat}rk7(}x`9-3 zK5HpTBLFs>2P!x!30hIaft$8{HW_2S8OIqSW|N=2S%5%wvcJ0J{ky(W@g6zctg@{78>-M+`<=@Tt3wE9*_62C|)%S zSH@+R9R^|AIyX0m;y-VF9lk#kX!iGl_hS@)e)k_}>2m^lTRjH5Eu$ZNBQmo0K#prM z&H6j@FJ(^5H1YbHC52Wr^H-y)-^pcQIiw|?J|Z~4*SIn*x=E|EY?mojS>m>)8;%&Kc|Q~30X5;M znUClM`R#+_iIe(U^EZ1j7{2X;xbSbaBNn8e%}&(<`HsIZoem>r=z$k#Zn>`P=pm0K zNIKWqhgl3>P~FX-kJ1g*PGmvj6&O&|J$uxrBD3N@->EzURMOG&bgkF34;z0odKHq= z*-8esq!Bq&&XYBZ-mwS|62D|UxkXLCAxhaHformnzgOe0_G3q{ryLw?V`w=UJLzd^ zB~Tlx{i4iKi@z0r$mlCeTK~@rYh0R#H4IF~8JAr4? zgFA(kp{3iWC*Pmeke*mY=d6q2ZZ40VO4c3Bb)Yorqy}Y`$z;Jag}Q1eZs6Y3hK?1D z?g(Lft{fNS!9Dz!=M^y!nK8rUM7o7Z_R~PDdo!OjrcT0v^*rrvjwZ1S5#>~2uzxXBOpu?H%(zH=W627~MPOM8X$#}7X@(U!{ z;;${w(Q<*Z4Cyk*JTBl~0pbzTmbYXqG}+yJxsD~4=Wu^4^hVGx`L+neX10G{PkUG8 z`fWkSfBP8yu<4{K7^)9(6yG9Vd0!b?OC=1oJ^Rk4u zXj)64alS{$^%zBqiA4cTcF5hoM-%emACH?zS&aNL9*PA` zxksUkKja>X>|+VqVbNYS&u1geG(ZU?;)UBFnxQdmQG1Ht{&V!WsFu@ILR9i2Xv2Xk|`(sXOBK zoMs;x6m0CoqxgI{h)kA62d+etLp5%7k4J|+vuIcGFY%x2e7hx-mZptD)3+viZdJpneU+SU=NP&9Fd! zm{+r-`BIbx!sxFvs>tDEptQk%m4`U(!SpbfQgVZAnyvS7x!izgh}D%XwLiKd;7A}# z(l8_5giNn-3_l>1HCEf%*yL^7tQ;x7;M9QW_|WP$?ESCB{zluVLvkDZx9*&6MhE6t z0s9HSBH$YdV$eD=nHI*fAqkkWJu&K~geqrxp$vo%vRh#~Y>mZ-GyPU39|s61otxoe z7COU~yaYNps#7?)jPM&C&4F49_bFa}j|6zfs}2PBX-xu36lo+2@i+OzK%&>gVIf&> z@>ZWp7T#BsOe-XuteqU1=r@fokHH^&|fU)X3qlL9~B6d%%zn1~3t$i?=z-@f@v<$j}wT)IC+S{}z<*%;o_ z_GS|4vu$Z6b?I+Pb4n3SzN#YvpnjCcUN&NGKh=fu;B3w8q{Qt7oaL`QjtC`q<%Zn7 zH;Z`-S-T`$F@pCMX(%- z;P^w$11kGOf^qx1E&O8Ku}J7c{4B1Tz_56W!Li}FxMRT zHIW{SWWnBdeybp9*}OyJ872n_;h-4loA)M70N~NQ@r}b_%5;^z3~!mhUvEqPT>0d`&cn`W#Mkq8J8{lkT>%4li%x=bjEfD4@NCTO7x!Ftptopq*yvd zneQ;Zdgv}^(`PBP_cD;OtQ7ry<~Sp8n}Ft^f9CkX?@DDA52-i?Xbrq2@jMCJar#|E zN~+ND5wL$6xQtX7a2fEtri)74t*He`02s9gZ7Cu|lLAdEpGg^co)O5kmpm_MvBb6V zR!4D_^jzx<{kn2Li7G62)J^?P59@#j$Ggp(IHIb7U#!wGw__Y09Xo;r4rdDJ0*(cN z{LAZiE!g}26hfq?ugBV-FfN_b!RGx|V!L!oO92zx@SXPqh8+r`6rrX{TsRCH2}f;b zYG>Vf7=qz3_PSUUL4f@`ED+~G zt)X-U9~vf5MJ-7Y*QsuYaX-QGe9QZka9+-J$NS~SYdChx>m3-R&;OP52c@3p>tBlb zNXW@{UTa1&l^$0!qkS6nSPHI_!j{yX-^~8hkYj5)33Z_Px(I#fBURO%TGo|zt`5b- zXjM-$=Tk?@`Z7_!!ka#7N)@=n7<0H&DmmZzaH|YW9iynsSOu5ML;_j$%2ae)gO& zD-N_R6U3!2TBY{QhS>7|5|8lSz(AkMPuP`iLYYH9rxHTVlc~NrR_Pz7N-=ga345F( zXAU1hpB;N`kjloRL;+r-ljSRrkh=X|nu?>~Q$+biDeUYez`ASQ(Z~)o7`@nz!C*cx z`+>na0}{OdQ~V4Y54fuK*XH;y8La?h^txe+W3@$ClVZoA`%B^%z!1E>Cer>eWVcqu z%jW}&rS79bHj1>|XM{$$@4Lbm$`Dox>JHpqS7hh2EF~CpK2jFoD!$OF@77pQU6`N@ zoCHQ!5N@uhfvlvJ{wWdzDPG{^RqghZLV=m8`Q`Ko$u=7TC~o9mKH2USOw7nOs+j*i zk&KTP8u}R?!GdXUHhkV-%#xqq6$K1`7~c*1bQ{YMj!0z%Elu6)4@L+RI*N3@o}KMY zuj?nWHg6oYu{pV~|FRc+EoYy>t!)gsOo#)!rW4kkgFF1=RexiAWm}qIf2{psH?d{a zjA!;sLmzl!Vx2zy09pJj!V`~&D`+_y7jk;(^7i8pN_$n;@2kID*HXs1Akv_<#%Qfs zT~YDCOJdCkDZ_&kT`PHa>rvkM{Ua65`b~rfJ4VF^ju=|NJk8v@(&IhZy9R&7FhdMJ zaf3}vdBYK`D%3>bgyC{!mt;uZAZ`-2{u*EFDJRj;$D8C0zPBH$ty=5xllcm&%hmf( z9LL*b+BEgpY{dqJ8-TV?TzwYv$4XRjKY}> zPk5)cY8MsVui>Rn-rF|~Q!qf|5V|6i*;l7%M)*F@N^r^?O1l=9`V zvNfUMFXTYI|Mtz1g9b$1T^~+h4^CjkH%wuui~G1RBGoMR%rUfDh;>R-$%*C^$-~T0 zv>(e7*IA`i))S}q_W^5|K)IV~IjA?VkYIFWup{>_6N{8OT)BZEm&TB*Ln=~=>;#3i zOva|laz{ti-ncU2L$ND)acy(@yT+FvjXf5WA0A>Kd}ZZbY(L zTYuDREAbKfm@7%^~ANnEs#_*N+HrV`Bj##roHe)7`*7@Wt0qW}_o0rqA_Eg~;M zpts&?7=dued05&i2a(aGNlt{x+|$y9jC1;<7Y(!EdrjQ1l`S&H%;u1dL1aKi#->2y zjMgGBoHEAQqEheQG$}}1*xE1_1Td%S`%^~;5qb}ttYxfd@nIV3fZ3UAnc%P$YEI7& zzn{vhdRb+Nf%j|hE#5S$uu0zNVe@;s%XVyUi__b=RIaOJ>f$)u-@e?GJO09CUSARb;8dru@}!sWgu{M2d4| zF{vcRQ;Et@Gu!>LKQWE#p_cMQ;q_GJzQ0ede%+4MqG-p+VXf}hauJtWeln;5OJt?C ztiu>)fp?|>&6rX#Od$=Md*^fVUe(xFf^krR#6n#5Z@h8SjjVzi<+sI=l|PPqwrpk6 z3-j$&EA9t;clj2Z>ybIJ##Uk(xM@7NEqCSOEeM}3zA6-!`ytpgzkcBb8LqRk;i#3p zx}FFQ9!?ZQR+ZorEo@x1v6&~(B;%`7dR-ZQ@CD2JuQ#k;CumzZsFC0*bH3Xe5ga6k z;wosl#gcNe4TvR*us~UO)#mRQhp8!;xU8_ozAIJWe90$>K)}q0bjhPypBL?{m#un$ zVp)?|kbS9>fQ2uY7bB

t#6{k##Lp?5mA=UEq9-=JlH+AmV8%nI$m82GbEHL$idL=s+spa;I>*FM)=-f7>sqY?VZ0$&x)1Neq!KOCd5CLPB;DLxd?LJK3tSjO>P?Fl2vFgcuAn zA%to$mh9`yydU*Ezvq3=|NWoyc24JXPMxFgXSqN3eO=dm-Rjq@l`}XL>E9>i(47f) zwr5~FX6AtjvD*DnPM!mS(Z%1RYSOqq#2!sXhBV{uy%UJeG4OYi&M3z)osJNUk;+90 z(_7xQih;*pb3+r}2+_k}a@;JR(v%+@!hn;@GktP5dA4_Ul)SXL`}zK*Y{nip&aM$A zr;`2PQEU0Dl}j^8SZr<`^zq`r9C9$POl@!+Q1P?A`sAB+fNXt1$|M9TkH^d1R|JEgxPqh+7%ta*x~>=7j^D5^jT8UWVR6$s$A$* zj(~^6$^w}PSA+x1Z)O{8Wv1rBZY5f>6l)4#xjECuvn)rxHUylq|NO=;b@@@yd_W=g z_ZL0_iW`2!o~*_lmAwyYdu?iEfO_NxuSwfv;^c!*Z~+FoD#92i>9m{7*|24v=4GBT zYwuEWofWI?v0P{WbC@!lR{YR7$5nG}S{pz0SF3$pG+V?7Q*=NVRm$lr^8<#Ipuh&X z(;06r9t^XIY+;*?l!>Pxc)T}amtj7zJ*XqX1{O&OK#2?5Xj3Nd6 z+35^oe8=?ios{KAH_M4&1powbWh@g%kAa)N`wsinb-r9tP|G~N2HuJ_Ox}3JuI&Je zNU12%sI+X_l$^5-_`$LH9I^HMB~`?=G+UD8IM*?I^vKkmWT)J#iw8smn2<6QOP8O} zD8j+EH|-;$h!48O|9*Q^4uk#8&9?e+I`H|7q1os2n_Nb2x#XLY_RRHV({ZwJ11|cT zBtXb(b?@d7kZ4JXE;cuE@4F<VE|amj-U*A-mZNOW4b?m1EnYor=h2PBl zxymkL$$B+tzl-zhXwabupdq*82{C<;D9aJ3wjllLc96$<#Z~a5JdYY$DgA)V$Sg=b zObcOS)nX*DGi1L?b?dlcub0GS{`39CYf4cBCe9;@?Ck{IYZ8BFckOFDqBx%vlkeLR z-CXRXAC=rqg}rD7>461;meP*f$Hcl#`ASH65z6a zT0U5pSP7n(e0FW)yB@d4=7k%nKd&?gd`~``(6QRE-8iv(^{#S=FNjJ_V;Db3rb(Je z`ztIz#r!ouj_+|RahQ3xitwFx>8=71?DeX@%>bmaMc>ayf8(}7)*VMDC zZ~v2;U)S#h{Q-4j7-O#*p9j77FC_`vUF4ECL>^O)F2!mY5B~V!QUd=G5MO-kQ06Tt zXfKy7=p0UV+(tG{knJ!cGE5axPG6Sn=K>4Y^e@}JghKnt>xm{gDVA2hoI47Sp^k?> zX}NnXi)8%?>Er34v*HrCB);-Ug-0{8horQ8g7zz6Ea;97n0EyHPoG?w2wLqc&x7g= zfT;tSSoJ_KLOf%@;OWy1W>FP`ScyD~5WSwdpd)%ozIs5}`r2k*~8s$PC4ahzZBSLsRD7@TP~5c>?DFOa3)n6^ZD94zmQV$JQHjU5cuIz*6k zho~8lm{Tb_WRh<)0liyp&jPZ`OQSajNBfnP$OS->)Z+tMoHoj(V33cbgm<`^;tR_n)mMSfzB6EsHq0t(E=>}gIt2%Owrood^(3``ixUW)VYkA`z%d_(lZS$gfQL(U;j-fLz*Xo z$Mq!yZQbANyqx~olkNa(kCAEm!u#cc967Bz(2=)8k+k*tvHw9r($yN&bgxo-n_#M} zL$`MFMnnJIzkF4f<`<)F^lQx;D|>Q@)wmK!kw1HYN>-fEho3%~Tl;aU(NE#I`6D73qAJ>c>S7jj#I>j+SViEe-S=Uk*53g~IijzV_)gHskQ-!YEl=ypBmw3l2A76XEfi zs&egpTvbD~o(Nd4+ztifAy{@AnP+8IcNR3-(aFx2zb*$rkFNi&re&)q{|Qi6#a2_x zgFXhYbc%)BeR5YIO9o>N^M>6c2!YbJ2j!=EBJ5tKcaRf^i1iX%_ymo*X%wUh+ab-as(b-eZjM+jv34H>-!9MX{dL0WNA^!)o}(pVo~n%- zKNKzaDr^Eg!MWm&Gvq}LZ7as%f4V_3>3Wrrm|kz115 zFw5{n21e+x)B#ZS*`zTjz6?PiT4_|o9^(Pq?WuCP`AtYH`drB)8-w{*Cc(YJ68unQ(+$_A`Z!RIdoWHPV_synr;P*$t zNeWAusFaT{rW++F(2R0tR^Q{#hTYqpWgtZyx(Sf9v7=on=sevqx)&bX&U^)Re;&JT2~bM_N_rhcuCrGzQ$+vgo4wXta( z8tHKmn0|0zYhrPN1P*{#r7j-#eI2jel%`Xji9(|zr?+a&jt=e99+%P|fZ(TeqM5ea zoWPongHQ2OC;96)L6aRQc4hB-JYI+2S4Dvc0KmG*2fDl+c`hSL8fGpf!B~!_5$T!S z{vzhKl^y(gp|SD}85U#9lj7RtoOW}_5m-fq!=5=J4RqiB*6)JO1Ua0^5yulE97Y=j z!v2e8S7{oimvmeIS;%q*y3RQ9>n`fBH1Xn#+EMR96_3Bw@WfDywnr`@U)lsl?f(Yz zyW~(I6$&<}JkN#gVI4%Z!g%_iZRa**9r11T$KCZ0*8Uuf?`-&zj!jsWpoR33dSzw8 zuSs?Wy~{3hlf*Y1%J4Braz04clA>hSr>Hrl_`&ot%toFu7hZX3L273^s0BqGrNwwP zuAc_J|D?&b=liR<)k4|b>zdfX6&=BCu3H6@wOmQRt8`o=q{#F9sQ{2cfP8+Q>30>5 zWDbLaCM9sFCq!z|xf?o^p{?WycW-)gAz{#ES$|Cj2N7psokI-g}|D>AFUCfm++ zxUFw%PB-dNI5Nst74K*1T*#~|BcjC?A|W66UoAa8$EOYQEPMArolsD^ zAm$g_eB_QMTU6_%XZm~(7!S4^v^+aRnWP{u!mk_ z`l&``9uHbII6&1my2QKIGQ`gDfpRiAf!4gZjpEfdP+FGm-@ljMXXpp9ZLp`BPtHq7 zCaOm&LU1?0qD! z0!8JYp=~{;HTbXvPxDO7>@3H51?7&y){MaETSxp#7uMUmX-mrvS>M^EP?7k`;3cd* zpZ3Z96tsBMJH^CLaHxdiDln-0KV~~$;_rz44wdD6ao0b1-)x?6y2$nI=|z_Mu?qnC zlU7rQLap__3NUaA?^1WBf0Fxc_a-dZue67ObGy83dn=72EM)1^@^}hWvX>ZeF1Oc`@+;X$ z6(q#~)d$EOP^X^zFgtWAW}!$FVOQ-DWO-Coev{I2_X%t0$Y9WpLxOPpJA%UT6N2Js z&{6g&hE9S$p({x-Ru|7=WtEh-y{Wg;NMQtocr&Cbc}8HNH|OZ)(&~yiB6In{ubVbB z@!-dll4-Zt*^Cqu{V7G!Zn@|j=Oltm!b`^})|_1{w=v4t_-;I&+;Vq+Lb+@^ud6w* zsqM(}xBRErHLY)MKH=VxV7QOw)DOk~on>V`R^Ekz>t96xFLwfBZ(39~pH)|)-rMce zC7^<=BDkH8D?v?K-@8$+W{lw0=W;zS{!?PNGQ(TuFTqyfWR0;yk{0^Y4tkgzw8Eg_+3`INZ2P!()UiD z%P(?`@iEAXHz3nG`6=J}u-4jpK^`(BiH>nLdUewGNPw3hC7&zcR#3NzGCPNVyop(6JwP8FfIrCk;)5xG}CJf;z z)^fAZM%l}V6))<-8$dGjzR8WpD#wKQ(o_+o<}It(qhZXAR6UB<>QU_UDCEb;l9mUT zuhp_CgSWU!-7)D?8lZ)c=zg}4$RG4e-Q04a2xPgyxh_7KT8aVqA%IzWjY<2D5os9z z^J$+Y_`5pXcv>~Piqt8G3w$^9lH`Xh(rkGfslJqet%Y*RRk6H#SucgXuR(0zeqv5B zYhZP~-WZNPy{4h(A(>)oK@^t0j1`O(LXRZgUw^&kVs`O$A%mc9mBU3|%xpdun47#2 zjXpGGf`ZX@yr{&*mgcR=R3FvSDH7SWfANvaJHowKSV@Qll;iQ^#~-{|6gWD)7hMYfZidEIU_4@wum7m(Ky` zDLnIJP2tl%JKT&bp-XI8i| ze)@gPg4&mAaEN%md;d4Al^D2>p#$n;3_YS9^43=SH}w%K)m@j`?&rRuvSh||0-|JQ z&dnL~aYR3th$>S%PirGK{|ps>BcB$KX7BL~A3X}ZOMq~DXX(XX*=kyD&zKMKGTFNc zXaB}+zRef!=)sbpY0EL22VNmoNLmFSAb-ICcQ=X>j`DVlXFimY>_ng?(8kU$BB&jR zM=cs~x=NrkySS zI9URViE4{9;#X4|*ia8<4R6@P+LAJNH|wpn!814ScLFQue3TZlHgmH1F-?{Bts9ZR z;~iePs8Nm>r=HKRI~+^s1f)u6p?x#bsr*=~r#~MN9!J>G`U3-Xfy(MEZgp~Wg1S*q z{|yw6Dd07PrE%H!ng-87z=?!Oo&Fxsdm`l5q2;-f@;Wq{V8(RVV9P5#;oCQT`}A_1 z$bz~IB7Zq8S8XTv675^aLN|h_hiOsDxpm5=Lr8|}Yi)Pf(G!nAM;LPMo{&=_i})(< z8Sy;OO)GxmhBb4zv_y20Zp`iV-Q+VAWt8pXCWYHm;-UkgLsSMUp{l&Hr(KyhXlj&A zTmNQS^Il8pL)ESAIwY4ptH!UH{&Ppd4yv>Mntaax5Db6HO9|Rr?${eNq6{K)-&15M z;2)@N*5WdYCg9*9IlgG<+E!B1buqn%vGs{mcOT@MM9V$ni}RcHd3`Q*Hraq4DAS@C z2TIVFgU@IPj;$>Ek)1r_X1jB_UGMX~7dCV2Mq~ufSq!!SEg797pvM*~JN8v#ERSM= zaUevLFiN~7Bss!ry2-+g|4-rwJS}h5-YYxgf=nuq(C$yc2ZK)SkKHoO^I0AG({LiH zLy!KhmM)Sff^jgvB{H!=it9fns6IIu^(Pp&oi^0~V1dM1Bgf7#Y4A9F;Bi=~biQsX%`=U2E9*jU!b^w#Wnlk|;{B-J@>v4)+EN{?wg z#N1Lxhx{J5n$g9Tq*#z6B!gs1BS0!r$8HcHfqJ)LrQ$a#R0^AKehVhA`GDyZob7NissKR zIvNj}<|-R3?dO#s`+lTip5i|qptC>ec@b7FZ{tMSY}#z}q3JG&9rVs)CESb4M$v}{ z>h5%+t|;GlGJ5sdpsZtBP8+M%sX#%X_g?L!D;6<1EbP>m5COu{cG2SyDai;uehJ~u zr_>bavv-L<;{VFBMWpo=;Wa81(3`7R{3_gRMCkkijRxX|!{?)I@JW{oa)N{s{;a$S zM{uAFOn?=;&;|Ve z;_ZPU0xqChn5FI9jWf-lNpXs7ORIaFc0P^>r2*x+?F=y+{s5+s8D)0{gmUKH=biy49{mgn4vxqvdV5dU_~sPOC_weMWeVBGu{d>zq)l< zZR+?&hvg04&4vIFSHGtlTQFzYo2Zt(H4 z6Q2fC23%a^q>108b%ESi07cjig7QaJ&e(z}=>ZRDs->nHZvJeI8xuisz&w1bwkf2< zs~or+8?%qS`ps=w+q6zTi1djUU=WYasYgAt`?8>0LGV+qG{i3jKJ@!@|!5%rWojKu+bIo6d%uNK4GMT;3h_A5SHlw#=kes20Om0XA zhVh91DC%Mp(R2ky1Nsh?c*YxfmwQwGplKnZ6leLnzV_GH#iJX9aov}LNBQ{_b_8NC zlByX9 zvP5#LA(2a~)GD5_j$LR?8=8BL00t1l3-JLf-}TIysPdGu!piaXWfwKnq|17zd=H=v z#Ac~4klPIyo8fR*tlk^^nhUKLP1IiF zZh=?RVN#vd_b_*kcq$JnI0*C(&om^X{vc~D2cc<#-lnNzk`$Q6|F|43C7c@5;T43l zFv>5`yyXB}ou+Oqj1IyZ%_zSVDIYf>9!EzNRW%|n?=q+(LHoX5Wdi`#P!^2?*(t&- zbkUA>p{p~QK0(XoAyEQ-&LV27zkxK~2?f&a<_VDDdo~<5i@wzE8?ZU@7VujT(x~1a zngHxwr4OL;dJn!u?kz(u{id+SIJc%B{rdLw5oMh?=4i$(Q*Tmxe#dE2m@ZNA^y*>C zWTKGtafEOx?Vz3+A(-3qsR ze;@JALf}b-+-H1>aO|sI&J?I#w*39qw=b|u^td4vkrsIr{>DoVXzLl zAo>8WQ?APDMhXO&MS}qR+^>`OBS>F9cu@#mwJ~M#Hh%dJIoCLgJ^gsGm20i6`5f9d zd^^ev!dG&*@(%+`_`Ftjk#?pj#lL_f1$(1Scrh7+U#dIz@lP03a$9c$YW~FKM_*GN z_>Vt#LT9}vm*sfypf)bmj{T6>N3(F0dD}v{h`X~v6@bxF(qN+RIi3v!7qNDIOU7v& zj?l?c&F9=vUnCj{K)g}EEZtpE?}ROlFsaXPB)rMnr@zKl%``CpHmH_+@%!yOiz@@J zniA0fz^uz_BWB7Q0Af5xyw{fs9?`4IV8(A}3qJD-(CoNLTe^uRcfNpNE`wotZhG0} zNa}OYesBo`$Alf=2!DkZzBSc1q0Vb!b{U3D=7_)c^e>^%!~wdpBZ90N#un-_16KJH z3Ob(x)j%F4+;lOQ9OY#L zDudEYtpg?u725h4bmx zv6#Gb2Vh9TJrAnqqUy79ok!c9F5kffQ!cV>uXUd7thf^dOEbl)GxdiD44ro3gJoTs zS^v~cXYZPGF;D!)^|qGYS@ZJdi6wC1o)ii?YcS-cSdZuUWq~dhOR}fV3m?yg@kdCT zW?<(0^}Tl(g+kF>0FOKXZ>xIqz|5hu0pl+JR)xP6LudYleBA4lt<(Y0CF-mi2M8I{ zJXjf5+hpqXY%3S}c3#Wk2G<>@xIb`Dom$J_y#=orQ3iI)8|+6g^woyN(t{Q&4fKME zy)U%p5*rQ3H9aRE+5lQ$EUUcoAz==9tFJJIwLC$iU*SmL`QE(=(3)g?o5$5r1yzqC zcKP1omb-n5#gc6RPMFFE#j{!DeW&>1PcbQB@TcB6u zhoH?=B!X@C;r>@?*#?w8=Yfh21K<3(qf)o}=kAWK^9o%RvBG);jqVX^8_cC5I1Ald=#vnkYuj3BcABOg)NcrpRVd%A<3K-n38u(nohB*|W8HY6x$#`L6iv3tCYSf`H zd+42YeB$aHC1_zIDD!!xsah!+=?uB zR1R{Bje=<7Xw^|Tv9!9iJpB{m zLdJYKtC1c&{1PI7Z-8VKoH6EFnVpx_mjDBv`lNvI@Yb@NgfDwUknd-woeQ%FDnp|Q z+A7E^Qw0hY%x2!S>cJC5k9hs3{0FxM1eQbjgKstfN$ckIiqq!NAhyV^(^ROfZviYCS=}S0l$sGH1z%&KgDdeT$w^#1yjAT6QQ(PPUHCKUt)x$~uRJ7+|m8S-NB`14=3s7$_EDY%MYtz?6_jGwK#VQLA5Za!N>&!{o`T_yFv z+i*lb(34zG8+F>=t-Oz?46iT0BLLkOX~tQtyz(RaZDP1x@(BstvHP?0MwNxkBE3pU z;yHft6_R?Zu^}0Ef6FwA%jWKs6E*dR`OZg&f+sq&s=695?R==;5NdZSg408HHW`qKHcm9X!I3p0NBM4aL?vzZW>fk5u$)Do3&ey+g_ z{WEn5f|~LZm8W0*Xvev}NaVq(5@x~j2fXW_jU~r`6WYPTd>OpZBOyiNhITMqyqF*% zr6nOJc&vy8tSV(;V+Su}{=RU(?|RMZZr6uj%^i-hctVc2?;yzZ`Am@8*z`>B{MdNy zrgYvx$=IB=cQNW3e(T#*c6svlzjtltOPz`oOhUeJdZ`+hfHVG=*c_wp^RcI2_=FJTeNfVI@GI81}fT4#z!T0FAVXt;$ zQhdGZ+allQW2QCRmxM=HZe`l|?OiRqRPM>=%eCvhghLbswJurphlQJG^hku1V5ljL zEvaCJl?J~wBbW{tCsW8IZ^^O<12N|#o%8oZ())_9N|rXIza!uces$C6>{siHn<-~- zk&-VfzP#awNGSZUqOQ6|I@~RUX%wt`XGB^`niqH-z`uj{Z@Wf@bMheE zCU8DxF>t}x6Jh&dTpXj!j}XGnOULfE1&sf=jA$)7b~~BKy6f2P>yrJdJlCHP3cAe}q6E`Y1HPcn&NZy+bF?*= zl;U@^#jtmLT>7jJyZT1$PeeF#y)vTwyli1!1`$;dlzDlIfh|M@rlq1tYD8tMJbjg% zlaPm6f*X$^amx3DpNRPR^QX-}npx5C!b-%qOskPn&(QMKi9-gwMtosSp$3V#TxSuI zr{}vwK_>h8NLxD{i7QZyw7LM6*#I2)Q(S?$vVfbZL7chH zb)7<3^zzz`Ay&fkZ8SPwu3+QghQ#^)Hge>Laj>-CMtvq~pOEs6c3%)9<#Bg0m~MYL z-c)Nvd2-x$rX4jtj`ch&s3C{#NimMvsa3I(S?0j>s>>?cwUwH`D$w3;i(um2tj}?G z|L&ZxZcP~Gr|HhHQRo24>;oW>73;kw%&ELMAE5xmab0JwHxl|FW*a_ zTj?1t9ZVrWKEG}_;YOI%rnip|!LC0Xh^rvNJi^qOU3zBVGNK|c$JJ<`Gtl#z&-ol& zr%JW17Cqg_t^CGY&wAD=W%_u@4>djAdEV~l>$9{(NGEPR-I=vyZ z8Hk|=&usXPa&|MPTM1u(g*WXUZO~U!*7i!s9(*l0J#dYssY~8@J@)$y)!w+S!}kL~XG+Y*qc9k*WGzR&#!ny@BqmE3hS4 zp0mD0R)*?sX^$GagQKqXMXB9>Wb5!?%UJ6sMWe0@^^sNtG#M=0nW>~xKJXNkANd6b zGM)Ezb=jE+XJsI4yl%75cX9;BIW{9gAAGMzZ7gbT83;#m)E*zN95`!Bp-u}E6h5iI z*G_Jo%NLfxoOy4(mGDXl_abkaEIhmB6-!J(^?m@xF~aBy#N+Yhm& zwNCHX-5N|Ng+@2tA55uffKOVrJF5)s{j%Gn-|)LVu$uT$JmnKx1nHwzG_hpx%;U$& zjed^4TY|?^j*57KVIf03HxO(HNdyDiWyt@Q2)Vrd!}!b}?d|Pfgfsh+B_2Cgj@XI? z&ppw!iC@flm?Q8$<`gc~vb5zKJR^n^vmtS~zDEJ!`OD z|9B&GVk4{B=%1WLv_V>)gtFB(IINhP|EUoAF_L0}!a;Iz%kx^^`J3tHMzsy!M|e<1 zNlSKeNuw^jaDBUzZm29g7g+wA{=%L7Q^>`v&dbW6~Yj5yQUOemG1p1NFgCuvb2mmhv+_ zA5Smaay>sZFJ3`3`g-{(J&vgkZora*AZlImS=C$FRjNbYYw<*+mmqsXCH4C@Unbo~N_ppJH+Ws@l6>7Z<(=HOUgqAJvn;`z**hs> zz~zY+uZugmf>)LHgXB=9VXTZco9V(=$0Ob58U*TaYqwPB<|r3zJmz8aQMVifYf3CP z2pj#XhS78LH*|$cf8OH54KZyV+%jL~E;2pmJN5kN)q$ZR9|&}bJr>ZF@1i@9QX%RRDZHR1UX5Q82jc93~H1AV)pci z%F}3@N`F(>-WdFxKb*7vv!r*HyvDEH^Q)vu%F~!i`#zs7UXEIuVaD80$)VD=cjr`) z0?~+#;!qBXw}APxW85#tSe~<^EE^m>p=rKuRuc&u{fQa1=_};+Z||DU1SiZ~Yb5ma zy)~$IE-A3D_01%RSu~NcQg^fvarY(SOoIQVimrrMStHK*N=3G_-q*ewVpdQ})P5L~ zpV(Esp_BW{Vz?*AO)Ng!z5ixjlAvaqHC5+z?X1d8hU4b3boHwH`;s!UnaL`a?&mC) z#cs7egGD&dat7r`Rod(dqkVhF=4mxDq;7t9OkaHv8E<~sqPNYD!(6&6d>|ziWxlso zgJD7aU5yj29-3gNd|WD=~on3>Gp>Fl5*!GZd<@x70#?AYeI!Nl$jp2;Oi z^S0b)oXwsjAF^tF)0%suL0r#VhG;f^=Pzb?v49Cn-KpXxe&P*xgFs;)YPaK|_r52GUqzKarRm3N_k}R29>~2%go%irHlZs-cCu32 zSQpA!zKmMlcO_h0v+?40;N0Vs_5D1pEb%hGb9ZC9mN}3J?A@uADP#&^n1Z@M8CQ_3 zcMBr~3pDo^`;YH|{5kRS8QFf3q{KntwT-dCb{vmk*2~$fY*d3We{Frhw7RHOORF+0 zw)}3SH=aN{ZMpgNwN?RqS#VLv`(=K!0n-m#3-=<|^6F;JBl84QrDA@I(`L`XkeMmH zOFSHiLa%PpjmEQvMzrQW|01WuNt4>rf#RzURHUb`-=6X(5Fl31Y&W{d&l{Fp=pa*x z5AP4_%nWMMkFT0qI7p`ogf|>(l&_o87!wG?BRqW4K3iU;&kJ(y-`|X*_YUuJwr!vHZ(i?=qc}w2P$diK|s=Vm3 zdV}-B`{i$(kG<%l8<;|26ilIzsY@;E*D-IW10l{6{coFRJkvu)Q|QL-7_^r^7k_Ft z7lVcY zzL!*Ut;rB4Bp2u1Zz6JH#Hc)Z{mRR%Oq_IUfHO{ZE z^XBaJ3`*NX)faW6d<%Osu?FW8F0S8@yRV5ImIk3V=-qSaSAH@=de%-HgMEM?TCh zue~e9Y1R0O5j)gwlS>bY0+kpN6Xad$vM9|tBi zb;I`Y$4gglHN{;R7zS#I4n_>|Vbwd#@6U(x4wO#dzl)y95;yfNy`S{YQ~%!f{1qFJA2M0aD;vi^Fu$m z7-Yu{o|r6|D|Ol{!7X)4Djj8GQ=Jq^^9Z0YHuE%d`0t^bB#NjCL`l;6nm}(*UOE?| zPfIwl{?4yBYR|#M-L9agPBMe;Pl;PYZf!9aVt&2ZG>RKCo}P>M0Y*Xoi9)=vi$0|> zvTRyGn?j##ruSOI$|G_Q{-5_`0wv6(C6;0dNXUD}h|>H6vog`z{F zurLvbKEhhJ#H?Wm%!@9Zsq~nt*uGy-TLJs)Si@Gv*fR z^<`8t<}9laI+bn}jGC>uaf9Se`IQ1HKaSsYD9cd)O1w-p)DNvD4NGD9YfqTJEvkG2 zpJ|cQnb>I<3XPI${j8~2Cfq4`srwx$1RqZ+7NRKgJ!j%y;4dq}NM{nSd=@=)c!avD z*>Q5cI~rWVG4;T&qQj!N1HSsR_zRPnhWKL~^O$}G|GPLLP(@StF5K=ui``@_jOONj z67v1ZbjV5xewDIo1w<25EO^LiFFMHJlEo4QqvmW)?Hz2MA8YSV_hv+AAn%JU%C8|7 zMPB<=+)VWVJ!%`3^L@J^)U>Jjd+8mwZ?5VAnh9_ z3jHVgVB$CpmBzDCJ6oM~M3|J+)-q+=%$)Rt9Ml-t@8e&^53j~TV3?yUH zAj?+8%+PLfU&_?zp;Q3e^Yw+7k?=E5Qm3k5?jPh@80Sh=^XUsu1S1JKZLDklRbV&7 zOPZGqp2S;_x9)rVVb{o5FEo2qR9A0BrmLYAk3nkC>-(eC8=op~ti8DBdJTLa&iKT9 zs!&0jtkMw`cfA%n&qdf1KR*gUWXS*6`X=Ox6FQ0YpoOvG`*7)}+MikIcDLm2m!H4y zCA^zl(Yd^S=4Mb44NvNrc>bx(67~6EEd+gBzV~R^CpK19hGXE)(Zrkgu_`jJ%SlL! zm42-4nCu<9I|r2K9<;9QbS`Z&IUH(?P{Z0QcYVfh^C{JRy$tnFd3qhrXbXmfMCM)h zzkcb-wjNnQEWEJ{eu>2HW1D_bckVMJY2=uC7~87VVLHOO>(>Ed#;EfPd*1a-DyJ&c z>BbYiQZ*N$dF{Rj8!+NdmJJid@?D?BS2M$%?zSL|X`Y{dO~ExusU_N()}l^PoY`)u zC2IL0?G*13*o#R&9 z4g%Rbsd*BbOGQM|sb?{yfcdh@UQz7-Jx?{tW;=dT-+4>4Ed~d~_zJn~Az|l98-woq zaJ_BxR}jHy_4DHdA&%S3AdTpOFc9vMLHS^ zB$uLZ0>oJ)DxJEma%&jpUC{p4oQxT9{#)RQ{wl;ID$hciKsO;GQ?uXySS+dLO4-X# zmELK!%GXvEWgJl6$#Dog2wy=FBmg@Mc{s^`@em@Co=(b35$|!nP&0uk-0P7=)`gW# zS0H_&FfQvddvNIsE5pDkzG#V};_$Ei{r!OycOxqe`sGPq~FWV znb<(??i|uqqO#|&j)D-iTScLz#CZF%DS4pmE(Jf}TDiux7p{dZES0Tp>n_m0*YUB} zpYYY$ju#)ikstKsfA=e_K-n&0CJb5I#sI>U`Bj;M%3brYf*33X6E&Y{W|7OLm$jKL z>yK+~6|Ehg7VF%jwnf2TXO>3_xwR06|69%O7eWp4K~kklZ^s@qI!vdC0TM%CV$Wd+=??Mhe#sVFF5aAGoey zo`oziXXg(Lr3l`k!|)(b_mFnX$FrPR6GOv4t|p~KEh$EZfxpLEI~QgI&-uF_`a9=n z0M_FHYdhnZjGEb%Ab@UQ`3rruCni}_BH-z^FK+~a?bp9-H$88_V|oSe+3GED-y|{x zGAu%;-_m8eZ{>H;>0kwZ!Wj)yi&#|O(TD}c=CHbE) zW(xr6pLI9qD`}iJi7r9BcLhVfP(LL8PeDC~2{x0nY;K^SYM8~$0Wp>w$Kmdu$TUYD zToZ0aqPJxD<-b(ZCl$*PT-XXG>%iN|nu$T*kiaO+OX_~sBW>I_H6#Qh85GjrfDKF+ zneOX1ua}fHajx3odH-g*{Zk1O=lX0()Pe2neIpBJ->!m%)62YUf+4fq4+okifAuTq zYKY$&kJI&RSmpg13W~AbO;AuYDqH>Du1Z6kbc(U3#C+WS~p4_^y zXW(as*>B4+|6?K+pNbBm=3}&d_!0$V${fJx&qd6VFDCokcMR@($yzR)arq*Q@s@DS zC_0(VR2D^QSJZ7nE}8PgQ)Fn(&J^j!k#tq;<)N=eeP@6yspa;{%*=}kE**BLFIBD{-HUi<(g`oL zi_LTjPp%mI@p9-;(riUA49nXTxBRD$Y3V%QCxD^0)J>4S4m$XqZ&Bs9FsA?hoc(cL{|j zPa{O}ZSc%mVq~zEDEwcwUk?K0CuIihm&PF>hW=4OQJt4~(fMB3!}>4dZi6YgL^(Av z@i|Jih%qbHCNU^k-u4-LafA$?ve)jK2$DoM{}Y~m<;}a5b`lxep%@rZR-n;#n$M?9 z#OSkldYOQ;zC+yv4%q7Ov^%v84I8xN5*}N(je{{xX&zltxj=Ebmeu*!Y~CcHQx|=s zot|Osi`v3G?&s`3H8;Fe3G$;q->+h`yM8ke=TNi}!vFr35k`pdg>R~4(`(LR@40+( z5t6euwd|9|Pi_ql+aDfy8tMLcOy_!vWl#U-Pn1(lMMdsJd_Dshk=9G!OWEq2kBo+e zalAn48A!>~z}f{7jjDYih}Af`<^nSqJs%bXm?29@B!m`!q?|`YKjuy_u5_Rmm}N)- zCnT=p5hkVHvhg1S$YAZ=W&xH$S7{sX!?*p3yLe6A*%$W=$%m1mmKx*JsZ+YWMoK}| z-jwY?ytIAyRHWx>lBs`E2qo9`xYdP)4B+`Q!Zg=gCt^JG;V- zlV-s#EdOc&Hde2de;ZV4W&HB$P9PZ3MxqI1B^}Nf7dd2Jq_Mc7I!-K&6RU>`Xf9Cj zwGV%f6Et>sK5^WXH@{!LKf{C>KXKCaSMhc)@@oQ>WFB?0hrF~~$xCj&oy_`9gBa?1 zNwVl_q#y?0d^y=Ga-;?q5_)C+BkVmzqw|>Gv9A01^uf_-;~Xef=*30OUYd#zWF}9e zR?wu<(h;q@Os-^;vP(>A5X95Q3Az<{Rd*X zsA-N6w7cfs?^4dXx|jSXn#JR8dq^@vOLwOrL`15H8sf0BnZV;jWld+k?50hi9wN$i zV$3FyK-UI^tK_!%sYC@ZB2A_z`SL!Wf_+v(_lH+%F;Mz^vCO31M+dd?ILsOV) z0$1NAxa%i{_E^6VmIT$zpz&DGhGKE`(otvfDfoju{)*2+$^%21S_co+GhpXC$4X2o4S zl<48yZm_lmUC6i^y#DbVlb{~3f!j^ubL2XMv?*i-|2i_a$SM_ZWKC+C_8UQ~lN2-~ z0CqN|Pf-XmF$e623hn1_(v0P_-@nl=94FiuF~sc*!h*gN>l26cNhJB}G@g?P+BK!; z!(l}@rrIaigmyf{+X7_wIeYq-)<9;@L+8p9KTeGkOc<`faXn#C6>|vH(+yXou8VU; z{2mU`>ty1*3=7|7W|q&PaR<|V!z^l7%jw1vE@kkSx0Y-A^UH(**R7OcSVdGVsa~4F za=nBW>S=H95R(>6_1}zGo$Tvi*D=aWHFd>d2vjV8Wy;&a=s!Y4K9a!B`NBB<*4mVE zJ^N?vzS*EJ)}{_wIPE%ynQ)3AIDdD@T9Fh_T~;EYp{!^i(YN77vpax`$YbEl6?TLD z@e#22sRzUv#moVz-$UfC`JLq{)olOhZ&sf^DA~mgVT*mE(UP|B@oA}8r`8}auM9={ z_)DWjnr6Z>^?~Ecq0#3Cdft6BdgAbu0w;7;MS>u_HW6<;^WQzJerkCl+!%jg{>9C9 zydODc^d;Q&lFz2JW_YUHy&7y771Nbiju(n$tYA3uus<}z35?9~t*cLE;M%}?QHLG8 z*_B?NK_cm@Zsyg}w77k@s)5Tfk6>luSKa`wH`PlfNG?L6$vI2<%VInYhZzZe69IXV zOH1kkr3mxnP4W?HM$Q-A349Bjl7b!2TsT5YEIwpKhG8b+#UJWj|@||Z8Fd`pr z3^!1-n>qx_?F#-iB&%uPgJx;2&ijzt(8MITw6yeV!=j*+yQ7V=df5vZ-QPJ5em_U_ zBl2BzMmDFTMJQ}15Fx@7m1GDs_n@1JZhf`x`u4Xa+k37hba_41QI|&_!33mk{Vz_HF3|*S(Y4pTiXh6RNX(2 zy`zEf#m@JoJD)v7ZTzcmlJ|7BVZd*;@mSG!XQK$wd{v=8x)?dYPXZA09X9`rU~P6; zQv4F6cxCiIAbYe>a}+hJDMz5(P=eCM0*(oBz7S8~i?^n+WiBSY@TX$GGxunh`RKj< z?UX|z&GSD&xZ_l211?tNBtS~F zDo7AY(+Mcl2LmgEx*VZ*MxCp=H_lSS1I7;eR}<>`w>IY*3N42OdT%@d(6yE(zyISDKACN;k*Y^y|L~ zM)+zP7`@}GVz^xO7$!i&K-_J#vp!KuB#ooeu+e~bEOm-3Ekbbz@-NKxm(Tt8b-1gf2;CMQxe_`hgLJqna?c~Fgq>-g7A29pb&e1SKqVHkkT5v-lEfn|mi}iwSRuI9o@ATCT zm~c~jXq%r_8jgQZX3ZQ0$-aBC>dgu#xS{9-z%|`fv9EVh|nC&1ode2;j zv=rME-y&E}I@P1&MkpYEIj8?o12sj zDpGJ){jXAS0HoC}tON8Rmrbv#hBnK8&JyF0eM8h@spFRq3;N@FT;1Imx~pFZG7pw} z@#XeE8Y6aPzY)hx6lL!w@tc0)(*jr;#P5Q+gDv2nGDOHO3y%GP;YQ1o9|t(mZvh;D z@{6iRx}6icG){z?0)W;u03{ltWvaX7c8I1Q}$YYX7yw}P$%BY11}7KSDK_d`Ic zfF(S$VN`8S7DVP;|e z9cDlf>{ffeE;mQF=!wnj?X`4~&XruEJK@fJBeN|MI=sVPVo|nCBaW4nG;obd$>}C6 zg(j+Y%=70%$-u|`$@9HBfGc1N?Z5y2Z#JGi$yrY=c+N0`Nj;grQCBERzj>kYjk{|c zoNe3lUlpuUgO6qo31h%((UXAGPkFVpn_|7`hr^}C-0wpvUi$HVx$3W269krQ#gzbK zZFL2G;=w09m3RVT(qelfDO?}Q(wmUIF#B3Vut+DoVdCne!(o!gwsLulWxZP?s1B^9h!q%zu~peZFPd^XA9fhKuui8i0VwjaIz*V_Sm7k z<4Pgx(qUD@Qsw6E8`-WAH$edih6|$dh$;bf4Y~&JPce7X^*N1`%+2IYgw1haNIYO7 z5EV%m*=Vprp16zekcc5LLGom{ks1J;H?{_)rG@MJRfyMjaYL|2Pl6;%a65Lx^5$8~ zCw6y;;O-L?5ME7OV0)Z#Ee0D5rsuYZ`R4&qJz zt-vT~Trc(sL4-MoQAoUq7|VAT55N@vO~n848S%UM_pELmn7QUVlX6hn)+a?RKAFM8 zBnnG55&eieph?gYXbb9j4nEg+krjim_D5n~^k?nqh-Z5L#0xV890o%x+N?umHq{@C zbV#*o{qIqqdIw|5-wrylH%L7P95W;QHAShTL83n2nk!7^Z4s+-Rp0Sdf0dstU4Ia~ z&m9Jt8VFZoxO;Mlva4A-b17LeUhijqW}ZU!shN%M!Y}f!tdfP{c;Si_PDe?{x$s46 z1eEHWb%}da4;0IkL8c(H+vQYgyX)c3qkn!^zcvZ~-wZppWhs2au1+ZcHhOw46E}N$ zxk(=P-SQ*8wNH5oR29@!=*gUCw6T>=1s+V>)QzRL1B*6@%$&N+0szcp~$cc)B>m67Y7g!j(8#fbYTvJSh9x7@T+7vk_ z2exhJR}L4kd6G(xBc;EWfL{$Y4G*!EQ5iSMy|~OEsz3#X!1sO>OFnlB5k}wtTrlljc-cO)3E6EucBJqtqYX@` z#fF;M$-~0lNkGw{gcrW+pRA!yY&_5!t`ZFgQRfZ-C>%9aAmM%Fk>@RvlzlSE!S9*P za7}jqY+jR~wDIuVTT*Ljq;^5Y3Th&hB@ALfL3{E|pSK*=`Sl2UZ`Y*LrZTUNg>6;r zTiQi*pA8kBB%^Rd`DfWR#nvMa7HbGS+-P6t=3Daad$v|S?B(83EbOMf1PRQ^AiVJK zc*uK51%lk1od;Ike*sBv9UbeJIKi&b{piWOT4KHYD3kX8sl_wJ#GFgPU&ed2;FcNj zZNO@D#FKb9{oh>1w@vy0uwhdSMcKl#Fa}OrD?YP<2GvEzh8wl36H`b95BCWR>jsJ@IL%sf;6Y&-yLcPSu3k+IDLOF4a0h#_z!L}>sEyz0j4k6!X1j_W*YVF zVeI;EYs`oEp3Ye=9G?iChBljQc3#&x7ca|GX)6PQ7m>!>WTo7P3xus@i18Sp`Y9Py zM2z&rNT#wK*DUz$epMjVBPgKFOQx+nK^}a=y&hVlD&c*!WrouX5^NH;#Oymzxw4%x(&mw? ze&YNaI?fVFD|9)jXpIT#XuNS4#3`g9XxDu2QGM|h+_aE*z7lIaw>ddq`=ac>Ztt&(I{7$Bl&i-{CN=s*uUzgvJw-bA=YYZBTvl00V{r zo3;7~`!I=8$KXSivH_7;8j6*IWU-ujWmE0sg!wT}`z+3ERV^GPPUggD-_fL+siBiQP3? z+@W!jAVP1J;iND5)w~)tif};mQec>h&qqCk&~0qZelQ=|^{jI5LnD7=Op@RiJe97?DUE{~wXmyWWe= z!qT0b8!Hgh(f`bKsY_thT)1@DoiBCVOh1eG5ir$mUyy4iINal4U5`W>2T+&=#=@v2 zzHk3RRF>Xf{SOCzbLo*($PI!hCl%o19YSE(D3E}u55x=#hytzhF|sY-sPDu!vhY)TNa%o z27W?K;;?;tQ*F(djt^rX{M8lP(p-XMceMNNYG|U0ABGQ!T0aRbUpyA}t=PKz(~rvP z`k$np>7kUK$K7r{N>GJa&N;T6Xi^H@7QJh~`KzR(5ZgFLB50?t4rc(G65XC>pld&@96 zTq-&|zrqA4lUlPu!hy*dDeYcBdY3eSi8Jo|QC7mnyh4v$oO zjwKvdcg03i3GmaLxY`isDRvxIXbaF8e>{^iLQ#6A`S;hp_Wa%VOAO3Pu$HkI!c#}M z-c4C_FmXVt#lb@j``8JUOmNzz>uu_*_S`o^+D~xU-P&`Uqb%D+Rr~PHH#@3Kot_T~ zXz^;*CPf(&wnOZw)Xft&39{FBL3)JjJN)wsmSSxV4|qPQa@_&J?E>RjF5Sc;1(AV4 z+?IM)8-x)cjwoaFpvRDl0p1~ceTcl|@@!CBn9dMWznp2j4?@Gs87av09_Y9W1ilX< zDw*C`Y+z9lK5wr0!dBv~v{;z6-2Tj!Ph|!H1R`tPTb(ujjTCga>|hNBGL75wN5;y0 z=!ML)p9sRUlHs??h1Z;G_9mr^+dwrY8d0n>kSaZ<7JrUW`a-Z0m|$%6TA9)|%eC_k z&*FYePxAS&x?sq`;j$5bsBj12$B>HETf!k`gD|=1yx{^bp}pbKN$tK9Rf#o`RJL=O z+HNP%@%eCp@xEz%6flX3=x@Y1owTdVho7&4@7M-E9SH-WyyQoc&E$7)49X@)w{CRbsR}IIp&XXC^V|Z1;d}2VY zpgtfD2THz{|0PQo<~KBO`@^-T=Klopu%tK6w!QB7=e<~xA%TT zpmVYz1B!BLFJ>bLl&0?o?{%rjNe!q;F-G!tW_Fd-q5L1t=|P1lQnJG(1*Y1uRYXx& zCY#5Y6BP|)5c z*Or?L-spSk(2j6$9x2Mm$*nHiL!W30g^qN``=W)ESVfglMb;F?$|PQHH$pqu^h%yy z>5CIJ@@l$?X$u)2xhy!5su+KSH$}UPJ1HT)ST#-~mKHX}91k@*)%Fh_s?r@(IRDn< z0CJo7C^;8reSD#xZB(vhF0m8XLF0~E7wz2tM;`}TpMheo+U`U(3mAHoMFRg zi#y6xdYugD<5v5RW9WKlwVl#{3m1b!8>>Mk^{@I+)R@kBe4>eST%1CP-cRpu+^j{; zn|2uQS?e0^WmoA7m6ABDPN)m|c91w<|23WZLrT`JGP*(V?MX$7ieAFp_qv`kORm)1 z)ITy9tz1CHzrElK)f4dbg%BkNz8~RS94xJUczP-`sdXw^q`4rdn_kK^4l|zzt!QBv zUaiV{u%&|3F~#7hWmuE51Ge!kvnRT)YdmztF=T>?GcW8w`w(Ix0j`J~F8YcnOz;xY zd18o9epbAh+}cw2b5}bU*C_uk=y`4$3>{yED5EZl>?3cpTBe7kg2^V3 ze-us#BL{i=*|C($V7S^&<&YzN+%2<~8gPaCG^VSJ^&cpYp?{8l?JPr@h!=51Z$RVu zDiq`RbEGu(iyA>EHU_QR(7(W-^+eYF&XA~_Ai`;TKIQQzZvh^L`Un1EZ(B#R!TwJk zfNs0@U9@6w;%1@uxK>U%+L%CeRhy?$?RN{d9I!rAfZ2=|&8rs>QCk?5~ z{D-g&xbG0Et~(M>1%wDECBIR?3IE|k^j=^tUjmmuZ~HF>SM~UvHcfTj9`d6B{lhUT z1wSIKCXL7VpgrA#@h>eAOg);skx3x7`1{@(jMqb2MolEw?jLqr_~FfK9z{5hG3{(5 zxW36y#go1oOSkog&p!-p50~=&yZNCFc&*8s`BgViyDf7f^i^+P05T`X@5%rtrj6}_ z8I?Mb!>V4fP~V_zVu1T$z(GoCIpY7{x^kVEWW|T;9&R=&ad?0R`3V%-k9^&`-*vTH)lpOgT2J z*(bblp$p5GH*$VX(XgxS?zm`tL<=$UrLvWnYpe@PDG!Dtmpz)3&MXppDwFk(?hU&A zx5N_`kohnmN^W;(&#MK9RI!oplnL+V4oN zp8h*3aTFLaWf__GRnEMx;j9P66+rY4j+9=8tSz!lAHW3azD5XfG#3M1KOg4r0u&eF z_>&O>8JmEh%kA5oRK5M3IxwuJM?if5^|!$u`p3&{hm$qs=wT5B6RJi~AKjl@ew&JZ zGSS{xxo@+w(K3S=q(={=Aos4B>U7X?{k|-kTpXDZB?oo4YkM84$;g9y)9{akH%7^! zRmiGt>0vd|xYR{}vs$Hl;5_RoI3zMR-x)bKUF+`dG)VQUEGa2zfnLfNAGD)!K;J&e zaWCQ^jRD+v)hYS22dl{;4(E8}UJ#R9rE z3lfr^KAfee;mtp(4p*WDu{rFfSWSsAlU0oKZqcskW$EGr%TK5Z@NW+aTQ*G|=&mS1 zA3|8YCzXDv_T1PjJoWb(rvzt>uG5Oz%JenPdU*|JzZg35oXRqSD-?E%RfEKGHt{-V zJ0b_AsiC2vKRfAApU;*f&+IFupgd+~{ToZy{i|yqT|--}-s0s5&ZC2$9u@DQTyN-_ zV2&8B9PZ0V?ODLlaa_%H%jKz?U=*#_KpICnofK-P}g=!q?W;fGETvo(3|N1sDN> zgfWu>L4ib%GLtiG^bK4%REES=hSFN2dAPZ45!F>y-&25Ws*LvE1%{v&Ps|~z0-NH^ z-_G_&;!Gj_6Cz?_VpJj{Xz`0fR6curu2N%!=>AB{0{{R6@&I@Z`uiNaVKbK)?LJU# zJdm>bDzfi2koG48wQC`yt%kjmWv{)o_Ur7_#(~wI#vyXj@x5`|ymk?T?urWRDHv|k ziQwl+VL1cHF8Yo4t4%9=&l%k`IYrU{VvG&y9C!>9T<}1>$I)+Oxn2|e#&{qEQH>8S z$8#Y$+;3szicBZlBU5>?!xK8L(S^x8-hR5eGPc+iyg)!&=HM<*nqf0})b6`p3>cPh zgy;e6KUSOG9i>SJN`32&i#o5`JN9A;Dt~E(Y&azJloOM2=ll1XeQj1;!F1+05b^;7; z5(fuxpdwyy0{``!4Vel8s5^xUEP@K!UY9QQ^sc7zB?xx)A;!aasaHaCym_4_*31yX z`}lEFAjWO_NT1I(zxMWvkdO>SY2E>nIgic0;?A{T-{sDGs7ufTLyX@F?3b3EqWt1f z(%&Jd2b_0+pxL+4L{wv`h&S&ygVvR?CVJ@i_u1|MgZ&w_!(|O}f1jPk<*!=p=DDoW zwP{bK(1TO$@7)+Ut>X8%0}Wxax4@VlX!<=$6N=5W$)XMc`yuUoBhRjJP{6fSW3iJN z*JL5I+SA_B@-KGc*;$xcuVi4R8vOtS)zv|AD_uF>MGly7kz4~}2b1Z2bAXqw%cRx| zVmh8?Tzt%v33jkH7ohnA(FUejRFVnLDatgpR6*TSczomC!Dta7hN=X^AS<^TEJLX5 zPRcVnm_Jpg)@FLksAfhp-8Z-cH#qV||31HKQoq&dGUeNLpiLz`v7DW;ITkq~-cl%d zl~bO)7_-oEiesh=>+766r?t9LA%YQDlFL6Jzb(U)_W=d`%3-&rM}Fm@BI9T?jp5jh`idp_`{FR!=)WxWk1bvH;ZoGY9Q zo7G_Ind56rMC)Ze->Qb|Y>4=LyNGL9Qed6k4Q?m{S*Jk;h?o$RphFR~u3r&5a_-ZA zB2|3II$TEK?Kc?9XOPB)abEJplM}BZ>M#ZbHngaAG13Q^5i75Qe2}y#PA|C$&LwJ6 z2lowO0?EQY2qZ_tz+mz$8HYF8IeBpKM{7P^1irZNz4l>=xXShYB4on<87R~lz$O9d z1G+%39$@0#*z;E)mx|MB05*Tel0C3D-%oo@e{}rS}e=(0=VO(lz-b>6W`1J;^O@Bc5kkD z%v$ynI4BB4@=hENFJIpV+!_Dr@bg!o9JK5A=QlTv%~gSx8Yh9*L^CL|fb$B&c35c) z9A;B10Tv$he|{LY2psyCef@d6z@cV#{;2IAp^XJc`!CM+)2{Xd+Y4*wZ&$ksT+-LT zxKw}nyMudpW8XxBgLH$@(F1EU52yhB9kBtJ)}Q?Pwd-!=>^(xgF`W}x=)fJ8r00X!O-XqI&~%*Ssw<%vP{ zVtwr5{{=Q#UtY>0`*&s=+kr4}QIZ5);34A;+|kqlv~j9X&XM#K!2=(5>Ac*h>MZ`- z3>Xm!t-uWng*l87#-R1zVQv!)ZIrtcqIS=U%DufVMLhoQ$2HdSu95xw3~WHLerm~m zpS#VuC+>j`$muwbTpt3%-Kb<^S|4cBLiguVkLB+Uomu&hfg#)U%c=rU9D`B=xJ+dz zI1SP$aj4(3=zVqk)5;%_R(0`7+PAm2{$7~UUpKM+&+3vd>s-D&3x$>Mb2|O>M&mO- zXAa;ZKK?){(5%fA;DTd|zm|UWeY2zM84`^5ow{C}{5y2sdP5znFWoh^jz{!AO;~TD zleDyL-ND0!prp9Q=U3V*xq|bvfCY|dyK6RA=eHJDhu|!*)VFJAA6$r%eQXNcoUDCk zJBZ4@XRaUz4ib%O=}C8m&0C!_WRLvS-240e((4*p@6KO3yy(!16~MNOJ-qE=q{RiQ zCe*$HOW}LDHGh5tf)bP2wf_CwneXj#8aHUzE#AryVGRn%F3#>pz+Is|%AiCJtM-3E z!kDxBmoRV{h)HaCKWJ7bftf}2u4Ng6PU!TDk>I2wP_gCt48{#9FHe6<1no;oaAuJ| zYZ=C{#__gh2FOb}J+oZD0+(-Gei;?rZqWluHwum(rpMVp8+w8Han5>Yt5Wf_xAIQc zUKHNEJ>kiH$;c9oN?qVep4%YRpzI7DIAnM*4b=Q&IFPd?_FQdto8GrtDJKqKX6(6i z1DFdJZCPx8{N?$=U&VLs0Bf+--ounO6+ u?lLRS0a%g&dISjaKqp)Pi))P9mju^D9KSm7^#aab%U(1m)fyq!+)04b=DpRG%Z%3 z*wA9P0z(f2wo|d4dl+_KbLz2&<+2XVfECz~wmUU&n`LcmI7+ItwJ~>XnkIDvgRvr8 zqPc_em?w&V9{JuQAEn<1Fho)0BPEkx{{Fr9v{znv#fJO5`R1D%Aj-4$!7S_%spmKFcS4j!KYsjp+UL;0-~KSjEOd{YKHt+f*X47=c4464yvOVh zk`?sd4{xS@4!+#DdlLWvF0F3D$>|{g02n@SIL%W^9L)3}Swz3~VKwb@=-?+$9|M54 zs9aioAbMo^u{*DtO2ww5K+gW+roGYq8dsDZ{4Co)3#pJ78in9 zuXnts-5NidjV4@NF#!NzVa8zE2SHRrNnz;)h^P>21puII6hrsha=AV%`yhyF=r8^G z7iphE2RE-(eXSM3rPWRN`J$Q@%f68%jkrU!r~tJ4@vyKkV?^EuK~zG&c}=Yt3jn~$ z>7hVzA%Wbi5j7SP6qCWY3ZgRT3Mmf8Sdc8Dq_7MhI1DGJ!P9CvIX#q#z^w?}Rta4o zhaf7Wq_6-y5Ep>{u46&cUr&A)f(s2V}i)rtFWC{ZX>|2B= z0kKp`DHbzKAKbcYDE$ZR#5u(mX2-!XSQ z+c{{I007{QxdT6b?!S@5_~Y}B*$0i1b1uEk%dc)~7`%-Kx3F}%Lz0ChZCGL=B(@SI zege?G*}WiQKp1`c^T2k)M2f&F6hT52M3i_`FLA4SG}GTZ>UHY{m$1xLj&!+0g503Q zI8<5ISZ@H&TSN@TU^&*)+pDyp-%vFx)HmEQcRJ!8UeKSjZX1Qg6Aue*&yA?3 zAd($a&I+X-s6`MY9>QFq%hj)7u5v_rRtU)+VKEk@_YjvAs(#g8?sH+Gho-z$owY?o z*pYNFx9YKCTm2qi0T3W8#2q3TA`IrXA(UB$vJKY@g zzTb(PcJ39D7Sy(x42_L8IiG8B!Uym_&6$dfjqJ z3+{BYJ2UjNUp^;FT$H^*lf+L9q6z_NXY|x{%^f!&>(UmNxE2R*OoKiyS}$VYPB+h0 zj=H9-^N3ef_? zn-#iMo$b1~f;!BR{w@@D+=@vR@e>18gg`WDx+bJ+fh=)}Bbr%7XkQ_jSs}lhD2s7{ zUV_Xo%`^W|-Q0y{qZ#@z5Lqf8)JI6BxbzD--Uj9>M;tK`Au1yNnRr1UJP`5f*WTG8 zP;O{S5l!YfBG(J9VYnldodwbAqHer2zJ=Js4RqHr-sB&KE7|Yy?H#EOE3%x#0yd|wM zZ+XulE18}+j4VC@01bfpx3Io)(^;>Ad-V9@kK3hE33OctU2i)dmSw@tPWlfhqfu0 zV!~4k55a|t-#f2lJ9j*Ro(?q#uQ){9$;d>ul_tp-tUVAFWBPRay$4?XjmUc$*Wu*k zq`hz7J|NagE|&vMYab?;%Ykj%P%5Qs{VL}Q0emZ^)hPd9y8jWmXw0oT+%b2c? z7L{k8ISlW`&_YaEuTGmHgs83J6YiJxnZ090X(Qab-&KNcti90OX;+wurOmp`uokVCeuFUOc6y? z2xOZ=p#Y^)2`ZIJ;=Qyn#uAY?UNh{s-nj$+sRp|@Kb_C}euop4BK+`Z`=<}GFlZOb zYa6$v5!BYmqeIT}`q!JGZLyMc3#p`%?%pJJ2vau64OwuH$pdvf$pmd$7H| z4cD$+OT=o4WwFS7YVf!*XU`1TFTF4hZ@*K6d+Vp{x8JG3OD~MW)z7{T4Z_j=bW{k~ z0YFzJFE6636q$sL3!Bwh23ZG=nwXeyir-j7#WYP=TU&G1jgF3jVHl3M(CO!5F}Z+w zm#`Rv<{`P~>zIz40Sad$uG!1Oq23^;kKyI}vzpSG}SPoT|wOiF$n?+ni z!W-KlBlvrX3b9yJrP*lu#!te;gm#0%+6ogBcU!%Px%wU$KN^GERA<6Oj~_Bncd=N6 zVzC%Grb0x;k2C_gT^0)wm!O?^vo`J+%cr$yMOJ?FlEsoGvQl~b**60K-$bjP6^)-u zbnMtMn{*_!ZQJ=H;=&>_2M>7HtfUdh^^LJ4ZMBFXixvw&u%+RLpM@c^Efz#q-bR@~ zJ}O@Orge?GtrikwB{zL8mxEj`2l;$HP+UewN89eteY68pp2u_7woFV+*fImTp29-A zM6&q!{A0E#ONEeSizSL6gb4v}Tf`zY2FqZSJFfw=Uhn7w^Y&X`gdT&2r}9?DKu>8r zK)tM%R;vY#MguI%g5BL+&~@FhFi3|&x3J`LIWP>PBc?*udy!-ySMP7PZV^ju%hjt_wdv_;JD<-xgE;Ys3mwRn=@RKOgJrDn zTNInZo;dW=BPjdzYY_+Q5mXinR#>v3vIw(Uc6WE7P$+<|>yffVerTHJ1cu32xuVhi zzL3lx*?q(MSqLm?ZL;s7%CdHE{Zy=TCKivIERLEl0#z!H(?CV5rB2U($Ksv5kNcetLwUyVJv;^AelcRtGnSP7Jk+Rf`}ju3qEQfSARO1nh^DJW z71Gbd3h_d=HHAbcE0wpr$aIrfU81R}DZ5Z8I583)WV%D1QYHJQWt~pcD`pa;=y78# z?lyV5Ec6q-JmxJ;n!#O~D_5>)^YinLxTxw5bqI?JKOBu&?-sbAX)V3BXTd!W3=uY! z27c-lvNq_F=WVk~;QF)7`M=w?0vLaht!rY-+t)|V* z&Dq3i;k8&~xI-u`2sgbT7EzHE%#Gp>S(YWl%8=m>@!L@df+UV*SsepH@gmwCLSaD= z1qri;=r{{6GTb2)76joyMkigCxJ|8A(}=K$uvpyg5N~@JV?ns-m&#i=X&24y?d=J% zSO_BBAruybi+-uRO@pxPkSJ>fK)gGIt`L$a7gx-lpJqe^Y1GJwbcfJlLAdCr%3D9O zIHQFh^dL|?ps*lZ^jqbv8`*IdmcB!xpxq(fie3~Jgo}QxyiE$$VmXnB82SYw@+2qdR5Qqgt+Kvkf3&M?xmA9&mhRDnG^mHQMhs?NG zDwRBsxw^W_B>pHY2p1|>-X=L3qReBFW9;9*-&wc4z1_7=Bwp>4bu6H;Ac>OoF>ljk zU|_&mCO0{~P9$FKqp%=}ft9z(;Z?LIVra^!$7BJ81>vIKD{m2RP*@Nyu<|xJyoN{+ zIcx&!FWus literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/lil_pip.png b/src/main/resources/assets/hbm/textures/models/weapons/lil_pip.png deleted file mode 100644 index 7709cf279f7b811835c6c58a0a5625c1744e76e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4498 zcmV;D5pC{?P)-%ML8Y0lnf z@4e>Y^jUeFJpOm85=il1OS{ncMf%30|17GhVa7=Kj8lR?*{-_ zYq7MngsQ4wjPbt8vP2xmh@uGXb{k2Oz*>u{st`pHj4=R!x~|>t+=suHW$AvV{9G5u zvD-I_A{0e|G)>WNw=p<42vgU!<>Gtpxd#C7)mLBPwbx$5g$ozZXf&{X{d%a8+U+*- zJjZXp{f14OHo+K!v9U2kQ3L>(oSbwUs{!h|Mw+JXIb~V8zXL#)WoWnCFvd8c0eD8> zy}Tz$5>!>?evjiAbzM6n#c}NILAla2MPFYZlDqG|8@!Sv@q|(VxN%igNRkAtR?Drc z>)I327=xlHkR*xo0tKNbxvnfrq-hEOD9h6QogO9{;y8Bb;JsB<#Yxy>cZt8gk0bBKnQRx7U2dx;h%TtzJ}hX6h} zO;ZnQR9H)lUSXEk?<|>W$WVDzoG8!`Wa3j{d5?OtEK8?6!$1v1#VL~-8@QSS7%QQ& z#u#K-=1La5LFg*%0C*Xh_v;$X-WrcoQnNPq470u()mn=*O;MJmSG|~IH7_ucS5<|g zD3IrQ2hpLhVXbYq+ep*YWmpm+KEN1*R;z_K-gv`PuBs|L_uO+%D2??rO_Arh7dD!A zct1TxCFvNh;q#~*!z@ix6h+}egJG^^+@Yx~OMLzH*Uo#4FNLwPHo}vZ)k_77q6n|N z@`^{Gs8ke14p}q+J+6CKRppYS?!o7>nR5u%<|e7XkH*}b(lfIL83A?Hs%SW9A9fYy<8N9^B5K7y<~nNf7BYd0t%snX6bq^cA=WSFG9N`JL)QSVa@Iwa&2 zDmQSo8%&Y}@4WL4-hTUSw}1&z8xOUx#w{Os`t)hc&(FJ%h@uE@z4aD=P6ARRvQ0L| zpr@zDDWu)v%F2qPw9FkuRgxr*e<;7;8cl%QN9P*OxZi&JEvl-*)YKHREW^~)6pS(W z^wUrA#TQ?=#YItcvBRpW@Z*m^!di>|{(di`&(F`pT8qKKLC?#KV@*&+QFv8>O7!&f zc=4}YolcFIpox+&6qLVE#)lt%xPz$4$w}{FCr+He_U+p-H#g^m(Qaxj%FMqH3=FK< zC9bTjcp;!1U0Ys0U+>qB4}kMF5vtE(nbU-<2BI-`?%cUrwspWr?=sow&wOZEmS{Gc zSXo&?6h)5C5~h4GKQD>`&1TaRh@MnKGU000R{Bgu=oA`A%c#b_4p1~y89KZYJ}B%2 znNW0~Nl!2?fexc9%MycwgI?1yH#Y|W*tTt(_c_Cf-Xydslp0(GXLZu7PUL9U+SAk1 zWgHEMu#!b1BO?xennZT&*x@!NES1`Fz1H#h`FWf@w3dMYGxTNSH%F*g|rH6DLl%O~SY)H8#dzU|_(j;UrdrgM$D%qcI{Z zge5)rdy{A70on#L-nIN`J_$SAuuN*HPA*@*jE_J57%#v4G8&DB`{R`>SJup^)>`Cw z?#&1YSH?X(bML+PdW1wbr?9$*w$$NBO!)zgrMW;)e?mT@Wt?ki^ytMGUqo4!IB?(q z4jecD0C?t^XWR|!;sAIvbqZ;W!OuVcjOFEJR8@tQl@(M~h2i00Y}>ZYOIq406Si97 zh=w?hUA%KIjdz9;Jza+$m03mU!ue-&!0yWMfmmCU)_T*T)2Sa$B(=CR|Ki|2+uIVX}inHplvg-dWJwnm{6H;narsl zKc_C%T0Hygvz=am4TrTB7cXA)U`VB?M4so~ahCFKuB+=BjYh+3Ml_pK5T)6gox=pk z&W^cAa|va1M_pG9%(bmn%RN`+cCgJ}niren?lz4{Eca@CkbYCQZ#9v_6%h($mw^xb@as@#v$E z;-il~a>mr7EE-j3gu8d|c8YxR$tRBI^Y3Ag0<5w{=7TT4{L;Pipi>~NCJAAiWtpdh z<_2b2QeZ+;C&)w((V#VXc6JuV81(n|qpoY5Idca6{rygHZM?Q_-HMxUzPT%35Se;X ztxh9C^}F&5%1O%XO7FV#r((lIL=FOYE5=CyVY*Ekg__M|%*U!w%I10_uONZzS97F@1MA=D`X^hW4`^@z= zs#l)poo-MSrWLg}AQCoj-s~l(IF36HkvBDT{H?rSQDn^Olv&$xB1hjNaE$Hh9*loQ zB-g3KC=d0RnVE5GqA0@9&=6X!79x(OSc3^M#=LfeREkDuwOU@KV3nw<3cGgg@l1OA2=}<$bzuM-q(+fEZ<ol1AD%w~=wR5FBbnZ3RT+=l{E{XyJ0|T8mMCd)& zAqinn%c}RsNGrYWww?z*l@ z;ms5Y#j-3N&u1dh@w1MR!Wyh2Ze@}a6BAy=$g<2CjeF7vOlsCzH$n?zS=lG|V`5}- z)jo!(YqeTk{f(=P1fj%B6N?%uY@l?#hKnAFvE1q!qDqm)S%fhL zPe1+inoW&ze^qR5ZVp9JxFM>ZZD9 zB^r$eE?v5WnVA`9$k6c0M3t-oSCb$!G#4neX?=YNA6%9tE?@jJ{(b%jT>78?a>rk5 z(N0?a*s)_?mC?R|!s{R?qz9>6&0E{ zCbl#7VoW2jd3D_-q!G|>l)M3(_Nh(4Mh2MXsV=0TX*2< zi;@a=Qp@ldJe=7pE!Hq1JL@`ymFCD=i|3zz-jykBzlk(H_vFcwn4O))_uqeylP6Dl zv8@9XI!8HzRx&=9vN{9n0&RjQfM!fulb#8anC6P`9`Xx4!R0zNY}go48J4u!+1al0 zt29_kDSy|FQP;+CyvhSY7?WMmYrL83fYtdO8z&7L!Z93>P_YoM;UvjgizlCa(&G)h z=l%EJ_ZlAlOc_F+(Qdch`GyWefU7S_spY6Jh1ZUXURM6E%#q4z9?=F#2c_0pyzs&c zomwnPX!af-AIFg+M{wxSAsAyYK0fZ%a>}YzA%uAt5}ZTOU=d?MV?^t?CK$HFI*|cZ z&+J3e5>j4$cSsGU&)4p6@7}!_9UVoQrWhX|?+Pg@%9fcwYZz(i*8Tth8jS`bdQmew z1=brmkW}d9dG4Vm9Hy|lQ(=rT?hKO3>$|{oKpe+7eE2Yq965sByLUTO9y)Z$3s=n} zWSg2}xUUXglp!W+5h|JIx%ZDuI_S{wXfztmI4pHKM^q1yUF!USeZPyzoqvP{Q2o=t z!We_m(NO@v;lqcWz?z7)bSl!g9}_q~=Xxbi?jI(&m;(vMp+ab_*#Hel0rW*i?e>bI zaECAYuPoYT>!mQ}bHZs6C)sS8w1TZwviV#l_$Z2C_V3?s`3LRHwA^W&QpxbdMf(E) zuCE~ZVQ-;S`H@E+f&GWhKUbQ6{sS6}(->FMzjw|1%STtE|% z4m((yw5@e4Dj*ul{Pf^Nt?wxx)O>Y7RaF=r9YvBPc<;UUyqvL?Lo@_{4)xUo6qQ@6 zQ=-XEV?}!eg`~z|D3BV3f&qRnQB@W8?%liU$>V?OO1ShcWuQm({U0r}dTPXeLye^K zMIx5@D+x;$34?lz4-dJ3&I#05dLLo0=+PvoD8SA?A_ido?I`j-3!6O3MHx8GkJOt0yf?t8a8FN!tJOBqH- zN3mzm9@KU1Dngp3xb3#vya`tLvINlm@+EZ)o2W#)EalJ?RFjP+B~3m`Ubt4z1k~fN zzWOSvs_M+-!%p+~pPT`Rs-s7b;)y4oaLUt&A=3+AkPKhrA=+pRCP*_jHfEKDg{MLa zQ>DL3dNd1HRfT4=iMp=wzyl9>`C@~07*qoM6N<$f(<^IYXATM diff --git a/src/main/resources/assets/hbm/textures/models/weapons/maresleg.png b/src/main/resources/assets/hbm/textures/models/weapons/maresleg.png new file mode 100644 index 0000000000000000000000000000000000000000..b520a29b369be3da7cbe58679e0985cf2e99e3b3 GIT binary patch literal 4117 zcmX{(2{@GN_Y*FIWTeQxHQZ#6p~=>aH5w(8YiudYTp}`KUve8ms6=Du-jOI8+YH%> zh{iI)Xsp>MW8b&(pWE*~|L=L;^FGh{&N=US&;CBSfiM@~6Xyc}00Nd4CbsN-i@kh+ z+-ztpQ-)@5T!Ao4J0Sau0J_Hm0D|3?CRgo3a+Y&#;w8+*+g-DT%uX)<9;3OH(~%DH z?>N_8$BIj zXK5{7mHK3Axk9;vdB8n9gZHfg`kLR69X1$?3`SNh#)LATJ7$R){8%hGD8BM2J$>#V z>5+aWK;0Cut;@+(IGO$wrTK%qq2Z5l2B#%HeZeJS-#A=M^m&WJN_)B>MQuBbE8t|3 z*@>MUU_LOz`qA$kf5~PTN#iXJ%olpypt<=&-fVamnk)b89?mUZ@0q6LDIZ-*H~fwb z^X^6r9V~7O;CIWj7LoDN7n{Fb5<5OV9-09U)Bl9TwdB#-XE{k$+666lGhU(B13DbN zdR1^xvH1+?KF#m41xuZe;>MLcLdY};T1%hk|DO5W zDD-E@;qt<+c~Q&?PrFN;0b(ry4+g=2io$pF=i`F)^bsosWo1`xU9`XYO(oiET-|Zq zE`#QQyX@qAG7uBCzCQaS)x6y`&fu8{ww}CJJ$gj@^69sNY6nH&60fs$ET^+s1{szu z5=2lJP|cq@Bc!L=oi_9t0@9;~177TB9+)3<^S!bao#iDZ(zJ8(-LR+(RRwKhY#*YE_mJ~W7laxt6 z^oipyQ)8;1(yrsg+*DT%yL|5~2A@DKyyCbi3W)QlPV@ilIrR}n3* zE#f^u+{UG)vl*YzWZa(Xx14+5?+pA~tvP-N*17ts4mFBF8xZH_-2Y*WTT+};4AbW8 zcylF1(x+4^N?v}arCmjHBpU|0Zd9{ag9z@d<;aP#F{hfwiV8W*IL!E4k$3SMxP$0w3ZFJYvnu6H~e7#}Rc17}?4S zB7AU(<6(WhMO~tA)E|DqF*fEv>o`acr))?GXUeYC!myCPy?^w^&YWiFcuYN(G89uN z)8wAomdg7qR@2gDV!41NuPxBW^lywR!YuAQyaN)=#Eej{!(B{F;cjfjTz1MQkO7>zN)ehOZMt0n&80Jh zt4wy#==66anAEJefnGA|RTt-OGya+4ZPdrjpQ_!&seioNnJ>A^g66Hbtgu5RFL_0w z1H5IC**Kc-;zyA7vq9T1U&~`eGT#m?5PtDT@vpu}2YEE9T{)UG1BJlU1&OsW(txY0 z92SR2S=4WeeH)>U8$a_uh0m1P^Gn&x%FG1E#(nSzA6Y4BAW!GfsBrX3a((cL^M-@M zBBD+nR`(cchaRojXLoTf4`I|42G&0F&BGX4KGvf@F4NFv(9-j<(iI-6UTMkn=@EQ# zD2%1Bb%jNS^fuu9@GavfI0lHVaBQp~F|m`Kv15s4 zgvN`q{mQf-S3nSvE^Eu{t7Rp}3vU{=Y>G0_jqg>8SiQR%oyg(u`U@G~X<;y`Pi%_v zzFg64rQCgG!#%~-*$zNDZ6;4N8@w5r#8I7IpMa>aV!mh~(!sxSZ2PKcS=;Na9u`m);9gJkE+6GnQzt7bZl)uIs_()M3N_ zZ=QiwjgIze*US459Enf8*q7@=B*<15Ms}+udre-5yk7FF6(sSs8Y3GtWTd4xI2%>m z3rq8%blSVGPo*HBv6oPL<5r|ByI=5W+#vX;W$(I6z~(uKCk89=y(t1*>1V-S_B|5|sJ1Jn~zqQ>_iPaF8eUo62m^&wL z`z2XQQu2b71b6j3sWQ9UK+gQfv0Xf2YrMG9M z1}8%YvyEHX22P&?!pjXoW6j@QwPU|X8{Y-U0qh$%LEAG)l!m|6`~G&_Q^nuR5mywili7RROmNph~ZJE~qzwcH;Ra*pX;OJIp0!RrN4jTpWrH}txBQC@sTeHlo zlqhAyp)q%X$a)|10SoELZduG(H|~!L%5@{g;f)M+*P*q9@Y+ZLUqbeI3i}d!ceDjB z1|J6=`u=mQ7XRk9U$d&cV`AR%;)8vzLgmDd(^xbTCJdu3_ximbJy%vHAyZwqRIIZ_ zr;CIh?P;=;J*!7i+Aty`+qMv{JY$!iDi%*Cki8!;783D8cI&_QZX#33FRCW1f0jM;mA*%*QhF&Gxro}R z?ZqKj+r9qsu&scDV`^BA!it6Q)?xm`=d`vdmF^i$n%|)~svqgYWJe_6(idv{_-`i7 zk^q(N&y@0sinEq!5?ywL#`om(2VINSf;LFRf> zB_zsSNI|vR5=Mm{LJQgS4y-}bW9f@~mM>^Y5dx(7nbkY91*Zymd+78*hm_2ec$$Mw zBbsoPVwgK@`e_J(mVixFs$V1~(rNjd{sY*V%3&gZcN*u7GLq>R1XHtH&@p!h494_} zk8D9PH{T+Xp3M57sSysms*dnmT177)zWfC$4v8s$oc97Q`=E7P>Eftad967)-vz$- zw=7++F0ub25-LL^2RYt+*t{E_{0_x1VJ?HWsJL$d!9j+(Sa`)?pEHkEx z=+K1TBBQr{TWfjDy^$r0ygy}qEtlrg=8zFB&Z*8mU_fVUZQCK^(`1i+S=v*Y!)&jF zS$_cYtii!*0&nR|(uH?hpfGTj@CcqAmQbJ+sm>f-&65KibwnWB9gH?{s9_e9FSz^$ zXGwA$qGf^=o^e>0 zb5(p$h59-+ra#}~Da>wjfknj|pT*dU<^u>q^GxmXUEOt`!arl_O(^_0cHJ+yy3Y}7 z^>%k`;@~LoqBmM-{lw4mnj{S+xT@9S*`w2=Lh{-ACrNwB>Zzl)a4NmQqq+3{8~bty zu8b&FG@m!R-*Dz*n5HG3^p0g}kCpNsx>2?#o;A~ihuFf&5| zYf;`1#-INx;p4l{3}@GUUbZ(~;f~)bbtu0NLU1?ZM3X{X6 z@IQI2iKkIPB96hnj%noCzHs_YS2+7zK6Mn_YbfuXkDlBeaN~?+->4l&%WB+?4n@l4 zED?#+sqkn$x%aPrX?yeiP|70VQY9>3nK4|V)eZ1(9i~a{>R{$vwiZ*dV9W~*&L%vY z6>MmLEv5}AIfE(aYUiqsUDm(1ZcQiQ>0;9b5&zoeVneYws%qfk>N^P7e<+=?{>#K` k#oo+fI+6WY0{j%b5^C&aCZ;mYe&+)$O%W!guseVKALCXJZvX%Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/pepperbox.png b/src/main/resources/assets/hbm/textures/models/weapons/pepperbox.png new file mode 100644 index 0000000000000000000000000000000000000000..26c6e8c9372f3461edae7665ad9405a3ef15e5ac GIT binary patch literal 3118 zcmV+}4AJw6P)L5my7703TQXcWO1dj>R%cCardI4#I2VfM1%F}VbW*<&_> z{Q$vMe}R~QMi4gn0O~b+n~PcPUIM|H93vZ&Lj)!S7IpSu2sT1t1cL_)gmkDJTGcAG zx?A1V)lx}%zsqAZQyQsT{nx+VdsS_KAOh$BtO=kGpcpgSfU%laODv0>Rlfj2PfR2e zi{fftCb48lFo-}LBomANYF;L>WJoZGK*(VbL6Be&b1;CB!ytkn!64>vKn{ZlCb#Mr zK&0dA4%n+E@V*b+DW;1rY`4l`f^rx{Fyt`SoO`AkvA82x1acTe7&+54S)owCa5zMv zP{8i)F822JFc=Il9*@1phr=OCr4j~%0rvLx(ChUeGp^NYXOqiWv4!QD)rnUH0NfAjMwIs@_X!C)}sC}hX21EN?s*Xf^6rC4;kUGI7C znd%)zA97;hq(4k^+=YpEnLINgOOAi@7YYT>ISd8^?CXQGY5!HQE)L_Zqc(?81(-^Q!Jn_PV4MZl+0=cl<>WB*W5+*zXti3# zcsxd{)iV6kj&{3k^m;wC+igR3obv`S@4MnqJaENA{88us_;rb*}L=j`h03WtY>P!Vn0HqNSGPa5e(LX6$Ad)$&%M|ccd-MZ-c z!p8Mc!wvfQE9{j|Qwf)x4i|NnQ3llxL#0?89v%X4rx7Z};+_fodve@(P9f>>UX-f{ zi(%tV$zf>6jt&=fmQjYr2~c@3jcHLS7FSnS_@V~(zOPm+-a6@zw`}esEIvj9C#a-9 z0faJgvi5UbqD(W9>MDt9hw>vFQ$j z`Y`l^au@-ui^KTJQdd&FQv~)C99MD}+euC~QME47mN+QQA7&GuX*oVVMz`Bl7FCLb z7=H}C9L7sDaf80s>{mWreN*4IlWRf`C!mwV(7g}iA8qwwai=&vZn9q@7J|>iqUQ@6 z$NMmNb04vKs7exmC>AOlhU!kwtQ z$W9}G>8%FDj?YEo#PcQIs(?ETs}60J4QxA zjT%rnbHzg3jA=X`oC@((-TOa!%zu#7`#f-YPAgR zF!=r|>?&Vn9JKqrUc@54wNRd;&6uwk54-R=2QJB&JDoKL1DNvEq}{2DdJ6PQUN z@58v9R7uXy&sjd7$7nP{KA*?a+rI@Sdhz9#U$US*PYJb9l_Y?;Vo-T7>qM-V%W)V$ zb`Apwu3n@OXBn{&Bd?PD=oX~g0NeRo=T4IF+n6^nd64}9JLUb!jNd_M1W!V=j*Ig9|3Og9=Q;m#sU zhw;LO@tNgLOH{2X;ppZt`1XyWSdhb54LQnT%;WFFh;kCv%f+IhdMybji(SJ3pbQut ziJjQO2oix4RJMLdHQDH_~iL{>>YZvZ_9 zqZ~PmWw7y8lFAvp)s8{Y{$~E5sP4na%3%Q6ISga679@!S4NEXbO*^6-2A{Tk!bKiW zXT-ktQ=tEM8^r_QYV!Eie*gwBOZXi4*QgNkY0cPCsw8ovU+e&|#^iN2A$RKu!o}zackABBcp2?540Ha&Q2vJohvP^+V<>y zI`}T)Y420=oAT_jNa`@kAs3=-rzek>jy-cb&EmnlbL7(&KF#a^j8C^42)`X8k&KPc zVH7oR7+LgTh;WCXs?*au4$#A4_;07#zm9f}z-$giOyCmf*!mm>0M@9v-%vaO>hHry z8^6t<(^Ev%>Qz7dVv8#pVaSRF@53(~j8UQ(rtjLMk5esq0t+-VZfE-3vYRpVrBz8bKZk+jqTw%%hB=40&g1Bl>^eO~ zRCaoDWE_USALQfuycqa9JpHRz-@%#ghcU@HHEQ9xC^6Q*5?;)QK5(lD^c**SpovKu zHa~}f>>LJP`X1&i$YF##j5vu<|BhRW64-%vNPA@)cvxk4-E_s`l}+v<1v!~-;7yN7 zau$^bi$#MRMtF`Q$XWPBh2NJXth3WECUbCSacf=`X)n-Z{b!@U59y((>@xBp&Uj~q&^Hl;`nh?RZ09iZuw*7ELb$~M{9N(^0NwXS$8APWlVlQ z`o$qRj08{)BOt2o!`QY?&m;~bRv$)0f-}%zOg7b-a~Q9iu4sffjEjp4#>FF_&r?n# zfUV78M8zak5*-}ISru#(9fow3_Mw^PZ=9*`HCZ9fl$Rv74X7)%qeETC8f`u*8h zsUY(A>lS6-49RUf})od*&NO<6RTl$~?y8UaY<0>tSEk4dHz{_!&Zf1A#OIDI2D zV$p{`>BXUYlzl&GF8VZLv#sYr%oP#ZkVCz0fH4+2m#ll6jj)y5SQSzB{j55Nv2Ev} zQUS_knv!V74j5yRb4iX4A2JnD_Wi6nhp}zv!8G0J7oipZ2QG-t>0&G~djJ3c07*qo IM6N<$f-w2ZyZ`_I literal 0 HcmV?d00001 From 16d2d86add1b0e3646ceeb7ef0f09feb603aa2b3 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:25:33 -0500 Subject: [PATCH 18/70] holy shiiiiiiiiiitttt RBMK optimization update --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 339 ++++++++++++++++++ .../java/com/hbm/main/ModEventHandler.java | 6 + .../hbm/render/tileentity/RenderRBMKLid.java | 2 +- .../machine/rbmk/IRBMKFluxReceiver.java | 4 +- .../tileentity/machine/rbmk/RBMKDials.java | 12 + .../machine/rbmk/TileEntityCraneConsole.java | 2 - .../machine/rbmk/TileEntityRBMKAbsorber.java | 8 +- .../machine/rbmk/TileEntityRBMKBase.java | 55 +-- .../machine/rbmk/TileEntityRBMKBlank.java | 6 + .../machine/rbmk/TileEntityRBMKBoiler.java | 21 ++ .../machine/rbmk/TileEntityRBMKConsole.java | 6 +- .../machine/rbmk/TileEntityRBMKControl.java | 21 ++ .../rbmk/TileEntityRBMKControlAuto.java | 19 + .../rbmk/TileEntityRBMKControlManual.java | 21 +- .../machine/rbmk/TileEntityRBMKCooler.java | 22 ++ .../machine/rbmk/TileEntityRBMKHeater.java | 27 +- .../machine/rbmk/TileEntityRBMKInlet.java | 12 +- .../machine/rbmk/TileEntityRBMKModerator.java | 8 +- .../machine/rbmk/TileEntityRBMKOutgasser.java | 32 +- .../machine/rbmk/TileEntityRBMKOutlet.java | 14 +- .../machine/rbmk/TileEntityRBMKReflector.java | 6 + .../machine/rbmk/TileEntityRBMKRod.java | 325 +++++++---------- .../machine/rbmk/TileEntityRBMKRodReaSim.java | 41 +-- .../machine/rbmk/TileEntityRBMKStorage.java | 6 + 24 files changed, 747 insertions(+), 268 deletions(-) create mode 100644 src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java new file mode 100644 index 000000000..03d369ae6 --- /dev/null +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -0,0 +1,339 @@ +package com.hbm.handler.rbmkmk2; + +import com.hbm.blocks.machine.rbmk.RBMKBase; +import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.tileentity.machine.rbmk.*; +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.block.Block; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +import java.util.*; + +public class RBMKHandler { + + static double moderatorEfficiency; + static double reflectorEfficiency; + static double absorberEfficiency; + static int columnHeight; + static int fluxRange; + + public enum RBMKType { + ROD, + MODERATOR, + CONTROL_ROD, + REFLECTOR, + ABSORBER, + OUTGASSER, + OTHER // why do neutron calculations on them if they won't change anything? + } + + public static class RBMKNode { + + protected RBMKType type; + protected TileEntityRBMKBase tile; + protected boolean hasLid; + + public RBMKNode(TileEntityRBMKBase tile, RBMKType type) { + this.type = type; + this.tile = tile; + this.hasLid = tile.hasLid(); + addNode(this); + } + } + + private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { + return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + } + + public static RBMKNode makeNode(TileEntityRBMKBase tile) { + return new RBMKNode(tile, tile.getRBMKType()); + } + + public static class NeutronStream { + + public RBMKNode origin; + + // doubles!! + public double fluxQuantity; + // Hey, new implementation! Basically a ratio for slow flux to fast flux + // 0 = all slow flux + // 1 = all fast flux + public double fluxRatio; + + // Vector for direction of neutron flow. + public Vec3 vector; + + public NeutronStream(RBMKNode origin, Vec3 vector, double flux, double ratio) { + this.origin = origin; + this.vector = vector; + this.fluxQuantity = flux; + this.fluxRatio = ratio; + streams.put(this, origin.tile.getWorldObj()); + } + + public List getBlocks() { + List positions = new ArrayList<>(); + + for (int i = 1; i <= fluxRange; i++) { + int x = (int) Math.floor(0.5 + vector.xCoord * i); + int z = (int) Math.floor(0.5 + vector.zCoord * i); + + BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); + positions.add(pos); + } + return positions; + } + + // This, however, is used for actual RBMK flux calculations. + // Does NOT include the origin node + // USES THE CACHE!!! + public List getNodes() { + List positions = new ArrayList<>(); + + for (int i = 1; i <= fluxRange; i++) { + int x = (int) Math.floor(0.5 + vector.xCoord * i); + int z = (int) Math.floor(0.5 + vector.zCoord * i); + + BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); + + if (nodeCache.containsKey(pos)) { + positions.add(nodeCache.get(pos)); + continue; + } + + // If it isn't an RBMK block then don't do anything with it + if(!(origin.tile.getBlockType() instanceof RBMKBase)) + continue; + + TileEntity te = blockPosToTE(origin.tile.getWorldObj(), pos); + + if (te instanceof TileEntityRBMKBase) { + TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase) te; + RBMKType type = rbmkBase.getRBMKType(); + // they should ALL be RBMKBase TEs + RBMKNode node = new RBMKNode(rbmkBase, type); + positions.add(node); + addNode(node); + } + } + return positions; + } + + // The... small one? whatever it's still pretty big, runs the interaction for the stream. + public void runStreamInteraction(World worldObj) { + + // do nothing if there's nothing to do lmao + if(fluxQuantity == 0D) + return; + + BlockPos pos = new BlockPos(origin.tile); + + TileEntityRBMKBase originTE; + + if (nodeCache.containsKey(pos)) + originTE = nodeCache.get(pos).tile; + else { + originTE = (TileEntityRBMKBase) blockPosToTE(worldObj, pos); + if(originTE == null) + return; // Doesn't exist anymore! + addNode(new RBMKNode(originTE, originTE.getRBMKType())); + } + + int moderatedCount = 0; + + for(BlockPos nodePos : getBlocks()) { + + if(fluxQuantity == 0D) // Whoops, used it all up! + return; + + RBMKNode node = nodeCache.get(nodePos); + + if(node == null) { + TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow? + if (te instanceof TileEntityRBMKBase) { + node = makeNode((TileEntityRBMKBase) te); + addNode(node); // whoops! + } else + return; // TE no longer exists, die!! + } + + if(node.type == RBMKType.OTHER) // pass right on by! + continue; + + Block block = node.tile.getBlockType(); + + if (!(block instanceof RBMKBase)) { + int hits = getHits(nodePos); // Get the amount of hits on blocks. + if (hits == columnHeight) // If stream is fully blocked. + return; + else if (hits > 0) { // If stream is partially blocked. + irradiateFromFlux(pos, hits); + fluxQuantity *= 1 - ((double) hits / columnHeight); // Inverse to get partial blocking by blocks. + continue; + } else { // Nothing hit! + irradiateFromFlux(pos, 0); + continue; + } + } + + // we established earlier during `getNodes()` that they should all be RBMKBase TEs + // no issue with casting here! + TileEntityRBMKBase nodeTE = node.tile; + + if(!node.hasLid) + ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); + + if(node.type == RBMKType.MODERATOR) { + moderatedCount += 1; + moderateStream(); + } + + if(node.tile instanceof IRBMKFluxReceiver) { + IRBMKFluxReceiver column = ((IRBMKFluxReceiver) nodeTE); + if(node.type == RBMKType.ROD) { + TileEntityRBMKRod rod = ((TileEntityRBMKRod) column); + if(rod.hasRod) { + if(rod.isModerated()) + moderateStream(); + rod.receiveFlux(this); + return; + } + } else if(node.type == RBMKType.OUTGASSER) { + TileEntityRBMKOutgasser outgasser = ((TileEntityRBMKOutgasser) column); + if(outgasser.canProcess()) { + column.receiveFlux(this); + return; + } + } + } + + else if(node.type == RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = ((TileEntityRBMKControl) nodeTE); + if (rod.level > 0D) + fluxQuantity *= ((TileEntityRBMKControl) nodeTE).getMult(); + else + return; + } + + else if(node.type == RBMKType.REFLECTOR) { + if((origin.tile).isModerated()) + moderatedCount += 1; + if (fluxRatio > 0D && moderatedCount > 0) { + for (int i = 0; i < moderatedCount; i++) { + moderateStream(); // Moderate streams on the way back! + } + } + if(reflectorEfficiency != 1) { + fluxQuantity *= reflectorEfficiency; + } else { + ((TileEntityRBMKRod) originTE).receiveFlux(this); + // this one missing return line was baffling me for half an hour + // "why is this rod jumping to double the flux randomly????" + // because you aren't fucking returning from the function, and it's hitting the reflector after it, you idiot + return; + } + } + + else if(node.type == RBMKType.ABSORBER) { + if (absorberEfficiency == 1) + return; // Instantly stop stream processing. + else + fluxQuantity *= absorberEfficiency; + } + } + + // Called *after* most streams have returned. + List nodes = getNodes(); + + if(nodes.isEmpty()) // how tf did we get here if its empty + return; + + // Get the last node in the stream. + RBMKNode lastNode = nodes.get(nodes.size() - 1); + + // Block hits don't have to be considered here, since if it's fully blocked it'll return the function before getting here. + if(lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) { + // Neutrons must not have been caught then! + irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); + } + + // but oh wait, control rods exist + if(lastNode.type == RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = ((TileEntityRBMKControl) lastNode.tile); + // just get level and irradiate based on that + if(rod.getMult() > 0D) { + fluxQuantity = fluxQuantity * rod.getMult(); + irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); + } + + } + } + + public int getHits(BlockPos pos) { + int hits = 0; + + for(int h = 0; h < columnHeight; h++) { + // holy fucking shit + // I have had this one line cause me like tens of problems + // I FUCKING HATE THIS + // total count of bugs fixed attributed to this function: 6 + if (!origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) + hits += 1; + } + + return hits; + } + + public void irradiateFromFlux(BlockPos pos) { + ChunkRadiationManager.proxy.incrementRad(origin.tile.getWorldObj(), pos.getX(), pos.getY(), pos.getZ(), (float) (fluxQuantity * 0.05F * (1 - (double) getHits(pos) / columnHeight))); + } + + public void irradiateFromFlux(BlockPos pos, int hits) { + ChunkRadiationManager.proxy.incrementRad(origin.tile.getWorldObj(), pos.getX(), pos.getY(), pos.getZ(), (float) (fluxQuantity * 0.05F * (1 - (double) hits / columnHeight))); + } + + public void moderateStream() { + fluxRatio = fluxRatio * (1 - moderatorEfficiency); + } + } + + // HashMap of all RBMK nodes and their positions. + protected static HashMap nodeCache = new HashMap<>(); + + // List of all active neutron streams. + public static HashMap streams = new HashMap<>(); + + public static void addNode(RBMKNode node) { + nodeCache.put(new BlockPos(node.tile), node); + } + + public static void removeNode(BlockPos position) { + nodeCache.remove(position); + } + + // The big one!! Runs all interactions for neutrons. + public static void runAllInteractions() { + + for (World worldObj : MinecraftServer.getServer().worldServers) { + // Gamerule caching because this apparently is kinda slow? + // meh, good enough + reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(); + absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(); + moderatorEfficiency = RBMKDials.getModeratorEfficiency(worldObj); + // I hate this. + // this broke everything because it was ONE OFF + // IT'S NOT THE TOTAL HEIGHT IT'S THE AMOUNT OF BLOCKS ABOVE AAAAAAAAAAAAA + columnHeight = RBMKDials.getColumnHeight(worldObj) + 1; + fluxRange = RBMKDials.getFluxRange(worldObj); + streams.forEach((stream, world) -> { + if (world == worldObj) + // WOO!! + stream.runStreamInteraction(world); + }); + } + streams.clear(); + } +} diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 2141b15e3..2f3b4ff4c 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -9,6 +9,8 @@ import java.util.Map; import java.util.Random; import java.util.UUID; +import com.hbm.handler.rbmkmk2.RBMKHandler; +import net.minecraft.server.MinecraftServer; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; @@ -1143,6 +1145,10 @@ public class ModEventHandler { RequestNetwork.updateEntries(); TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); + // RBMK!!!! + MinecraftServer.getServer().theProfiler.startSection("rbmkHandler_flux_interaction"); + RBMKHandler.runAllInteractions(); + MinecraftServer.getServer().theProfiler.endSection(); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java index 2783e8508..47fd69ef9 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java @@ -35,7 +35,7 @@ public class RenderRBMKLid extends TileEntitySpecialRenderer { if(rod.hasRod) hasRod = true; - if(rod.fluxFast + rod.fluxSlow > 5) + if(rod.fluxQuantity > 5) cherenkov = true; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java index 91824df0a..655c234ae 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java @@ -1,5 +1,7 @@ package com.hbm.tileentity.machine.rbmk; +import com.hbm.handler.rbmkmk2.RBMKHandler; + public interface IRBMKFluxReceiver { public enum NType { @@ -14,5 +16,5 @@ public interface IRBMKFluxReceiver { } } - public void receiveFlux(NType type, double flux); + public void receiveFlux(RBMKHandler.NeutronStream stream); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index a93498b6f..e8f2867bb 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -30,6 +30,8 @@ public class RBMKDials { public static final String KEY_REASIM_BOILER_SPEED = "dialReasimBoilerSpeed"; public static final String KEY_DISABLE_MELTDOWNS = "dialDisableMeltdowns"; public static final String KEY_ENABLE_MELTDOWN_OVERPRESSURE = "dialEnableMeltdownOverpressure"; + + public static final String KEY_MODERATOR_EFFICIENCY = "dialModeratorEfficiency"; public static void createDials(World world) { GameRules rules = world.getGameRules(); @@ -55,6 +57,7 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_REASIM_BOILER_SPEED, "0.05"); rules.setOrCreateGameRule(KEY_DISABLE_MELTDOWNS, "false"); rules.setOrCreateGameRule(KEY_ENABLE_MELTDOWN_OVERPRESSURE, "false"); + rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1"); } } @@ -229,4 +232,13 @@ public class RBMKDials { public static boolean getOverpressure(World world) { return world.getGameRules().getGameRuleBooleanValue(KEY_ENABLE_MELTDOWN_OVERPRESSURE); } + + /** + * The percentage of neutron to moderate from fast to slow when they pass through a moderator. + * @param world + * @return + */ + public static double getModeratorEfficiency(World world) { + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index cf1d2d8bf..1d3ea4d8d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -7,8 +7,6 @@ import com.hbm.handler.CompatHandler; import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.items.machine.ItemRBMKRod; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.NBTPacket; -import com.hbm.tileentity.INBTPacketReceiver; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java index 20512c206..abbb5ceb1 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { - + @Override public void onMelt(int reduce) { @@ -17,6 +18,11 @@ public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.ABSORBER; + } + @Override public ColumnType getConsoleType() { return ColumnType.ABSORBER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 9adb5b1a8..4c85c3aff 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -8,20 +8,23 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.entity.effect.EntitySpear; import com.hbm.entity.projectile.EntityRBMKDebris; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; -import com.hbm.packet.toclient.NBTPacket; import com.hbm.saveddata.TomSaveData; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.Compat; import com.hbm.util.I18nUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; @@ -45,7 +48,7 @@ import java.util.*; * @author hbm * */ -public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements INBTPacketReceiver { +public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements IBufPacketReceiver { public double heat; @@ -108,10 +111,8 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements this.worldObj.theProfiler.endStartSection("rbmkBase_rpassive_cooling"); coolPassively(); this.worldObj.theProfiler.endSection(); - - NBTTagCompound data = new NBTTagCompound(); - this.writeToNBT(data); - this.networkPack(data, trackingRange()); + + this.networkPackNT(trackingRange()); } } @@ -211,6 +212,13 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements this.markDirty(); } } + + @Override + public void invalidate() { + super.invalidate(); + + NeutronNodeWorld.removeNode(new BlockPos(this)); // woo-fucking-hoo!!! + } @Override public void markDirty() { @@ -234,6 +242,8 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements if(heat < 20) heat = 20D; } + + public abstract RBMKNeutronHandler.RBMKType getRBMKType(); protected static boolean diag = false; @@ -260,22 +270,27 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements nbt.setInteger("water", this.water); nbt.setInteger("steam", this.steam); } - - public void networkPack(NBTTagCompound nbt, int range) { - diag = true; - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - diag = false; + public void networkPackNT(int range) { + if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } - - public void networkUnpack(NBTTagCompound nbt) { - - diag = true; - this.readFromNBT(nbt); - diag = false; + + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.muffled); + buf.writeDouble(this.heat); + buf.writeInt(this.water); + buf.writeInt(this.steam); } - + + @Override + public void deserialize(ByteBuf buf) { + this.muffled = buf.readBoolean(); + this.heat = buf.readDouble(); + this.water = buf.readInt(); + this.steam = buf.readInt(); + } + public void getDiagData(NBTTagCompound nbt) { diag = true; this.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java index 82a7137a9..08611e1b1 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKBlank extends TileEntityRBMKBase { @@ -17,6 +18,11 @@ public class TileEntityRBMKBlank extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.BLANK; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 7a1a6ec0b..2a1ea6801 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -8,6 +8,7 @@ import api.hbm.tile.IInfoProviderEC; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerRBMKGeneric; import com.hbm.inventory.fluid.FluidType; @@ -21,6 +22,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -163,6 +165,20 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I steam.writeToNBT(nbt, "steam"); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + steam.serialize(buf); + feed.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.steam.deserialize(buf); + this.feed.deserialize(buf); + } + @Override public boolean hasPermission(EntityPlayer player) { return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 20; @@ -208,6 +224,11 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.BOILER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index ffbaea36f..02b224c7a 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -103,7 +103,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod) { TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; - flux += fuel.fluxFast + fuel.fluxSlow; + flux += fuel.fluxQuantity; } } else { @@ -556,8 +556,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod){ TileEntityRBMKRod fuelChannel = (TileEntityRBMKRod)te; - data_table.put("fluxSlow", fuelChannel.fluxSlow); - data_table.put("fluxFast", fuelChannel.fluxFast); + data_table.put("fluxQuantity", fuelChannel.fluxQuantity); + data_table.put("fluxRatio", fuelChannel.fluxRatio); } if(te instanceof TileEntityRBMKBoiler){ diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java index 4b3f79c15..edb73195c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java @@ -2,9 +2,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -87,6 +89,20 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im nbt.setDouble("level", this.level); nbt.setDouble("targetLevel", this.targetLevel); } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.level); + buf.writeDouble(this.targetLevel); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.level = buf.readDouble(); + this.targetLevel = buf.readDouble(); + } @Override @SideOnly(Side.CLIENT) @@ -115,6 +131,11 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im this.standardMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.CONTROL_ROD; + } + @Override public NBTTagCompound getNBTForConsole() { NBTTagCompound data = new NBTTagCompound(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java index dc4159964..158c85083 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java @@ -8,6 +8,7 @@ import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -105,6 +106,24 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements nbt.setInteger("function", function.ordinal()); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.levelLower); + buf.writeDouble(this.levelUpper); + buf.writeDouble(this.heatLower); + buf.writeDouble(this.heatUpper); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.levelLower = buf.readDouble(); + this.levelUpper = buf.readDouble(); + this.heatLower = buf.readDouble(); + this.heatUpper = buf.readDouble(); + } + @Override public void receiveControl(NBTTagCompound data) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java index 92ec4377e..d01438c7e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java @@ -9,6 +9,7 @@ import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -91,7 +92,7 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement if(nbt.hasKey("startingLevel")) this.startingLevel = nbt.getDouble("startingLevel"); - + if(nbt.hasKey("color")) this.color = RBMKColor.values()[nbt.getInteger("color")]; else @@ -108,6 +109,24 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement if(color != null) nbt.setInteger("color", color.ordinal()); } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.startingLevel); + if(this.color != null) + buf.writeInt(this.color.ordinal()); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.startingLevel = buf.readDouble(); + if(buf.isReadable(1)) { + int color = buf.readInt(); + this.color = RBMKColor.values()[MathHelper.clamp_int(color, 0, RBMKColor.values().length)]; + } + } public static enum RBMKColor { RED, diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java index bd7250cf7..e4134ab0c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java @@ -2,11 +2,13 @@ package com.hbm.tileentity.machine.rbmk; import api.hbm.fluid.IFluidStandardReceiver; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import cpw.mods.fml.common.Optional; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -15,6 +17,7 @@ import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; import java.util.List; @@ -101,6 +104,25 @@ public class TileEntityRBMKCooler extends TileEntityRBMKBase implements IFluidSt nbt.setInteger("cooled", this.lastCooled); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.tank.serialize(buf); + buf.writeInt(this.lastCooled); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.tank.deserialize(buf); + this.lastCooled = buf.readInt(); + } + + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.COOLER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java index 941fb9637..e54a5acbd 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java @@ -4,6 +4,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.container.ContainerRBMKHeater; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -17,6 +18,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -50,7 +52,7 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I if(!worldObj.isRemote) { feed.setType(0, slots); - + if(feed.getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = feed.getTankType().getTrait(FT_Heatable.class); HeatingStep step = trait.getFirstStep(); @@ -82,7 +84,7 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I super.updateEntity(); } - + protected DirPos[] getOutputPos() { if(worldObj.getBlock(xCoord, yCoord - 1, zCoord) == ModBlocks.rbmk_loader) { @@ -125,7 +127,21 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I feed.writeToNBT(nbt, "feed"); steam.writeToNBT(nbt, "steam"); } - + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.feed.serialize(buf); + this.steam.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.feed.deserialize(buf); + this.steam.deserialize(buf); + } + @Override public void onMelt(int reduce) { @@ -138,6 +154,11 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.HEATEX; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java index be66e767d..301f5bb1c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java @@ -4,14 +4,16 @@ import api.hbm.fluid.IFluidStandardReceiver; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidStandardReceiver { +public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidStandardReceiver, IBufPacketReceiver { public FluidTank water; @@ -61,6 +63,14 @@ public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidS this.water.writeToNBT(nbt, "tank"); } + public void serialize(ByteBuf buf) { + this.water.serialize(buf); + } + + public void deserialize(ByteBuf buf) { + this.water.deserialize(buf); + } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {water}; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java index 7abb95b12..7ce7c1e67 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKModerator extends TileEntityRBMKBase { - + @Override public void onMelt(int reduce) { @@ -17,6 +18,11 @@ public class TileEntityRBMKModerator extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.MODERATOR; + } + @Override public ColumnType getConsoleType() { return ColumnType.MODERATOR; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 81c74e75d..95a851736 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -4,6 +4,7 @@ import api.hbm.fluid.IFluidStandardSender; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.FluidStack; import com.hbm.inventory.container.ContainerRBMKOutgasser; import com.hbm.inventory.fluid.Fluids; @@ -17,6 +18,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -90,14 +92,13 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement } @Override - public void receiveFlux(NType type, double flux) { + public void receiveFlux(RBMKHandler.NeutronStream stream) { if(canProcess()) { - - if(type == NType.FAST) - flux *= 0.2D; - - progress += flux * RBMKDials.getOutgasserMod(worldObj); + + double efficiency = Math.min((1 - stream.fluxRatio) * 0.8, 1); + + progress += stream.fluxQuantity * efficiency * RBMKDials.getOutgasserMod(worldObj); if(progress > duration) { process(); @@ -165,6 +166,11 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OUTGASSER; + } + @Override public ColumnType getConsoleType() { return ColumnType.OUTGASSER; @@ -196,6 +202,20 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement this.gas.writeToNBT(nbt, "gas"); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.gas.serialize(buf); + buf.writeDouble(this.progress); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.gas.deserialize(buf); + this.progress = buf.readDouble(); + } + @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { return OutgasserRecipes.getOutput(itemStack) != null && i == 0; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java index 259ac0b4c..0dc4cd89b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java @@ -4,14 +4,16 @@ import api.hbm.fluid.IFluidStandardSender; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluidStandardSender { +public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluidStandardSender, IBufPacketReceiver { public FluidTank steam; @@ -61,6 +63,16 @@ public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluid this.steam.writeToNBT(nbt, "tank"); } + @Override + public void serialize(ByteBuf buf) { + this.steam.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + this.steam.deserialize(buf); + } + public void fillFluidInit() { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.sendFluid(steam, worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java index ed5b1afc0..79e40867b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKReflector extends TileEntityRBMKBase { @@ -17,6 +18,11 @@ public class TileEntityRBMKReflector extends TileEntityRBMKBase { super.onMelt(reduce); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.REFLECTOR; + } + @Override public ColumnType getConsoleType() { return ColumnType.REFLECTOR; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 70750e00a..e62ee4379 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -5,13 +5,14 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.blocks.machine.rbmk.RBMKRod; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.neutron.NeutronStream; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.inventory.container.ContainerRBMKRod; import com.hbm.inventory.gui.GUIRBMKRod; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRBMKRod; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; -import com.hbm.util.Compat; import com.hbm.util.CompatEnergyControl; import com.hbm.util.ParticleUtil; @@ -19,6 +20,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -28,8 +30,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -38,10 +40,12 @@ import java.util.List; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBMKFluxReceiver, IRBMKLoadable, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent { - - //amount of "neutron energy" buffered for the next tick to use for the reaction - public double fluxFast; - public double fluxSlow; + + // New system!! + // Used for receiving flux (calculating outbound flux/burning rods) + public double fluxRatio; + public double fluxQuantity; + public boolean hasRod; public TileEntityRBMKRod() { @@ -52,243 +56,167 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public String getName() { return "container.rbmkRod"; } - + @Override public boolean isModerated() { return ((RBMKRod)this.getBlockType()).moderated; } - + @Override public int trackingRange() { return 25; } - @SuppressWarnings("incomplete-switch") //shut the fuck up @Override - public void receiveFlux(NType type, double flux) { - - switch(type) { - case FAST: this.fluxFast += flux; break; - case SLOW: this.fluxSlow += flux; break; - } + public void receiveFlux(NeutronStream stream) { + double fastFlux = this.fluxQuantity * this.fluxRatio; + double fastFluxIn = stream.fluxQuantity * stream.fluxRatio; + + this.fluxQuantity += stream.fluxQuantity; + fluxRatio = (fastFlux + fastFluxIn) / fluxQuantity; } - + @Override public void updateEntity() { if(!worldObj.isRemote) { - + if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { - + ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); - + double fluxIn = fluxFromType(rod.nType); - double fluxOut = rod.burn(worldObj, slots[0], fluxIn); + double fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); + double fluxRatioOut; NType rType = rod.rType; - + if(rType == NType.SLOW) + fluxRatioOut = 0; + else + fluxRatioOut = 1; + rod.updateHeat(worldObj, slots[0], 1.0D); this.heat += rod.provideHeat(worldObj, slots[0], heat, 1.0D); - + if(!this.hasLid()) { - ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) ((this.fluxFast + this.fluxSlow) * 0.05F)); + ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) (this.fluxQuantity * 0.05F)); } - + super.updateEntity(); - + if(this.heat > this.maxHeat()) { - + if(RBMKDials.getMeltdownsDisabled(worldObj)) { ParticleUtil.spawnGasFlame(worldObj, xCoord + 0.5, yCoord + RBMKDials.getColumnHeight(worldObj) + 0.5, zCoord + 0.5, 0, 0.2, 0); } else { this.meltdown(); } - this.fluxFast = 0; - this.fluxSlow = 0; + this.fluxQuantity = 0; return; } - - if(this.heat > 10_000) this.heat = 10_000; - - //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back - this.fluxFast = 0; - this.fluxSlow = 0; - this.worldObj.theProfiler.startSection("rbmkRod_flux_spread"); - spreadFlux(rType, fluxOut); - this.worldObj.theProfiler.endSection(); - + if(this.heat > 10_000) this.heat = 10_000; + + //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back + this.fluxQuantity = 0; + spreadFlux(fluxQuantityOut, fluxRatioOut); + hasRod = true; - + } else { - this.fluxFast = 0; - this.fluxSlow = 0; - + this.fluxQuantity = 0; + this.fluxRatio = 0; + hasRod = false; - + super.updateEntity(); } } } - - /** - * SLOW: full efficiency for slow neutrons, fast neutrons have half efficiency - * FAST: fast neutrons have 100% efficiency, slow only 30% - * ANY: just add together whatever we have because who cares - * @param type - * @return - */ - + private double fluxFromType(NType type) { - + + switch(type) { - case SLOW: return this.fluxFast * 0.5D + this.fluxSlow; - case FAST: return this.fluxFast + this.fluxSlow * 0.3D; - case ANY: return this.fluxFast + this.fluxSlow; + case SLOW: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.5, 1)); + case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min((1 - this.fluxRatio) * 0.3, 1)); + case ANY: return this.fluxQuantity; } - + return 0.0D; } - + public static final ForgeDirection[] fluxDirs = new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.EAST, ForgeDirection.SOUTH, ForgeDirection.WEST }; - - protected static NType stream; - - protected void spreadFlux(NType type, double fluxOut) { - - int range = RBMKDials.getFluxRange(worldObj); - - for(ForgeDirection dir : fluxDirs) { - - stream = type; - double flux = fluxOut; - - for(int i = 1; i <= range; i++) { - - flux = runInteraction(xCoord + dir.offsetX * i, yCoord, zCoord + dir.offsetZ * i, flux); - - if(flux <= 0) - break; - } - } - } - - protected double runInteraction(int x, int y, int z, double flux) { - - TileEntity te = Compat.getTileStandard(worldObj, x, y, z); - - if(te instanceof TileEntityRBMKBase) { - TileEntityRBMKBase base = (TileEntityRBMKBase) te; - - if(!base.hasLid()) - ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) (flux * 0.05F)); - - if(base.isModerated()) { - this.stream = NType.SLOW; - } - } - //burn baby burn - if(te instanceof TileEntityRBMKRod) { - TileEntityRBMKRod rod = (TileEntityRBMKRod)te; - - if(rod.getStackInSlot(0) != null && rod.getStackInSlot(0).getItem() instanceof ItemRBMKRod) { - rod.receiveFlux(stream, flux); - return 0; - } else { - return flux; - } + protected static NType stream; + + public void spreadFlux(double flux, double ratio) { + + for(ForgeDirection dir : fluxDirs) { + + Vec3 neutronVector = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); + + new NeutronStream(RBMKNeutronHandler.makeNode(this), neutronVector, flux, ratio); + // Create new neutron streams } - - if(te instanceof TileEntityRBMKOutgasser) { - TileEntityRBMKOutgasser rod = (TileEntityRBMKOutgasser)te; - - if(!rod.canProcess()) { - return flux; - } - } - - if(te instanceof IRBMKFluxReceiver) { - IRBMKFluxReceiver rod = (IRBMKFluxReceiver)te; - rod.receiveFlux(stream, flux); - return 0; - } - - //multiply neutron count with rod setting - if(te instanceof TileEntityRBMKControl) { - TileEntityRBMKControl control = (TileEntityRBMKControl)te; - - if(control.getMult() == 0.0D) - return 0; - - flux *= control.getMult(); - - return flux; - } - - //set neutrons to slow - if(te instanceof TileEntityRBMKModerator) { - stream = NType.SLOW; - return flux; - } - - //return the neutrons back to this with no further action required - if(te instanceof TileEntityRBMKReflector) { - this.receiveFlux(this.isModerated() ? NType.SLOW : stream, flux); - return 0; - } - - //break the neutron flow and nothign else - if(te instanceof TileEntityRBMKAbsorber) { - return 0; - } - - if(te instanceof TileEntityRBMKBase) { - return flux; - } - - int limit = RBMKDials.getColumnHeight(worldObj); - int hits = 0; - for(int h = 0; h <= limit; h++) { - - if(!worldObj.getBlock(x, y + h, z).isOpaqueCube()) - hits++; - } - - if(hits > 0) - ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, (float) (flux * 0.05F * hits / (float)limit)); - - return 0; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - this.fluxFast = nbt.getDouble("fluxFast"); - this.fluxSlow = nbt.getDouble("fluxSlow"); + if(nbt.hasKey("fluxFast") || nbt.hasKey("fluxSlow")) { + // recalculate new values to keep stable operations + this.fluxQuantity = nbt.getDouble("fluxFast") + nbt.getDouble("fluxSlow"); + if(this.fluxQuantity > 0) + this.fluxRatio = nbt.getDouble("fluxFast") / fluxQuantity; + else + this.fluxRatio = 0; + nbt.removeTag("fluxSlow"); + nbt.removeTag("fluxFast"); + writeToNBT(nbt); + } else { + this.fluxQuantity = nbt.getDouble("fluxQuantity"); + this.fluxRatio = nbt.getDouble("fluxRatio"); + } this.hasRod = nbt.getBoolean("hasRod"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxFast", this.fluxFast); - nbt.setDouble("fluxSlow", this.fluxSlow); + nbt.setDouble("fluxQuantity", this.fluxQuantity); + nbt.setDouble("fluxRatio", this.fluxRatio); nbt.setBoolean("hasRod", this.hasRod); } - + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.fluxQuantity); + buf.writeDouble(this.fluxRatio); + buf.writeBoolean(this.hasRod); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.fluxQuantity = buf.readDouble(); + this.fluxRatio = buf.readDouble(); + this.hasRod = buf.readBoolean(); + } + public void getDiagData(NBTTagCompound nbt) { this.writeToNBT(nbt); - + if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { - + ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); nbt.setString("f_yield", rod.getYield(slots[0]) + " / " + rod.yield + " (" + (rod.getEnrichment(slots[0]) * 100) + "%)"); @@ -296,55 +224,60 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM nbt.setString("f_heat", rod.getCoreHeat(slots[0]) + " / " + rod.getHullHeat(slots[0]) + " / " + rod.meltingPoint); } } - + @Override public void onMelt(int reduce) { boolean moderated = this.isModerated(); int h = RBMKDials.getColumnHeight(worldObj); reduce = MathHelper.clamp_int(reduce, 1, h); - + if(worldObj.rand.nextInt(3) == 0) reduce++; - + boolean corium = slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod; - - if(corium && slots[0].getItem() == ModItems.rbmk_fuel_drx) + + if(corium && slots[0].getItem() == ModItems.rbmk_fuel_drx) RBMKBase.digamma = true; - + slots[0] = null; if(corium) { - + for(int i = h; i >= 0; i--) { worldObj.setBlock(xCoord, yCoord + i, zCoord, ModBlocks.corium_block, 5, 3); worldObj.markBlockForUpdate(xCoord, yCoord + i, zCoord); } - + int count = 1 + worldObj.rand.nextInt(RBMKDials.getColumnHeight(worldObj)); - + for(int i = 0; i < count; i++) { spawnDebris(DebrisType.FUEL); } } else { this.standardMelt(reduce); } - + if(moderated) { - + int count = 2 + worldObj.rand.nextInt(2); - + for(int i = 0; i < count; i++) { spawnDebris(DebrisType.GRAPHITE); } } - + spawnDebris(DebrisType.ELEMENT); - + if(this.getBlockMetadata() == RBMKBase.DIR_NORMAL_LID.ordinal() + RBMKBase.offset) spawnDebris(DebrisType.LID); } + @Override + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.ROD; + } + @Override public ColumnType getConsoleType() { return ColumnType.FUEL; @@ -353,9 +286,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM @Override public NBTTagCompound getNBTForConsole() { NBTTagCompound data = new NBTTagCompound(); - + if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { - + ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); data.setDouble("enrichment", rod.getEnrichment(slots[0])); data.setDouble("xenon", rod.getPoison(slots[0])); @@ -363,7 +296,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM data.setDouble("c_coreHeat", rod.getCoreHeat(slots[0])); data.setDouble("c_maxHeat", rod.meltingPoint); } - + return data; } @@ -393,7 +326,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM slots[0] = null; this.markDirty(); } - + // do some opencomputer stuff @Override @Optional.Method(modid = "OpenComputers") @@ -409,16 +342,16 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM @Callback(direct = true) @Optional.Method(modid = "OpenComputers") - public Object[] getFluxSlow(Context context, Arguments args) { - return new Object[] {fluxSlow}; + public Object[] getFluxQuantity(Context context, Arguments args) { + return new Object[] {fluxQuantity}; } @Callback(direct = true) @Optional.Method(modid = "OpenComputers") - public Object[] getFluxFast(Context context, Arguments args) { - return new Object[] {fluxFast}; + public Object[] getFluxRatio(Context context, Arguments args) { + return new Object[] {fluxRatio}; } - + @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getDepletion(Context context, Arguments args) { @@ -480,7 +413,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM return new Object[] { heat, returnValues.get(0), returnValues.get(1), - fluxSlow, fluxFast, returnValues.get(2), returnValues.get(3), returnValues.get(4), + fluxQuantity, fluxRatio, returnValues.get(2), returnValues.get(3), returnValues.get(4), ((RBMKRod)this.getBlockType()).moderated, xCoord, yCoord, zCoord}; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index e8e284a07..7114db0c7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -1,7 +1,9 @@ package com.hbm.tileentity.machine.rbmk; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.util.Vec3; public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { @@ -16,40 +18,17 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { } @Override - protected void spreadFlux(NType type, double fluxOut) { + public void spreadFlux(double flux, double ratio) { - int range = RBMKDials.getReaSimRange(worldObj); int count = RBMKDials.getReaSimCount(worldObj); - - Vec3 dir = Vec3.createVectorHelper(1, 0, 0); - - for(int i = 0; i < count; i++) { - - stream = type; - double flux = fluxOut * RBMKDials.getReaSimOutputMod(worldObj); - - dir.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - - for(int j = 1; j <= range; j++) { - int x = (int)Math.floor(0.5 + dir.xCoord * j); - int z = (int)Math.floor(0.5 + dir.zCoord * j); - int lastX = (int)Math.floor(0.5 + dir.xCoord * (j - 1)); - int lastZ = (int)Math.floor(0.5 + dir.zCoord * (j - 1)); - - //skip if the position is on the rod itself - if(x == 0 && z == 0) - continue; - - //skip if the current position is equal to the last position - if(x == lastX && z == lastZ) - continue; - - flux = runInteraction(xCoord + x, yCoord, zCoord + z, flux); - - if(flux <= 0) - break; - } + for (int i = 0; i < count; i++) { + Vec3 neutronVector = Vec3.createVectorHelper(1, 0, 0); + + neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + + new RBMKHandler.NeutronStream(RBMKHandler.makeNode(this), neutronVector, flux, ratio); + // Create new neutron streams } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java index a670b6c09..ac8621882 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine.rbmk; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.container.ContainerRBMKStorage; import com.hbm.inventory.gui.GUIRBMKStorage; import com.hbm.items.machine.ItemRBMKRod; @@ -40,6 +41,11 @@ public class TileEntityRBMKStorage extends TileEntityRBMKSlottedBase implements super.updateEntity(); } + @Override + public RBMKHandler.RBMKType getRBMKType() { + return RBMKHandler.RBMKType.OTHER; + } + @Override public ColumnType getConsoleType() { return ColumnType.STORAGE; From 3e487dd5288fca8ba87f7c697147e11ef2e0939c Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:30:34 -0500 Subject: [PATCH 19/70] fuck! --- src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index e8f2867bb..7f4874c50 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -57,7 +57,7 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_REASIM_BOILER_SPEED, "0.05"); rules.setOrCreateGameRule(KEY_DISABLE_MELTDOWNS, "false"); rules.setOrCreateGameRule(KEY_ENABLE_MELTDOWN_OVERPRESSURE, "false"); - rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1"); + rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1.0"); } } From e32f67c2b2f9842d9004349ab77cdfc6e2806716 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 19 Aug 2024 19:11:54 -0500 Subject: [PATCH 20/70] this is fucking insane dude RBMK optimization update soon!!!!!!! --- .../java/api/hbm/energymk2/Nodespace.java | 1 + .../com/hbm/blocks/machine/rbmk/RBMKBase.java | 8 + .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 316 +++++++++++------- .../com/hbm/items/machine/ItemRBMKLid.java | 10 +- .../java/com/hbm/main/ModEventHandler.java | 8 +- .../machine/rbmk/TileEntityRBMKBase.java | 1 + .../machine/rbmk/TileEntityRBMKOutgasser.java | 2 +- .../machine/rbmk/TileEntityRBMKRod.java | 19 +- .../rbmk/TileEntityRBMKSlottedBase.java | 4 - 9 files changed, 234 insertions(+), 135 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index cdc618f51..07a5b94b2 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -8,6 +8,7 @@ import java.util.Set; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import cpw.mods.fml.common.gameevent.TickEvent; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java index 1293874a8..55975c521 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java @@ -3,6 +3,7 @@ package com.hbm.blocks.machine.rbmk; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.handler.MultiblockHandlerXR; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRBMKLid; import com.hbm.lib.RefStrings; @@ -11,6 +12,7 @@ import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; import api.hbm.block.IToolable; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -27,6 +29,8 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; + public abstract class RBMKBase extends BlockDummyable implements IToolable, ILookOverlay { public static boolean dropLids = true; @@ -170,6 +174,10 @@ public abstract class RBMKBase extends BlockDummyable implements IToolable, ILoo int i = rbmk.getBlockMetadata(); if(rbmk.hasLid() && rbmk.isLidRemovable()) { + + RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + if (node != null) + node.removeLid(); if(!world.isRemote) { if(i == DIR_NORMAL_LID.ordinal() + offset) { diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 03d369ae6..1b92d92a6 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -4,13 +4,16 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.util.fauxpointtwelve.BlockPos; -import net.minecraft.block.Block; -import net.minecraft.server.MinecraftServer; + +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraft.world.World; - -import java.util.*; +import net.minecraftforge.common.util.ForgeDirection; public class RBMKHandler { @@ -30,6 +33,10 @@ public class RBMKHandler { OTHER // why do neutron calculations on them if they won't change anything? } + private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { + return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + } + public static class RBMKNode { protected RBMKType type; @@ -40,16 +47,66 @@ public class RBMKHandler { this.type = type; this.tile = tile; this.hasLid = tile.hasLid(); - addNode(this); + } + + public void addLid() { + this.hasLid = true; + } + + public void removeLid() { + this.hasLid = false; + } + + public void checkNode(BlockPos pos) { + + if (tile == null) + removeNode(pos); // what the fuck??? + + if (tile.isInvalid()) + removeNode(pos); + + if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; + if (!rod.hasRod) { + + // Simulate streams coming out of the RBMK rod find nodes to uncache. + + for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { + NeutronStream stream = new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ)); + + List nodes = stream.getNodes(false); + for (RBMKNode nodeToRemove : nodes) + removeNode(new BlockPos(nodeToRemove.tile)); + } + } + } + + // TODO: Implement `hasRodInRange` for non-rod tile uncaching. } } - private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { - return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + public static RBMKNode makeNode(TileEntityRBMKBase tile) { + BlockPos pos = new BlockPos(tile); + if (nodeCache.containsKey(pos)) + return getNode(pos); + return new RBMKNode(tile, tile.getRBMKType()); } - public static RBMKNode makeNode(TileEntityRBMKBase tile) { - return new RBMKNode(tile, tile.getRBMKType()); + public static class StreamWorld { + + List streams; + + public StreamWorld() { + streams = new ArrayList<>(); + } + + public void addStream(NeutronStream stream) { + this.streams.add(stream); + } + + public void removeAllStreams() { + this.streams.clear(); + } } public static class NeutronStream { @@ -66,12 +123,25 @@ public class RBMKHandler { // Vector for direction of neutron flow. public Vec3 vector; + // Primarily used as a "dummy stream", not to be added to the streams list. + public NeutronStream(RBMKNode origin, Vec3 vector) { + this.origin = origin; + this.vector = vector; + } + public NeutronStream(RBMKNode origin, Vec3 vector, double flux, double ratio) { this.origin = origin; this.vector = vector; this.fluxQuantity = flux; this.fluxRatio = ratio; - streams.put(this, origin.tile.getWorldObj()); + World worldObj = origin.tile.getWorldObj(); + if (streamWorlds.get(worldObj) != null) + streamWorlds.get(worldObj).addStream(this); + else { + StreamWorld world = new StreamWorld(); + world.addStream(this); + streamWorlds.put(worldObj, world); + } } public List getBlocks() { @@ -90,7 +160,7 @@ public class RBMKHandler { // This, however, is used for actual RBMK flux calculations. // Does NOT include the origin node // USES THE CACHE!!! - public List getNodes() { + public List getNodes(boolean cache) { List positions = new ArrayList<>(); for (int i = 1; i <= fluxRange; i++) { @@ -99,24 +169,18 @@ public class RBMKHandler { BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - if (nodeCache.containsKey(pos)) { - positions.add(nodeCache.get(pos)); - continue; - } + if (nodeCache.containsKey(pos) && cache) + positions.add(getNode(pos)); - // If it isn't an RBMK block then don't do anything with it - if(!(origin.tile.getBlockType() instanceof RBMKBase)) - continue; - - TileEntity te = blockPosToTE(origin.tile.getWorldObj(), pos); - - if (te instanceof TileEntityRBMKBase) { - TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase) te; - RBMKType type = rbmkBase.getRBMKType(); - // they should ALL be RBMKBase TEs - RBMKNode node = new RBMKNode(rbmkBase, type); - positions.add(node); - addNode(node); + else if (this.origin.tile.getBlockType() instanceof RBMKBase) { + TileEntity te = blockPosToTE(this.origin.tile.getWorldObj(), pos); + if (te instanceof TileEntityRBMKBase) { + TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase)te; + RBMKNode node = makeNode(rbmkBase); + positions.add(node); + if (cache) + addNode(node); + } } } return positions; @@ -143,6 +207,7 @@ public class RBMKHandler { } int moderatedCount = 0; + double totalFluxMod = 1; for(BlockPos nodePos : getBlocks()) { @@ -152,33 +217,28 @@ public class RBMKHandler { RBMKNode node = nodeCache.get(nodePos); if(node == null) { - TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow? + TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow?? if (te instanceof TileEntityRBMKBase) { node = makeNode((TileEntityRBMKBase) te); addNode(node); // whoops! - } else - return; // TE no longer exists, die!! + } else { + int hits = getHits(nodePos); // Get the amount of hits on blocks. + if (hits == columnHeight) // If stream is fully blocked. + return; + else if (hits > 0) { // If stream is partially blocked. + irradiateFromFlux(pos, hits); + fluxQuantity *= 1 - ((double) hits / columnHeight); // Inverse to get partial blocking by blocks. + continue; + } else { // Nothing hit! + irradiateFromFlux(pos, 0); + continue; + } + } } if(node.type == RBMKType.OTHER) // pass right on by! continue; - Block block = node.tile.getBlockType(); - - if (!(block instanceof RBMKBase)) { - int hits = getHits(nodePos); // Get the amount of hits on blocks. - if (hits == columnHeight) // If stream is fully blocked. - return; - else if (hits > 0) { // If stream is partially blocked. - irradiateFromFlux(pos, hits); - fluxQuantity *= 1 - ((double) hits / columnHeight); // Inverse to get partial blocking by blocks. - continue; - } else { // Nothing hit! - irradiateFromFlux(pos, 0); - continue; - } - } - // we established earlier during `getNodes()` that they should all be RBMKBase TEs // no issue with casting here! TileEntityRBMKBase nodeTE = node.tile; @@ -186,17 +246,17 @@ public class RBMKHandler { if(!node.hasLid) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if(node.type == RBMKType.MODERATOR) { - moderatedCount += 1; + if (node.type == RBMKHandler.RBMKType.MODERATOR) { + moderatedCount++; moderateStream(); } - if(node.tile instanceof IRBMKFluxReceiver) { - IRBMKFluxReceiver column = ((IRBMKFluxReceiver) nodeTE); - if(node.type == RBMKType.ROD) { - TileEntityRBMKRod rod = ((TileEntityRBMKRod) column); - if(rod.hasRod) { - if(rod.isModerated()) + if (nodeTE instanceof IRBMKFluxReceiver) { + IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; + if (node.type == RBMKHandler.RBMKType.ROD) { + TileEntityRBMKRod rod = (TileEntityRBMKRod)column; + if (rod.hasRod) { + if (rod.isModerated()) moderateStream(); rod.receiveFlux(this); return; @@ -208,67 +268,54 @@ public class RBMKHandler { return; } } - } - else if(node.type == RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = ((TileEntityRBMKControl) nodeTE); - if (rod.level > 0D) - fluxQuantity *= ((TileEntityRBMKControl) nodeTE).getMult(); - else - return; - } - - else if(node.type == RBMKType.REFLECTOR) { - if((origin.tile).isModerated()) - moderatedCount += 1; - if (fluxRatio > 0D && moderatedCount > 0) { - for (int i = 0; i < moderatedCount; i++) { - moderateStream(); // Moderate streams on the way back! - } - } - if(reflectorEfficiency != 1) { - fluxQuantity *= reflectorEfficiency; - } else { - ((TileEntityRBMKRod) originTE).receiveFlux(this); - // this one missing return line was baffling me for half an hour - // "why is this rod jumping to double the flux randomly????" - // because you aren't fucking returning from the function, and it's hitting the reflector after it, you idiot - return; + } else if (node.type == RBMKHandler.RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = (TileEntityRBMKControl)nodeTE; + if (rod.level > 0.0D) { + this.fluxQuantity *= rod.getMult(); + totalFluxMod *= rod.getMult(); + continue; } + return; } - else if(node.type == RBMKType.ABSORBER) { - if (absorberEfficiency == 1) - return; // Instantly stop stream processing. - else - fluxQuantity *= absorberEfficiency; + if (node.type == RBMKHandler.RBMKType.REFLECTOR) { + if (this.origin.tile.isModerated()) + moderatedCount++; + if (this.fluxRatio > 0 && moderatedCount > 0) + for (int i = 0; i < moderatedCount; i++) + moderateStream(); + if (totalFluxMod < 1) + this.fluxQuantity *= totalFluxMod; + if (RBMKHandler.reflectorEfficiency != 1.0D) { + this.fluxQuantity *= RBMKHandler.reflectorEfficiency; + continue; + } + ((TileEntityRBMKRod)originTE).receiveFlux(this); + return; + } + if (node.type == RBMKHandler.RBMKType.ABSORBER) { + if (RBMKHandler.absorberEfficiency == 1) + return; + this.fluxQuantity *= RBMKHandler.absorberEfficiency; } } - // Called *after* most streams have returned. - List nodes = getNodes(); - - if(nodes.isEmpty()) // how tf did we get here if its empty + List nodes = getNodes(true); + if (nodes.isEmpty()) return; - // Get the last node in the stream. - RBMKNode lastNode = nodes.get(nodes.size() - 1); + RBMKHandler.RBMKNode lastNode = nodes.get(nodes.size() - 1); - // Block hits don't have to be considered here, since if it's fully blocked it'll return the function before getting here. - if(lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) { - // Neutrons must not have been caught then! - irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); - } + if (lastNode.type != RBMKHandler.RBMKType.REFLECTOR && lastNode.type != RBMKHandler.RBMKType.ABSORBER && lastNode.type != RBMKHandler.RBMKType.CONTROL_ROD) + irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); - // but oh wait, control rods exist - if(lastNode.type == RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = ((TileEntityRBMKControl) lastNode.tile); - // just get level and irradiate based on that - if(rod.getMult() > 0D) { - fluxQuantity = fluxQuantity * rod.getMult(); - irradiateFromFlux(new BlockPos(lastNode.tile).add(vector.xCoord, 0, vector.zCoord)); + if (lastNode.type == RBMKHandler.RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = (TileEntityRBMKControl)lastNode.tile; + if (rod.getMult() > 0.0D) { + this.fluxQuantity *= rod.getMult(); + irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); } - } } @@ -279,8 +326,8 @@ public class RBMKHandler { // holy fucking shit // I have had this one line cause me like tens of problems // I FUCKING HATE THIS - // total count of bugs fixed attributed to this function: 6 - if (!origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) + // total count of bugs fixed attributed to this function: 10 + if (origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) hits += 1; } @@ -296,16 +343,20 @@ public class RBMKHandler { } public void moderateStream() { - fluxRatio = fluxRatio * (1 - moderatorEfficiency); + fluxRatio *= (1 - moderatorEfficiency); } } + // List of all stream worlds. + public static HashMap streamWorlds = new HashMap<>(); + + public static void removeAllWorlds() { + streamWorlds.clear(); + } + // HashMap of all RBMK nodes and their positions. protected static HashMap nodeCache = new HashMap<>(); - // List of all active neutron streams. - public static HashMap streams = new HashMap<>(); - public static void addNode(RBMKNode node) { nodeCache.put(new BlockPos(node.tile), node); } @@ -314,26 +365,47 @@ public class RBMKHandler { nodeCache.remove(position); } + public static RBMKNode getNode(BlockPos position) { + return nodeCache.get(position); + } + + public static void removeAllNodes() { + nodeCache.clear(); + } + + static int cacheTime = 40; + static int ticks = 0; + // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { - for (World worldObj : MinecraftServer.getServer().worldServers) { + for (Entry world : streamWorlds.entrySet()) { + // Gamerule caching because this apparently is kinda slow? // meh, good enough - reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(); - absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(); - moderatorEfficiency = RBMKDials.getModeratorEfficiency(worldObj); + reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(world.worldObj); + absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(world.worldObj); + moderatorEfficiency = RBMKDials.getModeratorEfficiency(world.getKey()); + // I hate this. // this broke everything because it was ONE OFF // IT'S NOT THE TOTAL HEIGHT IT'S THE AMOUNT OF BLOCKS ABOVE AAAAAAAAAAAAA - columnHeight = RBMKDials.getColumnHeight(worldObj) + 1; - fluxRange = RBMKDials.getFluxRange(worldObj); - streams.forEach((stream, world) -> { - if (world == worldObj) - // WOO!! - stream.runStreamInteraction(world); - }); + columnHeight = RBMKDials.getColumnHeight(world.getKey()) + 1; + fluxRange = RBMKDials.getFluxRange(world.getKey()); + + for (NeutronStream stream : world.getValue().streams) { + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreams(); } - streams.clear(); + + // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage. + if (ticks >= cacheTime) { + ticks = 0; + for(Entry cachedNode : nodeCache.entrySet()) { + cachedNode.getValue().checkNode(cachedNode.getKey()); + } + } + ticks++; } } diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java index 1c1490798..c2e215307 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java @@ -2,9 +2,11 @@ package com.hbm.items.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.rbmk.RBMKBase; +import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.items.ModItems; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -13,6 +15,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; + public class ItemRBMKLid extends Item { @Override @@ -37,7 +41,11 @@ public class ItemRBMKLid extends Item { if(tile.hasLid()) return false; - + + RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + if (node != null) + node.addLid(); + int meta = RBMKBase.DIR_NORMAL_LID.ordinal(); if(this == ModItems.rbmk_lid_glass) { diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 2f3b4ff4c..74238ed6b 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -535,6 +535,12 @@ public class ModEventHandler { public void onLoad(WorldEvent.Load event) { BobmazonOfferFactory.init(); } + + @SubscribeEvent + public void onUnload(WorldEvent.Unload event) { + RBMKHandler.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. + RBMKHandler.removeAllNodes(); // Remove all nodes. + } public static boolean didSit = false; public static Field reference = null; @@ -1146,9 +1152,7 @@ public class ModEventHandler { TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); // RBMK!!!! - MinecraftServer.getServer().theProfiler.startSection("rbmkHandler_flux_interaction"); RBMKHandler.runAllInteractions(); - MinecraftServer.getServer().theProfiler.endSection(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 4c85c3aff..1c9961357 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -19,6 +19,7 @@ import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.Compat; +import com.hbm.util.GameRuleHelper; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 95a851736..3b701fc0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -96,7 +96,7 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement if(canProcess()) { - double efficiency = Math.min((1 - stream.fluxRatio) * 0.8, 1); + double efficiency = Math.min(1 - stream.fluxRatio * 0.8, 1); progress += stream.fluxQuantity * efficiency * RBMKDials.getOutgasserMod(worldObj); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index e62ee4379..160ab4992 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -17,6 +17,7 @@ import com.hbm.util.CompatEnergyControl; import com.hbm.util.ParticleUtil; import api.hbm.tile.IInfoProviderEC; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -139,7 +140,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM switch(type) { case SLOW: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.5, 1)); - case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min((1 - this.fluxRatio) * 0.3, 1)); + case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min(1 - this.fluxRatio * 0.3, 1)); case ANY: return this.fluxQuantity; } @@ -153,16 +154,24 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM ForgeDirection.WEST }; - protected static NType stream; - public void spreadFlux(double flux, double ratio) { + BlockPos pos = new BlockPos(this); + + RBMKHandler.RBMKNode node; + + if(getNode(pos) == null) { + node = RBMKHandler.makeNode(this); + addNode(node); + } else + node = getNode(pos); + for(ForgeDirection dir : fluxDirs) { Vec3 neutronVector = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); - - new NeutronStream(RBMKNeutronHandler.makeNode(this), neutronVector, flux, ratio); + // Create new neutron streams + new RBMKNeutronStream(node, neutronVector, flux, ratio); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java index 5b2e0b519..8ad47d4af 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java @@ -134,10 +134,6 @@ public abstract class TileEntityRBMKSlottedBase extends TileEntityRBMKActiveBase PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - } - public void handleButtonPacket(int value, int meta) { } From 639822b48d7e543afdcf9278771e319e5e0a0e0d Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:10:20 -0500 Subject: [PATCH 21/70] hooolyyyy shiiiiiiiit i finally fixed the bug!!!!!!!!!! --- .../handler/rbmkmk2/ItemRBMKRodFluxCurve.java | 55 ++++++++++++++++++ .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 43 ++++++++++---- .../java/com/hbm/hazard/HazardRegistry.java | 1 + src/main/java/com/hbm/items/ModItems.java | 14 +++++ .../machine/rbmk/TileEntityRBMKRod.java | 57 ++++++++++++++----- 5 files changed, 143 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java diff --git a/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java b/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java new file mode 100644 index 000000000..457638a76 --- /dev/null +++ b/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java @@ -0,0 +1,55 @@ +package com.hbm.handler.rbmkmk2; + +import com.hbm.items.machine.ItemRBMKPellet; +import com.hbm.items.machine.ItemRBMKRod; +import net.minecraft.util.MathHelper; + +import java.util.function.BiFunction; +import java.util.function.Function; + + +public class ItemRBMKRodFluxCurve extends ItemRBMKRod { + + /** Double 1: Flux ratio in. + * Double 2: Depletion value. + * Return double: Output flux ratio. + **/ + BiFunction ratioCurve; + + /** Double 1: Flux quantity in.
+ * Double 2: Flux ratio in.
+ * Return double: Output flux quantity. + **/ + BiFunction fluxCurve; + + public ItemRBMKRodFluxCurve(ItemRBMKPellet pellet) { + super(pellet); + } + + public ItemRBMKRodFluxCurve(String fullName) { + super(fullName); + } + + public ItemRBMKRodFluxCurve setOutputRatioCurve(Function func) { + this.ratioCurve = (fluxRatioIn, depletion) -> func.apply(fluxRatioIn) * 1.0D; + return this; + } + + public ItemRBMKRodFluxCurve setDepletionOutputRatioCurve(BiFunction func) { + this.ratioCurve = func; + return this; + } + + public ItemRBMKRodFluxCurve setOutputFluxCurve(BiFunction func) { + this.fluxCurve = func; + return this; + } + + public double fluxRatioOut(double fluxRatioIn, double depletion) { + return MathHelper.clamp_double(ratioCurve.apply(fluxRatioIn, depletion), 0, 1); + } + + public double fluxFromRatio(double quantity, double ratio) { + return fluxCurve.apply(quantity, ratio); + } +} diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 1b92d92a6..1661cb216 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -49,6 +49,12 @@ public class RBMKHandler { this.hasLid = tile.hasLid(); } + public RBMKNode(TileEntityRBMKBase tile, RBMKType type, boolean hasLid) { + this.type = type; + this.tile = tile; + this.hasLid = hasLid; + } + public void addLid() { this.hasLid = true; } @@ -57,13 +63,19 @@ public class RBMKHandler { this.hasLid = false; } - public void checkNode(BlockPos pos) { + public List checkNode(BlockPos pos) { - if (tile == null) - removeNode(pos); // what the fuck??? + List list = new ArrayList<>(); - if (tile.isInvalid()) - removeNode(pos); + if (tile == null) { + list.add(pos); // what the fuck??? + return list; + } + + if (tile.isInvalid()) { + list.add(pos); + return list; + } if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; @@ -76,11 +88,13 @@ public class RBMKHandler { List nodes = stream.getNodes(false); for (RBMKNode nodeToRemove : nodes) - removeNode(new BlockPos(nodeToRemove.tile)); + list.add(new BlockPos(nodeToRemove.tile)); } + return list; } } + return list; // TODO: Implement `hasRodInRange` for non-rod tile uncaching. } } @@ -89,6 +103,8 @@ public class RBMKHandler { BlockPos pos = new BlockPos(tile); if (nodeCache.containsKey(pos)) return getNode(pos); + if (!tile.hasWorldObj()) + return new RBMKNode(tile, tile.getRBMKType(), true); return new RBMKNode(tile, tile.getRBMKType()); } @@ -326,7 +342,7 @@ public class RBMKHandler { // holy fucking shit // I have had this one line cause me like tens of problems // I FUCKING HATE THIS - // total count of bugs fixed attributed to this function: 10 + // total count of bugs fixed attributed to this function: 11 if (origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) hits += 1; } @@ -373,8 +389,7 @@ public class RBMKHandler { nodeCache.clear(); } - static int cacheTime = 40; - static int ticks = 0; + private static int ticks = 0; // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { @@ -400,11 +415,15 @@ public class RBMKHandler { } // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage. + int cacheTime = 40; if (ticks >= cacheTime) { ticks = 0; - for(Entry cachedNode : nodeCache.entrySet()) { - cachedNode.getValue().checkNode(cachedNode.getKey()); - } + List toRemove = new ArrayList<>(); + for(Entry cachedNode : nodeCache.entrySet()) + toRemove.addAll(cachedNode.getValue().checkNode(cachedNode.getKey())); + + for(BlockPos pos : toRemove) + removeNode(pos); } ticks++; } diff --git a/src/main/java/com/hbm/hazard/HazardRegistry.java b/src/main/java/com/hbm/hazard/HazardRegistry.java index 0653efe8c..b8de08aa3 100644 --- a/src/main/java/com/hbm/hazard/HazardRegistry.java +++ b/src/main/java/com/hbm/hazard/HazardRegistry.java @@ -394,6 +394,7 @@ public class HazardRegistry { registerRBMKRod(rbmk_fuel_zfb_pu241, pu239 * rod_rbmk * 0.1F, wst * rod_rbmk * 7.5F); registerRBMKRod(rbmk_fuel_zfb_am_mix, pu241 * rod_rbmk * 0.1F, wst * rod_rbmk * 10F); registerRBMK(rbmk_fuel_drx, bf * rod_rbmk, bf * rod_rbmk * 100F, true, true, 0, 1F/3F); + registerRBMKRod(rbmk_fuel_curve, saf * rod_rbmk * np237 * rod_rbmk, wst * rod_rbmk * 35F); registerRBMKPellet(rbmk_pellet_ueu, u * billet, wst * billet * 20F); registerRBMKPellet(rbmk_pellet_meu, uf * billet, wst * billet * 21.5F); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d25b15108..4e99c505f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -7,6 +7,7 @@ import com.hbm.handler.ToolAbility; import com.hbm.handler.ToolAbility.LuckAbility; import com.hbm.handler.WeaponAbility; import com.hbm.handler.guncfg.*; +import com.hbm.handler.rbmkmk2.ItemRBMKRodFluxCurve; import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -64,6 +65,8 @@ import net.minecraftforge.common.util.EnumHelper; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; +import java.util.function.BiFunction; + public class ModItems { public static void mainRegistry() @@ -1129,6 +1132,7 @@ public class ModItems { public static ItemRBMKRod rbmk_fuel_zfb_am_mix; public static ItemRBMKRod rbmk_fuel_drx; public static ItemRBMKRod rbmk_fuel_test; + public static ItemRBMKRodFluxCurve rbmk_fuel_curve; public static ItemRBMKPellet rbmk_pellet_ueu; public static ItemRBMKPellet rbmk_pellet_meu; public static ItemRBMKPellet rbmk_pellet_heu233; @@ -3757,6 +3761,15 @@ public class ModItems { .setHeat(1.0D) .setMeltingPoint(100000) .setUnlocalizedName("rbmk_fuel_test").setTextureName(RefStrings.MODID + ":rbmk_fuel_test"); + rbmk_fuel_curve = (ItemRBMKRodFluxCurve) new ItemRBMKRodFluxCurve("3D curve test") + .setOutputFluxCurve((fluxQuantity, fluxRatio) -> fluxQuantity * (1 - Math.pow(fluxRatio, 2))) + .setDepletionOutputRatioCurve((ratioIn, depletion) -> Math.pow(ratioIn, 2) * depletion) + .setYield(1000000D) + .setStats(100) + .setFunction(EnumBurnFunc.EXPERIMENTAL) + .setHeat(1.0D) + .setMeltingPoint(100000) + .setUnlocalizedName("rbmk_fuel_curve").setTextureName(RefStrings.MODID + ":rbmk_fuel_curve"); watz_pellet = new ItemWatzPellet().setUnlocalizedName("watz_pellet").setTextureName(RefStrings.MODID + ":watz_pellet"); watz_pellet_depleted = new ItemWatzPellet().setUnlocalizedName("watz_pellet_depleted").setTextureName(RefStrings.MODID + ":watz_pellet"); @@ -6600,6 +6613,7 @@ public class ModItems { GameRegistry.registerItem(rbmk_fuel_zfb_am_mix, rbmk_fuel_zfb_am_mix.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_drx, rbmk_fuel_drx.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_test, rbmk_fuel_test.getUnlocalizedName()); + GameRegistry.registerItem(rbmk_fuel_curve, rbmk_fuel_curve.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_ueu, rbmk_pellet_ueu.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_meu, rbmk_pellet_meu.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 160ab4992..75388a8b7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -5,9 +5,9 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.blocks.machine.rbmk.RBMKRod; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; +import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.handler.neutron.NeutronStream; import com.hbm.handler.neutron.RBMKNeutronHandler; -import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.inventory.container.ContainerRBMKRod; import com.hbm.inventory.gui.GUIRBMKRod; import com.hbm.items.ModItems; @@ -46,6 +46,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM // Used for receiving flux (calculating outbound flux/burning rods) public double fluxRatio; public double fluxQuantity; + public double lastFluxQuantity; public boolean hasRod; @@ -86,14 +87,29 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); - double fluxIn = fluxFromType(rod.nType); - double fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); double fluxRatioOut; - NType rType = rod.rType; - if(rType == NType.SLOW) - fluxRatioOut = 0; - else - fluxRatioOut = 1; + double fluxQuantityOut; + + if (rod instanceof ItemRBMKRodFluxCurve) { // Experimental flux ratio curve rods! + ItemRBMKRodFluxCurve rodCurve = (ItemRBMKRodFluxCurve) rod; + + fluxRatioOut = rodCurve.fluxRatioOut(this.fluxRatio, ItemRBMKRod.getEnrichment(slots[0])); + + double fluxIn; + + fluxIn = rodCurve.fluxFromRatio(this.fluxQuantity, this.fluxRatio); + + fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); + } else { + NType rType = rod.rType; + if (rType == NType.SLOW) + fluxRatioOut = 0; + else + fluxRatioOut = 1; + + double fluxIn = fluxFromType(rod.nType); + fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); + } rod.updateHeat(worldObj, slots[0], 1.0D); this.heat += rod.provideHeat(worldObj, slots[0], heat, 1.0D); @@ -111,12 +127,15 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } else { this.meltdown(); } + this.lastFluxQuantity = 0; this.fluxQuantity = 0; return; } if(this.heat > 10_000) this.heat = 10_000; + this.lastFluxQuantity = this.fluxQuantity; + //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back this.fluxQuantity = 0; spreadFlux(fluxQuantityOut, fluxRatioOut); @@ -125,6 +144,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } else { + this.lastFluxQuantity = 0; this.fluxQuantity = 0; this.fluxRatio = 0; @@ -137,10 +157,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM private double fluxFromType(NType type) { - switch(type) { case SLOW: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.5, 1)); - case FAST: return (this.fluxQuantity * this.fluxRatio + Math.min(1 - this.fluxRatio * 0.3, 1)); + case FAST: return (this.fluxQuantity * (1 - this.fluxRatio) + Math.min(this.fluxRatio * 0.3, 1)); case ANY: return this.fluxQuantity; } @@ -169,7 +188,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM for(ForgeDirection dir : fluxDirs) { Vec3 neutronVector = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); - + // Create new neutron streams new RBMKNeutronStream(node, neutronVector, flux, ratio); } @@ -179,10 +198,10 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - if(nbt.hasKey("fluxFast") || nbt.hasKey("fluxSlow")) { + if (nbt.hasKey("fluxFast") || nbt.hasKey("fluxSlow")) { // recalculate new values to keep stable operations this.fluxQuantity = nbt.getDouble("fluxFast") + nbt.getDouble("fluxSlow"); - if(this.fluxQuantity > 0) + if (this.fluxQuantity > 0) this.fluxRatio = nbt.getDouble("fluxFast") / fluxQuantity; else this.fluxRatio = 0; @@ -196,10 +215,18 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.hasRod = nbt.getBoolean("hasRod"); } - @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + nbt.setDouble("fluxQuantity", this.lastFluxQuantity); + nbt.setDouble("fluxRatio", this.fluxRatio); + nbt.setBoolean("hasRod", this.hasRod); + } + + // aaaaaaa + public void writeToNBTDiag(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setDouble("fluxQuantity", this.fluxQuantity); nbt.setDouble("fluxRatio", this.fluxRatio); nbt.setBoolean("hasRod", this.hasRod); @@ -222,7 +249,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } public void getDiagData(NBTTagCompound nbt) { - this.writeToNBT(nbt); + this.writeToNBTDiag(nbt); if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { From 841852cc81d271292a15f52c4fa06294cdf31674 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:19:04 -0500 Subject: [PATCH 22/70] 99.999% there just some more optimization! (node culling) --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 104 ++++++++++++------ .../tileentity/machine/rbmk/RBMKDials.java | 24 +++- .../machine/rbmk/TileEntityRBMKRod.java | 15 ++- .../machine/rbmk/TileEntityRBMKRodReaSim.java | 21 +++- 4 files changed, 123 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 1661cb216..a2bd18e5f 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.Map.Entry; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; @@ -63,39 +64,72 @@ public class RBMKHandler { this.hasLid = false; } + public List getReaSimNodes(TileEntityRBMKRodReaSim rod) { + List list = new ArrayList<>(); + for (int x = rod.xCoord - fluxRange; x <= rod.xCoord + fluxRange; x++) + for (int z = rod.zCoord - fluxRange; z <= rod.zCoord + fluxRange; z++) + if ((x - rod.xCoord) * (x - rod.xCoord) + (z - rod.zCoord) * (z - rod.zCoord) <= fluxRange * fluxRange) + list.add(new BlockPos(rod)); + return list; + } + public List checkNode(BlockPos pos) { List list = new ArrayList<>(); - if (tile == null) { - list.add(pos); // what the fuck??? - return list; - } - - if (tile.isInvalid()) { + // Check if the tile no longer exists/is invalid. + if (tile == null || tile.isInvalid()) { list.add(pos); return list; } + List streams = new ArrayList<>(); + + // Simulate streams coming out of the RBMK rod. + for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { + streams.add(new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ))); + } + + // Check if the rod should uncache nodes. if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; - if (!rod.hasRod) { + if (!rod.hasRod || rod.fluxQuantity == 0) { - // Simulate streams coming out of the RBMK rod find nodes to uncache. - - for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { - NeutronStream stream = new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ)); - - List nodes = stream.getNodes(false); - for (RBMKNode nodeToRemove : nodes) - list.add(new BlockPos(nodeToRemove.tile)); + for (NeutronStream stream : streams) { + stream.getNodes(false).forEach(node -> list.add(new BlockPos(node.tile))); } + return list; } } + if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk + TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; + if (!rod.hasRod || rod.fluxQuantity == 0) { + list.addAll(getReaSimNodes(rod)); + } + } + + // TODO: implement ReaSim node culling on the non-rod side. + + // Check if non-rod nodes should be uncached due to no rod in range. + for (NeutronStream stream : streams) { + + List nodes = stream.getNodes(false); + + for (RBMKNode node : nodes) { + if (node.tile instanceof TileEntityRBMKRod) + return list; + } + + // If we get here, then no rods were found along this stream's path! + // This, most of the time, means we can just uncache all off the nodes inside the stream's path. + // That other part of the time, streams will be crossing paths. + // This is fine though, we can just uncache them anyway and the streams later on (next tick) will recache them. + nodes.forEach(node -> list.add(new BlockPos(node.tile))); + } + return list; - // TODO: Implement `hasRodInRange` for non-rod tile uncaching. } } @@ -160,6 +194,7 @@ public class RBMKHandler { } } + // USES THE CACHE!!! public List getBlocks() { List positions = new ArrayList<>(); @@ -173,10 +208,9 @@ public class RBMKHandler { return positions; } - // This, however, is used for actual RBMK flux calculations. // Does NOT include the origin node // USES THE CACHE!!! - public List getNodes(boolean cache) { + public List getNodes(boolean addNode) { List positions = new ArrayList<>(); for (int i = 1; i <= fluxRange; i++) { @@ -185,7 +219,7 @@ public class RBMKHandler { BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - if (nodeCache.containsKey(pos) && cache) + if (nodeCache.containsKey(pos)) positions.add(getNode(pos)); else if (this.origin.tile.getBlockType() instanceof RBMKBase) { @@ -194,7 +228,7 @@ public class RBMKHandler { TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase)te; RBMKNode node = makeNode(rbmkBase); positions.add(node); - if (cache) + if (addNode) addNode(node); } } @@ -223,7 +257,6 @@ public class RBMKHandler { } int moderatedCount = 0; - double totalFluxMod = 1; for(BlockPos nodePos : getBlocks()) { @@ -262,23 +295,25 @@ public class RBMKHandler { if(!node.hasLid) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if (node.type == RBMKHandler.RBMKType.MODERATOR) { + if (node.type == RBMKHandler.RBMKType.MODERATOR || nodeTE.isModerated()) { moderatedCount++; moderateStream(); } if (nodeTE instanceof IRBMKFluxReceiver) { IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; + if (node.type == RBMKHandler.RBMKType.ROD) { TileEntityRBMKRod rod = (TileEntityRBMKRod)column; + if (rod.hasRod) { - if (rod.isModerated()) - moderateStream(); rod.receiveFlux(this); return; } + } else if(node.type == RBMKType.OUTGASSER) { TileEntityRBMKOutgasser outgasser = ((TileEntityRBMKOutgasser) column); + if(outgasser.canProcess()) { column.receiveFlux(this); return; @@ -286,33 +321,34 @@ public class RBMKHandler { } } else if (node.type == RBMKHandler.RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = (TileEntityRBMKControl)nodeTE; + TileEntityRBMKControl rod = (TileEntityRBMKControl) nodeTE; + if (rod.level > 0.0D) { + this.fluxQuantity *= rod.getMult(); - totalFluxMod *= rod.getMult(); continue; } return; - } + } else if (node.type == RBMKHandler.RBMKType.REFLECTOR) { - if (node.type == RBMKHandler.RBMKType.REFLECTOR) { if (this.origin.tile.isModerated()) moderatedCount++; + if (this.fluxRatio > 0 && moderatedCount > 0) for (int i = 0; i < moderatedCount; i++) moderateStream(); - if (totalFluxMod < 1) - this.fluxQuantity *= totalFluxMod; + if (RBMKHandler.reflectorEfficiency != 1.0D) { this.fluxQuantity *= RBMKHandler.reflectorEfficiency; continue; } + ((TileEntityRBMKRod)originTE).receiveFlux(this); return; - } - if (node.type == RBMKHandler.RBMKType.ABSORBER) { + } else if (node.type == RBMKHandler.RBMKType.ABSORBER) { if (RBMKHandler.absorberEfficiency == 1) return; + this.fluxQuantity *= RBMKHandler.absorberEfficiency; } } @@ -398,8 +434,8 @@ public class RBMKHandler { // Gamerule caching because this apparently is kinda slow? // meh, good enough - reflectorEfficiency = 1; //RBMKDials.getReflectorEfficiency(world.worldObj); - absorberEfficiency = 1; //RBMKDials.getAbsorberEfficiency(world.worldObj); + reflectorEfficiency = RBMKDials.getReflectorEfficiency(world.getKey()); + absorberEfficiency = RBMKDials.getAbsorberEfficiency(world.getKey()); moderatorEfficiency = RBMKDials.getModeratorEfficiency(world.getKey()); // I hate this. diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 7f4874c50..c52555c23 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -32,6 +32,8 @@ public class RBMKDials { public static final String KEY_ENABLE_MELTDOWN_OVERPRESSURE = "dialEnableMeltdownOverpressure"; public static final String KEY_MODERATOR_EFFICIENCY = "dialModeratorEfficiency"; + public static final String KEY_ABSORBER_EFFICIENCY = "dialAbsorberEfficiency"; + public static final String KEY_REFLECTOR_EFFICIENCY = "dialReflectorEfficiency"; public static void createDials(World world) { GameRules rules = world.getGameRules(); @@ -58,6 +60,8 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_DISABLE_MELTDOWNS, "false"); rules.setOrCreateGameRule(KEY_ENABLE_MELTDOWN_OVERPRESSURE, "false"); rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1.0"); + rules.setOrCreateGameRule(KEY_ABSORBER_EFFICIENCY, "1.0"); + rules.setOrCreateGameRule(KEY_REFLECTOR_EFFICIENCY, "1.0"); } } @@ -234,11 +238,29 @@ public class RBMKDials { } /** - * The percentage of neutron to moderate from fast to slow when they pass through a moderator. + * The percentage of neutrons to moderate from fast to slow when they pass through a moderator. * @param world * @return */ public static double getModeratorEfficiency(World world) { return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); } + + /** + * The percentage of neutrons to be absorbed when a stream hits an absorber column. + * @param world + * @return + */ + public static double getAbsorberEfficiency(World world) { + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + } + + /** + * The percentage of neutron to reflect when a stream hits a reflector column. + * @param world + * @return + */ + public static double getReflectorEfficiency(World world) { + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 75388a8b7..97ad5a4d2 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -137,7 +137,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.lastFluxQuantity = this.fluxQuantity; //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back + this.fluxQuantity = 0; + spreadFlux(fluxQuantityOut, fluxRatioOut); hasRod = true; @@ -177,13 +179,18 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM BlockPos pos = new BlockPos(this); - RBMKHandler.RBMKNode node; + if (flux == 0) { + // simple way to remove the node from the cache when no flux is going into it! + removeNode(pos); + return; + } - if(getNode(pos) == null) { + RBMKHandler.RBMKNode node = getNode(pos); + + if(node == null) { node = RBMKHandler.makeNode(this); addNode(node); - } else - node = getNode(pos); + } for(ForgeDirection dir : fluxDirs) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index 7114db0c7..74da00c39 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -1,11 +1,13 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.rbmkmk2.RBMKHandler.RBMKNode; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.util.Vec3; +import static com.hbm.handler.rbmkmk2.RBMKHandler.*; + public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { public TileEntityRBMKRodReaSim() { @@ -20,6 +22,21 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { @Override public void spreadFlux(double flux, double ratio) { + BlockPos pos = new BlockPos(this); + + if (flux == 0) { + // simple way to remove the node from the cache when no flux is going into it! + removeNode(pos); + return; + } + + RBMKNode node = getNode(pos); + + if(node == null) { + node = makeNode(this); + addNode(node); + } + int count = RBMKDials.getReaSimCount(worldObj); for (int i = 0; i < count; i++) { @@ -27,7 +44,7 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - new RBMKHandler.NeutronStream(RBMKHandler.makeNode(this), neutronVector, flux, ratio); + new NeutronStream(makeNode(this), neutronVector, flux, ratio); // Create new neutron streams } } From a2632a1785ba75151f221f15eca35713b524728e Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:19:49 -0500 Subject: [PATCH 23/70] oops --- src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index a2bd18e5f..0a1692a7e 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -107,6 +107,7 @@ public class RBMKHandler { TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; if (!rod.hasRod || rod.fluxQuantity == 0) { list.addAll(getReaSimNodes(rod)); + return list; } } From 06260e7f2b2feb70046e69ec73eefb597bd1a192 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 28 Aug 2024 22:37:13 -0500 Subject: [PATCH 24/70] i am going to kms --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 50 +++++++++++++++---- .../machine/rbmk/TileEntityRBMKConsole.java | 2 +- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 0a1692a7e..9c17a3635 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -5,11 +5,8 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.util.fauxpointtwelve.BlockPos; -import java.util.HashMap; +import java.util.*; import java.util.Map.Entry; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; @@ -64,12 +61,12 @@ public class RBMKHandler { this.hasLid = false; } - public List getReaSimNodes(TileEntityRBMKRodReaSim rod) { + public List getReaSimNodes() { List list = new ArrayList<>(); - for (int x = rod.xCoord - fluxRange; x <= rod.xCoord + fluxRange; x++) - for (int z = rod.zCoord - fluxRange; z <= rod.zCoord + fluxRange; z++) - if ((x - rod.xCoord) * (x - rod.xCoord) + (z - rod.zCoord) * (z - rod.zCoord) <= fluxRange * fluxRange) - list.add(new BlockPos(rod)); + for (int x = this.tile.xCoord - fluxRange; x <= this.tile.xCoord + fluxRange; x++) + for (int z = this.tile.zCoord - fluxRange; z <= this.tile.zCoord + fluxRange; z++) + if ((x - this.tile.xCoord) * (x - this.tile.xCoord) + (z - this.tile.zCoord) * (z - this.tile.zCoord) <= fluxRange * fluxRange) + list.add(new BlockPos(this.tile).add(x, 0, z)); return list; } @@ -103,15 +100,46 @@ public class RBMKHandler { } } + List points = getReaSimNodes(); + + // Check if the ReaSim rod should be culled from the cache due to no rod or no flux. if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; if (!rod.hasRod || rod.fluxQuantity == 0) { - list.addAll(getReaSimNodes(rod)); + list.addAll(points); return list; } } - // TODO: implement ReaSim node culling on the non-rod side. + // Check if non-rod nodes should be uncached... but now with ReaSim! + { // Yeah, I don't want to contaminate the surrounding scope. + List nodes = new ArrayList<>(); + points.forEach(nodePos -> { + RBMKNode node = getNode(nodePos); + if (node != null) + nodes.add(node); + }); + + boolean hasRod = false; + + for (RBMKNode node : nodes) { + + if (node.tile instanceof TileEntityRBMKRod) { + + TileEntityRBMKRod rod = (TileEntityRBMKRod) node.tile; + + if (rod.hasRod && rod.fluxQuantity > 0) { + hasRod = true; + break; + } + } + } + + if (nodes.isEmpty() || !hasRod) { + list.add(pos); + return list; + } + } // Check if non-rod nodes should be uncached due to no rod in range. for (NeutronStream stream : streams) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index 02b224c7a..523ea09c6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -556,7 +556,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod){ TileEntityRBMKRod fuelChannel = (TileEntityRBMKRod)te; - data_table.put("fluxQuantity", fuelChannel.fluxQuantity); + data_table.put("fluxQuantity", fuelChannel.lastFluxQuantity); data_table.put("fluxRatio", fuelChannel.fluxRatio); } From 1aea83ad32f3c57ab92959a078a5b0a4966b6c9f Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:44:26 -0500 Subject: [PATCH 25/70] i fixed it i fixed it i fixed it i fixed it i fixed it i fixed it fucking FINALLY --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 63 +++++++++++-------- .../machine/rbmk/TileEntityRBMKConsole.java | 2 +- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index 9c17a3635..d69e1f692 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -5,7 +5,9 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.util.fauxpointtwelve.BlockPos; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.HashMap; import java.util.Map.Entry; import net.minecraft.tileentity.TileEntity; @@ -63,22 +65,18 @@ public class RBMKHandler { public List getReaSimNodes() { List list = new ArrayList<>(); - for (int x = this.tile.xCoord - fluxRange; x <= this.tile.xCoord + fluxRange; x++) - for (int z = this.tile.zCoord - fluxRange; z <= this.tile.zCoord + fluxRange; z++) - if ((x - this.tile.xCoord) * (x - this.tile.xCoord) + (z - this.tile.zCoord) * (z - this.tile.zCoord) <= fluxRange * fluxRange) - list.add(new BlockPos(this.tile).add(x, 0, z)); + for (int x = -fluxRange; x <= fluxRange; x++) + for (int z = -fluxRange; z <= fluxRange; z++) + if (Math.pow(x, 2) + Math.pow(z, 2) <= fluxRange * fluxRange) + list.add(new BlockPos(tile).add(x, 0, z)); return list; } - public List checkNode(BlockPos pos) { + public List checkNode() { List list = new ArrayList<>(); - // Check if the tile no longer exists/is invalid. - if (tile == null || tile.isInvalid()) { - list.add(pos); - return list; - } + BlockPos pos = new BlockPos(this.tile); List streams = new ArrayList<>(); @@ -90,7 +88,7 @@ public class RBMKHandler { // Check if the rod should uncache nodes. if (tile instanceof TileEntityRBMKRod && !(tile instanceof TileEntityRBMKRodReaSim)) { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; - if (!rod.hasRod || rod.fluxQuantity == 0) { + if (!rod.hasRod || rod.lastFluxQuantity == 0) { for (NeutronStream stream : streams) { stream.getNodes(false).forEach(node -> list.add(new BlockPos(node.tile))); @@ -105,7 +103,7 @@ public class RBMKHandler { // Check if the ReaSim rod should be culled from the cache due to no rod or no flux. if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; - if (!rod.hasRod || rod.fluxQuantity == 0) { + if (!rod.hasRod || rod.lastFluxQuantity == 0) { list.addAll(points); return list; } @@ -128,7 +126,7 @@ public class RBMKHandler { TileEntityRBMKRod rod = (TileEntityRBMKRod) node.tile; - if (rod.hasRod && rod.fluxQuantity > 0) { + if (rod.hasRod && rod.lastFluxQuantity > 0) { hasRod = true; break; } @@ -150,14 +148,15 @@ public class RBMKHandler { if (node.tile instanceof TileEntityRBMKRod) return list; } - - // If we get here, then no rods were found along this stream's path! - // This, most of the time, means we can just uncache all off the nodes inside the stream's path. - // That other part of the time, streams will be crossing paths. - // This is fine though, we can just uncache them anyway and the streams later on (next tick) will recache them. - nodes.forEach(node -> list.add(new BlockPos(node.tile))); } + // If we get here, then no rods were found along this stream's path! + // This, most of the time, means we can just uncache all the nodes inside the stream's path. + // That other part of the time, streams will be crossing paths. + // This is fine though, we can just uncache them anyway and the streams later on (next tick) will recache them. + // /\ idk what this guy was on about but this is just plain wrong. /\ + list.add(pos); + return list; } } @@ -214,13 +213,12 @@ public class RBMKHandler { this.fluxQuantity = flux; this.fluxRatio = ratio; World worldObj = origin.tile.getWorldObj(); - if (streamWorlds.get(worldObj) != null) - streamWorlds.get(worldObj).addStream(this); - else { + if (streamWorlds.get(worldObj) == null) { StreamWorld world = new StreamWorld(); world.addStream(this); streamWorlds.put(worldObj, world); - } + } else + streamWorlds.get(worldObj).addStream(this); } // USES THE CACHE!!! @@ -459,6 +457,19 @@ public class RBMKHandler { // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { + // Remove `StreamWorld` objects if they have no streams. + { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn + List toRemove = new ArrayList<>(); + streamWorlds.forEach((world, streamWorld) -> { + if (streamWorld.streams.isEmpty()) + toRemove.add(world); + }); + + for (World world : toRemove) { + streamWorlds.remove(world); + } + } + for (Entry world : streamWorlds.entrySet()) { // Gamerule caching because this apparently is kinda slow? @@ -484,8 +495,8 @@ public class RBMKHandler { if (ticks >= cacheTime) { ticks = 0; List toRemove = new ArrayList<>(); - for(Entry cachedNode : nodeCache.entrySet()) - toRemove.addAll(cachedNode.getValue().checkNode(cachedNode.getKey())); + for(RBMKNode cachedNode : nodeCache.values()) + toRemove.addAll(cachedNode.checkNode()); for(BlockPos pos : toRemove) removeNode(pos); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index 523ea09c6..78ea7a558 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -103,7 +103,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(te instanceof TileEntityRBMKRod) { TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; - flux += fuel.fluxQuantity; + flux += fuel.lastFluxQuantity; } } else { From 5a06075a9ceaf1b9424c88203279fb25298e8024 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:52:10 -0500 Subject: [PATCH 26/70] fix up some imports! --- src/main/java/com/hbm/main/ModEventHandler.java | 1 - .../java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 74238ed6b..1149fc2b6 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -10,7 +10,6 @@ import java.util.Random; import java.util.UUID; import com.hbm.handler.rbmkmk2.RBMKHandler; -import net.minecraft.server.MinecraftServer; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 1c9961357..4c85c3aff 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -19,7 +19,6 @@ import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.Compat; -import com.hbm.util.GameRuleHelper; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; From 8b5bfda1627316eeab303fee92b9ae11d31b3ca4 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 1 Sep 2024 19:55:49 -0500 Subject: [PATCH 27/70] more shit --- .../com/hbm/handler/rbmkmk2/RBMKHandler.java | 24 ++++++++++--------- .../machine/rbmk/TileEntityRBMKBase.java | 1 + .../machine/rbmk/TileEntityRBMKRod.java | 20 ++++------------ 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java index d69e1f692..fa0d93f46 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.HashMap; import java.util.Map.Entry; +import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -322,7 +323,7 @@ public class RBMKHandler { if(!node.hasLid) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if (node.type == RBMKHandler.RBMKType.MODERATOR || nodeTE.isModerated()) { + if (node.type == RBMKType.MODERATOR || nodeTE.isModerated()) { moderatedCount++; moderateStream(); } @@ -330,7 +331,7 @@ public class RBMKHandler { if (nodeTE instanceof IRBMKFluxReceiver) { IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; - if (node.type == RBMKHandler.RBMKType.ROD) { + if (node.type == RBMKType.ROD) { TileEntityRBMKRod rod = (TileEntityRBMKRod)column; if (rod.hasRod) { @@ -347,7 +348,7 @@ public class RBMKHandler { } } - } else if (node.type == RBMKHandler.RBMKType.CONTROL_ROD) { + } else if (node.type == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl) nodeTE; if (rod.level > 0.0D) { @@ -356,7 +357,7 @@ public class RBMKHandler { continue; } return; - } else if (node.type == RBMKHandler.RBMKType.REFLECTOR) { + } else if (node.type == RBMKType.REFLECTOR) { if (this.origin.tile.isModerated()) moderatedCount++; @@ -372,7 +373,7 @@ public class RBMKHandler { ((TileEntityRBMKRod)originTE).receiveFlux(this); return; - } else if (node.type == RBMKHandler.RBMKType.ABSORBER) { + } else if (node.type == RBMKType.ABSORBER) { if (RBMKHandler.absorberEfficiency == 1) return; @@ -380,16 +381,16 @@ public class RBMKHandler { } } - List nodes = getNodes(true); + List nodes = getNodes(true); if (nodes.isEmpty()) return; - RBMKHandler.RBMKNode lastNode = nodes.get(nodes.size() - 1); + RBMKNode lastNode = nodes.get(nodes.size() - 1); - if (lastNode.type != RBMKHandler.RBMKType.REFLECTOR && lastNode.type != RBMKHandler.RBMKType.ABSORBER && lastNode.type != RBMKHandler.RBMKType.CONTROL_ROD) + if (lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); - if (lastNode.type == RBMKHandler.RBMKType.CONTROL_ROD) { + if (lastNode.type == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl)lastNode.tile; if (rod.getMult() > 0.0D) { this.fluxQuantity *= rod.getMult(); @@ -405,8 +406,9 @@ public class RBMKHandler { // holy fucking shit // I have had this one line cause me like tens of problems // I FUCKING HATE THIS - // total count of bugs fixed attributed to this function: 11 - if (origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()).isOpaqueCube()) + // total count of bugs fixed attributed to this function: 13 + Block block = origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()); + if (block.isOpaqueCube()) hits += 1; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 4c85c3aff..808e0a076 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -325,6 +325,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements exceptions.add("z"); exceptions.add("items"); exceptions.add("id"); + exceptions.add("muffled"); String title = "Dump of Ordered Data Diagnostic (DODD)"; mc.fontRenderer.drawString(title, pX + 1, pZ - 19, 0x006000); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 97ad5a4d2..f559b28e4 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -212,9 +212,6 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.fluxRatio = nbt.getDouble("fluxFast") / fluxQuantity; else this.fluxRatio = 0; - nbt.removeTag("fluxSlow"); - nbt.removeTag("fluxFast"); - writeToNBT(nbt); } else { this.fluxQuantity = nbt.getDouble("fluxQuantity"); this.fluxRatio = nbt.getDouble("fluxRatio"); @@ -225,17 +222,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxQuantity", this.lastFluxQuantity); - nbt.setDouble("fluxRatio", this.fluxRatio); - nbt.setBoolean("hasRod", this.hasRod); - } - - // aaaaaaa - public void writeToNBTDiag(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setDouble("fluxQuantity", this.fluxQuantity); - nbt.setDouble("fluxRatio", this.fluxRatio); + nbt.setDouble("fluxSlow", this.lastFluxQuantity * (1 - fluxRatio)); + nbt.setDouble("fluxFast", this.lastFluxQuantity * fluxRatio); nbt.setBoolean("hasRod", this.hasRod); } @@ -256,7 +244,9 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } public void getDiagData(NBTTagCompound nbt) { - this.writeToNBTDiag(nbt); + diag = true; + this.writeToNBT(nbt); + diag = false; if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { From bc0d1059d817f22244111e06d3d870403d54a8de Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:17:07 -0500 Subject: [PATCH 28/70] i want to kill myself :heart: --- .../com/hbm/blocks/machine/rbmk/RBMKBase.java | 7 +- .../com/hbm/handler/neutron/NeutronNode.java | 20 ++ .../hbm/handler/neutron/NeutronNodeWorld.java | 62 +++++ .../hbm/handler/neutron/NeutronStream.java | 69 +++++ .../handler/neutron/PileNeutronHandler.java | 44 +++ .../RBMKNeutronHandler.java} | 254 ++++++------------ .../handler/rbmkmk2/ItemRBMKRodFluxCurve.java | 55 ---- .../java/com/hbm/hazard/HazardRegistry.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 16 +- .../com/hbm/items/machine/ItemRBMKLid.java | 7 +- .../com/hbm/items/machine/ItemRBMKRod.java | 55 +++- .../java/com/hbm/main/ModEventHandler.java | 12 +- .../machine/rbmk/IRBMKFluxReceiver.java | 4 +- .../machine/rbmk/TileEntityRBMKAbsorber.java | 6 +- .../machine/rbmk/TileEntityRBMKBase.java | 16 +- .../machine/rbmk/TileEntityRBMKBlank.java | 6 - .../machine/rbmk/TileEntityRBMKBoiler.java | 6 - .../machine/rbmk/TileEntityRBMKControl.java | 6 +- .../machine/rbmk/TileEntityRBMKCooler.java | 7 - .../machine/rbmk/TileEntityRBMKHeater.java | 6 - .../machine/rbmk/TileEntityRBMKModerator.java | 6 +- .../machine/rbmk/TileEntityRBMKOutgasser.java | 9 +- .../machine/rbmk/TileEntityRBMKReflector.java | 6 +- .../machine/rbmk/TileEntityRBMKRod.java | 40 ++- .../machine/rbmk/TileEntityRBMKRodReaSim.java | 13 +- .../machine/rbmk/TileEntityRBMKStorage.java | 6 +- 26 files changed, 423 insertions(+), 317 deletions(-) create mode 100644 src/main/java/com/hbm/handler/neutron/NeutronNode.java create mode 100644 src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java create mode 100644 src/main/java/com/hbm/handler/neutron/NeutronStream.java create mode 100644 src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java rename src/main/java/com/hbm/handler/{rbmkmk2/RBMKHandler.java => neutron/RBMKNeutronHandler.java} (60%) delete mode 100644 src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java index 55975c521..234a2a4b9 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java @@ -3,7 +3,8 @@ package com.hbm.blocks.machine.rbmk; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.handler.MultiblockHandlerXR; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKNeutronNode; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRBMKLid; import com.hbm.lib.RefStrings; @@ -29,8 +30,6 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; - public abstract class RBMKBase extends BlockDummyable implements IToolable, ILookOverlay { public static boolean dropLids = true; @@ -175,7 +174,7 @@ public abstract class RBMKBase extends BlockDummyable implements IToolable, ILoo if(rbmk.hasLid() && rbmk.isLidRemovable()) { - RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(new BlockPos(te)); if (node != null) node.removeLid(); diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNode.java b/src/main/java/com/hbm/handler/neutron/NeutronNode.java new file mode 100644 index 000000000..43d250949 --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/NeutronNode.java @@ -0,0 +1,20 @@ +package com.hbm.handler.neutron; + +import com.hbm.handler.neutron.NeutronStream.NeutronType; +import net.minecraft.tileentity.TileEntity; + +import java.util.HashMap; +import java.util.Map; + +public abstract class NeutronNode { + + protected NeutronType type; + protected TileEntity tile; + // like NBT but less fucking CANCER + protected Map data = new HashMap<>(); + + public NeutronNode(TileEntity tile, NeutronType type) { + this.type = type; + this.tile = tile; + } +} diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java new file mode 100644 index 000000000..cf1da973e --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java @@ -0,0 +1,62 @@ +package com.hbm.handler.neutron; + +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class NeutronNodeWorld { + // HashMap of all RBMK nodes and their positions. + protected static HashMap nodeCache = new HashMap<>(); + + public static void addNode(NeutronNode node) { + nodeCache.put(new BlockPos(node.tile), node); + } + + public static void removeNode(BlockPos position) { + nodeCache.remove(position); + } + + public static NeutronNode getNode(BlockPos position) { + return nodeCache.get(position); + } + + public static void removeAllNodes() { + nodeCache.clear(); + } + + // List of all stream worlds. + public static HashMap streamWorlds = new HashMap<>(); + + public static class StreamWorld { + + List streams; + + public StreamWorld() { + streams = new ArrayList<>(); + } + + public void addStream(NeutronStream stream) { + this.streams.add(stream); + } + + public void removeAllStreams() { + this.streams.clear(); + } + + public void removeAllStreamsOfType(NeutronStream.NeutronType type) { + List toRemove = new ArrayList<>(); + for (NeutronStream stream : streams) { + if (stream.type == type) + toRemove.add(stream); + } + toRemove.forEach((stream) -> streams.remove(stream)); + } + + public static void removeAllWorlds() { + streamWorlds.clear(); + } + } +} diff --git a/src/main/java/com/hbm/handler/neutron/NeutronStream.java b/src/main/java/com/hbm/handler/neutron/NeutronStream.java new file mode 100644 index 000000000..69b1d8eeb --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/NeutronStream.java @@ -0,0 +1,69 @@ +package com.hbm.handler.neutron; + +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import com.hbm.handler.neutron.NeutronNodeWorld.StreamWorld; + +import java.util.ArrayList; +import java.util.List; + +public abstract class NeutronStream { + + public enum NeutronType { + DUMMY, // Dummy streams for testing + RBMK, // RBMK neutron streams + PILE // Chicago pile streams + } + + public NeutronNode origin; + + // doubles!! + public double fluxQuantity; + // Hey, new implementation! Basically a ratio for slow flux to fast flux + // 0 = all slow flux + // 1 = all fast flux + public double fluxRatio; + + public NeutronType type = NeutronType.DUMMY; + + // Vector for direction of neutron flow. + public Vec3 vector; + + // Primarily used as a "dummy stream", not to be added to the streams list. + public NeutronStream(NeutronNode origin, Vec3 vector) { + this.origin = origin; + this.vector = vector; + } + + public NeutronStream(NeutronNode origin, Vec3 vector, double flux, double ratio, NeutronType type) { + this.origin = origin; + this.vector = vector; + this.fluxQuantity = flux; + this.fluxRatio = ratio; + this.type = type; + World worldObj = origin.tile.getWorldObj(); + if (NeutronNodeWorld.streamWorlds.get(worldObj) == null) { + StreamWorld world = new StreamWorld(); + world.addStream(this); + NeutronNodeWorld.streamWorlds.put(worldObj, world); + } else + NeutronNodeWorld.streamWorlds.get(worldObj).addStream(this); + } + + // USES THE CACHE!!! + public List getBlocks(int range) { + List positions = new ArrayList<>(); + + for (int i = 1; i <= range; i++) { + int x = (int) Math.floor(0.5 + vector.xCoord * i); + int z = (int) Math.floor(0.5 + vector.zCoord * i); + + BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); + positions.add(pos); + } + return positions; + } + + public abstract void runStreamInteraction(World worldObj); +} \ No newline at end of file diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java new file mode 100644 index 000000000..9d9d88558 --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -0,0 +1,44 @@ +package com.hbm.handler.neutron; + +import com.hbm.tileentity.machine.pile.TileEntityPileBase; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PileNeutronHandler { + + public static class PileNeutronNode extends NeutronNode { + + public PileNeutronNode(TileEntityPileBase tile) { + super(tile, NeutronStream.NeutronType.RBMK); + } + + } + + // The big one!! Runs all interactions for neutrons. + public static void runAllInteractions() { + + // Remove `StreamWorld` objects if they have no streams. + { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn + List toRemove = new ArrayList<>(); + NeutronNodeWorld.streamWorlds.forEach((world, streamWorld) -> { + if (streamWorld.streams.isEmpty()) + toRemove.add(world); + }); + + for (World world : toRemove) { + NeutronNodeWorld.streamWorlds.remove(world); + } + } + + for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { + + for (NeutronStream stream : world.getValue().streams) { + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreams(); + } + } +} diff --git a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java similarity index 60% rename from src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java rename to src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index fa0d93f46..88fab103a 100644 --- a/src/main/java/com/hbm/handler/rbmkmk2/RBMKHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -1,4 +1,4 @@ -package com.hbm.handler.rbmkmk2; +package com.hbm.handler.neutron; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.handler.radiation.ChunkRadiationManager; @@ -7,7 +7,6 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import java.util.ArrayList; import java.util.List; -import java.util.HashMap; import java.util.Map.Entry; import net.minecraft.block.Block; @@ -16,7 +15,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class RBMKHandler { +public class RBMKNeutronHandler { static double moderatorEfficiency; static double reflectorEfficiency; @@ -38,30 +37,27 @@ public class RBMKHandler { return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); } - public static class RBMKNode { + public static RBMKNeutronNode makeNode(TileEntityRBMKBase tile) { + BlockPos pos = new BlockPos(tile); + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + return (RBMKNeutronNode) NeutronNodeWorld.getNode(pos); + return new RBMKNeutronNode(tile, tile.getRBMKType(), tile.hasLid()); + } - protected RBMKType type; - protected TileEntityRBMKBase tile; - protected boolean hasLid; + public static class RBMKNeutronNode extends NeutronNode { - public RBMKNode(TileEntityRBMKBase tile, RBMKType type) { - this.type = type; - this.tile = tile; - this.hasLid = tile.hasLid(); - } - - public RBMKNode(TileEntityRBMKBase tile, RBMKType type, boolean hasLid) { - this.type = type; - this.tile = tile; - this.hasLid = hasLid; + public RBMKNeutronNode(TileEntityRBMKBase tile, RBMKType type, boolean hasLid) { + super(tile, NeutronStream.NeutronType.RBMK); + this.data.put("hasLid", hasLid); + this.data.put("type", type); } public void addLid() { - this.hasLid = true; + this.data.replace("hasLid", true); } public void removeLid() { - this.hasLid = false; + this.data.replace("hasLid", false); } public List getReaSimNodes() { @@ -74,16 +70,15 @@ public class RBMKHandler { } public List checkNode() { - List list = new ArrayList<>(); BlockPos pos = new BlockPos(this.tile); - List streams = new ArrayList<>(); + List streams = new ArrayList<>(); // Simulate streams coming out of the RBMK rod. for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { - streams.add(new NeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ))); + streams.add(new RBMKNeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ))); } // Check if the rod should uncache nodes. @@ -91,7 +86,7 @@ public class RBMKHandler { TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; if (!rod.hasRod || rod.lastFluxQuantity == 0) { - for (NeutronStream stream : streams) { + for (RBMKNeutronStream stream : streams) { stream.getNodes(false).forEach(node -> list.add(new BlockPos(node.tile))); } @@ -112,16 +107,16 @@ public class RBMKHandler { // Check if non-rod nodes should be uncached... but now with ReaSim! { // Yeah, I don't want to contaminate the surrounding scope. - List nodes = new ArrayList<>(); + List nodes = new ArrayList<>(); points.forEach(nodePos -> { - RBMKNode node = getNode(nodePos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(nodePos); if (node != null) nodes.add(node); }); boolean hasRod = false; - for (RBMKNode node : nodes) { + for (RBMKNeutronNode node : nodes) { if (node.tile instanceof TileEntityRBMKRod) { @@ -141,11 +136,11 @@ public class RBMKHandler { } // Check if non-rod nodes should be uncached due to no rod in range. - for (NeutronStream stream : streams) { + for (RBMKNeutronStream stream : streams) { - List nodes = stream.getNodes(false); + List nodes = stream.getNodes(false); - for (RBMKNode node : nodes) { + for (RBMKNeutronNode node : nodes) { if (node.tile instanceof TileEntityRBMKRod) return list; } @@ -162,84 +157,21 @@ public class RBMKHandler { } } - public static RBMKNode makeNode(TileEntityRBMKBase tile) { - BlockPos pos = new BlockPos(tile); - if (nodeCache.containsKey(pos)) - return getNode(pos); - if (!tile.hasWorldObj()) - return new RBMKNode(tile, tile.getRBMKType(), true); - return new RBMKNode(tile, tile.getRBMKType()); - } - public static class StreamWorld { + public static class RBMKNeutronStream extends NeutronStream { - List streams; - - public StreamWorld() { - streams = new ArrayList<>(); + public RBMKNeutronStream(NeutronNode origin, Vec3 vector) { + super(origin, vector); } - public void addStream(NeutronStream stream) { - this.streams.add(stream); - } - - public void removeAllStreams() { - this.streams.clear(); - } - } - - public static class NeutronStream { - - public RBMKNode origin; - - // doubles!! - public double fluxQuantity; - // Hey, new implementation! Basically a ratio for slow flux to fast flux - // 0 = all slow flux - // 1 = all fast flux - public double fluxRatio; - - // Vector for direction of neutron flow. - public Vec3 vector; - - // Primarily used as a "dummy stream", not to be added to the streams list. - public NeutronStream(RBMKNode origin, Vec3 vector) { - this.origin = origin; - this.vector = vector; - } - - public NeutronStream(RBMKNode origin, Vec3 vector, double flux, double ratio) { - this.origin = origin; - this.vector = vector; - this.fluxQuantity = flux; - this.fluxRatio = ratio; - World worldObj = origin.tile.getWorldObj(); - if (streamWorlds.get(worldObj) == null) { - StreamWorld world = new StreamWorld(); - world.addStream(this); - streamWorlds.put(worldObj, world); - } else - streamWorlds.get(worldObj).addStream(this); - } - - // USES THE CACHE!!! - public List getBlocks() { - List positions = new ArrayList<>(); - - for (int i = 1; i <= fluxRange; i++) { - int x = (int) Math.floor(0.5 + vector.xCoord * i); - int z = (int) Math.floor(0.5 + vector.zCoord * i); - - BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - positions.add(pos); - } - return positions; + public RBMKNeutronStream(NeutronNode origin, Vec3 vector, double flux, double ratio) { + super(origin, vector, flux, ratio, NeutronType.RBMK); } // Does NOT include the origin node // USES THE CACHE!!! - public List getNodes(boolean addNode) { - List positions = new ArrayList<>(); + public List getNodes(boolean addNode) { + List positions = new ArrayList<>(); for (int i = 1; i <= fluxRange; i++) { int x = (int) Math.floor(0.5 + vector.xCoord * i); @@ -247,17 +179,17 @@ public class RBMKHandler { BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - if (nodeCache.containsKey(pos)) - positions.add(getNode(pos)); + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + positions.add((RBMKNeutronNode) NeutronNodeWorld.getNode(pos)); else if (this.origin.tile.getBlockType() instanceof RBMKBase) { TileEntity te = blockPosToTE(this.origin.tile.getWorldObj(), pos); if (te instanceof TileEntityRBMKBase) { - TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase)te; - RBMKNode node = makeNode(rbmkBase); + TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase) te; + RBMKNeutronNode node = makeNode(rbmkBase); positions.add(node); if (addNode) - addNode(node); + NeutronNodeWorld.addNode(node); } } } @@ -268,36 +200,36 @@ public class RBMKHandler { public void runStreamInteraction(World worldObj) { // do nothing if there's nothing to do lmao - if(fluxQuantity == 0D) + if (fluxQuantity == 0D) return; BlockPos pos = new BlockPos(origin.tile); TileEntityRBMKBase originTE; - if (nodeCache.containsKey(pos)) - originTE = nodeCache.get(pos).tile; + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + originTE = (TileEntityRBMKBase) NeutronNodeWorld.nodeCache.get(pos).tile; else { originTE = (TileEntityRBMKBase) blockPosToTE(worldObj, pos); - if(originTE == null) + if (originTE == null) return; // Doesn't exist anymore! - addNode(new RBMKNode(originTE, originTE.getRBMKType())); + NeutronNodeWorld.addNode(new RBMKNeutronNode(originTE, originTE.getRBMKType(), originTE.hasLid())); } int moderatedCount = 0; - for(BlockPos nodePos : getBlocks()) { + for (BlockPos nodePos : getBlocks(fluxRange)) { - if(fluxQuantity == 0D) // Whoops, used it all up! + if (fluxQuantity == 0D) // Whoops, used it all up! return; - RBMKNode node = nodeCache.get(nodePos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.nodeCache.get(nodePos); - if(node == null) { + if (node == null) { TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow?? if (te instanceof TileEntityRBMKBase) { node = makeNode((TileEntityRBMKBase) te); - addNode(node); // whoops! + NeutronNodeWorld.addNode(node); // whoops! } else { int hits = getHits(nodePos); // Get the amount of hits on blocks. if (hits == columnHeight) // If stream is fully blocked. @@ -313,42 +245,44 @@ public class RBMKHandler { } } - if(node.type == RBMKType.OTHER) // pass right on by! + RBMKType type = (RBMKType) node.data.get("type"); + + if (type == RBMKType.OTHER) // pass right on by! continue; // we established earlier during `getNodes()` that they should all be RBMKBase TEs // no issue with casting here! - TileEntityRBMKBase nodeTE = node.tile; + TileEntityRBMKBase nodeTE = (TileEntityRBMKBase) node.tile; - if(!node.hasLid) + if (!(boolean) node.data.get("hasLid")) ChunkRadiationManager.proxy.incrementRad(worldObj, nodePos.getX(), nodePos.getY(), nodePos.getZ(), (float) (this.fluxQuantity * 0.05F)); - if (node.type == RBMKType.MODERATOR || nodeTE.isModerated()) { + if (type == RBMKType.MODERATOR || nodeTE.isModerated()) { moderatedCount++; moderateStream(); } if (nodeTE instanceof IRBMKFluxReceiver) { - IRBMKFluxReceiver column = (IRBMKFluxReceiver)nodeTE; + IRBMKFluxReceiver column = (IRBMKFluxReceiver) nodeTE; - if (node.type == RBMKType.ROD) { - TileEntityRBMKRod rod = (TileEntityRBMKRod)column; + if (type == RBMKType.ROD) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) column; if (rod.hasRod) { rod.receiveFlux(this); return; } - } else if(node.type == RBMKType.OUTGASSER) { + } else if (type == RBMKType.OUTGASSER) { TileEntityRBMKOutgasser outgasser = ((TileEntityRBMKOutgasser) column); - if(outgasser.canProcess()) { + if (outgasser.canProcess()) { column.receiveFlux(this); return; } } - } else if (node.type == RBMKType.CONTROL_ROD) { + } else if (type == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl) nodeTE; if (rod.level > 0.0D) { @@ -357,41 +291,43 @@ public class RBMKHandler { continue; } return; - } else if (node.type == RBMKType.REFLECTOR) { + } else if (type == RBMKType.REFLECTOR) { - if (this.origin.tile.isModerated()) + if (((TileEntityRBMKBase) this.origin.tile).isModerated()) moderatedCount++; if (this.fluxRatio > 0 && moderatedCount > 0) for (int i = 0; i < moderatedCount; i++) moderateStream(); - if (RBMKHandler.reflectorEfficiency != 1.0D) { - this.fluxQuantity *= RBMKHandler.reflectorEfficiency; + if (reflectorEfficiency != 1.0D) { + this.fluxQuantity *= reflectorEfficiency; continue; } - ((TileEntityRBMKRod)originTE).receiveFlux(this); + ((TileEntityRBMKRod) originTE).receiveFlux(this); return; - } else if (node.type == RBMKType.ABSORBER) { - if (RBMKHandler.absorberEfficiency == 1) + } else if (type == RBMKType.ABSORBER) { + if (absorberEfficiency == 1) return; - this.fluxQuantity *= RBMKHandler.absorberEfficiency; + this.fluxQuantity *= absorberEfficiency; } } - List nodes = getNodes(true); + List nodes = getNodes(true); if (nodes.isEmpty()) return; - RBMKNode lastNode = nodes.get(nodes.size() - 1); + RBMKNeutronNode lastNode = nodes.get(nodes.size() - 1); - if (lastNode.type != RBMKType.REFLECTOR && lastNode.type != RBMKType.ABSORBER && lastNode.type != RBMKType.CONTROL_ROD) + RBMKType lastNodeType = (RBMKType) lastNode.data.get("type"); + + if (lastNodeType != RBMKType.REFLECTOR && lastNodeType != RBMKType.ABSORBER && lastNodeType != RBMKType.CONTROL_ROD) irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); - if (lastNode.type == RBMKType.CONTROL_ROD) { - TileEntityRBMKControl rod = (TileEntityRBMKControl)lastNode.tile; + if (lastNodeType == RBMKType.CONTROL_ROD) { + TileEntityRBMKControl rod = (TileEntityRBMKControl) lastNode.tile; if (rod.getMult() > 0.0D) { this.fluxQuantity *= rod.getMult(); irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); @@ -426,32 +362,7 @@ public class RBMKHandler { public void moderateStream() { fluxRatio *= (1 - moderatorEfficiency); } - } - // List of all stream worlds. - public static HashMap streamWorlds = new HashMap<>(); - - public static void removeAllWorlds() { - streamWorlds.clear(); - } - - // HashMap of all RBMK nodes and their positions. - protected static HashMap nodeCache = new HashMap<>(); - - public static void addNode(RBMKNode node) { - nodeCache.put(new BlockPos(node.tile), node); - } - - public static void removeNode(BlockPos position) { - nodeCache.remove(position); - } - - public static RBMKNode getNode(BlockPos position) { - return nodeCache.get(position); - } - - public static void removeAllNodes() { - nodeCache.clear(); } private static int ticks = 0; @@ -462,17 +373,17 @@ public class RBMKHandler { // Remove `StreamWorld` objects if they have no streams. { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn List toRemove = new ArrayList<>(); - streamWorlds.forEach((world, streamWorld) -> { + NeutronNodeWorld.streamWorlds.forEach((world, streamWorld) -> { if (streamWorld.streams.isEmpty()) toRemove.add(world); }); for (World world : toRemove) { - streamWorlds.remove(world); + NeutronNodeWorld.streamWorlds.remove(world); } } - for (Entry world : streamWorlds.entrySet()) { + for (Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { // Gamerule caching because this apparently is kinda slow? // meh, good enough @@ -487,9 +398,10 @@ public class RBMKHandler { fluxRange = RBMKDials.getFluxRange(world.getKey()); for (NeutronStream stream : world.getValue().streams) { - stream.runStreamInteraction(world.getKey()); + if (stream.type == NeutronStream.NeutronType.RBMK) + stream.runStreamInteraction(world.getKey()); } - world.getValue().removeAllStreams(); + world.getValue().removeAllStreamsOfType(NeutronStream.NeutronType.RBMK); } // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage. @@ -497,11 +409,13 @@ public class RBMKHandler { if (ticks >= cacheTime) { ticks = 0; List toRemove = new ArrayList<>(); - for(RBMKNode cachedNode : nodeCache.values()) - toRemove.addAll(cachedNode.checkNode()); + for(NeutronNode cachedNode : NeutronNodeWorld.nodeCache.values()) { + RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; + toRemove.addAll(node.checkNode()); + } for(BlockPos pos : toRemove) - removeNode(pos); + NeutronNodeWorld.removeNode(pos); } ticks++; } diff --git a/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java b/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java deleted file mode 100644 index 457638a76..000000000 --- a/src/main/java/com/hbm/handler/rbmkmk2/ItemRBMKRodFluxCurve.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hbm.handler.rbmkmk2; - -import com.hbm.items.machine.ItemRBMKPellet; -import com.hbm.items.machine.ItemRBMKRod; -import net.minecraft.util.MathHelper; - -import java.util.function.BiFunction; -import java.util.function.Function; - - -public class ItemRBMKRodFluxCurve extends ItemRBMKRod { - - /** Double 1: Flux ratio in. - * Double 2: Depletion value. - * Return double: Output flux ratio. - **/ - BiFunction ratioCurve; - - /** Double 1: Flux quantity in.
- * Double 2: Flux ratio in.
- * Return double: Output flux quantity. - **/ - BiFunction fluxCurve; - - public ItemRBMKRodFluxCurve(ItemRBMKPellet pellet) { - super(pellet); - } - - public ItemRBMKRodFluxCurve(String fullName) { - super(fullName); - } - - public ItemRBMKRodFluxCurve setOutputRatioCurve(Function func) { - this.ratioCurve = (fluxRatioIn, depletion) -> func.apply(fluxRatioIn) * 1.0D; - return this; - } - - public ItemRBMKRodFluxCurve setDepletionOutputRatioCurve(BiFunction func) { - this.ratioCurve = func; - return this; - } - - public ItemRBMKRodFluxCurve setOutputFluxCurve(BiFunction func) { - this.fluxCurve = func; - return this; - } - - public double fluxRatioOut(double fluxRatioIn, double depletion) { - return MathHelper.clamp_double(ratioCurve.apply(fluxRatioIn, depletion), 0, 1); - } - - public double fluxFromRatio(double quantity, double ratio) { - return fluxCurve.apply(quantity, ratio); - } -} diff --git a/src/main/java/com/hbm/hazard/HazardRegistry.java b/src/main/java/com/hbm/hazard/HazardRegistry.java index b8de08aa3..d9021d10d 100644 --- a/src/main/java/com/hbm/hazard/HazardRegistry.java +++ b/src/main/java/com/hbm/hazard/HazardRegistry.java @@ -394,7 +394,7 @@ public class HazardRegistry { registerRBMKRod(rbmk_fuel_zfb_pu241, pu239 * rod_rbmk * 0.1F, wst * rod_rbmk * 7.5F); registerRBMKRod(rbmk_fuel_zfb_am_mix, pu241 * rod_rbmk * 0.1F, wst * rod_rbmk * 10F); registerRBMK(rbmk_fuel_drx, bf * rod_rbmk, bf * rod_rbmk * 100F, true, true, 0, 1F/3F); - registerRBMKRod(rbmk_fuel_curve, saf * rod_rbmk * np237 * rod_rbmk, wst * rod_rbmk * 35F); + //registerRBMKRod(rbmk_fuel_curve, saf * rod_rbmk * np237 * rod_rbmk, wst * rod_rbmk * 35F); registerRBMKPellet(rbmk_pellet_ueu, u * billet, wst * billet * 20F); registerRBMKPellet(rbmk_pellet_meu, uf * billet, wst * billet * 21.5F); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 4e99c505f..4e4fffd1f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -7,7 +7,6 @@ import com.hbm.handler.ToolAbility; import com.hbm.handler.ToolAbility.LuckAbility; import com.hbm.handler.WeaponAbility; import com.hbm.handler.guncfg.*; -import com.hbm.handler.rbmkmk2.ItemRBMKRodFluxCurve; import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -1132,7 +1131,7 @@ public class ModItems { public static ItemRBMKRod rbmk_fuel_zfb_am_mix; public static ItemRBMKRod rbmk_fuel_drx; public static ItemRBMKRod rbmk_fuel_test; - public static ItemRBMKRodFluxCurve rbmk_fuel_curve; + //public static ItemRBMKRod rbmk_fuel_curve; public static ItemRBMKPellet rbmk_pellet_ueu; public static ItemRBMKPellet rbmk_pellet_meu; public static ItemRBMKPellet rbmk_pellet_heu233; @@ -3761,15 +3760,18 @@ public class ModItems { .setHeat(1.0D) .setMeltingPoint(100000) .setUnlocalizedName("rbmk_fuel_test").setTextureName(RefStrings.MODID + ":rbmk_fuel_test"); - rbmk_fuel_curve = (ItemRBMKRodFluxCurve) new ItemRBMKRodFluxCurve("3D curve test") + /* Experimental flux curve shit + rbmk_fuel_curve = (ItemRBMKRod) new ItemRBMKRod("3D Flux Curve Test") + .setFluxCurve(true) .setOutputFluxCurve((fluxQuantity, fluxRatio) -> fluxQuantity * (1 - Math.pow(fluxRatio, 2))) .setDepletionOutputRatioCurve((ratioIn, depletion) -> Math.pow(ratioIn, 2) * depletion) .setYield(1000000D) - .setStats(100) - .setFunction(EnumBurnFunc.EXPERIMENTAL) - .setHeat(1.0D) + .setStats(75) + .setFunction(EnumBurnFunc.SQUARE_ROOT) + .setHeat(1.5D) .setMeltingPoint(100000) .setUnlocalizedName("rbmk_fuel_curve").setTextureName(RefStrings.MODID + ":rbmk_fuel_curve"); + */ watz_pellet = new ItemWatzPellet().setUnlocalizedName("watz_pellet").setTextureName(RefStrings.MODID + ":watz_pellet"); watz_pellet_depleted = new ItemWatzPellet().setUnlocalizedName("watz_pellet_depleted").setTextureName(RefStrings.MODID + ":watz_pellet"); @@ -6613,7 +6615,7 @@ public class ModItems { GameRegistry.registerItem(rbmk_fuel_zfb_am_mix, rbmk_fuel_zfb_am_mix.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_drx, rbmk_fuel_drx.getUnlocalizedName()); GameRegistry.registerItem(rbmk_fuel_test, rbmk_fuel_test.getUnlocalizedName()); - GameRegistry.registerItem(rbmk_fuel_curve, rbmk_fuel_curve.getUnlocalizedName()); + //GameRegistry.registerItem(rbmk_fuel_curve, rbmk_fuel_curve.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_ueu, rbmk_pellet_ueu.getUnlocalizedName()); GameRegistry.registerItem(rbmk_pellet_meu, rbmk_pellet_meu.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java index c2e215307..853fe918f 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKLid.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKLid.java @@ -2,7 +2,8 @@ package com.hbm.items.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.rbmk.RBMKBase; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKNeutronNode; import com.hbm.items.ModItems; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; @@ -15,8 +16,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import static com.hbm.handler.rbmkmk2.RBMKHandler.getNode; - public class ItemRBMKLid extends Item { @Override @@ -42,7 +41,7 @@ public class ItemRBMKLid extends Item { if(tile.hasLid()) return false; - RBMKHandler.RBMKNode node = getNode(new BlockPos(te)); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(new BlockPos(te)); if (node != null) node.addLid(); diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 93e30f4ac..d02a393d2 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -2,6 +2,8 @@ package com.hbm.items.machine; import java.util.List; import java.util.Locale; +import java.util.function.BiFunction; +import java.util.function.Function; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; @@ -14,6 +16,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class ItemRBMKRod extends Item { @@ -241,7 +244,7 @@ public class ItemRBMKRod extends Item { } /** - * @param reactivity [0;100] ...or at least those are sane levels + * @param enrichment [0;100] ...or at least those are sane levels * @return the amount of reactivity yielded, unmodified by xenon */ public double reactivityFunc(double in, double enrichment) { @@ -355,7 +358,55 @@ public class ItemRBMKRod extends Item { public static double getPoisonLevel(ItemStack stack) { return getPoison(stack) / 100D; } - + + // START Special flux curve handling! + // Nothing really uses this yet, though it's a really fun feature to play around with. + + // For the RBMK handler to see if the rod is special. + public boolean specialFluxCurve = false; + + public ItemRBMKRod setFluxCurve(boolean bool) { + specialFluxCurve = bool; + return this; + } + + /** Double 1: Flux ratio in. + * Double 2: Depletion value. + * Return double: Output flux ratio. + **/ + BiFunction ratioCurve; + + /** Double 1: Flux quantity in.
+ * Double 2: Flux ratio in.
+ * Return double: Output flux quantity. + **/ + BiFunction fluxCurve; + + public ItemRBMKRod setOutputRatioCurve(Function func) { + this.ratioCurve = (fluxRatioIn, depletion) -> func.apply(fluxRatioIn) * 1.0D; + return this; + } + + public ItemRBMKRod setDepletionOutputRatioCurve(BiFunction func) { + this.ratioCurve = func; + return this; + } + + public ItemRBMKRod setOutputFluxCurve(BiFunction func) { + this.fluxCurve = func; + return this; + } + + public double fluxRatioOut(double fluxRatioIn, double depletion) { + return MathHelper.clamp_double(ratioCurve.apply(fluxRatioIn, depletion), 0, 1); + } + + public double fluxFromRatio(double quantity, double ratio) { + return fluxCurve.apply(quantity, ratio); + } + + // END Special flux curve handling. + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 1149fc2b6..478c1fe9a 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -9,7 +9,9 @@ import java.util.Map; import java.util.Random; import java.util.UUID; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.PileNeutronHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; @@ -537,8 +539,8 @@ public class ModEventHandler { @SubscribeEvent public void onUnload(WorldEvent.Unload event) { - RBMKHandler.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. - RBMKHandler.removeAllNodes(); // Remove all nodes. + NeutronNodeWorld.StreamWorld.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. + NeutronNodeWorld.removeAllNodes(); // Remove all nodes. } public static boolean didSit = false; @@ -1151,7 +1153,9 @@ public class ModEventHandler { TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); // RBMK!!!! - RBMKHandler.runAllInteractions(); + RBMKNeutronHandler.runAllInteractions(); + // Chicago Pile!!!! + PileNeutronHandler.runAllInteractions(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java index 655c234ae..2b8464354 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/IRBMKFluxReceiver.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronStream; public interface IRBMKFluxReceiver { @@ -16,5 +16,5 @@ public interface IRBMKFluxReceiver { } } - public void receiveFlux(RBMKHandler.NeutronStream stream); + public void receiveFlux(NeutronStream stream); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java index abbb5ceb1..d1c585539 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAbsorber.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { @@ -19,8 +19,8 @@ public class TileEntityRBMKAbsorber extends TileEntityRBMKBase { } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.ABSORBER; + public RBMKType getRBMKType() { + return RBMKType.ABSORBER; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 808e0a076..70e768933 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -10,6 +10,7 @@ import com.hbm.entity.projectile.EntityRBMKDebris; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.neutron.NeutronNodeWorld; import com.hbm.handler.neutron.RBMKNeutronHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; @@ -41,7 +42,12 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; -import java.util.*; +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; +import java.util.Iterator; /** * Base class for all RBMK components, active or passive. Handles heat and the explosion sequence @@ -243,13 +249,15 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements heat = 20D; } - public abstract RBMKNeutronHandler.RBMKType getRBMKType(); - + public RBMKType getRBMKType() { + return RBMKType.OTHER; + } + protected static boolean diag = false; @Override public void readFromNBT(NBTTagCompound nbt) { - + if(!diag) { super.readFromNBT(nbt); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java index 08611e1b1..82a7137a9 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBlank.java @@ -1,7 +1,6 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKBlank extends TileEntityRBMKBase { @@ -18,11 +17,6 @@ public class TileEntityRBMKBlank extends TileEntityRBMKBase { super.onMelt(reduce); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.BLANK; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 2a1ea6801..1c1d4c29b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -8,7 +8,6 @@ import api.hbm.tile.IInfoProviderEC; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerRBMKGeneric; import com.hbm.inventory.fluid.FluidType; @@ -224,11 +223,6 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.BOILER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java index edb73195c..9e6d43868 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java @@ -2,7 +2,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -132,8 +132,8 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.CONTROL_ROD; + public RBMKType getRBMKType() { + return RBMKType.CONTROL_ROD; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java index e4134ab0c..fe3ddc71d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java @@ -2,7 +2,6 @@ package com.hbm.tileentity.machine.rbmk; import api.hbm.fluid.IFluidStandardReceiver; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; @@ -17,7 +16,6 @@ import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; import java.util.List; @@ -118,11 +116,6 @@ public class TileEntityRBMKCooler extends TileEntityRBMKBase implements IFluidSt this.lastCooled = buf.readInt(); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.COOLER; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java index e54a5acbd..42aecf827 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java @@ -4,7 +4,6 @@ import api.hbm.fluid.IFluidStandardTransceiver; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; import com.hbm.inventory.container.ContainerRBMKHeater; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -154,11 +153,6 @@ public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements I super.onMelt(reduce); } - @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; - } - @Override public ColumnType getConsoleType() { return ColumnType.HEATEX; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java index 7ce7c1e67..989b0af42 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKModerator.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKModerator extends TileEntityRBMKBase { @@ -19,8 +19,8 @@ public class TileEntityRBMKModerator extends TileEntityRBMKBase { } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.MODERATOR; + public RBMKType getRBMKType() { + return RBMKType.MODERATOR; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 3b701fc0e..7b39fa47b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -4,7 +4,8 @@ import api.hbm.fluid.IFluidStandardSender; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.NeutronStream; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.inventory.FluidStack; import com.hbm.inventory.container.ContainerRBMKOutgasser; import com.hbm.inventory.fluid.Fluids; @@ -92,7 +93,7 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement } @Override - public void receiveFlux(RBMKHandler.NeutronStream stream) { + public void receiveFlux(NeutronStream stream) { if(canProcess()) { @@ -167,8 +168,8 @@ public class TileEntityRBMKOutgasser extends TileEntityRBMKSlottedBase implement } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OUTGASSER; + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.OUTGASSER; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java index 79e40867b..f2157f849 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKReflector.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; public class TileEntityRBMKReflector extends TileEntityRBMKBase { @@ -19,8 +19,8 @@ public class TileEntityRBMKReflector extends TileEntityRBMKBase { } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.REFLECTOR; + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.REFLECTOR; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index f559b28e4..8908bfa3e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -5,9 +5,11 @@ import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.blocks.machine.rbmk.RBMKRod; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.CompatHandler; -import com.hbm.handler.radiation.ChunkRadiationManager; -import com.hbm.handler.neutron.NeutronStream; +import com.hbm.handler.neutron.NeutronNodeWorld; import com.hbm.handler.neutron.RBMKNeutronHandler; +import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKNeutronNode; +import com.hbm.handler.neutron.NeutronStream; import com.hbm.inventory.container.ContainerRBMKRod; import com.hbm.inventory.gui.GUIRBMKRod; import com.hbm.items.ModItems; @@ -90,14 +92,15 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM double fluxRatioOut; double fluxQuantityOut; - if (rod instanceof ItemRBMKRodFluxCurve) { // Experimental flux ratio curve rods! - ItemRBMKRodFluxCurve rodCurve = (ItemRBMKRodFluxCurve) rod; + // Experimental flux ratio curve rods! + // Again, nothing really uses this so its just idle code at the moment. + if (rod.specialFluxCurve) { - fluxRatioOut = rodCurve.fluxRatioOut(this.fluxRatio, ItemRBMKRod.getEnrichment(slots[0])); + fluxRatioOut = rod.fluxRatioOut(this.fluxRatio, ItemRBMKRod.getEnrichment(slots[0])); double fluxIn; - fluxIn = rodCurve.fluxFromRatio(this.fluxQuantity, this.fluxRatio); + fluxIn = rod.fluxFromRatio(this.fluxQuantity, this.fluxRatio); fluxQuantityOut = rod.burn(worldObj, slots[0], fluxIn); } else { @@ -181,15 +184,15 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM if (flux == 0) { // simple way to remove the node from the cache when no flux is going into it! - removeNode(pos); + NeutronNodeWorld.removeNode(pos); return; } - RBMKHandler.RBMKNode node = getNode(pos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(pos); if(node == null) { - node = RBMKHandler.makeNode(this); - addNode(node); + node = RBMKNeutronHandler.makeNode(this); + NeutronNodeWorld.addNode(node); } for(ForgeDirection dir : fluxDirs) { @@ -214,7 +217,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.fluxRatio = 0; } else { this.fluxQuantity = nbt.getDouble("fluxQuantity"); - this.fluxRatio = nbt.getDouble("fluxRatio"); + this.fluxRatio = nbt.getDouble("fluxMod"); } this.hasRod = nbt.getBoolean("hasRod"); } @@ -222,8 +225,17 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxSlow", this.lastFluxQuantity * (1 - fluxRatio)); - nbt.setDouble("fluxFast", this.lastFluxQuantity * fluxRatio); + nbt.setDouble("fluxQuantity", this.fluxQuantity); + nbt.setDouble("fluxMod", this.fluxRatio); + nbt.setBoolean("hasRod", this.hasRod); + } + + // aaaaaaaa + public void writeToNBTDiag(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setDouble("fluxSlow", this.fluxQuantity * (1 - fluxRatio)); + nbt.setDouble("fluxFast", this.fluxQuantity * fluxRatio); nbt.setBoolean("hasRod", this.hasRod); } @@ -245,7 +257,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void getDiagData(NBTTagCompound nbt) { diag = true; - this.writeToNBT(nbt); + this.writeToNBTDiag(nbt); diag = false; if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index 74da00c39..d638e4795 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -1,12 +1,13 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler.RBMKNode; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.util.Vec3; -import static com.hbm.handler.rbmkmk2.RBMKHandler.*; +import static com.hbm.handler.neutron.RBMKNeutronHandler.*; public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { @@ -26,15 +27,15 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { if (flux == 0) { // simple way to remove the node from the cache when no flux is going into it! - removeNode(pos); + NeutronNodeWorld.removeNode(pos); return; } - RBMKNode node = getNode(pos); + RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(pos); if(node == null) { node = makeNode(this); - addNode(node); + NeutronNodeWorld.addNode(node); } int count = RBMKDials.getReaSimCount(worldObj); @@ -44,7 +45,7 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - new NeutronStream(makeNode(this), neutronVector, flux, ratio); + new RBMKNeutronHandler.RBMKNeutronStream(makeNode(this), neutronVector, flux, ratio); // Create new neutron streams } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java index ac8621882..66809e58e 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKStorage.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.handler.rbmkmk2.RBMKHandler; +import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.inventory.container.ContainerRBMKStorage; import com.hbm.inventory.gui.GUIRBMKStorage; import com.hbm.items.machine.ItemRBMKRod; @@ -42,8 +42,8 @@ public class TileEntityRBMKStorage extends TileEntityRBMKSlottedBase implements } @Override - public RBMKHandler.RBMKType getRBMKType() { - return RBMKHandler.RBMKType.OTHER; + public RBMKNeutronHandler.RBMKType getRBMKType() { + return RBMKNeutronHandler.RBMKType.OTHER; } @Override From 931bbb3d8c30faf48b026e751ddcf910ebe71a6a Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:21:12 -0500 Subject: [PATCH 29/70] oh my fucking god --- .../handler/neutron/PileNeutronHandler.java | 118 +++++++++++++++++- .../handler/neutron/RBMKNeutronHandler.java | 6 +- .../machine/pile/TileEntityPileBase.java | 115 +++++------------ .../pile/TileEntityPileBreedingFuel.java | 2 +- .../machine/pile/TileEntityPileFuel.java | 2 +- .../machine/pile/TileEntityPileSource.java | 2 +- 6 files changed, 158 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 9d9d88558..48377590e 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -1,6 +1,16 @@ package com.hbm.handler.neutron; +import api.hbm.block.IPileNeutronReceiver; +import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.machine.pile.TileEntityPileBase; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import java.util.ArrayList; @@ -9,14 +19,110 @@ import java.util.Map; public class PileNeutronHandler { + public static int range = 5; + public static class PileNeutronNode extends NeutronNode { public PileNeutronNode(TileEntityPileBase tile) { - super(tile, NeutronStream.NeutronType.RBMK); + super(tile, NeutronStream.NeutronType.PILE); } } + public static PileNeutronNode makeNode(TileEntityPileBase tile) { + BlockPos pos = new BlockPos(tile); + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + return (PileNeutronNode) NeutronNodeWorld.getNode(pos); + return new PileNeutronNode(tile); + } + + private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { + return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + } + + public static class PileNeutronStream extends NeutronStream { + + public PileNeutronStream(NeutronNode origin, Vec3 vector) { + super(origin, vector); + } + + public PileNeutronStream(NeutronNode origin, Vec3 vector, double flux) { + super(origin, vector, flux, 0D, NeutronType.PILE); + } + + @Override + public void runStreamInteraction(World worldObj) { + + //Random rand = origin.tile.getWorldObj().rand; + //Vec3 vec = Vec3.createVectorHelper(1, 0, 0); + //vec.rotateAroundZ((float)(rand.nextDouble() * Math.PI * 2D)); + //vec.rotateAroundY((float)(rand.nextDouble() * Math.PI * 2D)); + //vec.rotateAroundX((float)(rand.nextDouble() * Math.PI * 2D)); + + TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; + BlockPos pos = new BlockPos(originTE); + + for(float i = 1; i <= range; i += 0.5F) { + + BlockPos node = new BlockPos( + (int)Math.floor(pos.getX() + 0.5 + vector.xCoord * i), + (int)Math.floor(pos.getY() + 0.5 + vector.yCoord * i), + (int)Math.floor(pos.getZ() + 0.5 + vector.zCoord * i) + ); + + TileEntity tile; + + if (NeutronNodeWorld.nodeCache.containsKey(node)) + tile = NeutronNodeWorld.nodeCache.get(node).tile; + else { + tile = blockPosToTE(worldObj, node); + if (tile == null) + return; // Doesn't exist anymore! + if (tile instanceof TileEntityPileBase) + NeutronNodeWorld.addNode(new PileNeutronNode((TileEntityPileBase) tile)); + } + + TileEntityPileBase te = (TileEntityPileBase) tile; + Block block = te.getBlockType(); + + + // Return when a boron block is hit + if(block == ModBlocks.block_boron) + return; + + else if(block == ModBlocks.concrete || + block == ModBlocks.concrete_smooth || + block == ModBlocks.concrete_asbestos || + block == ModBlocks.concrete_colored || + block == ModBlocks.brick_concrete) + fluxQuantity *= 0.25; + + int meta = te.getBlockMetadata(); + + if(block == ModBlocks.block_graphite_rod && (meta & 8) == 0) + return; + + if(te instanceof IPileNeutronReceiver) { + + IPileNeutronReceiver rec = (IPileNeutronReceiver) te; + rec.receiveNeutrons((int) fluxQuantity); + + if(block != ModBlocks.block_graphite_detector || (meta & 8) == 0) + return; + } + + int x = (int) (node.getX() + 0.5); + int y = (int) (node.getY() + 0.5); + int z = (int) (node.getZ() + 0.5); + List entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x, y, z, x, y, z)); + + if(entities != null) + for(EntityLivingBase e : entities) + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.CREATIVE, (float) (fluxQuantity / 4D)); + } + } + } + // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { @@ -40,5 +146,15 @@ public class PileNeutronHandler { } world.getValue().removeAllStreams(); } + + for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { + + for (NeutronStream stream : world.getValue().streams) { + if (stream.type == NeutronStream.NeutronType.PILE) + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreamsOfType(NeutronStream.NeutronType.PILE); + } + } } diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index 88fab103a..d02c17629 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -410,8 +410,10 @@ public class RBMKNeutronHandler { ticks = 0; List toRemove = new ArrayList<>(); for(NeutronNode cachedNode : NeutronNodeWorld.nodeCache.values()) { - RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; - toRemove.addAll(node.checkNode()); + if (cachedNode.type == NeutronStream.NeutronType.RBMK) { + RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; + toRemove.addAll(node.checkNode()); + } } for(BlockPos pos : toRemove) diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java index 8c06fd658..b4745b170 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java @@ -1,96 +1,49 @@ package com.hbm.tileentity.machine.pile; -import java.util.List; -import java.util.Random; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.PileNeutronHandler; +import com.hbm.handler.neutron.PileNeutronHandler.PileNeutronStream; +import com.hbm.handler.neutron.PileNeutronHandler.PileNeutronNode; -import com.hbm.blocks.ModBlocks; -import com.hbm.util.ContaminationUtil; -import com.hbm.util.ContaminationUtil.ContaminationType; -import com.hbm.util.ContaminationUtil.HazardType; - -import api.hbm.block.IPileNeutronReceiver; -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; public abstract class TileEntityPileBase extends TileEntity { @Override public abstract void updateEntity(); - - protected void castRay(int flux, int range) { - Random rand = worldObj.rand; - Vec3 vec = Vec3.createVectorHelper(1, 0, 0); - vec.rotateAroundZ((float)(rand.nextDouble() * Math.PI * 2D)); - vec.rotateAroundY((float)(rand.nextDouble() * Math.PI * 2D)); - vec.rotateAroundX((float)(rand.nextDouble() * Math.PI * 2D)); - - int prevX = xCoord; - int prevY = yCoord; - int prevZ = zCoord; - - for(float i = 1; i <= range; i += 0.5F) { - int x = (int)Math.floor(xCoord + 0.5 + vec.xCoord * i); - int y = (int)Math.floor(yCoord + 0.5 + vec.yCoord * i); - int z = (int)Math.floor(zCoord + 0.5 + vec.zCoord * i); - - if(x == prevX && y == prevY && z == prevZ) - continue; + @Override + public void invalidate() { + super.invalidate(); - prevX = x; - prevY = y; - prevZ = z; - - /*if(i == range || i == 1) { - NBTTagCompound data2 = new NBTTagCompound(); - data2.setString("type", "vanillaExt"); - data2.setString("mode", i == range ? "greendust" : - i == 1 ? "reddust" : "bluedust"); - data2.setDouble("posX", xCoord + 0.5 + vec.xCoord * i); - data2.setDouble("posY", yCoord + 0.5 + vec.yCoord * i); - data2.setDouble("posZ", zCoord + 0.5 + vec.zCoord * i); - MainRegistry.proxy.effectNT(data2); - }*/ - - Block b = worldObj.getBlock(x, y, z); - - if(b == ModBlocks.concrete || b == ModBlocks.concrete_smooth || b == ModBlocks.concrete_asbestos || b == ModBlocks.concrete_colored || b == ModBlocks.brick_concrete) - flux *= 0.25; - - if(b == ModBlocks.block_boron) - return; - - int meta = worldObj.getBlockMetadata(x, y, z); - - if(b == ModBlocks.block_graphite_rod && (meta & 8) == 0) - return; - - TileEntity te = worldObj.getTileEntity(x, y, z); - - if(te instanceof IPileNeutronReceiver) { - - //this part throttles neutron efficiency for reactions that are way too close, efficiency reaches 100% after 1.5 meters - //This entire time, this multiplier has been using the max distance, not the actual one, meaning efficency has always been 100% - //float mult = Math.min((float)i / 1.5F, 1F); - //int n = (int)(flux * mult); - - IPileNeutronReceiver rec = (IPileNeutronReceiver) te; - rec.receiveNeutrons(flux); - - if(b != ModBlocks.block_graphite_detector || (meta & 8) == 0) - return; - } - - List entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x + 0.5, y + 0.5, z + 0.5, x + 0.5, y + 0.5, z + 0.5)); - - if(entities != null) - for(EntityLivingBase e : entities) { - - ContaminationUtil.contaminate(e, HazardType.RADIATION, ContaminationType.CREATIVE, flux / 4F); - } + NeutronNodeWorld.removeNode(new BlockPos(this)); + } + + protected void castRay(int flux) { + + BlockPos pos = new BlockPos(this); + + if (flux == 0) { + // simple way to remove the node from the cache when no flux is going into it! + NeutronNodeWorld.removeNode(pos); + return; } + + PileNeutronNode node = (PileNeutronNode) NeutronNodeWorld.getNode(pos); + + if(node == null) { + node = PileNeutronHandler.makeNode(this); + NeutronNodeWorld.addNode(node); + } + + Vec3 neutronVector = Vec3.createVectorHelper(1, 0, 0); + + neutronVector.rotateAroundX((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundZ((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + + new PileNeutronStream(node, neutronVector, flux); } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java index 1bbe94acb..c1f775e0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java @@ -35,7 +35,7 @@ public class TileEntityPileBreedingFuel extends TileEntityPileBase implements IP return; for(int i = 0; i < 2; i++) - this.castRay(1, 5); + this.castRay(1); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index 288faa0ea..aedcb0082 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -71,7 +71,7 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr this.heat += reaction; for(int i = 0; i < 12; i++) - this.castRay((int) Math.max(reaction * 0.25, 1), 5); + this.castRay((int) Math.max(reaction * 0.25, 1)); return lastProgress; } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java index c297f9dfb..6b38b7875 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java @@ -12,7 +12,7 @@ public class TileEntityPileSource extends TileEntityPileBase { int n = this.getBlockType() == ModBlocks.block_graphite_source ? 1 : 2; for(int i = 0; i < 12; i++) { - this.castRay(n, 5); + this.castRay(n); } } } From 47657366ccaa1a3c21b2da2cff4078d79977705f Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 2 Sep 2024 21:39:28 -0500 Subject: [PATCH 30/70] the ByteBuf shenanigans begin!! --- .../bomb/TileEntityNukeBalefire.java | 34 ++++--- .../tileentity/machine/TileEntityAshpit.java | 25 +++-- .../machine/TileEntityConveyorPress.java | 47 +++++----- .../tileentity/machine/TileEntityCore.java | 42 +++++---- .../machine/TileEntityCoreEmitter.java | 41 ++++---- .../machine/TileEntityCoreInjector.java | 28 ++++-- .../machine/TileEntityCoreReceiver.java | 26 ++++-- .../machine/TileEntityCoreStabilizer.java | 29 +++--- .../machine/TileEntityCustomMachine.java | 68 +++++++------- .../oil/TileEntityMachinePumpjack.java | 22 ++--- .../machine/oil/TileEntityOilDrillBase.java | 93 ++++++++++--------- src/main/java/com/hbm/util/BufferUtil.java | 69 +++++++++++++- 12 files changed, 322 insertions(+), 202 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java index db18d4bfb..748bbfd3f 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java @@ -11,6 +11,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -54,22 +55,29 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU if(timer <= 0) { explode(); } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("timer", timer); - data.setBoolean("loaded", this.isLoaded()); - data.setBoolean("started", started); - networkPack(data, 250); + + networkPackNT(250); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - timer = data.getInteger("timer"); - started = data.getBoolean("started"); - loaded = data.getBoolean("loaded"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeInt(this.timer); + buf.writeBoolean(this.started); + buf.writeBoolean(this.loaded); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.timer = buf.readInt(); + this.started = buf.readBoolean(); + this.loaded = buf.readBoolean(); + } + public void handleButtonPacket(int value, int meta) { if(meta == 0 && this.isLoaded()) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java index acefaf0f2..dfb63df66 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAshpit.java @@ -15,6 +15,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -103,11 +104,8 @@ public class TileEntityAshpit extends TileEntityMachineBase implements IGUIProvi for(int i = 0; i < 5; i++) { if(slots[i] != null) isFull = true; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("playersUsing", this.playersUsing); - data.setBoolean("isFull", this.isFull); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { this.prevDoorAngle = this.doorAngle; @@ -142,10 +140,19 @@ public class TileEntityAshpit extends TileEntityMachineBase implements IGUIProvi } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.playersUsing = nbt.getInteger("playersUsing"); - this.isFull = nbt.getBoolean("isFull"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeInt(this.playersUsing); + buf.writeBoolean(this.isFull); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.playersUsing = buf.readInt(); + this.isFull = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java index 418c9932c..0cb68f8ec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java @@ -7,13 +7,16 @@ import com.hbm.inventory.recipes.PressRecipes; import com.hbm.items.machine.ItemStamp; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; @@ -84,16 +87,7 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE delay--; } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setDouble("press", press); - if(slots[0] != null) { - NBTTagCompound stack = new NBTTagCompound(); - slots[0].writeToNBT(stack); - data.setTag("stack", stack); - } - - this.networkPack(data, 50); + this.networkPackNT(50); } else { // approach-based interpolation, GO! @@ -174,23 +168,26 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE } public boolean canRetract() { - if(this.power < usage) return false; - return true; + return this.power >= usage; } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.power = nbt.getLong("power"); - this.syncPress = nbt.getInteger("press"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); - } else { - this.syncStack = null; - } - + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(this.power); + buf.writeDouble(this.syncPress); + BufferUtil.writeItemStack(buf, syncStack); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.syncPress = buf.readDouble(); + this.syncStack = BufferUtil.readItemStack(buf); + this.turnProgress = 2; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java index 4fd9621ee..66c1f0e51 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java @@ -21,11 +21,13 @@ import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.ArmorUtil; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -138,15 +140,8 @@ public class TileEntityCore extends TileEntityMachineBase implements IGUIProvide if(heat > 0) radiation(); - - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - data.setInteger("field", field); - data.setInteger("heat", heat); - data.setInteger("color", color); - data.setBoolean("melt", meltdownTick); - networkPack(data, 250); + + networkPackNT(250); heat = 0; @@ -162,15 +157,28 @@ public class TileEntityCore extends TileEntityMachineBase implements IGUIProvide } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); - field = data.getInteger("field"); - heat = data.getInteger("heat"); - color = data.getInteger("color"); - meltdownTick = data.getBoolean("melt"); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + buf.writeInt(field); + buf.writeInt(heat); + buf.writeInt(color); + buf.writeBoolean(meltdownTick); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + this.field = buf.readInt(); + this.heat = buf.readInt(); + this.color = buf.readInt(); + this.meltdownTick = buf.readBoolean(); } private void radiation() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 507035d8d..f0d9d3080 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -18,6 +18,7 @@ import com.hbm.util.CompatEnergyControl; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -169,26 +170,32 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne this.markDirty(); - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("watts", watts); - data.setLong("prev", prev); - data.setInteger("beam", beam); - data.setBoolean("isOn", isOn); - tank.writeToNBT(data, "tank"); - this.networkPack(data, 250); + this.networkPackNT(250); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - power = data.getLong("power"); - watts = data.getInteger("watts"); - prev = data.getLong("prev"); - beam = data.getInteger("beam"); - isOn = data.getBoolean("isOn"); - tank.readFromNBT(data, "tank"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(power); + buf.writeInt(watts); + buf.writeLong(prev); + buf.writeInt(beam); + buf.writeBoolean(isOn); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.watts = buf.readInt(); + this.prev = buf.readLong(); + this.beam = buf.readInt(); + this.isOn = buf.readBoolean(); + tank.deserialize(buf); } public long getPowerScaled(long i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index ee599910d..af15165d2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -12,6 +12,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -101,19 +102,26 @@ public class TileEntityCoreInjector extends TileEntityMachineBase implements IFl this.markDirty(); - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("beam", beam); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - this.networkPack(data, 250); + this.networkPackNT(250); } } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - beam = data.getInteger("beam"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeInt(beam); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.beam = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java index 16f9fe511..077c94b8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java @@ -16,6 +16,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -69,19 +70,26 @@ public class TileEntityCoreReceiver extends TileEntityMachineBase implements IEn } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("joules", joules); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + this.networkPackNT(50); joules = 0; } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - joules = data.getLong("joules"); - tank.readFromNBT(data, "t"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(joules); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + joules = buf.readLong(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java index bb7e05bbb..bb80dea66 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java @@ -14,6 +14,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -93,11 +94,7 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("watts", watts); - data.setInteger("beam", beam); - this.networkPack(data, 250); + this.networkPackNT(250); } } @@ -106,13 +103,23 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - power = data.getLong("power"); - watts = data.getInteger("watts"); - beam = data.getInteger("beam"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(power); + buf.writeInt(watts); + buf.writeInt(beam); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.watts = buf.readInt(); + this.beam = buf.readInt(); } public long getPowerScaled(long i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java index afc3b4d8e..f31e1060c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java @@ -22,6 +22,7 @@ import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachinePolluting; import com.hbm.tileentity.TileEntityProxyBase; +import com.hbm.util.BufferUtil; import com.hbm.util.Compat; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -31,6 +32,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -221,23 +223,44 @@ public class TileEntityCustomMachine extends TileEntityMachinePolluting implemen } else { this.progress = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", this.machineType); - data.setLong("power", power); - data.setBoolean("structureOK", structureOK); - data.setInteger("flux", flux); - data.setInteger("heat", heat); - data.setInteger("progress", progress); - data.setInteger("maxProgress", maxProgress); - for (int i = 0; i < inputTanks.length; i++) inputTanks[i].writeToNBT(data, "i" + i); - for (int i = 0; i < outputTanks.length; i++) outputTanks[i].writeToNBT(data, "o" + i); - this.matcher.writeToNBT(data); - this.networkPack(data, 50); + this.networkPackNT(50); } } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(power); + buf.writeInt(progress); + buf.writeInt(flux); + buf.writeInt(heat); + buf.writeBoolean(structureOK); + buf.writeInt(maxProgress); + for (FluidTank inputTank : inputTanks) inputTank.serialize(buf); + for (FluidTank outputTank : outputTanks) outputTank.serialize(buf); + this.matcher.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.machineType = BufferUtil.readString(buf); + if(this.config == null) this.init(); + + this.power = buf.readLong(); + this.progress = buf.readInt(); + this.flux = buf.readInt(); + this.heat = buf.readInt(); + this.structureOK = buf.readBoolean(); + this.maxProgress = buf.readInt(); + for (FluidTank inputTank : inputTanks) inputTank.deserialize(buf); + for (FluidTank outputTank : outputTanks) outputTank.deserialize(buf); + this.matcher.deserialize(buf); + } + /** Only accepts inputs in a fixed order, saves a ton of performance because there's no permutations to check for */ public CustomMachineRecipe getMatchingRecipe() { List recipes = CustomMachineRecipes.recipes.get(this.config.recipeKey); @@ -459,25 +482,6 @@ public class TileEntityCustomMachine extends TileEntityMachinePolluting implemen return matcher.isValidForFilter(slots[filterSlot], index, stack); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.machineType = nbt.getString("type"); - if(this.config == null) this.init(); - - this.power = nbt.getLong("power"); - this.progress = nbt.getInteger("progress"); - this.flux = nbt.getInteger("flux"); - this.heat = nbt.getInteger("heat"); - this.structureOK = nbt.getBoolean("structureOK"); - this.maxProgress = nbt.getInteger("maxProgress"); - for(int i = 0; i < inputTanks.length; i++) inputTanks[i].readFromNBT(nbt, "i" + i); - for(int i = 0; i < outputTanks.length; i++) outputTanks[i].readFromNBT(nbt, "o" + i); - - this.matcher.readFromNBT(nbt); - } - @Override public void readFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java index 7d836a45f..7308e13e7 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java @@ -18,6 +18,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -110,19 +111,18 @@ public class TileEntityMachinePumpjack extends TileEntityOilDrillBase { } } } - - @Override - public void networkPack(NBTTagCompound nbt, int range) { - nbt.setFloat("speed", this.indicator == 0 ? (5F + (2F * this.speedLevel)) + (this.overLevel - 1F) * 10: 0F); - super.networkPack(nbt, range); - } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.speed = nbt.getFloat("speed"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeFloat(this.indicator == 0 ? (5F + (2F * this.speedLevel)) + (this.overLevel - 1F) * 10: 0F); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.speed = buf.readFloat(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java index a8b2e4555..e0b84079a 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java @@ -23,6 +23,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -90,83 +91,87 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple @Override public void updateEntity() { - - if(!worldObj.isRemote) { - + + if (!worldObj.isRemote) { + this.updateConnections(); - + this.tanks[0].unloadTank(1, 2, slots); this.tanks[1].unloadTank(3, 4, slots); - + UpgradeManager.eval(slots, 5, 7); this.speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); this.energyLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); this.overLevel = Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) + 1; int abLevel = Math.min(UpgradeManager.getLevel(UpgradeType.AFTERBURN), 3); - + int toBurn = Math.min(tanks[1].getFill(), abLevel * 10); - - if(toBurn > 0) { + + if (toBurn > 0) { tanks[1].setFill(tanks[1].getFill() - toBurn); this.power += toBurn * 5; - - if(this.power > this.getMaxPower()) + + if (this.power > this.getMaxPower()) this.power = this.getMaxPower(); } - + power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); - for(DirPos pos : getConPos()) { - if(tanks[0].getFill() > 0) this.sendFluid(tanks[0], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + for (DirPos pos : getConPos()) { + if (tanks[0].getFill() > 0) + this.sendFluid(tanks[0], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if (tanks[1].getFill() > 0) + this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - if(this.power >= this.getPowerReqEff() && this.tanks[0].getFill() < this.tanks[0].getMaxFill() && this.tanks[1].getFill() < this.tanks[1].getMaxFill()) { - + + if (this.power >= this.getPowerReqEff() && this.tanks[0].getFill() < this.tanks[0].getMaxFill() && this.tanks[1].getFill() < this.tanks[1].getMaxFill()) { + this.power -= this.getPowerReqEff(); - - if(worldObj.getTotalWorldTime() % getDelayEff() == 0) { + + if (worldObj.getTotalWorldTime() % getDelayEff() == 0) { this.indicator = 0; - - for(int y = yCoord - 1; y >= getDrillDepth(); y--) { - - if(worldObj.getBlock(xCoord, y, zCoord) != ModBlocks.oil_pipe) { - - if(trySuck(y)) { + + for (int y = yCoord - 1; y >= getDrillDepth(); y--) { + + if (worldObj.getBlock(xCoord, y, zCoord) != ModBlocks.oil_pipe) { + + if (trySuck(y)) { break; } else { tryDrill(y); break; } } - - if(y == getDrillDepth()) + + if (y == getDrillDepth()) this.indicator = 1; } } - + } else { this.indicator = 2; } - - this.sendUpdate(); + + this.networkPackNT(25); } } - - public void sendUpdate() { - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("indicator", this.indicator); - for(int i = 0; i < tanks.length; i++) tanks[i].writeToNBT(data, "t" + i); - this.networkPack(data, 25); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + buf.writeLong(this.power); + buf.writeInt(this.indicator); + for (FluidTank tank : tanks) tank.serialize(buf); } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.indicator = nbt.getInteger("indicator"); - for(int i = 0; i < tanks.length; i++) tanks[i].readFromNBT(nbt, "t" + i); + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + this.power = buf.readLong(); + this.indicator = buf.readInt(); + for (FluidTank tank : tanks) tank.deserialize(buf); } public boolean canPump() { diff --git a/src/main/java/com/hbm/util/BufferUtil.java b/src/main/java/com/hbm/util/BufferUtil.java index 3f50e7e54..8a8c7c8ad 100644 --- a/src/main/java/com/hbm/util/BufferUtil.java +++ b/src/main/java/com/hbm/util/BufferUtil.java @@ -1,15 +1,22 @@ package com.hbm.util; +import java.io.IOException; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import io.netty.buffer.ByteBuf; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTSizeTracker; +import net.minecraft.nbt.NBTTagCompound; public class BufferUtil { - private static final Charset CHARSET = Charset.forName("UTF-8"); + private static final Charset CHARSET = StandardCharsets.UTF_8; // Writes a string to a byte buffer by encoding the length and raw bytes - public static final void writeString(ByteBuf buf, String value) { + public static void writeString(ByteBuf buf, String value) { if(value == null) { buf.writeInt(-1); return; @@ -20,7 +27,7 @@ public class BufferUtil { } // Reads a string from a byte buffer via the written length and raw bytes - public static final String readString(ByteBuf buf) { + public static String readString(ByteBuf buf) { final int count = buf.readInt(); if(count < 0) return null; @@ -30,4 +37,58 @@ public class BufferUtil { return new String(bytes, CHARSET); } -} + /** + * Writes the ItemStack to the buffer. + */ + public static void writeItemStack(ByteBuf buf, ItemStack item) { + if (item == null) + buf.writeShort(-1); + else { + buf.writeShort(Item.getIdFromItem(item.getItem())); + buf.writeByte(item.stackSize); + buf.writeShort(item.getItemDamage()); + NBTTagCompound nbtTagCompound = null; + + if (item.getItem().isDamageable() || item.getItem().getShareTag()) + nbtTagCompound = item.stackTagCompound; + + if(nbtTagCompound != null) { + byte[] nbtData = new byte[0]; + try { + nbtData = CompressedStreamTools.compress(nbtTagCompound); + } catch(IOException e) { + e.printStackTrace(); + } + buf.writeShort((short) nbtData.length); + buf.writeBytes(nbtData); + } else { + buf.writeShort(-1); + } + } + } + + /** + * Reads an ItemStack from a buffer + */ + public static ItemStack readItemStack(ByteBuf buf) { + ItemStack item = null; + short id = buf.readShort(); + + if (id >= 0) { + byte quantity = buf.readByte(); + short meta = buf.readShort(); + item = new ItemStack(Item.getItemById(id), quantity, meta); + + short nbtLength = buf.readByte(); + + byte[] tags = new byte[nbtLength]; + buf.readBytes(tags); + try { + item.stackTagCompound = CompressedStreamTools.func_152457_a(tags, new NBTSizeTracker(2097152L)); + } catch(IOException e) { + e.printStackTrace(); + } + } + return item; + } +} \ No newline at end of file From f8e6a60d0f23244ee702624b3044ee443e53c6a6 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 4 Sep 2024 21:37:37 -0500 Subject: [PATCH 31/70] holy shit what the fuck am i smoking --- .../hbm/tileentity/TileEntityMachineBase.java | 7 +- .../machine/TileEntityDeuteriumExtractor.java | 24 +++- .../machine/TileEntityDiFurnaceRTG.java | 35 +++--- .../machine/TileEntityElectrolyser.java | 74 +++++++----- .../machine/TileEntityFurnaceIron.java | 38 +++--- .../machine/TileEntityFurnaceSteel.java | 34 +++--- .../tileentity/machine/TileEntityHadron.java | 48 ++++++-- .../tileentity/machine/TileEntityITER.java | 65 +++++----- .../TileEntityMachineCombustionEngine.java | 35 +++--- .../machine/TileEntityMachineCompressor.java | 47 ++++---- .../machine/TileEntityMachineDiesel.java | 29 +++-- .../machine/TileEntityMachineEPress.java | 47 ++++---- .../TileEntityMachineLargeTurbine.java | 42 ++++--- .../machine/TileEntityMachineMiningLaser.java | 65 +++++----- .../TileEntityMachinePlasmaHeater.java | 34 +++--- .../machine/TileEntityMachinePress.java | 38 ++++-- .../machine/TileEntityMachineRadGen.java | 39 +++--- .../machine/TileEntityMachineRadiolysis.java | 41 ++++--- .../TileEntityMachineReactorBreeding.java | 27 +++-- ...eEntityMachineSchrabidiumTransmutator.java | 30 +++-- .../TileEntityMachineSolderingStation.java | 62 +++++----- .../machine/TileEntityMachineTurbineGas.java | 102 ++++++++-------- .../machine/TileEntityMachineTurbofan.java | 43 ++++--- .../machine/TileEntityMicrowave.java | 31 +++-- .../machine/TileEntityPWRController.java | 71 ++++++----- .../machine/TileEntityReactorControl.java | 55 +++++---- .../machine/TileEntityReactorResearch.java | 44 ++++--- .../machine/TileEntityReactorZirnox.java | 45 +++---- .../machine/TileEntitySoyuzLauncher.java | 45 +++---- .../tileentity/machine/TileEntityTesla.java | 44 +++---- .../tileentity/machine/TileEntityWatz.java | 41 ++++--- .../TileEntityMachineCatalyticReformer.java | 22 +++- .../machine/oil/TileEntityMachineCoker.java | 41 ++++--- .../oil/TileEntityMachineGasFlare.java | 34 +++--- .../oil/TileEntityMachineLiquefactor.java | 36 +++--- .../oil/TileEntityMachineRefinery.java | 39 +++--- .../oil/TileEntityMachineSolidifier.java | 36 +++--- .../oil/TileEntityMachineVacuumDistill.java | 31 +++-- .../machine/rbmk/TileEntityRBMKConsole.java | 113 +++++++++--------- .../network/TileEntityCraneBoxer.java | 23 ++-- .../network/TileEntityCraneGrabber.java | 29 +++-- .../network/TileEntityCraneRouter.java | 36 +++--- .../network/TileEntityRadioTorchCounter.java | 37 +++--- .../turret/TileEntityTurretArty.java | 25 ++-- .../turret/TileEntityTurretBaseNT.java | 61 ++++++---- .../turret/TileEntityTurretFritz.java | 16 +-- .../turret/TileEntityTurretHIMARS.java | 31 +++-- .../turret/TileEntityTurretMaxwell.java | 22 ++-- .../turret/TileEntityTurretRichard.java | 22 ++-- .../turret/TileEntityTurretSentry.java | 18 +-- .../turret/TileEntityTurretTauon.java | 22 ++-- src/main/java/com/hbm/util/BufferUtil.java | 90 ++++++++++---- 52 files changed, 1229 insertions(+), 937 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index d34c5ee38..24194f2b3 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -154,12 +154,7 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, val, id), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } @Deprecated public void processGauge(int val, int id) { } - - @Deprecated public void networkPack(NBTTagCompound nbt, int range) { - nbt.setBoolean("muffled", muffled); - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - + @Deprecated public void networkUnpack(NBTTagCompound nbt) { this.muffled = nbt.getBoolean("muffled"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index 12cc135b4..a1f55015b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -6,6 +6,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -44,13 +45,8 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - tanks[0].writeToNBT(data, "water"); - tanks[1].writeToNBT(data, "heavyWater"); - this.networkPack(data, 50); + this.networkPackNT(50); } } @@ -68,6 +64,22 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen tanks[1].readFromNBT(data, "heavyWater"); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + } + public boolean hasPower() { return power >= this.getMaxPower() / 20; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java index db4d16a27..3934be49c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java @@ -13,6 +13,7 @@ import com.hbm.util.RTGUtil; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -72,24 +73,28 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGU MachineDiFurnaceRTG.updateBlockState(isProcessing() || (canProcess() && hasPower()), getWorldObj(), xCoord, yCoord, zCoord); - NBTTagCompound data = new NBTTagCompound(); - data.setShort("progress", progress); - data.setShort("speed", processSpeed); - data.setByteArray("modes", new byte[] {(byte) sideUpper, (byte) sideLower}); - networkPack(data, 10); + networkPackNT(10); } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - progress = nbt.getShort("progress"); - processSpeed = nbt.getShort("speed"); - byte[] modes = nbt.getByteArray("modes"); - this.sideUpper = modes[0]; - this.sideLower = modes[1]; + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort(progress); + buf.writeShort(processSpeed); + buf.writeBytes(new byte[] {sideUpper, sideLower}); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + progress = buf.readShort(); + processSpeed = buf.readShort(); + byte[] bytes = new byte[2]; + buf.readBytes(bytes); + this.sideUpper = bytes[0]; + this.sideLower = bytes[1]; + } + private void processItem() { if(canProcess()) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index aa1db0589..40ce00a0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -39,6 +39,7 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -208,24 +209,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setInteger("progressFluid", this.progressFluid); - data.setInteger("progressOre", this.progressOre); - data.setInteger("usageOre", this.usageOre); - data.setInteger("usageFluid", this.usageFluid); - data.setInteger("processFluidTime", this.getDurationFluid()); - data.setInteger("processOreTime", this.getDurationMetal()); - if(this.leftStack != null) { - data.setInteger("leftType", leftStack.material.id); - data.setInteger("leftAmount", leftStack.amount); - } - if(this.rightStack != null) { - data.setInteger("rightType", rightStack.material.id); - data.setInteger("rightAmount", rightStack.amount); - } - for(int i = 0; i < 4; i++) tanks[i].writeToNBT(data, "t" + i); - this.networkPack(data, 50); + this.networkPackNT(50); } } @@ -244,21 +228,47 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.progressFluid); + buf.writeInt(this.progressOre); + buf.writeInt(this.usageOre); + buf.writeInt(this.usageFluid); + buf.writeInt(this.getDurationFluid()); + buf.writeInt(this.getDurationMetal()); + for(int i = 0; i < 4; i++) tanks[i].serialize(buf); + buf.writeBoolean(this.leftStack != null); + buf.writeBoolean(this.rightStack != null); + if(this.leftStack != null) { + buf.writeInt(leftStack.material.id); + buf.writeInt(leftStack.amount); + } + if(this.rightStack != null) { + buf.writeInt(rightStack.material.id); + buf.writeInt(rightStack.amount); + } + } - this.power = nbt.getLong("power"); - this.progressFluid = nbt.getInteger("progressFluid"); - this.progressOre = nbt.getInteger("progressOre"); - this.usageOre = nbt.getInteger("usageOre"); - this.usageFluid = nbt.getInteger("usageFluid"); - this.processFluidTime = nbt.getInteger("processFluidTime"); - this.processOreTime = nbt.getInteger("processOreTime"); - if(nbt.hasKey("leftType")) this.leftStack = new MaterialStack(Mats.matById.get(nbt.getInteger("leftType")), nbt.getInteger("leftAmount")); - else this.leftStack = null; - if(nbt.hasKey("rightType")) this.rightStack = new MaterialStack(Mats.matById.get(nbt.getInteger("rightType")), nbt.getInteger("rightAmount")); - else this.rightStack = null; - for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.progressFluid = buf.readInt(); + this.progressOre = buf.readInt(); + this.usageOre = buf.readInt(); + this.usageFluid = buf.readInt(); + this.processFluidTime = buf.readInt(); + this.processOreTime = buf.readInt(); + for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); + boolean left = buf.readBoolean(); + boolean right = buf.readBoolean(); + if(left) { + this.leftStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); + } + if(right) { + this.rightStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); + } } public boolean canProcessFluid() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java index c85bb845d..42d67d723 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java @@ -17,6 +17,7 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -115,14 +116,8 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI } else { this.progress = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("maxBurnTime", this.maxBurnTime); - data.setInteger("burnTime", this.burnTime); - data.setInteger("progress", this.progress); - data.setInteger("processingTime", this.processingTime); - data.setBoolean("wasOn", this.wasOn); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { if(this.progress > 0) { @@ -141,16 +136,25 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.maxBurnTime = nbt.getInteger("maxBurnTime"); - this.burnTime = nbt.getInteger("burnTime"); - this.progress = nbt.getInteger("progress"); - this.processingTime = nbt.getInteger("processingTime"); - this.wasOn = nbt.getBoolean("wasOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.maxBurnTime); + buf.writeInt(this.burnTime); + buf.writeInt(this.progress); + buf.writeInt(this.processingTime); + buf.writeBoolean(this.wasOn); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.maxBurnTime = buf.readInt(); + this.burnTime = buf.readInt(); + this.progress = buf.readInt(); + this.processingTime = buf.readInt(); + this.wasOn = buf.readBoolean(); + } + public boolean canSmelt() { if(this.burnTime <= 0) return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java index 4d6d7cbab..c67275db0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceSteel.java @@ -8,11 +8,13 @@ import com.hbm.inventory.container.ContainerFurnaceSteel; import com.hbm.inventory.gui.GUIFurnaceSteel; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -96,13 +98,9 @@ public class TileEntityFurnaceSteel extends TileEntityMachineBase implements IGU } } - - NBTTagCompound data = new NBTTagCompound(); - data.setIntArray("progress", progress); - data.setIntArray("bonus", bonus); - data.setInteger("heat", heat); - data.setBoolean("wasOn", wasOn); - this.networkPack(data, 50); + + this.networkPackNT(50); + } else { if(this.wasOn) { @@ -122,13 +120,21 @@ public class TileEntityFurnaceSteel extends TileEntityMachineBase implements IGU } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.progress = nbt.getIntArray("progress"); - this.bonus = nbt.getIntArray("bonus"); - this.heat = nbt.getInteger("heat"); - this.wasOn = nbt.getBoolean("wasOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + BufferUtil.writeIntArray(buf, this.progress); + BufferUtil.writeIntArray(buf, this.bonus); + buf.writeInt(this.heat); + buf.writeBoolean(this.wasOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.progress = BufferUtil.readIntArray(buf); + this.bonus = BufferUtil.readIntArray(buf); + this.heat = buf.readInt(); + this.wasOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index acd6246fb..eba83d93d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -25,6 +25,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.gui.GuiScreen; @@ -170,7 +171,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe data.setInteger("stat_x", stat_x); data.setInteger("stat_y", stat_y); data.setInteger("stat_z", stat_z); - this.networkPack(data, 50); + this.networkPackNT(50); } } @@ -212,22 +213,45 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.setStats(this.state, p.momentum, true); } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.isOn); + buf.writeLong(this.power); + buf.writeBoolean(this.analysisOnly); + buf.writeInt(this.ioMode); + buf.writeByte((byte) this.state.ordinal()); + + buf.writeBoolean(this.stat_success); + buf.writeByte((byte) this.stat_state.ordinal()); + buf.writeInt(this.stat_charge); + buf.writeInt(this.stat_x); + buf.writeInt(this.stat_y); + buf.writeInt(this.stat_z); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.isOn = buf.readBoolean(); + this.power = buf.readLong(); + this.analysisOnly = buf.readBoolean(); + this.ioMode = buf.readInt(); + this.state = EnumHadronState.values()[buf.readByte()]; + + this.stat_success = buf.readBoolean(); + this.stat_state = EnumHadronState.values()[buf.readByte()]; + this.stat_charge = buf.readInt(); + this.stat_x = buf.readInt(); + this.stat_y = buf.readInt(); + this.stat_z = buf.readInt(); + } + @Override public void networkUnpack(NBTTagCompound data) { super.networkUnpack(data); - this.isOn = data.getBoolean("isOn"); - this.power = data.getLong("power"); - this.analysisOnly = data.getBoolean("analysis"); - this.ioMode = data.getInteger("ioMode"); - this.state = EnumHadronState.values()[data.getByte("state")]; - this.stat_success = data.getBoolean("stat_success"); - this.stat_state = EnumHadronState.values()[data.getByte("stat_state")]; - this.stat_charge = data.getInteger("stat_charge"); - this.stat_x = data.getInteger("stat_x"); - this.stat_y = data.getInteger("stat_y"); - this.stat_z = data.getInteger("stat_z"); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 714f7471b..3fd90d627 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -26,6 +26,7 @@ import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; @@ -36,6 +37,7 @@ import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -158,27 +160,7 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } } - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isOn", isOn); - data.setLong("power", power); - data.setInteger("progress", progress); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - plasma.writeToNBT(data, "t2"); - - if(slots[3] == null) { - data.setInteger("blanket", 0); - } else if(slots[3].getItem() == ModItems.fusion_shield_tungsten) { - data.setInteger("blanket", 1); - } else if(slots[3].getItem() == ModItems.fusion_shield_desh) { - data.setInteger("blanket", 2); - } else if(slots[3].getItem() == ModItems.fusion_shield_chlorophyte) { - data.setInteger("blanket", 3); - } else if(slots[3].getItem() == ModItems.fusion_shield_vaporwave) { - data.setInteger("blanket", 4); - } - - this.networkPack(data, 250); + this.networkPackNT(250); /// END Notif packets /// } else { @@ -378,16 +360,37 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.isOn = data.getBoolean("isOn"); - this.power = data.getLong("power"); - this.blanket = data.getInteger("blanket"); - this.progress = data.getInteger("progress"); // - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); - plasma.readFromNBT(data, "t2"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.isOn); + buf.writeLong(this.power); + buf.writeInt(this.progress); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + plasma.serialize(buf); + if(slots[3] == null) { + buf.writeInt(0); + } else if(slots[3].getItem() == ModItems.fusion_shield_tungsten) { + buf.writeInt(1); + } else if(slots[3].getItem() == ModItems.fusion_shield_desh) { + buf.writeInt(2); + } else if(slots[3].getItem() == ModItems.fusion_shield_chlorophyte) { + buf.writeInt(3); + } else if(slots[3].getItem() == ModItems.fusion_shield_vaporwave) { + buf.writeInt(4); + } + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.isOn = buf.readBoolean(); + this.power = buf.readLong(); + this.progress = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + plasma.deserialize(buf); + this.blanket = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java index 78292b220..da52bb30f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java @@ -23,6 +23,7 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -111,13 +112,8 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin if(power > maxPower) power = maxPower; - - data.setInteger("playersUsing", playersUsing); - data.setInteger("setting", setting); - data.setBoolean("isOn", isOn); - data.setBoolean("wasOn", wasOn); - tank.writeToNBT(data, "tank"); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { this.prevDoorAngle = this.doorAngle; @@ -200,14 +196,23 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.playersUsing = nbt.getInteger("playersUsing"); - this.setting = nbt.getInteger("setting"); - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - this.wasOn = nbt.getBoolean("wasOn"); - this.tank.readFromNBT(nbt, "tank"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.playersUsing); + buf.writeInt(this.setting); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.wasOn); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.playersUsing = buf.readInt(); + this.setting = buf.readInt(); + this.isOn = buf.readBoolean(); + this.wasOn = buf.readBoolean(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java index c3e94a705..a62846ea1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java @@ -27,6 +27,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -119,16 +120,8 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement for(DirPos pos : getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("progress", progress); - data.setInteger("processTime", processTime); - data.setInteger("powerRequirement", powerRequirement); - data.setLong("power", power); - tanks[0].writeToNBT(data, "0"); - tanks[1].writeToNBT(data, "1"); - data.setBoolean("isOn", isOn); - this.networkPack(data, 100); + + this.networkPackNT(100); } else { @@ -163,17 +156,29 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement } private float randSpeed = 0.1F; - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.progress = nbt.getInteger("progress"); - this.processTime = nbt.getInteger("processTime"); - this.powerRequirement = nbt.getInteger("powerRequirement"); - this.power = nbt.getLong("power"); - tanks[0].readFromNBT(nbt, "0"); - tanks[1].readFromNBT(nbt, "1"); - this.isOn = nbt.getBoolean("isOn"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.progress); + buf.writeInt(this.processTime); + buf.writeInt(this.powerRequirement); + buf.writeLong(this.power); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.progress = buf.readInt(); + this.processTime = buf.readInt(); + this.powerRequirement = buf.readInt(); + this.power = buf.readLong(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + this.isOn = buf.readBoolean(); } private void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index d36cb4336..3b0ea20a6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -28,6 +28,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -151,22 +152,26 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen generate(); - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("power", (int) power); - data.setInteger("powerCap", (int) powerCap); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + this.networkPackNT(50); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - power = data.getInteger("power"); - powerCap = data.getInteger("powerCap"); - tank.readFromNBT(data, "t"); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt((int) power); + buf.writeInt((int) powerCap); + tank.serialize(buf); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readInt(); + this.powerCap = buf.readInt(); + tank.deserialize(buf); + } + public boolean hasAcceptableFuel() { return getHEFromFuel() > 0; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index 081aab10a..6ed33d35c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -13,6 +13,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; @@ -20,6 +21,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -117,16 +119,7 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("press", press); - if(slots[2] != null) { - NBTTagCompound stack = new NBTTagCompound(); - slots[2].writeToNBT(stack); - data.setTag("stack", stack); - } - - this.networkPack(data, 50); + this.networkPackNT(50); } else { @@ -141,21 +134,27 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE } } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.syncPress = nbt.getInteger("press"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); - } else { - this.syncStack = null; - } - + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeInt(press); + if (slots[2] == null) + buf.writeShort(-1); // indicate that the NBT doesn't actually exist to avoid null pointer errors. + else + BufferUtil.writeNBT(buf, slots[2].stackTagCompound); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.syncPress = buf.readInt(); + + NBTTagCompound stack = BufferUtil.readNBT(buf); + this.syncStack = ItemStack.loadItemStackFromNBT(stack); + this.turnProgress = 2; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index ba32528da..ce494df35 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -29,6 +29,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -102,6 +103,8 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme return "container.machineLargeTurbine"; } + private boolean operational; + @Override public void updateEntity() { @@ -117,9 +120,7 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme tanks[0].setType(0, 1, slots); tanks[0].loadTank(2, 3, slots); power = Library.chargeItemsFromTE(slots, 4, power, maxPower); - - boolean operational = false; - + FluidType in = tanks[0].getTankType(); boolean valid = false; if(in.hasTrait(FT_Coolable.class)) { @@ -145,13 +146,9 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme if(power > maxPower) power = maxPower; tanks[1].unloadTank(5, 6, slots); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setBoolean("operational", operational); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - this.networkPack(data, 50); + + this.networkPackNT(50); + } else { this.lastRotor = this.rotor; this.rotor += this.fanAcceleration; @@ -199,14 +196,23 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme new DirPos(xCoord + dir.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2, dir) }; } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - this.shouldTurn = data.getBoolean("operational"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeBoolean(operational); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.shouldTurn = buf.readBoolean(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } public long getPowerScaled(int i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index e5ad38a1b..2747502cb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -31,6 +31,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardSender; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.EntityLivingBase; @@ -83,6 +84,8 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen return "container.miningLaser"; } + private double clientBreakProgress; + @Override public void updateEntity() { @@ -108,8 +111,6 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen lastTargetY = targetY; lastTargetZ = targetZ; - double clientBreakProgress = 0; - if(isOn) { UpgradeManager.eval(slots, 1, 8); @@ -167,43 +168,45 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen this.tryFillContainer(xCoord, yCoord, zCoord + 2); this.tryFillContainer(xCoord, yCoord, zCoord - 2); - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("lastX", lastTargetX); - data.setInteger("lastY", lastTargetY); - data.setInteger("lastZ", lastTargetZ); - data.setInteger("x", targetX); - data.setInteger("y", targetY); - data.setInteger("z", targetZ); - data.setBoolean("beam", beam); - data.setBoolean("isOn", isOn); - data.setDouble("progress", clientBreakProgress); - tank.writeToNBT(data, "t"); - - this.networkPack(data, 250); + this.networkPackNT(250); } } private void updateConnections() { this.trySubscribe(worldObj, xCoord, yCoord + 2, zCoord, ForgeDirection.UP); } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - this.power = data.getLong("power"); - this.lastTargetX = data.getInteger("lastX"); - this.lastTargetY = data.getInteger("lastY"); - this.lastTargetZ = data.getInteger("lastZ"); - this.targetX = data.getInteger("x"); - this.targetY = data.getInteger("y"); - this.targetZ = data.getInteger("z"); - this.beam = data.getBoolean("beam"); - this.isOn = data.getBoolean("isOn"); - this.breakProgress = data.getDouble("progress"); - tank.readFromNBT(data, "t"); + @Override + public void serialize(ByteBuf buf) { + buf.writeLong(this.power); + buf.writeInt(this.lastTargetX); + buf.writeInt(this.lastTargetY); + buf.writeInt(this.lastTargetZ); + buf.writeInt(this.targetX); + buf.writeInt(this.targetY); + buf.writeInt(this.targetZ); + buf.writeBoolean(this.beam); + buf.writeBoolean(this.isOn); + buf.writeDouble(this.clientBreakProgress); + tank.serialize(buf); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.lastTargetX = buf.readInt(); + this.lastTargetY = buf.readInt(); + this.lastTargetZ = buf.readInt(); + this.targetX = buf.readInt(); + this.targetY = buf.readInt(); + this.targetZ = buf.readInt(); + this.beam = buf.readBoolean(); + this.isOn = buf.readBoolean(); + this.breakProgress = buf.readDouble(); + tank.deserialize(buf); + } + private void buildDam() { if(worldObj.getBlock(targetX + 1, targetY, targetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX + 1, targetY, targetZ, ModBlocks.barricade); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java index 8224d6f41..0d8621759 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java @@ -19,6 +19,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -122,13 +123,7 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme /// END Loading plasma into the ITER /// /// START Notif packets /// - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - plasma.writeToNBT(data, "t2"); - this.networkPack(data, 50); + this.networkPackNT(50); /// END Notif packets /// } } @@ -148,14 +143,23 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme } } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - tanks[0].readFromNBT(nbt, "t0"); - tanks[1].readFromNBT(nbt, "t1"); - plasma.readFromNBT(nbt, "t2"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + plasma.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + plasma.deserialize(buf); } private void updateType() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index 58a31e5bd..655ce48be 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -8,8 +8,10 @@ import com.hbm.items.machine.ItemStamp; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -133,17 +135,7 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU this.markChanged(); } - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("speed", speed); - data.setInteger("burnTime", burnTime); - data.setInteger("press", press); - if(slots[2] != null) { - NBTTagCompound stack = new NBTTagCompound(); - slots[2].writeToNBT(stack); - data.setTag("stack", stack); - } - - this.networkPack(data, 50); + this.networkPackNT(50); } else { @@ -158,6 +150,30 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU } } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.speed); + buf.writeInt(this.burnTime); + buf.writeInt(this.press); + if (slots[2] == null) + buf.writeShort(-1); // indicate that the NBT doesn't actually exist to avoid null pointer errors. + else + BufferUtil.writeNBT(buf, slots[2].stackTagCompound); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.speed = buf.readInt(); + this.burnTime = buf.readInt(); + this.press = buf.readInt(); + NBTTagCompound stack = BufferUtil.readNBT(buf); + this.syncStack = ItemStack.loadItemStackFromNBT(stack); + + this.turnProgress = 2; + } @Override public void networkUnpack(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java index 825937515..a4d1bcbec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java @@ -11,6 +11,7 @@ import com.hbm.items.special.ItemWasteLong; import com.hbm.items.special.ItemWasteShort; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.Tuple.Triplet; @@ -18,6 +19,7 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -111,26 +113,29 @@ public class TileEntityMachineRadGen extends TileEntityMachineBase implements IE if(this.power > maxPower) this.power = maxPower; - - NBTTagCompound data = new NBTTagCompound(); - data.setIntArray("progress", this.progress); - data.setIntArray("maxProgress", this.maxProgress); - data.setIntArray("production", this.production); - data.setLong("power", this.power); - data.setBoolean("isOn", this.isOn); - this.networkPack(data, 50); + + this.networkPackNT(50); } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.progress = nbt.getIntArray("progress"); - this.maxProgress = nbt.getIntArray("maxProgress"); - this.production = nbt.getIntArray("production"); - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + BufferUtil.writeIntArray(buf, this.progress); + BufferUtil.writeIntArray(buf, this.maxProgress); + BufferUtil.writeIntArray(buf, this.production); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.progress = BufferUtil.readIntArray(buf); + this.maxProgress = BufferUtil.readIntArray(buf); + this.production = BufferUtil.readIntArray(buf); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java index c468441a0..107d37ba1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java @@ -23,6 +23,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -98,16 +99,6 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement tanks[2].writeToNBT(nbt, "output2"); } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - this.heat = data.getInteger("heat"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); - tanks[2].readFromNBT(data, "t2"); - } - @Override public void updateEntity() { @@ -139,16 +130,30 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("heat", heat); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - tanks[2].writeToNBT(data, "t2"); - this.networkPack(data, 50); + + this.networkPackNT(50); } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.heat); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + tanks[2].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.heat = buf.readInt(); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + tanks[2].serialize(buf); + } protected DirPos[] getConPos() { return new DirPos[] { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java index ceb1bef2c..b0f71f6c1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java @@ -15,6 +15,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -66,19 +67,23 @@ public class TileEntityMachineReactorBreeding extends TileEntityMachineBase impl } else { progress = 0.0F; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("flux", flux); - data.setFloat("progress", progress); - this.networkPack(data, 20); + + this.networkPackNT(20); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - flux = data.getInteger("flux"); - progress = data.getFloat("progress"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(flux); + buf.writeFloat(progress); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.flux = buf.readInt(); + this.progress = buf.readFloat(); } public void getInteractions() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java index 7f9241d46..7e7784c6d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java @@ -16,6 +16,7 @@ import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -167,11 +168,8 @@ public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineB } else { process = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("progress", process); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { @@ -193,6 +191,20 @@ public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineB } } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.process); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.process = buf.readInt(); + } @Override public AudioWrapper createAudioLoop() { @@ -224,14 +236,6 @@ public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineB audio = null; } } - - @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - this.process = data.getInteger("progress"); - } @Override public void setPower(long i) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java index b085ee613..3a405ca0d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java @@ -27,6 +27,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -69,6 +70,8 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } } + private SolderingRecipe recipe; + @Override public void updateEntity() { @@ -84,7 +87,7 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } } - SolderingRecipe recipe = SolderingRecipes.getRecipe(new ItemStack[] {slots[0], slots[1], slots[2], slots[3], slots[4], slots[5]}); + recipe = SolderingRecipes.getRecipe(new ItemStack[] {slots[0], slots[1], slots[2], slots[3], slots[4], slots[5]}); long intendedMaxPower; UpgradeManager.eval(slots, 9, 10); @@ -133,19 +136,8 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } this.maxPower = Math.max(intendedMaxPower, power); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setLong("maxPower", maxPower); - data.setLong("consumption", consumption); - data.setInteger("progress", progress); - data.setInteger("processTime", processTime); - if(recipe != null) { - data.setInteger("display", Item.getIdFromItem(recipe.output.getItem())); - data.setInteger("displayMeta", recipe.output.getItemDamage()); - } - this.tank.writeToNBT(data, "t"); - this.networkPack(data, 25); + + this.networkPackNT(25); } } @@ -240,22 +232,38 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.maxPower = nbt.getLong("maxPower"); - this.consumption = nbt.getLong("consumption"); - this.progress = nbt.getInteger("progress"); - this.processTime = nbt.getInteger("processTime"); - - if(nbt.hasKey("display")) { - this.display = new ItemStack(Item.getItemById(nbt.getInteger("display")), 1, nbt.getInteger("displayMeta")); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeLong(this.maxPower); + buf.writeLong(this.consumption); + buf.writeInt(this.progress); + buf.writeInt(this.processTime); + buf.writeBoolean(recipe != null); + if(recipe != null) { + buf.writeInt(Item.getIdFromItem(recipe.output.getItem())); + buf.writeInt(recipe.output.getItemDamage()); + } + this.tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.maxPower = buf.readLong(); + this.consumption = buf.readLong(); + this.progress = buf.readInt(); + this.processTime = buf.readInt(); + + if(buf.readBoolean()) { + int id = buf.readInt(); + this.display = new ItemStack(Item.getItemById(id), 1, buf.readInt()); } else { this.display = null; } - - this.tank.readFromNBT(nbt, "t"); + + this.tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index f7e3349f5..7c19022ab 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -28,6 +28,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -85,7 +86,9 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement tanks[2] = new FluidTank(Fluids.WATER, 16000); tanks[3] = new FluidTank(Fluids.HOTSTEAM, 160000); } - + + private long powerBeforeNet; + @Override public void updateEntity() { @@ -131,10 +134,9 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", Math.min(this.power, this.maxPower)); //set first to get an unmodified view of how much power was generated before deductions from the net - + + powerBeforeNet = Math.min(this.power, maxPower); + //do net/battery deductions first... power = Library.chargeItemsFromTE(slots, 0, power, maxPower); this.tryProvide(worldObj, xCoord - dir.offsetZ * 5, yCoord + 1, zCoord + dir.offsetX * 5, rot); //sends out power @@ -152,26 +154,8 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement this.trySubscribe(tanks[2].getTankType(), worldObj, xCoord + dir.offsetX * 2 + rot.offsetX * -4, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * -4, dir); //steam this.sendFluid(tanks[3], worldObj, xCoord + dir.offsetZ * 6, yCoord + 1, zCoord - dir.offsetX * 6, rot.getOpposite()); - - data.setInteger("rpm", this.rpm); - data.setInteger("temp", this.temp); - data.setInteger("state", this.state); - data.setBoolean("automode", this.autoMode); - data.setInteger("throttle", this.throttle); - data.setInteger("slidpos", this.powerSliderPos); - - if(state != 1) { - data.setInteger("counter", this.counter); //sent during startup and shutdown - } else { - data.setInteger("instantPow", this.instantPowerOutput); //sent while running - } - - tanks[0].writeToNBT(data, "fuel"); - tanks[1].writeToNBT(data, "lube"); - tanks[2].writeToNBT(data, "water"); - tanks[3].writeToNBT(data, "steam"); - this.networkPack(data, 150); + this.networkPackNT(150); } else { //client side, for sounds n shit @@ -200,6 +184,51 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.powerBeforeNet); + buf.writeInt(this.rpm); + buf.writeInt(this.temp); + buf.writeInt(this.state); + buf.writeBoolean(this.autoMode); + buf.writeInt(this.throttle); + buf.writeInt(this.powerSliderPos); + + if(state != 1) { + buf.writeInt(this.counter); //sent during startup and shutdown + } else { + buf.writeInt(this.instantPowerOutput); //sent while running + } + + tanks[0].serialize(buf); + tanks[1].serialize(buf); + tanks[2].serialize(buf); + tanks[3].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.rpm = buf.readInt(); + this.temp = buf.readInt(); + this.state = buf.readInt(); + this.autoMode = buf.readBoolean(); + this.powerSliderPos = buf.readInt(); + this.throttle = buf.readInt(); + + if(state != 1) + this.counter = buf.readInt(); + else + this.instantPowerOutput = buf.readInt(); //state 1 + + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.tanks[2].deserialize(buf); + this.tanks[3].deserialize(buf); + } private void stopIfNotReady() { @@ -378,30 +407,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.rpm = nbt.getInteger("rpm"); - this.temp = nbt.getInteger("temp"); - this.state = nbt.getInteger("state"); - this.autoMode = nbt.getBoolean("automode"); - this.powerSliderPos = nbt.getInteger("slidpos"); - this.throttle = nbt.getInteger("throttle"); - - if(nbt.hasKey("counter")) - this.counter = nbt.getInteger("counter"); //state 0 and -1 - else - this.instantPowerOutput = nbt.getInteger("instantPow"); //state 1 - - this.tanks[0].readFromNBT(nbt, "fuel"); - this.tanks[1].readFromNBT(nbt, "lube"); - this.tanks[2].readFromNBT(nbt, "water"); - this.tanks[3].readFromNBT(nbt, "steam"); - } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index 875a2698e..6970a921f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -34,6 +34,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -284,15 +285,8 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem if(this.power > this.maxPower) { this.power = this.maxPower; } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setByte("after", (byte) afterburner); - data.setBoolean("wasOn", wasOn); - data.setBoolean("showBlood", showBlood); - tank.writeToNBT(data, "tank"); - blood.writeToNBT(data, "blood"); - this.networkPack(data, 150); + + this.networkPackNT(150); } else { @@ -385,16 +379,27 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem } } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.afterburner = nbt.getByte("after"); - this.wasOn = nbt.getBoolean("wasOn"); - this.showBlood = nbt.getBoolean("showBlood"); - tank.readFromNBT(nbt, "tank"); - blood.readFromNBT(nbt, "blood"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeByte((byte) afterburner); + buf.writeBoolean(wasOn); + buf.writeBoolean(showBlood); + tank.serialize(buf); + blood.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.afterburner = buf.readByte(); + this.wasOn = buf.readBoolean(); + this.showBlood = buf.readBoolean(); + tank.deserialize(buf); + blood.deserialize(buf); } public AudioWrapper createAudioLoop() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java index b6e4e9d55..48c671e50 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java @@ -11,6 +11,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -75,21 +76,25 @@ public class TileEntityMicrowave extends TileEntityMachineBase implements IEnerg time += speed * 2; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("time", time); - data.setInteger("speed", speed); - networkPack(data, 50); + + networkPackNT(50); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - power = data.getLong("power"); - time = data.getInteger("time"); - speed = data.getInteger("speed"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeInt(time); + buf.writeInt(speed); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + power = buf.readLong(); + time = buf.readInt(); + speed = buf.readInt(); } public void handleButtonPacket(int value, int meta) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 15fe1d786..d33ff0118 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -29,6 +29,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -270,22 +271,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.coreHeat = 0; } } - - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - data.setInteger("rodCount", rodCount); - data.setInteger("coreHeat", coreHeat); - data.setInteger("hullHeat", hullHeat); - data.setDouble("flux", flux); - data.setDouble("processTime", processTime); - data.setDouble("progress", progress); - data.setInteger("typeLoaded", typeLoaded); - data.setInteger("amountLoaded", amountLoaded); - data.setDouble("rodLevel", rodLevel); - data.setDouble("rodTarget", rodTarget); - data.setInteger("coreHeatCapacity", coreHeatCapacity); - this.networkPack(data, 150); + + this.networkPackNT(150); } else { if(amountLoaded > 0) { @@ -383,23 +370,41 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG protected int getRodCountForCoolant() { return this.rodCount + (int) Math.ceil(this.heatsinkCount / 4D); } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - tanks[0].readFromNBT(nbt, "t0"); - tanks[1].readFromNBT(nbt, "t1"); - rodCount = nbt.getInteger("rodCount"); - coreHeat = nbt.getInteger("coreHeat"); - hullHeat = nbt.getInteger("hullHeat"); - flux = nbt.getDouble("flux"); - processTime = nbt.getDouble("processTime"); - progress = nbt.getDouble("progress"); - typeLoaded = nbt.getInteger("typeLoaded"); - amountLoaded = nbt.getInteger("amountLoaded"); - rodLevel = nbt.getDouble("rodLevel"); - rodTarget = nbt.getInteger("rodTarget"); - coreHeatCapacity = nbt.getInteger("coreHeatCapacity"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.rodCount); + buf.writeInt(this.coreHeat); + buf.writeInt(this.hullHeat); + buf.writeDouble(this.flux); + buf.writeDouble(this.processTime); + buf.writeDouble(this.progress); + buf.writeInt(this.typeLoaded); + buf.writeInt(this.amountLoaded); + buf.writeDouble(this.rodLevel); + buf.writeDouble(this.rodTarget); + buf.writeInt(this.coreHeatCapacity); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.rodCount = buf.readInt(); + this.coreHeat = buf.readInt(); + this.hullHeat = buf.readInt(); + this.flux = buf.readDouble(); + this.processTime = buf.readDouble(); + this.progress = buf.readDouble(); + this.typeLoaded = buf.readInt(); + this.amountLoaded = buf.readInt(); + this.rodLevel = buf.readDouble(); + this.rodTarget = buf.readInt(); + this.coreHeatCapacity = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } protected void setupTanks() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java index 0a5fad22a..a8b1be570 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorControl.java @@ -13,6 +13,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -136,33 +137,37 @@ public class TileEntityReactorControl extends TileEntityMachineBase implements I reactor.setTarget(level); } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setDouble("level", level); - data.setInteger("flux", flux); - data.setBoolean("isLinked", isLinked); - data.setDouble("levelLower", levelLower); - data.setDouble("levelUpper", levelUpper); - data.setDouble("heatLower", heatLower); - data.setDouble("heatUpper", heatUpper); - data.setInteger("function", function.ordinal()); - this.networkPack(data, 150); + + this.networkPackNT(150); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.heat = data.getInteger("heat"); - this.level = data.getDouble("level"); - this.flux = data.getInteger("flux"); - isLinked = data.getBoolean("isLinked"); - levelLower = data.getDouble("levelLower"); - levelUpper = data.getDouble("levelUpper"); - heatLower = data.getDouble("heatLower"); - heatUpper = data.getDouble("heatUpper"); - function = RodFunction.values()[data.getInteger("function")]; + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(heat); + buf.writeDouble(level); + buf.writeInt(flux); + buf.writeBoolean(isLinked); + buf.writeDouble(levelLower); + buf.writeDouble(levelUpper); + buf.writeDouble(heatLower); + buf.writeDouble(heatUpper); + buf.writeByte(function.ordinal()); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.level = buf.readDouble(); + this.flux = buf.readInt(); + isLinked = buf.readBoolean(); + levelLower = buf.readDouble(); + levelUpper = buf.readDouble(); + heatLower = buf.readDouble(); + heatUpper = buf.readDouble(); + function = RodFunction.values()[buf.readByte()]; } private boolean establishLink() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java index e242b5ee2..2f35685ce 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java @@ -15,12 +15,14 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPlateFuel; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -151,27 +153,31 @@ public class TileEntityReactorResearch extends TileEntityMachineBase implements float rad = (float) heat / (float) maxHeat * 50F; ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord, zCoord, rad); } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setByte("water", water); - data.setDouble("level", level); - data.setDouble("targetLevel", targetLevel); - data.setIntArray("slotFlux", slotFlux); - data.setInteger("totalFlux", totalFlux); - this.networkPack(data, 150); + + this.networkPackNT(150); } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.heat = data.getInteger("heat"); - this.water = data.getByte("water"); - this.level = data.getDouble("level"); - this.targetLevel = data.getDouble("targetLevel"); - this.slotFlux = data.getIntArray("slotFlux"); - this.totalFlux = data.getInteger("totalFlux"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.heat); + buf.writeByte(this.water); + buf.writeDouble(this.level); + buf.writeDouble(this.targetLevel); + BufferUtil.writeIntArray(buf, this.slotFlux); + buf.writeInt(this.totalFlux); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.water = buf.readByte(); + this.level = buf.readDouble(); + this.targetLevel = buf.readDouble(); + this.slotFlux = BufferUtil.readIntArray(buf); + this.totalFlux = buf.readInt(); } public byte getWater() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index d1a46f430..ec4902930 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -33,6 +33,7 @@ import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -128,17 +129,6 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.heat = data.getInteger("heat"); - this.pressure = data.getInteger("pressure"); - this.isOn = data.getBoolean("isOn"); - steam.readFromNBT(data, "t0"); - carbonDioxide.readFromNBT(data, "t1"); - water.readFromNBT(data, "t2"); - } - public int getGaugeScaled(int i, int type) { switch (type) { case 0: return (steam.getFill() * i) / steam.getMaxFill(); @@ -227,18 +217,33 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC } checkIfMeltdown(); - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setInteger("pressure", pressure); - data.setBoolean("isOn", isOn); - steam.writeToNBT(data, "t0"); - carbonDioxide.writeToNBT(data, "t1"); - water.writeToNBT(data, "t2"); - this.networkPack(data, 150); + + this.networkPackNT(150); } } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.heat); + buf.writeInt(this.pressure); + buf.writeBoolean(this.isOn); + steam.serialize(buf); + carbonDioxide.serialize(buf); + water.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.pressure = buf.readInt(); + this.isOn = buf.readBoolean(); + steam.deserialize(buf); + carbonDioxide.deserialize(buf); + water.deserialize(buf); + } + private void generateSteam() { // function of SHS produced per tick diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java index 346d171f5..5bcf63e9b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java @@ -23,6 +23,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.item.IDesignatorItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -94,15 +95,8 @@ public class TileEntitySoyuzLauncher extends TileEntityMachineBase implements IS } else { liftOff(); } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setByte("mode", mode); - data.setBoolean("starting", starting); - data.setByte("type", this.getType()); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - networkPack(data, 250); + + networkPackNT(250); } if(worldObj.isRemote) { @@ -189,18 +183,29 @@ public class TileEntitySoyuzLauncher extends TileEntityMachineBase implements IS audio = null; } } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - power = data.getLong("power"); - mode = data.getByte("mode"); - starting = data.getBoolean("starting"); - rocketType = data.getByte("type"); - tanks[0].readFromNBT(data, "t0"); - tanks[1].readFromNBT(data, "t1"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeByte(mode); + buf.writeBoolean(starting); + buf.writeByte(this.getType()); + tanks[0].serialize(buf); + tanks[1].serialize(buf); } - + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + power = buf.readLong(); + mode = buf.readByte(); + starting = buf.readBoolean(); + rocketType = buf.readByte(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + } + public void startCountdown() { if(canLaunch()) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java index ecdb619a0..ee498d053 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java @@ -15,6 +15,7 @@ import com.hbm.util.ArmorUtil; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityCreeper; @@ -69,17 +70,7 @@ public class TileEntityTesla extends TileEntityMachineBase implements IEnergyRec this.targets = zap(worldObj, dx, dy, dz, range, null); } - NBTTagCompound data = new NBTTagCompound(); - data.setShort("length", (short)targets.size()); - int i = 0; - for(double[] d : this.targets) { - data.setDouble("x" + i, d[0]); - data.setDouble("y" + i, d[1]); - data.setDouble("z" + i, d[2]); - i++; - } - - this.networkPack(data, 100); + this.networkPackNT(100); } } @@ -145,19 +136,30 @@ public class TileEntityTesla extends TileEntityMachineBase implements IEnergyRec return ret; } - - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - int s = data.getShort("length"); - + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort((short)targets.size()); + for(double[] d : this.targets) { + buf.writeDouble(d[0]); + buf.writeDouble(d[1]); + buf.writeDouble(d[2]); + } + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + int s = buf.readShort(); + this.targets.clear(); - + for(int i = 0; i < s; i++) this.targets.add(new double[] { - data.getDouble("x" + i), - data.getDouble("y" + i), - data.getDouble("z" + i) + buf.readDouble(), // X + buf.readDouble(), // Y + buf.readDouble() // Z }); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index a7ebcfd70..e3489abe0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -31,6 +31,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -120,7 +121,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand /* send sync packets (order doesn't matter) */ for(TileEntityWatz segment : segments) { segment.isOn = turnedOn; - segment.sendPacket(sharedTanks); + this.networkPackNT(25); segment.heat *= 0.99; //cool 1% per tick } @@ -277,30 +278,28 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand } } } - - public void sendPacket(FluidTank[] tanks) { - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", this.heat); - data.setBoolean("isOn", isOn); - data.setBoolean("lock", isLocked); - data.setDouble("flux", this.fluxLastReaction + this.fluxLastBase); - for(int i = 0; i < tanks.length; i++) { - tanks[i].writeToNBT(data, "t" + i); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.heat); + buf.writeBoolean(isOn); + buf.writeBoolean(isLocked); + buf.writeDouble(this.fluxLastReaction + this.fluxLastBase); + for (FluidTank tank : tanks) { + tank.serialize(buf); } - this.networkPack(data, 25); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.heat = nbt.getInteger("heat"); - this.isOn = nbt.getBoolean("isOn"); - this.isLocked = nbt.getBoolean("lock"); - this.fluxDisplay = nbt.getDouble("flux"); - for(int i = 0; i < tanks.length; i++) { - tanks[i].readFromNBT(nbt, "t" + i); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.heat = buf.readInt(); + this.isOn = buf.readBoolean(); + this.isLocked = buf.readBoolean(); + this.fluxDisplay = buf.readDouble(); + for (FluidTank tank : tanks) { + tank.deserialize(buf); } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java index 3ef9daf56..a95a94b68 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java @@ -20,6 +20,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -73,13 +74,24 @@ public class TileEntityMachineCatalyticReformer extends TileEntityMachineBase im } } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - for(int i = 0; i < 4; i++) tanks[i].writeToNBT(data, "" + i); - this.networkPack(data, 150); + + this.networkPackNT(150); } } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + for(int i = 0; i < 4; i++) tanks[i].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); + } @Override public void networkUnpack(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java index cf90645d5..dcee0bbc2 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java @@ -12,6 +12,7 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.Tuple.Triplet; import com.hbm.util.fauxpointtwelve.DirPos; @@ -19,6 +20,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -107,14 +109,8 @@ public class TileEntityMachineCoker extends TileEntityMachineBase implements IFl for(DirPos pos : getConPos()) { if(this.tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("wasOn", this.wasOn); - data.setInteger("heat", this.heat); - data.setInteger("progress", this.progress); - tanks[0].writeToNBT(data, "t0"); - tanks[1].writeToNBT(data, "t1"); - this.networkPack(data, 25); + + this.networkPackNT(25); } else { if(this.wasOn) { @@ -135,6 +131,8 @@ public class TileEntityMachineCoker extends TileEntityMachineBase implements IFl } } } + + public DirPos[] getConPos() { @@ -172,16 +170,25 @@ public class TileEntityMachineCoker extends TileEntityMachineBase implements IFl return true; } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.wasOn = nbt.getBoolean("wasOn"); - this.heat = nbt.getInteger("heat"); - this.progress = nbt.getInteger("progress"); - tanks[0].readFromNBT(nbt, "t0"); - tanks[1].readFromNBT(nbt, "t1"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.wasOn); + buf.writeInt(this.heat); + buf.writeInt(this.progress); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.wasOn = buf.readBoolean(); + this.heat = buf.readInt(); + this.progress = buf.readInt(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index 1bfbfe835..ed34c417a 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -30,6 +30,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -178,13 +179,8 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements } power = Library.chargeItemsFromTE(slots, 0, power, maxPower); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setBoolean("isOn", isOn); - data.setBoolean("doesBurn", doesBurn); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + + this.networkPackNT(50); } else { @@ -240,15 +236,23 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements new DirPos(xCoord, yCoord, zCoord - 2, Library.NEG_Z) }; } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - this.doesBurn = nbt.getBoolean("doesBurn"); - tank.readFromNBT(nbt, "t"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.doesBurn); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); + this.doesBurn = buf.readBoolean(); + tank.serialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index a97f9574d..201d7a409 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -24,6 +24,7 @@ import api.hbm.fluid.IFluidStandardSender; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -76,14 +77,8 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen this.progress = 0; this.sendFluid(); - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setInteger("progress", this.progress); - data.setInteger("usage", this.usage); - data.setInteger("processTime", this.processTime); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + + this.networkPackNT(50); } } @@ -154,14 +149,23 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.progress = nbt.getInteger("progress"); - this.usage = nbt.getInteger("usage"); - this.processTime = nbt.getInteger("processTime"); - tank.readFromNBT(nbt, "t"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.progress); + buf.writeInt(this.usage); + buf.writeInt(this.processTime); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.progress = buf.readInt(); + this.usage = buf.readInt(); + this.processTime = buf.readInt(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index 65bf61681..29e46ab1f 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -37,6 +37,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -193,14 +194,9 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements } } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - for(int i = 0; i < 5; i++) tanks[i].writeToNBT(data, "" + i); - data.setBoolean("exploded", hasExploded); - data.setBoolean("onFire", onFire); - data.setBoolean("isOn", this.isOn); - this.networkPack(data, 150); + + this.networkPackNT(150); + } else { if(this.isOn) audioTime = 20; @@ -253,16 +249,25 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements audio = null; } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - for(int i = 0; i < 5; i++) tanks[i].readFromNBT(nbt, "" + i); - this.hasExploded = nbt.getBoolean("exploded"); - this.onFire = nbt.getBoolean("onFire"); - this.isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + for(int i = 0; i < 5; i++) tanks[i].serialize(buf); + buf.writeBoolean(this.hasExploded); + buf.writeBoolean(this.onFire); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + for(int i = 0; i < 5; i++) tanks[i].deserialize(buf); + this.hasExploded = buf.readBoolean(); + this.onFire = buf.readBoolean(); + this.isOn = buf.readBoolean(); } private void refine() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index 5f0545326..cb8daee0c 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -24,6 +24,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -75,14 +76,8 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement this.process(); else this.progress = 0; - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setInteger("progress", this.progress); - data.setInteger("usage", this.usage); - data.setInteger("processTime", this.processTime); - tank.writeToNBT(data, "t"); - this.networkPack(data, 50); + + this.networkPackNT(50); } } @@ -171,14 +166,23 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.progress = nbt.getInteger("progress"); - this.usage = nbt.getInteger("usage"); - this.processTime = nbt.getInteger("processTime"); - tank.readFromNBT(nbt, "t"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.progress); + buf.writeInt(this.usage); + buf.writeInt(this.processTime); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.progress = buf.readInt(); + this.usage = buf.readInt(); + this.processTime = buf.readInt(); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java index 037982ffd..c40b6dae4 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java @@ -20,6 +20,7 @@ import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -81,12 +82,9 @@ public class TileEntityMachineVacuumDistill extends TileEntityMachineBase implem } } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", this.power); - data.setBoolean("isOn", this.isOn); - for(int i = 0; i < 5; i++) tanks[i].writeToNBT(data, "" + i); - this.networkPack(data, 150); + + this.networkPackNT(150); + } else { if(this.isOn) audioTime = 20; @@ -139,14 +137,21 @@ public class TileEntityMachineVacuumDistill extends TileEntityMachineBase implem audio = null; } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - for(int i = 0; i < 5; i++) tanks[i].readFromNBT(nbt, "" + i); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + for(int i = 0; i < 5; i++) tanks[i].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); + for(int i = 0; i < 5; i++) tanks[i].deserialize(buf); } private void refine() { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index 78ea7a558..4d53c8c5d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -14,6 +14,7 @@ import com.hbm.inventory.gui.GUIRBMKConsole; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; +import com.hbm.util.BufferUtil; import com.hbm.util.Compat; import com.hbm.util.EnumUtil; import com.hbm.util.I18nUtil; @@ -21,6 +22,7 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -77,8 +79,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon this.worldObj.theProfiler.endSection(); prepareScreenInfo(); } - - prepareNetworkPack(); + + this.networkPackNT(50); } } @@ -185,66 +187,65 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon screen.display = text; } } - - private void prepareNetworkPack() { - - NBTTagCompound data = new NBTTagCompound(); - - if(this.worldObj.getTotalWorldTime() % 10 == 0) { - - data.setBoolean("full", true); - - for(int i = 0; i < columns.length; i++) { - - if(this.columns[i] != null) { - data.setTag("column_" + i, this.columns[i].data); - data.setShort("type_" + i, (short)this.columns[i].type.ordinal()); - } - } - - data.setIntArray("flux", this.fluxBuffer); - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - if(screen.display != null) { - data.setString("t" + i, screen.display); - } - } - } - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - data.setByte("s" + i, (byte) screen.type.ordinal()); - } - - this.networkPack(data, 50); - } - @Override - public void networkUnpack(NBTTagCompound data) { - - if(data.getBoolean("full")) { - this.columns = new RBMKColumn[15 * 15]; - - for(int i = 0; i < columns.length; i++) { - - if(data.hasKey("type_" + i)) { - this.columns[i] = new RBMKColumn(ColumnType.values()[data.getShort("type_" + i)], (NBTTagCompound)data.getTag("column_" + i)); + public void serialize(ByteBuf buf) { + super.serialize(buf); + + if (this.worldObj.getTotalWorldTime() % 10 == 0) { + buf.writeBoolean(true); + + for (RBMKColumn column : this.columns) { + if (column == null || column.type == null) + buf.writeByte(-1); + else { + buf.writeByte((byte) column.type.ordinal()); + BufferUtil.writeNBT(buf, column.data); } } - - this.fluxBuffer = data.getIntArray("flux"); - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - screen.display = data.getString("t" + i); + + BufferUtil.writeIntArray(buf, fluxBuffer); + + for (RBMKScreen screen : this.screens) { + BufferUtil.writeString(buf, screen.display); + } + + } else { + + buf.writeBoolean(false); + + for (RBMKScreen screen : screens) { + buf.writeByte((byte) screen.type.ordinal()); } } - - for(int i = 0; i < this.screens.length; i++) { - RBMKScreen screen = screens[i]; - screen.type = ScreenType.values()[data.getByte("s" + i)]; + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + if (buf.readBoolean()) { // check if it should be a full packet + + for(int i = 0; i < this.columns.length; i++) { + byte ordinal = buf.readByte(); + if (ordinal == -1) + this.columns[i] = null; + else + this.columns[i] = new RBMKColumn(ColumnType.values()[ordinal], BufferUtil.readNBT(buf)); + } + + this.fluxBuffer = BufferUtil.readIntArray(buf); + + for (RBMKScreen screen : this.screens) { + screen.display = BufferUtil.readString(buf); + } + + } else { + + for (RBMKScreen screen : this.screens) { + screen.type = ScreenType.values()[buf.readByte()]; + } + } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java index a634dcc79..a50aa77b8 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneBoxer.java @@ -8,6 +8,7 @@ import com.hbm.inventory.gui.GUICraneBoxer; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -143,17 +144,21 @@ public class TileEntityCraneBoxer extends TileEntityCraneBase implements IGUIPro worldObj.spawnEntityInWorld(moving); } } - - NBTTagCompound data = new NBTTagCompound(); - data.setByte("mode", mode); - this.networkPack(data, 15); + + this.networkPackNT(15); } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.mode = nbt.getByte("mode"); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeByte(this.mode); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.mode = buf.readByte(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java index 26ed150ea..ddfa5db9c 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java @@ -13,6 +13,7 @@ import com.hbm.util.InventoryUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -130,21 +131,23 @@ public class TileEntityCraneGrabber extends TileEntityCraneBase implements IGUIP } } } - - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isWhitelist", isWhitelist); - this.matcher.writeToNBT(data); - this.networkPack(data, 15); + + this.networkPackNT(15); } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.isWhitelist = nbt.getBoolean("isWhitelist"); - this.matcher.modes = new String[this.matcher.modes.length]; - this.matcher.readFromNBT(nbt); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.isWhitelist); + this.matcher.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.isWhitelist = buf.readBoolean(); + this.matcher.deserialize(buf); } public boolean matchesFilter(ItemStack stack) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java index 6568f113b..50593e9d4 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java @@ -7,8 +7,10 @@ import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -44,26 +46,28 @@ public class TileEntityCraneRouter extends TileEntityMachineBase implements IGUI if(!worldObj.isRemote) { - NBTTagCompound data = new NBTTagCompound(); - for(int i = 0; i < patterns.length; i++) { - NBTTagCompound compound = new NBTTagCompound(); - patterns[i].writeToNBT(compound); - data.setTag("pattern" + i, compound); - } - data.setIntArray("modes", this.modes); - this.networkPack(data, 15); + this.networkPackNT(15); } } - + @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - for(int i = 0; i < patterns.length; i++) { - NBTTagCompound compound = data.getCompoundTag("pattern" + i); - patterns[i].readFromNBT(compound); + public void serialize(ByteBuf buf) { + super.serialize(buf); + for (ModulePatternMatcher pattern : patterns) { + pattern.serialize(buf); } - this.modes = data.getIntArray("modes"); + + BufferUtil.writeIntArray(buf, this.modes); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + for (ModulePatternMatcher pattern : patterns) { + pattern.deserialize(buf); + } + + this.modes = BufferUtil.readIntArray(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java index 4b4e18803..e2013512c 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java @@ -3,8 +3,10 @@ package com.hbm.tileentity.network; import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.Compat; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -68,24 +70,27 @@ public class TileEntityRadioTorchCounter extends TileEntityMachineBase implement this.lastCount[i] = count; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("polling", polling); - data.setIntArray("last", lastCount); - this.matcher.writeToNBT(data); - for(int i = 0; i < 3; i++) if(channel[i] != null) data.setString("c" + i, channel[i]); - this.networkPack(data, 15); + + this.networkPackNT(15); } } - - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.polling = nbt.getBoolean("polling"); - this.lastCount = nbt.getIntArray("last"); - this.matcher.modes = new String[this.matcher.modes.length]; - this.matcher.readFromNBT(nbt); - for(int i = 0; i < 3; i++) this.channel[i] = nbt.getString("c" + i); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.polling); + BufferUtil.writeIntArray(buf, this.lastCount); + this.matcher.serialize(buf); + for(int i = 0; i < 3; i++) BufferUtil.writeString(buf, this.channel[i]); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.polling = buf.readBoolean(); + this.lastCount = BufferUtil.readIntArray(buf); + this.matcher.deserialize(buf); + for(int i = 0; i < 3; i++) this.channel[i] = BufferUtil.readString(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index b598e0a99..e4e646eb7 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -19,6 +19,7 @@ import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -317,9 +318,8 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); - - NBTTagCompound data = this.writePacket(); - this.networkPack(data, 250); + + this.networkPackNT(250); this.didJustShoot = false; @@ -409,20 +409,17 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - data.setShort("mode", mode); - if(didJustShoot) - data.setBoolean("didJustShoot", didJustShoot); - return data; + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort(this.mode); + buf.writeBoolean(this.didJustShoot); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.mode = nbt.getShort("mode"); - if(nbt.getBoolean("didJustShoot")) - this.retracting = true; + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.mode = buf.readShort(); + this.retracting = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 6cea0933e..192812428 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -34,6 +34,7 @@ import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -228,9 +229,8 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); - - NBTTagCompound data = this.writePacket(); - this.networkPack(data, 250); + + this.networkPackNT(250); if(usesCasings() && this.casingDelay() > 0) { if(casingDelay > 0) { @@ -252,26 +252,45 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } } } - - protected NBTTagCompound writePacket() { - - NBTTagCompound data = new NBTTagCompound(); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(this.tPos != null); if(this.tPos != null) { - data.setDouble("tX", this.tPos.xCoord); - data.setDouble("tY", this.tPos.yCoord); - data.setDouble("tZ", this.tPos.zCoord); + buf.writeDouble(this.tPos.xCoord); + buf.writeDouble(this.tPos.yCoord); + buf.writeDouble(this.tPos.zCoord); } - data.setDouble("pitch", this.rotationPitch); - data.setDouble("yaw", this.rotationYaw); - data.setLong("power", this.power); - data.setBoolean("isOn", this.isOn); - data.setBoolean("targetPlayers", this.targetPlayers); - data.setBoolean("targetAnimals", this.targetAnimals); - data.setBoolean("targetMobs", this.targetMobs); - data.setBoolean("targetMachines", this.targetMachines); - data.setInteger("stattrak", this.stattrak); - - return data; + buf.writeDouble(this.rotationPitch); + buf.writeDouble(this.rotationYaw); + buf.writeLong(this.power); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.targetPlayers); + buf.writeBoolean(this.targetAnimals); + buf.writeBoolean(this.targetMobs); + buf.writeBoolean(this.targetMachines); + buf.writeInt(this.stattrak); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + boolean hasTPos = buf.readBoolean(); + if(hasTPos) { + this.tPos.xCoord = buf.readDouble(); + this.tPos.yCoord = buf.readDouble(); + this.tPos.zCoord = buf.readDouble(); + } + this.rotationPitch = buf.readDouble(); + this.rotationYaw = buf.readDouble(); + this.power = buf.readLong(); + this.isOn = buf.readBoolean(); + this.targetPlayers = buf.readBoolean(); + this.targetAnimals = buf.readBoolean(); + this.targetMobs = buf.readBoolean(); + this.targetMachines = buf.readBoolean(); + this.stattrak = buf.readInt(); } protected void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java index cf55b19c6..e11edbc53 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java @@ -22,6 +22,7 @@ import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -153,18 +154,17 @@ public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFl } } } - + @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - tank.writeToNBT(data, "t"); - return data; + public void serialize(ByteBuf buf) { + super.serialize(buf); + tank.serialize(buf); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - tank.readFromNBT(nbt, "t"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + tank.deserialize(buf); } @Override //TODO: clean this shit up diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 149dc136c..714ee338f 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -17,6 +17,7 @@ import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -249,9 +250,8 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem } this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); - - NBTTagCompound data = this.writePacket(); - this.networkPack(data, 250); + + this.networkPackNT(250); } else { @@ -267,22 +267,21 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem } @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - data.setShort("mode", this.mode); - data.setInteger("type", this.typeLoaded); - data.setInteger("ammo", this.ammo); - data.setFloat("crane", crane); - return data; + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeShort(this.mode); + buf.writeShort(this.typeLoaded); + buf.writeInt(this.ammo); + buf.writeFloat(this.crane); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.mode = nbt.getShort("mode"); - this.typeLoaded = nbt.getShort("type"); - this.ammo = nbt.getInteger("ammo"); - this.crane = nbt.getFloat("crane"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.mode = buf.readShort(); + this.typeLoaded = buf.readShort(); + this.ammo = buf.readInt(); + this.crane = buf.readFloat(); } public boolean hasAmmo() { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 43dacb564..b39e07cb2 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -19,6 +19,7 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -261,20 +262,21 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I } this.power -= demand; - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("shot", true); - this.networkPack(data, 250); + + this.networkPackNT(250); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - - if(nbt.hasKey("shot")) - beam = 5; - else - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(true); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.beam = buf.readBoolean() ? 5 : 0; } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java index f6c95d847..2dbe1e5bc 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java @@ -15,6 +15,7 @@ import cpw.mods.fml.relauncher.SideOnly; import com.hbm.items.ModItems; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -104,20 +105,21 @@ public class TileEntityTurretRichard extends TileEntityTurretBaseNT { if(this.getFirstConfigLoaded() == null) { this.loaded = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("loaded", this.loaded); - this.networkPack(data, 250); + + this.networkPackNT(250); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - - if(nbt.hasKey("loaded")) - this.loaded = nbt.getInteger("loaded"); - else - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(this.loaded); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.loaded = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java index 76420c588..6c7c5359f 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java @@ -15,6 +15,7 @@ import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -229,20 +230,19 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG } @Override - protected NBTTagCompound writePacket() { - NBTTagCompound data = super.writePacket(); - if(didJustShootLeft) data.setBoolean("justShotLeft", didJustShootLeft); - if(didJustShootRight) data.setBoolean("justShotRight", didJustShootRight); + public void serialize(ByteBuf buf) { + super.serialize(buf); + if(didJustShootLeft) buf.writeBoolean(didJustShootLeft); + if(didJustShootRight) buf.writeBoolean(didJustShootRight); didJustShootLeft = false; didJustShootRight = false; - return data; } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - if(nbt.getBoolean("justShotLeft")) this.retractingLeft = true; - if(nbt.getBoolean("justShotRight")) this.retractingRight = true; + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + if(buf.readBoolean()) this.retractingLeft = true; + if(buf.readBoolean()) this.retractingRight = true; } protected void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java index 10d95d561..4932f013d 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java @@ -13,6 +13,7 @@ import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -130,10 +131,8 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { this.target.attackEntityFrom(ModDamageSource.electricity, 30F + worldObj.rand.nextInt(11)); this.conusmeAmmo(conf.ammo); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.tauShoot", 4.0F, 0.9F + worldObj.rand.nextFloat() * 0.3F); - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("shot", true); - this.networkPack(data, 250); + + this.networkPackNT(250); Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); @@ -149,12 +148,15 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { } @Override - public void networkUnpack(NBTTagCompound nbt) { - - if(nbt.hasKey("shot")) - beam = 3; - else - super.networkUnpack(nbt); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(true); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.beam = buf.readBoolean() ? 3 : 0; } @Override diff --git a/src/main/java/com/hbm/util/BufferUtil.java b/src/main/java/com/hbm/util/BufferUtil.java index 8a8c7c8ad..e81d259ec 100644 --- a/src/main/java/com/hbm/util/BufferUtil.java +++ b/src/main/java/com/hbm/util/BufferUtil.java @@ -14,7 +14,7 @@ import net.minecraft.nbt.NBTTagCompound; public class BufferUtil { private static final Charset CHARSET = StandardCharsets.UTF_8; - + // Writes a string to a byte buffer by encoding the length and raw bytes public static void writeString(ByteBuf buf, String value) { if(value == null) { @@ -22,7 +22,7 @@ public class BufferUtil { return; } - buf.writeInt(value.length()); + buf.writeInt(value.getBytes(CHARSET).length); buf.writeBytes(value.getBytes(CHARSET)); } @@ -37,6 +37,66 @@ public class BufferUtil { return new String(bytes, CHARSET); } + /** + * Writes an integer array to a buffer. + */ + public static void writeIntArray(ByteBuf buf, int[] array) { + buf.writeInt(array.length); + for (int value : array) { + buf.writeInt(value); + } + } + + /** + * Reads an integer array from a buffer. + */ + public static int[] readIntArray(ByteBuf buf) { + int length = buf.readInt(); + + int[] array = new int[length]; + + for (int i = 0; i < length; i++) { + array[i] = buf.readInt(); + } + + return array; + } + + /** + * Writes a NBTTagCompound to a buffer. + */ + public static void writeNBT(ByteBuf buf, NBTTagCompound compound) { + if(compound != null) { + byte[] nbtData = new byte[0]; + try { + nbtData = CompressedStreamTools.compress(compound); + } catch(IOException e) { + e.printStackTrace(); + } + buf.writeShort((short) nbtData.length); + buf.writeBytes(nbtData); + } else + buf.writeShort(-1); + } + + /** + * Reads a NBTTagCompound from a buffer. + */ + public static NBTTagCompound readNBT(ByteBuf buf) { + short nbtLength = buf.readShort(); + + if (nbtLength == -1) // check if no compound was even given. + return new NBTTagCompound(); + byte[] tags = new byte[nbtLength]; + buf.readBytes(tags); + try { + return CompressedStreamTools.func_152457_a(tags, new NBTSizeTracker(2097152L)); + } catch(IOException e) { + e.printStackTrace(); + } + return new NBTTagCompound(); + } + /** * Writes the ItemStack to the buffer. */ @@ -52,23 +112,12 @@ public class BufferUtil { if (item.getItem().isDamageable() || item.getItem().getShareTag()) nbtTagCompound = item.stackTagCompound; - if(nbtTagCompound != null) { - byte[] nbtData = new byte[0]; - try { - nbtData = CompressedStreamTools.compress(nbtTagCompound); - } catch(IOException e) { - e.printStackTrace(); - } - buf.writeShort((short) nbtData.length); - buf.writeBytes(nbtData); - } else { - buf.writeShort(-1); - } + writeNBT(buf, nbtTagCompound); } } /** - * Reads an ItemStack from a buffer + * Reads an ItemStack from a buffer. */ public static ItemStack readItemStack(ByteBuf buf) { ItemStack item = null; @@ -78,16 +127,7 @@ public class BufferUtil { byte quantity = buf.readByte(); short meta = buf.readShort(); item = new ItemStack(Item.getItemById(id), quantity, meta); - - short nbtLength = buf.readByte(); - - byte[] tags = new byte[nbtLength]; - buf.readBytes(tags); - try { - item.stackTagCompound = CompressedStreamTools.func_152457_a(tags, new NBTSizeTracker(2097152L)); - } catch(IOException e) { - e.printStackTrace(); - } + item.stackTagCompound = readNBT(buf); } return item; } From 851d70d3de4ba30dca8f162c8bac4d4ff45c46c2 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 4 Sep 2024 21:55:11 -0500 Subject: [PATCH 32/70] part 1 --- .../java/com/hbm/handler/neutron/PileNeutronHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 48377590e..03af1a103 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -62,7 +62,7 @@ public class PileNeutronHandler { TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; BlockPos pos = new BlockPos(originTE); - for(float i = 1; i <= range; i += 0.5F) { + for(float i = 1; i <= range; i += 1F) { BlockPos node = new BlockPos( (int)Math.floor(pos.getX() + 0.5 + vector.xCoord * i), @@ -70,6 +70,9 @@ public class PileNeutronHandler { (int)Math.floor(pos.getZ() + 0.5 + vector.zCoord * i) ); + if(node.equals(pos)) + continue; // don't interact with itself! + TileEntity tile; if (NeutronNodeWorld.nodeCache.containsKey(node)) @@ -77,7 +80,7 @@ public class PileNeutronHandler { else { tile = blockPosToTE(worldObj, node); if (tile == null) - return; // Doesn't exist anymore! + return; // Doesn't exist! if (tile instanceof TileEntityPileBase) NeutronNodeWorld.addNode(new PileNeutronNode((TileEntityPileBase) tile)); } From 1195f28d8eb25422c31fd65eed79d204f205dc55 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 6 Sep 2024 19:43:18 -0500 Subject: [PATCH 33/70] holy shit im done (part 2) --- .../com/hbm/blocks/generic/BlockEmitter.java | 38 ++++---- .../hbm/blocks/machine/MachineCapacitor.java | 4 +- .../hbm/blocks/machine/PistonInserter.java | 47 +++++---- .../hbm/blocks/network/BlockCableGauge.java | 27 ++++-- .../hbm/blocks/network/FluidDuctGauge.java | 28 +++--- .../handler/neutron/PileNeutronHandler.java | 6 +- .../java/com/hbm/packet/PacketDispatcher.java | 3 +- .../com/hbm/packet/toclient/NBTPacket.java | 96 ------------------- .../hbm/tileentity/INBTPacketReceiver.java | 17 ---- .../hbm/tileentity/TileEntityMachineBase.java | 9 +- .../hbm/tileentity/TileEntityTickingBase.java | 18 +--- .../hbm/tileentity/bomb/TileEntityCharge.java | 29 +++--- .../bomb/TileEntityCompactLauncher.java | 6 +- .../bomb/TileEntityLaunchTable.java | 6 +- .../deco/TileEntityLanternBehemoth.java | 20 ++-- .../tileentity/machine/TileEntityCharger.java | 26 ++--- .../machine/TileEntityChimneyBase.java | 22 +++-- .../tileentity/machine/TileEntityChungus.java | 33 +++---- .../machine/TileEntityCondenser.java | 28 +++--- .../machine/TileEntityCondenserPowered.java | 21 +++- .../machine/TileEntityDeuteriumExtractor.java | 8 -- .../machine/TileEntityDiFurnace.java | 27 ++++-- .../tileentity/machine/TileEntityHadron.java | 7 -- .../machine/TileEntityHadronDiode.java | 26 ++--- .../machine/TileEntityHadronPower.java | 4 +- .../machine/TileEntityHeatBoiler.java | 47 +++++---- .../TileEntityHeatBoilerIndustrial.java | 47 +++++---- .../machine/TileEntityHeaterElectric.java | 30 +++--- .../machine/TileEntityHeaterHeatex.java | 36 +++---- .../machine/TileEntityMachineAssemfac.java | 13 --- .../machine/TileEntityMachineAutosaw.java | 30 +++--- .../machine/TileEntityMachineDrain.java | 6 +- .../machine/TileEntityMachineHephaestus.java | 38 +++++--- .../machine/TileEntityMachineIGenerator.java | 5 +- .../machine/TileEntityMachineMixer.java | 17 +--- .../machine/TileEntityMachinePress.java | 18 ---- .../machine/TileEntityMachinePumpBase.java | 35 ++++--- .../TileEntityMachinePumpElectric.java | 17 ++-- .../machine/TileEntityMachinePumpSteam.java | 21 ++-- .../machine/TileEntityMachineRadarNT.java | 2 +- .../machine/TileEntityMachineRadarScreen.java | 15 +-- .../TileEntityMachineStrandCaster.java | 29 ++---- .../machine/TileEntityMachineTeleporter.java | 23 +++-- .../machine/TileEntityRadioRec.java | 23 +++-- .../tileentity/machine/TileEntitySawmill.java | 60 ++++++------ .../machine/TileEntitySolarBoiler.java | 9 +- .../machine/TileEntitySolarMirror.java | 29 +++--- .../machine/TileEntitySteamEngine.java | 42 ++++---- .../machine/TileEntityStirling.java | 26 ++--- .../TileEntityMachineCatalyticCracker.java | 22 +++-- .../TileEntityMachineCatalyticReformer.java | 8 -- .../oil/TileEntityMachineFractionTower.java | 2 +- .../machine/pile/TileEntityPileBase.java | 4 +- .../machine/rbmk/TileEntityCraneConsole.java | 86 +++++++++-------- .../machine/rbmk/TileEntityRBMKBase.java | 9 +- .../rbmk/TileEntityRBMKSlottedBase.java | 17 ---- .../storage/TileEntityFileCabinet.java | 2 +- .../storage/TileEntityMassStorage.java | 35 +++---- .../network/TileEntityDroneCrate.java | 36 ++++--- .../network/TileEntityDroneRequester.java | 20 ++-- .../network/TileEntityDroneWaypoint.java | 2 +- .../network/TileEntityRadioTelex.java | 42 ++++---- .../network/TileEntityRadioTorchBase.java | 31 +++--- .../network/TileEntityRadioTorchLogic.java | 36 ++++--- .../TileEntityRequestNetworkContainer.java | 10 +- .../turret/TileEntityTurretBaseNT.java | 22 ----- 66 files changed, 707 insertions(+), 851 deletions(-) delete mode 100644 src/main/java/com/hbm/packet/toclient/NBTPacket.java delete mode 100644 src/main/java/com/hbm/tileentity/INBTPacketReceiver.java diff --git a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java index c9b09dae1..fa38c3618 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java @@ -4,10 +4,8 @@ import java.awt.Color; import java.util.List; import com.hbm.blocks.ITooltipProvider; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; -import com.hbm.packet.toclient.NBTPacket; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import api.hbm.block.IToolable; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -103,7 +101,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP return false; } - public static class TileEntityEmitter extends TileEntity implements INBTPacketReceiver { + public static class TileEntityEmitter extends TileEntityLoadedBase implements IBufPacketReceiver { public static final int range = 100; public int color; @@ -146,7 +144,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP if(color == 0) { color = Color.HSBtoRGB(worldObj.getTotalWorldTime() / 50.0F, 0.5F, 0.25F) & 16777215; } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "plasmablast"); data.setFloat("r", ((float)((color & 0xff0000) >> 16)) / 256F); @@ -168,20 +166,16 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP data.setFloat("pitch", -90); data.setFloat("yaw", 90); } - + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(worldObj.provider.dimensionId, x, y, z, 100)); color = prevColor; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("beam", this.beam); - data.setInteger("color", this.color); - data.setFloat("girth", this.girth); - data.setInteger("effect", this.effect); - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(data, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + + sendStandard(150); + } } @@ -225,11 +219,19 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.beam = nbt.getInteger("beam"); - this.color = nbt.getInteger("color"); - this.girth = nbt.getFloat("girth"); - this.effect = nbt.getInteger("effect"); + public void serialize(ByteBuf buf) { + buf.writeInt(this.beam); + buf.writeInt(this.color); + buf.writeFloat(this.girth); + buf.writeInt(this.effect); + } + + @Override + public void deserialize(ByteBuf buf) { + this.beam = buf.readInt(); + this.color = buf.readInt(); + this.girth = buf.readFloat(); + this.effect = buf.readInt(); } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index f1662ec4e..b6044e274 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -199,8 +199,8 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP this.trySubscribe(worldObj, xCoord + opp.offsetX, yCoord + opp.offsetY, zCoord + opp.offsetZ, opp); - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 15)); - + sendStandard(15); + this.powerSent = 0; this.powerReceived = 0; } diff --git a/src/main/java/com/hbm/blocks/machine/PistonInserter.java b/src/main/java/com/hbm/blocks/machine/PistonInserter.java index 8b95fed92..7539e685e 100644 --- a/src/main/java/com/hbm/blocks/machine/PistonInserter.java +++ b/src/main/java/com/hbm/blocks/machine/PistonInserter.java @@ -4,11 +4,14 @@ import java.util.List; import com.hbm.blocks.BlockContainerBase; import com.hbm.blocks.ITooltipProvider; -import com.hbm.tileentity.INBTPacketReceiver; import api.hbm.block.IInsertable; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockPistonBase; import net.minecraft.block.material.Material; @@ -206,7 +209,7 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid // |___..---' _|____`-----..-----'\ // |_____________________| @ | ) // average coding session involving tile entities - public static class TileEntityPistonInserter extends TileEntity implements IInventory, INBTPacketReceiver { + public static class TileEntityPistonInserter extends TileEntityLoadedBase implements IInventory, IBufPacketReceiver { public ItemStack slot; @@ -257,15 +260,7 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid delay--; } - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("extend", extend); - if(this.slot != null) { - NBTTagCompound stack = new NBTTagCompound(); - slot.writeToNBT(stack); - data.setTag("stack", stack); - } - - INBTPacketReceiver.networkPack(this, data, 25); + sendStandard(25); } else { this.lastExtend = this.renderExtend; @@ -279,22 +274,32 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - this.syncExtend = nbt.getInteger("extend"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); + public void serialize(ByteBuf buf) { + buf.writeInt(extend); + + buf.writeBoolean(this.slot != null); + if(this.slot != null) { + BufferUtil.writeNBT(buf, slot.stackTagCompound); + } + + this.turnProgress = 2; + } + + @Override + public void deserialize(ByteBuf buf) { + this.syncExtend = buf.readInt(); + + if(buf.readBoolean()) { + NBTTagCompound stack = BufferUtil.readNBT(buf); this.slot = ItemStack.loadItemStackFromNBT(stack); } else this.slot = null; - + this.turnProgress = 2; } - - /* :3 NBT stuff */ - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java index bc31744fd..3c6cc0425 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java +++ b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java @@ -8,16 +8,20 @@ import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; +import com.hbm.packet.BufPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.render.block.RenderBlockMultipass; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityCableBaseNT; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import api.hbm.energymk2.PowerNetMK2; import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -105,7 +109,7 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, } @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) - public static class TileEntityCableGauge extends TileEntityCableBaseNT implements INBTPacketReceiver, SimpleComponent, CompatHandler.OCComponent { + public static class TileEntityCableGauge extends TileEntityCableBaseNT implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { private long deltaTick = 0; private long deltaSecond = 0; @@ -128,18 +132,21 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, } this.deltaSecond += deltaTick; } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("deltaT", deltaTick); - data.setLong("deltaS", deltaLastSecond); - INBTPacketReceiver.networkPack(this, data, 25); + + sendStandard(25); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.deltaTick = Math.max(nbt.getLong("deltaT"), 0); - this.deltaLastSecond = Math.max(nbt.getLong("deltaS"), 0); + public void serialize(ByteBuf buf) { + buf.writeLong(deltaTick); + buf.writeLong(deltaLastSecond); + } + + @Override + public void deserialize(ByteBuf buf) { + this.deltaTick = Math.max(buf.readLong(), 0); + this.deltaLastSecond = Math.max(buf.readLong(), 0); } @Override diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java index 2c60fbc59..153268f9f 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java @@ -11,15 +11,19 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.CompatHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; +import com.hbm.packet.BufPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.render.block.RenderBlockMultipass; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.I18nUtil; import api.hbm.fluid.IPipeNet; import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -30,7 +34,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; @@ -109,7 +112,7 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL } @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) - public static class TileEntityPipeGauge extends TileEntityPipeBaseNT implements INBTPacketReceiver, SimpleComponent, CompatHandler.OCComponent { + public static class TileEntityPipeGauge extends TileEntityPipeBaseNT implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { private BigInteger lastMeasurement = BigInteger.valueOf(10); private long deltaTick = 0; @@ -139,18 +142,21 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL } catch(Exception ex) { } } - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("deltaT", deltaTick); - data.setLong("deltaS", deltaLastSecond); - INBTPacketReceiver.networkPack(this, data, 25); + + sendStandard(25); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.deltaTick = Math.max(nbt.getLong("deltaT"), 0); - this.deltaLastSecond = Math.max(nbt.getLong("deltaS"), 0); + public void serialize(ByteBuf buf) { + buf.writeLong(deltaTick); + buf.writeLong(deltaLastSecond); + } + + @Override + public void deserialize(ByteBuf buf) { + this.deltaTick = Math.max(buf.readLong(), 0); + this.deltaLastSecond = Math.max(buf.readLong(), 0); } @Optional.Method(modid = "OpenComputers") diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 03af1a103..1285b6ad2 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -62,7 +62,7 @@ public class PileNeutronHandler { TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; BlockPos pos = new BlockPos(originTE); - for(float i = 1; i <= range; i += 1F) { + for(float i = 1; i <= range; i += 0.5F) { BlockPos node = new BlockPos( (int)Math.floor(pos.getX() + 0.5 + vector.xCoord * i), @@ -73,6 +73,8 @@ public class PileNeutronHandler { if(node.equals(pos)) continue; // don't interact with itself! + pos.mutate(node.getX(), node.getY(), node.getZ()); + TileEntity tile; if (NeutronNodeWorld.nodeCache.containsKey(node)) @@ -108,7 +110,7 @@ public class PileNeutronHandler { if(te instanceof IPileNeutronReceiver) { IPileNeutronReceiver rec = (IPileNeutronReceiver) te; - rec.receiveNeutrons((int) fluxQuantity); + rec.receiveNeutrons((int) Math.floor(fluxQuantity)); if(block != ModBlocks.block_graphite_detector || (meta & 8) == 0) return; diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 12c8de1da..903a7939a 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -79,7 +79,8 @@ public class PacketDispatcher { //Tile sync wrapper.registerMessage(AuxGaugePacket.Handler.class, AuxGaugePacket.class, i++, Side.CLIENT); //The horrid one - wrapper.registerMessage(NBTPacket.Handler.class, NBTPacket.class, i++, Side.CLIENT); //The convenient but laggy one + // fucking DIE + //wrapper.registerMessage(NBTPacket.Handler.class, NBTPacket.class, i++, Side.CLIENT); //The convenient but laggy one wrapper.registerMessage(BufPacket.Handler.class, BufPacket.class, i++, Side.CLIENT); //The not-so-convenient but not laggy one } diff --git a/src/main/java/com/hbm/packet/toclient/NBTPacket.java b/src/main/java/com/hbm/packet/toclient/NBTPacket.java deleted file mode 100644 index 65b15e8af..000000000 --- a/src/main/java/com/hbm/packet/toclient/NBTPacket.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.hbm.packet.toclient; - -import java.io.IOException; - -import com.hbm.tileentity.INBTPacketReceiver; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import net.minecraft.client.Minecraft; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; - -@Deprecated // rest in peace sweet little prince -public class NBTPacket implements IMessage { - - PacketBuffer buffer; - int x; - int y; - int z; - - public NBTPacket() { } - - public NBTPacket(NBTTagCompound nbt, int x, int y, int z) { - - this.buffer = new PacketBuffer(Unpooled.buffer()); - this.x = x; - this.y = y; - this.z = z; - - try { - buffer.writeNBTTagCompoundToBuffer(nbt); - - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void fromBytes(ByteBuf buf) { - - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buffer.writeBytes(buf); - } - - @Override - public void toBytes(ByteBuf buf) { - - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buf.writeBytes(buffer); - } - - public static class Handler implements IMessageHandler { - - @Override - public IMessage onMessage(NBTPacket m, MessageContext ctx) { - - if(Minecraft.getMinecraft().theWorld == null) - return null; - - TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - - try { - - NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); - - if(nbt != null) { - - if(te instanceof INBTPacketReceiver) - ((INBTPacketReceiver) te).networkUnpack(nbt); - } - - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } - } - -} diff --git a/src/main/java/com/hbm/tileentity/INBTPacketReceiver.java b/src/main/java/com/hbm/tileentity/INBTPacketReceiver.java deleted file mode 100644 index a22b501e8..000000000 --- a/src/main/java/com/hbm/tileentity/INBTPacketReceiver.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hbm.tileentity; - -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.NBTPacket; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; - -public interface INBTPacketReceiver { - - public void networkUnpack(NBTTagCompound nbt); - - public static void networkPack(TileEntity that, NBTTagCompound data, int range) { - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(data, that.xCoord, that.yCoord, that.zCoord), new TargetPoint(that.getWorldObj().provider.dimensionId, that.xCoord, that.yCoord, that.zCoord, range)); - } -} diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 24194f2b3..3e931baae 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -1,9 +1,9 @@ package com.hbm.tileentity; +import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxGaugePacket; import com.hbm.packet.toclient.BufPacket; -import com.hbm.packet.toclient.NBTPacket; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -17,7 +17,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidTank; -public abstract class TileEntityMachineBase extends TileEntityLoadedBase implements ISidedInventory, INBTPacketReceiver, IBufPacketReceiver { +public abstract class TileEntityMachineBase extends TileEntityLoadedBase implements ISidedInventory, IBufPacketReceiver { public ItemStack slots[]; @@ -154,11 +154,6 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, val, id), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } @Deprecated public void processGauge(int val, int id) { } - - @Deprecated - public void networkUnpack(NBTTagCompound nbt) { - this.muffled = nbt.getBoolean("muffled"); - } /** Sends a sync packet that uses ByteBuf for efficient information-cramming */ public void networkPackNT(int range) { diff --git a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java index bfd9a6ced..c678ba677 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java @@ -1,15 +1,9 @@ package com.hbm.tileentity; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; -import com.hbm.packet.toclient.NBTPacket; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; -import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidTank; -public abstract class TileEntityTickingBase extends TileEntityLoadedBase implements INBTPacketReceiver, IBufPacketReceiver { +public abstract class TileEntityTickingBase extends TileEntityLoadedBase implements IBufPacketReceiver { public TileEntityTickingBase() { } @@ -25,20 +19,12 @@ public abstract class TileEntityTickingBase extends TileEntityLoadedBase impleme //shit i don't know man @Override public abstract void updateEntity(); - - @Deprecated public void networkPack(NBTTagCompound nbt, int range) { - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - - @Deprecated public void networkUnpack(NBTTagCompound nbt) { } - @Deprecated public void handleButtonPacket(int value, int meta) { } public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + if(!worldObj.isRemote) sendStandard(range); } @Override public void serialize(ByteBuf buf) { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java index 0577276c8..9ad2765c0 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java @@ -1,15 +1,13 @@ package com.hbm.tileentity.bomb; import com.hbm.blocks.bomb.BlockChargeBase; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.NBTPacket; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.nbt.NBTTagCompound; +import cpw.mods.fml.common.network.NetworkRegistry; +import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; -public class TileEntityCharge extends TileEntity implements INBTPacketReceiver { +public class TileEntityCharge extends TileEntity implements IBufPacketReceiver { public boolean started; public int timer; @@ -29,18 +27,21 @@ public class TileEntityCharge extends TileEntity implements INBTPacketReceiver { ((BlockChargeBase)this.getBlockType()).explode(worldObj, xCoord, yCoord, zCoord); } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("timer", timer); - data.setBoolean("started", started); - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(data, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 100)); + + sendStandard(100); } } @Override - public void networkUnpack(NBTTagCompound data) { - timer = data.getInteger("timer"); - started = data.getBoolean("started"); + public void serialize(ByteBuf buf) { + buf.writeLong(this.timer); + buf.writeBoolean(this.started); + } + + @Override + public void deserialize(ByteBuf buf) { + this.timer = buf.readInt(); + this.started = buf.readBoolean(); } public String getMinutes() { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index 60b75b91f..40a3d4644 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -188,9 +188,9 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I if(worldObj.getTotalWorldTime() % 20 == 0) this.updateConnections(); - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + + sendStandard(50); + MissileStruct multipart = getStruct(slots[0]); if(multipart != null) diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index e9e8ef8d2..cd1aa132d 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -197,9 +197,9 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide this.decrStackSize(4, 1); solid += 250; } - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + + sendStandard(50); + MissileStruct multipart = getStruct(slots[0]); if(multipart != null) diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java index 758f1727d..30fc9e132 100644 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java +++ b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java @@ -13,11 +13,12 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.special.ItemKitCustom; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IRepairable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -27,7 +28,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; -public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketReceiver, IRepairable { +public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketReceiver, IRepairable { public boolean isBroken = false; public int comTimer = -1; @@ -63,10 +64,8 @@ public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketR if(comTimer >= 0) { comTimer--; } - - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isBroken", isBroken); - INBTPacketReceiver.networkPack(this, data, 250); + + sendStandard(250); } } @@ -81,8 +80,13 @@ public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketR } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.isBroken = nbt.getBoolean("isBroken"); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.isBroken); + } + + @Override + public void deserialize(ByteBuf buf) { + this.isBroken = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java index 6df1f8bf9..966c25326 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java @@ -4,18 +4,17 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import com.hbm.tileentity.INBTPacketReceiver; -import com.hbm.tileentity.TileEntityLoadedBase; - import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IEnergyReceiverMK2; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyReceiverMK2, INBTPacketReceiver { +public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyReceiverMK2, IBufPacketReceiver { private List players = new ArrayList(); private long charge = 0; @@ -62,10 +61,7 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 0.2F, 0.5F); } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("c", charge); - data.setBoolean("p", particles); - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(50); } lastUsingTicks = usingTicks; @@ -94,9 +90,15 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.charge = nbt.getLong("c"); - this.particles = nbt.getBoolean("p"); + public void serialize(ByteBuf buf) { + buf.writeLong(this.charge); + buf.writeBoolean(this.particles); + } + + @Override + public void deserialize(ByteBuf buf) { + this.charge = buf.readLong(); + this.particles = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java index 08964ccc8..dd6627066 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java @@ -6,15 +6,15 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.fluid.IFluidUser; -import net.minecraft.nbt.NBTTagCompound; +import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public abstract class TileEntityChimneyBase extends TileEntityLoadedBase implements IFluidUser, INBTPacketReceiver { +public abstract class TileEntityChimneyBase extends TileEntityLoadedBase implements IFluidUser, IBufPacketReceiver { public long ashTick = 0; public long sootTick = 0; @@ -49,9 +49,7 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme this.sootTick = 0; } - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("onTicks", onTicks); - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); if(onTicks > 0) onTicks--; @@ -72,9 +70,15 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme } public void spawnParticles() { } - - public void networkUnpack(NBTTagCompound nbt) { - this.onTicks = nbt.getInteger("onTicks"); + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(this.onTicks); + } + + @Override + public void deserialize(ByteBuf buf) { + this.onTicks = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index 254554c45..e4daad9e7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -13,11 +13,9 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.NBTPacket; import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -27,9 +25,9 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -40,7 +38,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyProviderMK2, INBTPacketReceiver, IFluidStandardTransceiver, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent, IConfigurableMachine { +public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyProviderMK2, IFluidStandardTransceiver, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent, IConfigurableMachine, IBufPacketReceiver { public long power; private int turnTimer; @@ -139,12 +137,8 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr turnTimer--; if(operational) turnTimer = 25; - - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setInteger("type", tanks[0].getTankType().getID()); - data.setInteger("operational", turnTimer); - this.networkPack(data, 150); + + sendStandard(150); } else { @@ -213,16 +207,19 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr new DirPos(xCoord - rot.offsetX * 3, yCoord, zCoord - rot.offsetZ * 3, rot.getOpposite()) }; } - - public void networkPack(NBTTagCompound nbt, int range) { - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + + @Override + public void serialize(ByteBuf buf) { + buf.writeLong(this.power); + buf.writeInt(this.turnTimer); + this.tanks[0].serialize(buf); } @Override - public void networkUnpack(NBTTagCompound data) { - this.power = data.getLong("power"); - this.turnTimer = data.getInteger("operational"); - this.tanks[0].setTankType(Fluids.fromID(data.getInteger("type"))); + public void deserialize(ByteBuf buf) { + this.power = buf.readLong(); + this.turnTimer = buf.readInt(); + this.tanks[0].deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 8d2730f8b..48a322a3b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -7,17 +7,16 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.saveddata.TomSaveData; -import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; -import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.*; import com.hbm.util.CompatEnergyControl; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.EnumSkyBlock; -public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidStandardTransceiver, INBTPacketReceiver, IInfoProviderEC, IConfigurableMachine { +public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidStandardTransceiver, IInfoProviderEC, IConfigurableMachine, IBufPacketReceiver { public int age = 0; public FluidTank[] tanks; @@ -52,8 +51,6 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS writer.name("I:outputTankSize").value(outputTankSize); } - - @Override public void updateEntity() { @@ -95,9 +92,7 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); - data.setByte("timer", (byte) this.waterTimer); - packExtra(data); - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); } } @@ -106,10 +101,17 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS public void postConvert(int convert) { } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.waterTimer = nbt.getByte("timer"); + public void serialize(ByteBuf buf) { + this.tanks[0].serialize(buf); + this.tanks[1].serialize(buf); + buf.writeByte(this.waterTimer); + } + + @Override + public void deserialize(ByteBuf buf) { + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.waterTimer = buf.readByte(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java index 9aabea820..2240477cd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java @@ -13,6 +13,7 @@ import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -98,11 +99,21 @@ public class TileEntityCondenserPowered extends TileEntityCondenser implements I } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.power = nbt.getLong("power"); - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.waterTimer = nbt.getByte("timer"); + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + this.tanks[0].serialize(buf); + this.tanks[1].serialize(buf); + buf.writeByte(this.waterTimer); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.waterTimer = buf.readByte(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index a1f55015b..26a075bda 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -56,14 +56,6 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - this.power = data.getLong("power"); - tanks[0].readFromNBT(data, "water"); - tanks[1].readFromNBT(data, "heavyWater"); - } - @Override public void serialize(ByteBuf buf) { super.serialize(buf); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java index c1d3bb893..9eacd6ed7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java @@ -10,7 +10,6 @@ import com.hbm.inventory.gui.GUIDiFurnace; import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachinePolluting; import com.hbm.util.CompatEnergyControl; @@ -18,6 +17,7 @@ import api.hbm.fluid.IFluidStandardSender; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -230,11 +230,7 @@ public class TileEntityDiFurnace extends TileEntityMachinePolluting implements I MachineDiFurnace.updateBlockState(this.progress > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); } - NBTTagCompound data = new NBTTagCompound(); - data.setShort("time", (short) this.progress); - data.setShort("fuel", (short) this.fuel); - data.setByteArray("modes", new byte[] { (byte) sideFuel, (byte) sideUpper, (byte) sideLower }); - INBTPacketReceiver.networkPack(this, data, 15); + networkPackNT(15); if(markDirty) { this.markDirty(); @@ -243,10 +239,21 @@ public class TileEntityDiFurnace extends TileEntityMachinePolluting implements I } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.progress = nbt.getShort("time"); - this.fuel = nbt.getShort("fuel"); - byte[] modes = nbt.getByteArray("modes"); + public void serialize(ByteBuf buf) { + buf.writeShort(this.progress); + buf.writeShort(this.fuel); + buf.writeBytes(new byte[] { + this.sideFuel, + this.sideUpper, + this.sideLower}); + } + + @Override + public void deserialize(ByteBuf buf) { + this.progress = buf.readShort(); + this.fuel = buf.readShort(); + byte[] modes = new byte[3]; + buf.readBytes(modes); this.sideFuel = modes[0]; this.sideUpper = modes[1]; this.sideLower = modes[2]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index eba83d93d..89fd43fe1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -247,13 +247,6 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.stat_z = buf.readInt(); } - @Override - public void networkUnpack(NBTTagCompound data) { - super.networkUnpack(data); - - - } - @Override public void handleButtonPacket(int value, int meta) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java index d77c5339a..f9c89de10 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronDiode.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine; import com.hbm.tileentity.TileEntityTickingBase; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -25,7 +26,7 @@ public class TileEntityHadronDiode extends TileEntityTickingBase { if(age >= 20) { age = 0; - sendSides(); + this.networkPackNT(250); } } else { @@ -35,27 +36,18 @@ public class TileEntityHadronDiode extends TileEntityTickingBase { } } } - - public void sendSides() { - - NBTTagCompound data = new NBTTagCompound(); - + + @Override public void serialize(ByteBuf buf) { for(int i = 0; i < 6; i++) { - - if(sides[i] != null) - data.setInteger("" + i, sides[i].ordinal()); + buf.writeByte(sides[i].ordinal()); } - - this.networkPack(data, 250); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - + @Override public void deserialize(ByteBuf buf) { for(int i = 0; i < 6; i++) { - sides[i] = DiodeConfig.values()[nbt.getInteger("" + i)]; + sides[i] = DiodeConfig.values()[buf.readByte()]; } - + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } @@ -75,7 +67,7 @@ public class TileEntityHadronDiode extends TileEntityTickingBase { public void setConfig(int side, int config) { sides[side] = DiodeConfig.values()[config]; this.markDirty(); - sendSides(); + this.networkPackNT(250); } public static enum DiodeConfig { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java index d4b0ff25f..ce8f2daa9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java @@ -29,8 +29,8 @@ public class TileEntityHadronPower extends TileEntityLoadedBase implements IEner for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 15)); + + sendStandard(15); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index c1c830cf5..be1fb7fd6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -18,8 +18,8 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.saveddata.TomSaveData; import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -27,13 +27,16 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.EnumSkyBlock; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { +public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { public int heat; public FluidTank[] tanks; @@ -54,14 +57,14 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPa this.tanks[0] = new FluidTank(Fluids.WATER, 16_000); this.tanks[1] = new FluidTank(Fluids.STEAM, 16_000 * 100); } + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); @Override public void updateEntity() { if(!worldObj.isRemote) { - NBTTagCompound data = new NBTTagCompound(); - if(!this.hasExploded) { this.setupTanks(); this.updateConnections(); @@ -72,23 +75,23 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPa if(light > 7 && TomSaveData.forWorld(worldObj).fire > 1e-5) { this.heat += ((maxHeat - heat) * 0.000005D); //constantly heat up 0.0005% of the remaining heat buffer for rampant but diminishing heating } - - data.setInteger("heat", lastHeat); - tanks[0].writeToNBT(data, "0"); + buf.writeInt(lastHeat); + + tanks[0].serialize(buf); this.isOn = false; this.tryConvert(); - tanks[1].writeToNBT(data, "1"); + tanks[1].serialize(buf); if(this.tanks[1].getFill() > 0) { this.sendFluid(); } } - data.setBoolean("exploded", this.hasExploded); - data.setBoolean("isOn", this.isOn); - data.setBoolean("muffled", this.muffled); - INBTPacketReceiver.networkPack(this, data, 25); + buf.writeBoolean(this.hasExploded); + buf.writeBoolean(this.muffled); + buf.writeBoolean(this.isOn); + sendStandard(25); } else { if(this.isOn) audioTime = 20; @@ -143,13 +146,19 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements INBTPa } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.hasExploded = nbt.getBoolean("exploded"); - this.muffled = nbt.getBoolean("muffled"); - this.heat = nbt.getInteger("heat"); - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + this.heat = buf.readInt(); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.hasExploded = buf.readBoolean(); + this.muffled = buf.readBoolean(); + this.isOn = buf.readBoolean(); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java index 04d66dda3..65c2765df 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java @@ -13,8 +13,8 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.saveddata.TomSaveData; import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -22,12 +22,15 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.EnumSkyBlock; -public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { +public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver, IConfigurableMachine { public int heat; public FluidTank[] tanks; @@ -46,13 +49,14 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme this.tanks[0] = new FluidTank(Fluids.WATER, 64_000); this.tanks[1] = new FluidTank(Fluids.STEAM, 64_000 * 100); } - + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + @Override public void updateEntity() { if(!worldObj.isRemote) { - - NBTTagCompound data = new NBTTagCompound(); + this.setupTanks(); this.updateConnections(); this.tryPullHeat(); @@ -62,21 +66,22 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme if(light > 7 && TomSaveData.forWorld(worldObj).fire > 1e-5) { this.heat += ((maxHeat - heat) * 0.000005D); //constantly heat up 0.0005% of the remaining heat buffer for rampant but diminishing heating } - - data.setInteger("heat", lastHeat); - tanks[0].writeToNBT(data, "0"); + buf.writeInt(lastHeat); + + tanks[0].serialize(buf); this.isOn = false; this.tryConvert(); - tanks[1].writeToNBT(data, "1"); + tanks[1].serialize(buf); if(this.tanks[1].getFill() > 0) { this.sendFluid(); } - data.setBoolean("isOn", this.isOn); - data.setBoolean("muffled", this.muffled); - INBTPacketReceiver.networkPack(this, data, 25); + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.muffled); + sendStandard(25); + } else { if(this.isOn) audioTime = 20; @@ -131,12 +136,18 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.heat = nbt.getInteger("heat"); - this.tanks[0].readFromNBT(nbt, "0"); - this.tanks[1].readFromNBT(nbt, "1"); - this.isOn = nbt.getBoolean("isOn"); - this.muffled = nbt.getBoolean("muffled"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + this.heat = buf.readInt(); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.isOn = buf.readBoolean(); + this.muffled = buf.readBoolean(); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java index 7c8a19797..72e216162 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -3,7 +3,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; @@ -12,12 +12,13 @@ import api.hbm.tile.IHeatSource; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyReceiverMK2, INBTPacketReceiver, IInfoProviderEC { +public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyReceiverMK2, IBufPacketReceiver, IInfoProviderEC { public long power; public int heatEnergy; @@ -47,12 +48,7 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH this.isOn = true; } - NBTTagCompound data = new NBTTagCompound(); - data.setByte("s", (byte) this.setting); - data.setInteger("h", this.heatEnergy); - data.setBoolean("o", isOn); - data.setBoolean("muffled", muffled); - INBTPacketReceiver.networkPack(this, data, 25); + sendStandard(25); } else { if(isOn) { @@ -103,11 +99,19 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.setting = nbt.getByte("s"); - this.heatEnergy = nbt.getInteger("h"); - this.isOn = nbt.getBoolean("o"); - this.muffled = nbt.getBoolean("muffled"); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.muffled); + buf.writeByte(this.setting); + buf.writeInt(this.heatEnergy); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + this.muffled = buf.readBoolean(); + this.setting = buf.readByte(); + this.heatEnergy = buf.readInt(); + this.isOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java index 1e9d5885d..3dee8b92a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java @@ -10,7 +10,6 @@ import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.inventory.gui.GUIHeaterHeatex; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -18,6 +17,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -27,7 +27,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHeatSource, INBTPacketReceiver, IFluidStandardTransceiver, IGUIProvider, IControlReceiver { +public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHeatSource, IFluidStandardTransceiver, IGUIProvider, IControlReceiver { public FluidTank[] tanks; public int amountToCool = 1; @@ -56,28 +56,30 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe this.heatEnergy *= 0.999; - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "0"); - this.tryConvert(); - tanks[1].writeToNBT(data, "1"); - data.setInteger("heat", heatEnergy); - data.setInteger("toCool", amountToCool); - data.setInteger("delay", tickDelay); - INBTPacketReceiver.networkPack(this, data, 25); + networkPackNT(25); for(DirPos pos : getConPos()) { if(this.tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - tanks[0].readFromNBT(nbt, "0"); - tanks[1].readFromNBT(nbt, "1"); - this.heatEnergy = nbt.getInteger("heat"); - this.amountToCool = nbt.getInteger("toCool"); - this.tickDelay = nbt.getInteger("delay"); + public void serialize(ByteBuf buf) { + tanks[0].serialize(buf); + tanks[1].serialize(buf); + buf.writeInt(this.heatEnergy); + buf.writeInt(this.amountToCool); + buf.writeInt(this.tickDelay); + } + + @Override + public void deserialize(ByteBuf buf) { + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + this.heatEnergy = buf.readInt(); + this.amountToCool = buf.readInt(); + this.tickDelay = buf.readInt(); } protected void setupTanks() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java index 948022a43..50be9bd1b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java @@ -133,19 +133,6 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im steam.deserialize(buf); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.progress = nbt.getIntArray("progress"); - this.maxProgress = nbt.getIntArray("maxProgress"); - this.isProgressing = nbt.getBoolean("isProgressing"); - - water.readFromNBT(nbt, "w"); - steam.readFromNBT(nbt, "s"); - } - private int getWaterRequired() { return 1000 / this.speed; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index ab03bac81..1bb9b4b12 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -11,13 +11,14 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.ModDamageSource; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockLeaves; import net.minecraft.block.material.Material; @@ -29,7 +30,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; -public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardReceiver { +public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardReceiver { public static final HashSet acceptedFuels = new HashSet(); @@ -174,12 +175,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IN } } - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isOn", isOn); - data.setFloat("yaw", this.rotationYaw); - data.setFloat("pitch", this.rotationPitch); - tank.writeToNBT(data, "t"); - INBTPacketReceiver.networkPack(this, data, 100); + sendStandard(100); } else { this.lastSpin = this.spin; @@ -280,12 +276,20 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IN } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.isOn = nbt.getBoolean("isOn"); - this.syncYaw = nbt.getFloat("yaw"); - this.syncPitch = nbt.getFloat("pitch"); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.isOn); + buf.writeFloat(this.syncYaw); + buf.writeFloat(this.syncPitch); + this.tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + this.isOn = buf.readBoolean(); + this.syncYaw = buf.readFloat(); + this.syncPitch = buf.readFloat(); this.turnProgress = 3; //use 3-ply for extra smoothness - this.tank.readFromNBT(nbt, "t"); + this.tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java index e14c4060b..f019f0815 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java @@ -46,9 +46,9 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu if(worldObj.getTotalWorldTime() % 20 == 0) { for(DirPos pos : getConPos()) this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + + sendStandard(50); + if(tank.getFill() > 0) { if(tank.getTankType().hasTrait(FT_Amat.class)) { worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 10F, true, true); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java index eb22b3289..f5799e1ed 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java @@ -10,20 +10,23 @@ import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver { +public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver { public FluidTank input; public FluidTank output; @@ -41,7 +44,9 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements private long fissureScanTime; private AudioWrapper audio; - + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + @Override public void updateEntity() { @@ -66,21 +71,20 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements } } } - - NBTTagCompound data = new NBTTagCompound(); - input.writeToNBT(data, "i"); + + input.serialize(buf); heatFluid(); - output.writeToNBT(data, "o"); + output.serialize(buf); if(output.getFill() > 0) { for(DirPos pos : getConPos()) { this.sendFluid(output, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - data.setInteger("heat", this.getTotalHeat()); - INBTPacketReceiver.networkPack(this, data, 150); + buf.writeInt(this.getTotalHeat()); + sendStandard(150); } else { @@ -182,11 +186,17 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements } @Override - public void networkUnpack(NBTTagCompound nbt) { - input.readFromNBT(nbt, "i"); - output.readFromNBT(nbt, "o"); - - this.bufferedHeat = nbt.getInteger("heat"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + input.deserialize(buf); + output.deserialize(buf); + + this.bufferedHeat = buf.readInt(); } private void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index 7996973c8..4c844422d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -222,15 +222,18 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement return new int[] { 3, 4, 5, 6 }; } + // o7 + /* @Override public void networkUnpack(NBTTagCompound nbt) { super.networkUnpack(nbt); - + this.power = nbt.getLong("power"); this.spin = nbt.getInteger("spin"); this.burn = nbt.getIntArray("burn"); this.hasRTG = nbt.getBoolean("hasRTG"); } + */ public int getPowerFromFuel(boolean con) { FluidType type = tanks[1].getTankType(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java index e9751c820..4ddbe6acd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java @@ -14,7 +14,6 @@ import com.hbm.inventory.recipes.MixerRecipes.MixerRecipe; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.BobMathUtil; @@ -35,7 +34,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineMixer extends TileEntityMachineBase implements INBTPacketReceiver, IControlReceiver, IGUIProvider, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider { +public class TileEntityMachineMixer extends TileEntityMachineBase implements IControlReceiver, IGUIProvider, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider { public long power; public static final long maxPower = 10_000; @@ -162,20 +161,6 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements INB for(int i = 0; i < tanks.length; i++) tanks[i].deserialize(buf); } - - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - this.processTime = nbt.getInteger("processTime"); - this.progress = nbt.getInteger("progress"); - this.recipeIndex = nbt.getInteger("recipe"); - this.wasOn = nbt.getBoolean("wasOn"); - for(int i = 0; i < 3; i++) { - tanks[i].readFromNBT(nbt, i + ""); - } - } public boolean canProcess() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index 655ce48be..6bea61bca 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -175,24 +175,6 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU this.turnProgress = 2; } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.speed = nbt.getInteger("speed"); - this.burnTime = nbt.getInteger("burnTime"); - this.syncPress = nbt.getInteger("press"); - - if(nbt.hasKey("stack")) { - NBTTagCompound stack = nbt.getCompoundTag("stack"); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); - } else { - this.syncStack = null; - } - - this.turnProgress = 2; - } - public boolean canProcess() { if(burnTime < 200) return false; if(slots[1] == null || slots[2] == null) return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java index 653064658..5c4b60c55 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java @@ -9,20 +9,19 @@ import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; -import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.*; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; -public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase implements IFluidStandardTransceiver, INBTPacketReceiver, IConfigurableMachine { +public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase implements IFluidStandardTransceiver, IBufPacketReceiver, IConfigurableMachine { public static final HashSet validBlocks = new HashSet(); @@ -50,7 +49,7 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp public static int groundDepth = 4; public static int steamSpeed = 1_000; public static int electricSpeed = 10_000; - + @Override public String getConfigName() { return "waterpump"; @@ -91,9 +90,8 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp this.isOn = true; this.operate(); } - - NBTTagCompound data = this.getSync(); - INBTPacketReceiver.networkPack(this, data, 150); + + sendStandard(150); } else { @@ -133,20 +131,19 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp return validBlocks >= invalidBlocks; // valid block count has to be at least 50% } - - protected NBTTagCompound getSync() { - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("isOn", isOn); - data.setBoolean("onGround", onGround); - water.writeToNBT(data, "w"); - return data; + + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.isOn); + buf.writeBoolean(this.onGround); + water.serialize(buf); } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.isOn = nbt.getBoolean("isOn"); - this.onGround = nbt.getBoolean("onGround"); - water.readFromNBT(nbt, "w"); + public void deserialize(ByteBuf buf) { + this.isOn = buf.readBoolean(); + this.onGround = buf.readBoolean(); + water.deserialize(buf); } protected abstract boolean canOperate(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java index 288193818..39835837b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java @@ -5,6 +5,7 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; public class TileEntityMachinePumpElectric extends TileEntityMachinePumpBase implements IEnergyReceiverMK2 { @@ -28,17 +29,17 @@ public class TileEntityMachinePumpElectric extends TileEntityMachinePumpBase imp super.updateEntity(); } - - protected NBTTagCompound getSync() { - NBTTagCompound data = super.getSync(); - data.setLong("power", power); - return data; + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - this.power = nbt.getLong("power"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java index d935cfbf4..fff843d0f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java @@ -4,6 +4,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.util.fauxpointtwelve.DirPos; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; public class TileEntityMachinePumpSteam extends TileEntityMachinePumpBase { @@ -47,19 +48,19 @@ public class TileEntityMachinePumpSteam extends TileEntityMachinePumpBase { public FluidTank[] getReceivingTanks() { return new FluidTank[] {steam}; } - - protected NBTTagCompound getSync() { - NBTTagCompound data = super.getSync(); - steam.writeToNBT(data, "s"); - lps.writeToNBT(data, "l"); - return data; + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + steam.serialize(buf); + lps.serialize(buf); } @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - steam.readFromNBT(nbt, "s"); - lps.readFromNBT(nbt, "l"); + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + steam.deserialize(buf); + lps.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index 219971f9f..9c224199a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -215,7 +215,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I screen.refZ = zCoord; screen.range = this.getRange(); screen.linked = true; - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), 25)); + sendStandard(25); } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java index f4dfafdd3..9da001e51 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java @@ -3,19 +3,16 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; import java.util.List; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import api.hbm.entity.RadarEntry; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -public class TileEntityMachineRadarScreen extends TileEntity implements IBufPacketReceiver { +public class TileEntityMachineRadarScreen extends TileEntityLoadedBase implements IBufPacketReceiver { public List entries = new ArrayList(); public int refX; @@ -28,16 +25,12 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack public void updateEntity() { if(!worldObj.isRemote) { - this.networkPackNT(100); + this.sendStandard(100); entries.clear(); this.linked = false; } } - - public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - + @Override public void serialize(ByteBuf buf) { buf.writeBoolean(linked); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index 235cc9c1f..619574436 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -11,14 +11,12 @@ import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemScraps; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.NBTPacket; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.util.fauxpointtwelve.DirPos; -import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -32,7 +30,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; //god thank you bob for this base class -public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase implements IGUIProvider, ICrucibleAcceptor, ISidedInventory, IFluidStandardTransceiver, INBTPacketReceiver, IInventory { +public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase implements IGUIProvider, ICrucibleAcceptor, ISidedInventory, IFluidStandardTransceiver, IBufPacketReceiver, IInventory { public FluidTank water; public FluidTank steam; @@ -110,12 +108,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase } } - NBTTagCompound data = new NBTTagCompound(); - - water.writeToNBT(data, "w"); - steam.writeToNBT(data, "s"); - - this.networkPack(data, 150); + sendStandard(150); } @@ -254,16 +247,14 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase return new GUIMachineStrandCaster(player.inventory, this); } - public void networkPack(NBTTagCompound nbt, int range) { - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + @Override public void serialize(ByteBuf buf) { + water.serialize(buf); + steam.serialize(buf); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - water.readFromNBT(nbt, "w"); - steam.readFromNBT(nbt, "s"); - + @Override public void deserialize(ByteBuf buf) { + water.deserialize(buf); + steam.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java index 0784cd130..2fc9636d8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java @@ -3,12 +3,14 @@ package com.hbm.tileentity.machine; import java.util.Iterator; import java.util.List; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energymk2.IEnergyReceiverMK2; +import com.hbm.util.BufferUtil; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.ReflectionHelper; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityTracker; @@ -29,7 +31,7 @@ import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements IEnergyReceiverMK2, INBTPacketReceiver { +public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements IEnergyReceiverMK2, IBufPacketReceiver { public long power = 0; public int targetX = -1; @@ -55,10 +57,7 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements } } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - data.setIntArray("target", new int[] {targetX, targetY, targetZ, targetDim}); - INBTPacketReceiver.networkPack(this, data, 15); + sendStandard(15); } else { @@ -72,9 +71,15 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.power = nbt.getLong("power"); - int[] target = nbt.getIntArray("target"); + public void serialize(ByteBuf buf) { + buf.writeLong(power); + BufferUtil.writeIntArray(buf, new int[] {targetX, targetY, targetZ, targetDim}); + } + + @Override + public void deserialize(ByteBuf buf) { + this.power = buf.readLong(); + int[] target = BufferUtil.readIntArray(buf); this.targetX = target[0]; this.targetY = target[1]; this.targetZ = target[2]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java index 7c1f7ea37..817a57adb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java @@ -1,20 +1,22 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.RTTYSystem; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; +import com.hbm.util.BufferUtil; import com.hbm.util.NoteBuilder; import com.hbm.util.NoteBuilder.Instrument; import com.hbm.util.NoteBuilder.Note; import com.hbm.util.NoteBuilder.Octave; import com.hbm.util.Tuple.Triplet; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioRec extends TileEntity implements INBTPacketReceiver, IControlReceiver { +public class TileEntityRadioRec extends TileEntity implements IBufPacketReceiver, IControlReceiver { public String channel = ""; public boolean isOn = false; @@ -49,17 +51,20 @@ public class TileEntityRadioRec extends TileEntity implements INBTPacketReceiver } } - NBTTagCompound data = new NBTTagCompound(); - data.setString("channel", channel); - data.setBoolean("isOn", isOn); - INBTPacketReceiver.networkPack(this, data, 15); + sendStandard(15); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - channel = nbt.getString("channel"); - isOn = nbt.getBoolean("isOn"); + public void serialize(ByteBuf buf) { + BufferUtil.writeString(buf, this.channel); + buf.writeBoolean(this.isOn); + } + + @Override + public void deserialize(ByteBuf buf) { + this.channel = BufferUtil.readString(buf); + this.isOn = buf.readBoolean(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index cd7a8ad37..1599374d9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -10,15 +10,17 @@ import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; +import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; import api.hbm.tile.IHeatSource; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Blocks; @@ -27,7 +29,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; @@ -144,25 +146,9 @@ public class TileEntitySawmill extends TileEntityMachineBase { this.overspeed = 0; this.warnCooldown = 0; } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("heat", heat); - data.setInteger("progress", progress); - data.setBoolean("hasBlade", hasBlade); - NBTTagList list = new NBTTagList(); - for(int i = 0; i < slots.length; i++) { - if(slots[i] != null) { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte) i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - data.setTag("items", list); - - INBTPacketReceiver.networkPack(this, data, 150); - + networkPackNT(150); + this.heat = 0; } else { @@ -180,20 +166,28 @@ public class TileEntitySawmill extends TileEntityMachineBase { } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.heat = nbt.getInteger("heat"); - this.progress = nbt.getInteger("progress"); - this.hasBlade = nbt.getBoolean("hasBlade"); - - NBTTagList list = nbt.getTagList("items", 10); + public void serialize(ByteBuf buf) { + buf.writeInt(heat); + buf.writeInt(progress); + buf.writeBoolean(hasBlade); - slots = new ItemStack[3]; - for(int i = 0; i < list.tagCount(); i++) { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } + ByteBuf itemBuf = new PacketBuffer(Unpooled.buffer()); + + for (ItemStack slot : slots) { + BufferUtil.writeItemStack(buf, slot); + } + + buf.writeBytes(itemBuf); + } + + @Override + public void deserialize(ByteBuf buf) { + this.heat = buf.readInt(); + this.progress = buf.readInt(); + this.hasBlade = buf.readBoolean(); + + for(int i = 0; i < slots.length; i++) { + slots[i] = BufferUtil.readItemStack(buf); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java index 6ed4b7556..7d70c7295 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java @@ -5,13 +5,10 @@ import java.util.HashSet; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.fluid.IFluidStandardTransceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -56,7 +53,7 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui heat = 0; - networkPackNT(15); + sendStandard(15); } else { //a delayed queue of mirror positions because we can't expect the boiler to always tick first @@ -121,10 +118,6 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui public FluidTank[] getAllTanks() { return new FluidTank[] { water, steam }; } - - public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } @Override public void serialize(ByteBuf buf) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java index c64a83cec..f921d04ad 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarMirror.java @@ -4,6 +4,7 @@ import com.hbm.tileentity.TileEntityTickingBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -28,7 +29,7 @@ public class TileEntitySolarMirror extends TileEntityTickingBase { if(!worldObj.isRemote) { if(worldObj.getTotalWorldTime() % 20 == 0) - sendUpdate(); + this.networkPackNT(200); if(tY < yCoord) { isOn = false; @@ -64,22 +65,18 @@ public class TileEntitySolarMirror extends TileEntityTickingBase { } } - public void sendUpdate() { - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("posX", tX); - data.setInteger("posY", tY); - data.setInteger("posZ", tZ); - data.setBoolean("isOn", isOn); - this.networkPack(data, 200); + @Override public void serialize(ByteBuf buf) { + buf.writeInt(this.tX); + buf.writeInt(this.tY); + buf.writeInt(this.tZ); + buf.writeBoolean(this.isOn); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - tX = nbt.getInteger("posX"); - tY = nbt.getInteger("posY"); - tZ = nbt.getInteger("posZ"); - isOn = nbt.getBoolean("isOn"); + @Override public void deserialize(ByteBuf buf) { + this.tX = buf.readInt(); + this.tY = buf.readInt(); + this.tZ = buf.readInt(); + this.isOn = buf.readBoolean(); } public void setTarget(int x, int y, int z) { @@ -87,7 +84,7 @@ public class TileEntitySolarMirror extends TileEntityTickingBase { tY = y; tZ = z; this.markDirty(); - this.sendUpdate(); + this.networkPackNT(200); } public void readFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java index a09c5747e..508786fec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java @@ -9,8 +9,8 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -18,13 +18,16 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEnergyProviderMK2, IFluidStandardTransceiver, INBTPacketReceiver, IConfigurableMachine { +public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEnergyProviderMK2, IFluidStandardTransceiver, IBufPacketReceiver, IConfigurableMachine { public long powerBuffer; @@ -66,7 +69,9 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner writer.name("I:ldsCap").value(ldsCap); writer.name("D:efficiency").value(efficiency); } - + + ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + @Override public void updateEntity() { @@ -76,9 +81,8 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner tanks[0].setTankType(Fluids.STEAM); tanks[1].setTankType(Fluids.SPENTSTEAM); - - NBTTagCompound data = new NBTTagCompound(); - tanks[0].writeToNBT(data, "s"); + + tanks[0].serialize(buf); FT_Coolable trait = tanks[0].getTankType().getTrait(FT_Coolable.class); double eff = trait.getEfficiency(CoolingType.TURBINE) * efficiency; @@ -105,9 +109,9 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.steamEngineOperate", getVolume(1.0F), 0.5F + (acceleration / 80F)); } - data.setLong("power", this.powerBuffer); - data.setFloat("rotor", this.rotor); - tanks[1].writeToNBT(data, "w"); + buf.writeLong(this.powerBuffer); + buf.writeFloat(this.rotor); + tanks[1].serialize(buf); for(DirPos pos : getConPos()) { if(this.powerBuffer > 0) this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); @@ -115,7 +119,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); } else { this.lastRotor = this.rotor; @@ -139,7 +143,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX, yCoord + 1, zCoord + rot.offsetZ * 2 - dir.offsetZ, rot) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -207,11 +211,17 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.powerBuffer = nbt.getLong("power"); - this.syncRotor = nbt.getFloat("rotor"); + public void serialize(ByteBuf buf) { + buf.writeBytes(this.buf); + this.buf = new PacketBuffer(Unpooled.buffer()); + } + + @Override + public void deserialize(ByteBuf buf) { + this.powerBuffer = buf.readLong(); + this.syncRotor = buf.readFloat(); this.turnProgress = 3; //use 3-ply for extra smoothness - this.tanks[0].readFromNBT(nbt, "s"); - this.tanks[1].readFromNBT(nbt, "w"); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java index d59a5e933..8c86ca568 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java @@ -8,8 +8,8 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityCog; import com.hbm.lib.Library; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -17,12 +17,13 @@ import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityStirling extends TileEntityLoadedBase implements INBTPacketReceiver, IEnergyProviderMK2, IConfigurableMachine { +public class TileEntityStirling extends TileEntityLoadedBase implements IBufPacketReceiver, IEnergyProviderMK2, IConfigurableMachine { public long powerBuffer; public int heat; @@ -88,11 +89,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack this.warnCooldown = 0; } - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", powerBuffer); - data.setInteger("heat", heat); - data.setBoolean("hasCog", hasCog); - INBTPacketReceiver.networkPack(this, data, 150); + sendStandard(150); if(hasCog) { for(DirPos pos : getConPos()) { @@ -143,10 +140,17 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.powerBuffer = nbt.getLong("power"); - this.heat = nbt.getInteger("heat"); - this.hasCog = nbt.getBoolean("hasCog"); + public void serialize(ByteBuf buf) { + buf.writeLong(this.powerBuffer); + buf.writeInt(this.heat); + buf.writeBoolean(this.hasCog); + } + + @Override + public void deserialize(ByteBuf buf) { + this.powerBuffer = buf.readLong(); + this.heat = buf.readInt(); + this.hasCog = buf.readBoolean(); } protected void tryPullHeat() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java index 37f9f4fb0..2579c61bd 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java @@ -5,7 +5,7 @@ import com.hbm.inventory.FluidStack; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CrackingRecipes; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; @@ -13,11 +13,12 @@ import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardTransceiver { +public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver { public FluidTank[] tanks; @@ -52,22 +53,23 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl if(tanks[i].getFill() > 0) this.sendFluid(tanks[i], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - - NBTTagCompound data = new NBTTagCompound(); - for(int i = 0; i < 5; i++) - tanks[i].writeToNBT(data, "tank" + i); - - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(25); } this.worldObj.theProfiler.endSection(); } } @Override - public void networkUnpack(NBTTagCompound nbt) { + public void serialize(ByteBuf buf) { for(int i = 0; i < 5; i++) - tanks[i].readFromNBT(nbt, "tank" + i); + tanks[i].serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + for(int i = 0; i < 5; i++) + tanks[i].deserialize(buf); } private void updateConnections() { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java index a95a94b68..7196e9b31 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java @@ -93,14 +93,6 @@ public class TileEntityMachineCatalyticReformer extends TileEntityMachineBase im for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.power = nbt.getLong("power"); - for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "" + i); - } - private void reform() { Triplet out = ReformingRecipes.getOutput(tanks[0].getTankType()); diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index 527b14b1a..76e7714e2 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -69,7 +69,7 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme this.sendFluid(); - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + sendStandard(50); } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java index b4745b170..0463be416 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java @@ -40,9 +40,9 @@ public abstract class TileEntityPileBase extends TileEntity { Vec3 neutronVector = Vec3.createVectorHelper(1, 0, 0); - neutronVector.rotateAroundX((float)(Math.PI * 2D * worldObj.rand.nextDouble())); - neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); neutronVector.rotateAroundZ((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundX((float)(Math.PI * 2D * worldObj.rand.nextDouble())); new PileNeutronStream(node, neutronVector, flux); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 1d3ea4d8d..a1d770a95 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -6,11 +6,11 @@ import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.CompatHandler; import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.items.machine.ItemRBMKRod; -import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.IBufPacketReceiver; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -27,7 +27,7 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.List; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityCraneConsole extends TileEntity implements INBTPacketReceiver, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityCraneConsole extends TileEntity implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { public int centerX; public int centerY; @@ -162,26 +162,8 @@ public class TileEntityCraneConsole extends TileEntity implements INBTPacketRece this.loadedHeat = 0; this.loadedEnrichment = 0; } - - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setBoolean("crane", setUpCrane); - - if(setUpCrane) { //no need to send any of this if there's NO FUCKING CRANE THERE - nbt.setInteger("centerX", centerX); - nbt.setInteger("centerY", centerY); - nbt.setInteger("centerZ", centerZ); - nbt.setInteger("spanF", spanF); - nbt.setInteger("spanB", spanB); - nbt.setInteger("spanL", spanL); - nbt.setInteger("spanR", spanR); - nbt.setInteger("height", height); - nbt.setDouble("posFront", posFront); - nbt.setDouble("posLeft", posLeft); - nbt.setBoolean("loaded", this.hasItemLoaded()); - nbt.setDouble("loadedHeat", loadedHeat); - nbt.setDouble("loadedEnrichment", loadedEnrichment); - } - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); + + sendStandard(250); } } @@ -241,27 +223,49 @@ public class TileEntityCraneConsole extends TileEntity implements INBTPacketRece } @Override - public void networkUnpack(NBTTagCompound nbt) { - + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.setUpCrane); + + if(this.setUpCrane) { //no need to send any of this if there's NO FUCKING CRANE THERE + buf.writeInt(this.centerX); + buf.writeInt(this.centerY); + buf.writeInt(this.centerZ); + buf.writeInt(this.spanF); + buf.writeInt(this.spanB); + buf.writeInt(this.spanL); + buf.writeInt(this.spanR); + buf.writeInt(this.height); + buf.writeDouble(this.posFront); + buf.writeDouble(this.posLeft); + buf.writeBoolean(this.hasItemLoaded()); + buf.writeDouble(this.loadedHeat); + buf.writeDouble(this.loadedEnrichment); + } + } + + @Override + public void deserialize(ByteBuf buf) { lastPosFront = posFront; lastPosLeft = posLeft; lastProgress = progress; - - this.setUpCrane = nbt.getBoolean("crane"); - this.centerX = nbt.getInteger("centerX"); - this.centerY = nbt.getInteger("centerY"); - this.centerZ = nbt.getInteger("centerZ"); - this.spanF = nbt.getInteger("spanF"); - this.spanB = nbt.getInteger("spanB"); - this.spanL = nbt.getInteger("spanL"); - this.spanR = nbt.getInteger("spanR"); - this.height = nbt.getInteger("height"); - this.posFront = nbt.getDouble("posFront"); - this.posLeft = nbt.getDouble("posLeft"); - this.hasLoaded = nbt.getBoolean("loaded"); - this.posLeft = nbt.getDouble("posLeft"); - this.loadedHeat = nbt.getDouble("loadedHeat"); - this.loadedEnrichment = nbt.getDouble("loadedEnrichment"); + + this.setUpCrane = buf.readBoolean(); + if (this.setUpCrane) { + this.centerX = buf.readInt(); + this.centerY = buf.readInt(); + this.centerZ = buf.readInt(); + this.spanF = buf.readInt(); + this.spanB = buf.readInt(); + this.spanL = buf.readInt(); + this.spanR = buf.readInt(); + this.height = buf.readInt(); + this.posFront = buf.readDouble(); + this.posLeft = buf.readDouble(); + this.hasLoaded = buf.readBoolean(); + this.posLeft = buf.readDouble(); + this.loadedHeat = buf.readDouble(); + this.loadedEnrichment = buf.readDouble(); + } } public void setTarget(int x, int y, int z) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 70e768933..76694847d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -9,7 +9,6 @@ import com.hbm.entity.effect.EntitySpear; import com.hbm.entity.projectile.EntityRBMKDebris; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.neutron.NeutronNodeWorld; -import com.hbm.handler.neutron.RBMKNeutronHandler; import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; @@ -118,7 +117,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements coolPassively(); this.worldObj.theProfiler.endSection(); - this.networkPackNT(trackingRange()); + this.sendStandard(trackingRange()); } } @@ -279,13 +278,8 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements nbt.setInteger("steam", this.steam); } - public void networkPackNT(int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - @Override public void serialize(ByteBuf buf) { - buf.writeBoolean(this.muffled); buf.writeDouble(this.heat); buf.writeInt(this.water); buf.writeInt(this.steam); @@ -293,7 +287,6 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements @Override public void deserialize(ByteBuf buf) { - this.muffled = buf.readBoolean(); this.heat = buf.readDouble(); this.water = buf.readInt(); this.steam = buf.readInt(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java index 8ad47d4af..0ebc3d3dc 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKSlottedBase.java @@ -1,15 +1,11 @@ package com.hbm.tileentity.machine.rbmk; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.NBTPacket; import com.hbm.tileentity.IGUIProvider; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.fluids.FluidTank; /** * Base class for RBMK components that have GUI slots and thus have to handle @@ -124,19 +120,6 @@ public abstract class TileEntityRBMKSlottedBase extends TileEntityRBMKActiveBase return new int[] {}; } - public int getGaugeScaled(int i, FluidTank tank) { - return tank.getFluidAmount() * i / tank.getCapacity(); - } - - public void networkPack(NBTTagCompound nbt, int range) { - - if(!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - - public void handleButtonPacket(int value, int meta) { - } - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java index 42122c5ed..aa9aff809 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java @@ -70,7 +70,7 @@ public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIPr } else timer = 0; - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); + sendStandard(25); } else { this.prevLowerExtent = lowerExtent; this.prevUpperExtent = upperExtent; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index 6db2f555f..dd80a4875 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -3,11 +3,13 @@ package com.hbm.tileentity.machine.storage; import com.hbm.inventory.container.ContainerMassStorage; import com.hbm.inventory.gui.GUIMassStorage; import com.hbm.items.ModItems; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IControlReceiverFilter; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -16,7 +18,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityMassStorage extends TileEntityCrateBase implements INBTPacketReceiver, IControlReceiverFilter { +public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPacketReceiver, IControlReceiverFilter { private int stack = 0; public boolean output = false; @@ -79,28 +81,30 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements INBTPa if(slots[2] == null) { slots[2] = slots[1].copy(); slots[2].stackSize = amount; - this.stack -= amount; } else { amount = Math.min(amount, slots[2].getMaxStackSize() - slots[2].stackSize); slots[2].stackSize += amount; - this.stack -= amount; } + this.stack -= amount; } } - - NBTTagCompound data = new NBTTagCompound(); - data.setInteger("stack", getStockpile()); - data.setBoolean("output", output); - if(slots[1] != null) slots[1].writeToNBT(data); - INBTPacketReceiver.networkPack(this, data, 15); + + sendStandard(15); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.stack = nbt.getInteger("stack"); - this.output = nbt.getBoolean("output"); - this.type = ItemStack.loadItemStackFromNBT(nbt); + public void serialize(ByteBuf buf) { + buf.writeInt(this.stack); + buf.writeBoolean(this.output); + BufferUtil.writeItemStack(buf, this.type); + } + + @Override + public void deserialize(ByteBuf buf) { + this.stack = buf.readInt(); + this.output = buf.readBoolean(); + this.type = BufferUtil.readItemStack(buf); } public int getCapacity() { @@ -180,12 +184,11 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements INBTPa if(slots[2] == null) { slots[2] = slots[1].copy(); slots[2].stackSize = amount; - this.stack -= amount; } else { amount = Math.min(amount, slots[2].getMaxStackSize() - slots[2].stackSize); slots[2].stackSize += amount; - this.stack -= amount; } + this.stack -= amount; } if(data.hasKey("toggle")) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java index 280c16fd0..446d4bf6e 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneCrate.java @@ -10,14 +10,15 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIDroneCrate; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.ParticleUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -27,7 +28,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIProvider, INBTPacketReceiver, IControlReceiver, IDroneLinkable, IFluidStandardTransceiver { +public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IDroneLinkable, IFluidStandardTransceiver { public FluidTank tank; @@ -82,26 +83,31 @@ public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIP (nextX - pos.getX()), (nextY - pos.getY()), (nextZ - pos.getZ()), 0x00ffff); } - - - NBTTagCompound data = new NBTTagCompound(); - data.setIntArray("pos", new int[] {nextX, nextY, nextZ}); - data.setBoolean("mode", sendingMode); - data.setBoolean("type", itemType); - tank.writeToNBT(data, "t"); - INBTPacketReceiver.networkPack(this, data, 25); + networkPackNT(25); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - int[] pos = nbt.getIntArray("pos"); + public void serialize(ByteBuf buf) { + BufferUtil.writeIntArray(buf, new int[] { + this.nextX, + this.nextY, + this.nextZ + }); + buf.writeBoolean(this.sendingMode); + buf.writeBoolean(this.itemType); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + int[] pos = BufferUtil.readIntArray(buf); this.nextX = pos[0]; this.nextY = pos[1]; this.nextZ = pos[2]; - this.sendingMode = nbt.getBoolean("mode"); - this.itemType = nbt.getBoolean("type"); - tank.readFromNBT(nbt, "t"); + this.sendingMode = buf.readBoolean(); + this.itemType = buf.readBoolean(); + tank.deserialize(buf); } protected void loadItems(EntityDeliveryDrone drone) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java index faa21f615..9d4948175 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java @@ -9,15 +9,16 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.container.ContainerDroneRequester; import com.hbm.inventory.gui.GUIDroneRequester; import com.hbm.module.ModulePatternMatcher; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.network.RequestNetwork.PathNode; import com.hbm.tileentity.network.RequestNetwork.RequestNode; import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -27,7 +28,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer implements INBTPacketReceiver, IGUIProvider, IControlReceiverFilter { +public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer implements IBufPacketReceiver, IGUIProvider, IControlReceiverFilter { public ModulePatternMatcher matcher; @@ -46,16 +47,17 @@ public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer super.updateEntity(); if(!worldObj.isRemote) { - - NBTTagCompound data = new NBTTagCompound(); - this.matcher.writeToNBT(data); - INBTPacketReceiver.networkPack(this, data, 15); + + sendStandard(15); } } - @Override - public void networkUnpack(NBTTagCompound nbt) { - this.matcher.readFromNBT(nbt); + @Override public void serialize(ByteBuf buf) { + this.matcher.serialize(buf); + } + + @Override public void deserialize(ByteBuf buf) { + this.matcher.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java index 33b68fc4e..d2facb170 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java @@ -39,7 +39,7 @@ public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketRec } } - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 15)); + sendStandard(15); } else { BlockPos pos = getCoord(dir); if(nextY != -1 && worldObj.getTotalWorldTime() % 2 == 0) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java index 26d6dec14..789f0a96d 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java @@ -6,14 +6,16 @@ import java.util.List; import com.hbm.handler.CompatHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.gui.GuiScreenRadioTelex; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; +import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; @@ -30,7 +32,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityRadioTelex extends TileEntity implements INBTPacketReceiver, IControlReceiver, IGUIProvider, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiver, IControlReceiver, IGUIProvider, SimpleComponent, CompatHandler.OCComponent { public static final int lineWidth = 33; public String txChannel = ""; @@ -130,28 +132,32 @@ public class TileEntityRadioTelex extends TileEntity implements INBTPacketReceiv } } - NBTTagCompound data = new NBTTagCompound(); - for(int i = 0; i < 5; i++) { - data.setString("tx" + i, txBuffer[i]); - data.setString("rx" + i, rxBuffer[i]); - } - data.setString("txChan", txChannel); - data.setString("rxChan", rxChannel); - data.setInteger("sending", sendingChar); - INBTPacketReceiver.networkPack(this, data, 16); + sendStandard(16); } } @Override - public void networkUnpack(NBTTagCompound nbt) { - + public void serialize(ByteBuf buf) { for(int i = 0; i < 5; i++) { - txBuffer[i] = nbt.getString("tx" + i); - rxBuffer[i] = nbt.getString("rx" + i); + BufferUtil.writeString(buf, txBuffer[i]); + BufferUtil.writeString(buf, rxBuffer[i]); } - this.txChannel = nbt.getString("txChan"); - this.rxChannel = nbt.getString("rxChan"); - this.sendingChar = (char) nbt.getInteger("sending"); + + BufferUtil.writeString(buf, this.txChannel); + BufferUtil.writeString(buf, this.rxChannel); + buf.writeChar(this.sendingChar); + } + + @Override + public void deserialize(ByteBuf buf) { + for(int i = 0; i < 5; i++) { + txBuffer[i] = BufferUtil.readString(buf); + rxBuffer[i] = BufferUtil.readString(buf); + } + + this.txChannel = BufferUtil.readString(buf); + this.rxChannel = BufferUtil.readString(buf); + this.sendingChar = buf.readChar(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java index e881b1ecf..5a01077fa 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java @@ -1,8 +1,10 @@ package com.hbm.tileentity.network; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.util.BufferUtil; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -10,7 +12,7 @@ import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioTorchBase extends TileEntity implements INBTPacketReceiver, IControlReceiver { +public class TileEntityRadioTorchBase extends TileEntity implements IBufPacketReceiver, IControlReceiver { /** channel we're broadcasting on/listening to */ public String channel = ""; @@ -30,12 +32,7 @@ public class TileEntityRadioTorchBase extends TileEntity implements INBTPacketRe if(!worldObj.isRemote) { - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("p", polling); - data.setBoolean("m", customMap); - if(channel != null) data.setString("c", channel); - for(int i = 0; i < 16; i++) if(mapping[i] != null) data.setString("m" + i, mapping[i]); - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(50); } } @@ -62,11 +59,19 @@ public class TileEntityRadioTorchBase extends TileEntity implements INBTPacketRe } @Override - public void networkUnpack(NBTTagCompound nbt) { - this.polling = nbt.getBoolean("p"); - this.customMap = nbt.getBoolean("m"); - this.channel = nbt.getString("c"); - for(int i = 0; i < 16; i++) this.mapping[i] = nbt.getString("m" + i); + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.polling); + buf.writeBoolean(this.customMap); + BufferUtil.writeString(buf, this.channel); + for(int i = 0; i < 16; i++) BufferUtil.writeString(buf, this.mapping[i]); + } + + @Override + public void deserialize(ByteBuf buf) { + this.polling = buf.readBoolean(); + this.customMap = buf.readBoolean(); + this.channel = BufferUtil.readString(buf); + for(int i = 0; i < 16; i++) this.mapping[i] = BufferUtil.readString(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java index 4a44c3504..36b070cb2 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java @@ -1,9 +1,11 @@ package com.hbm.tileentity.network; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; +import com.hbm.util.BufferUtil; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -11,7 +13,7 @@ import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioTorchLogic extends TileEntity implements INBTPacketReceiver, IControlReceiver { +public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketReceiver, IControlReceiver { /** channel we're broadcasting on/listening to */ public String channel = ""; @@ -80,13 +82,7 @@ public class TileEntityRadioTorchLogic extends TileEntity implements INBTPacketR } } - NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("p", polling); - data.setBoolean("d", descending); - if(channel != null) data.setString("c", channel); - for(int i = 0; i < 16; i++) if(!mapping[i].equals("")) data.setString("m" + i, mapping[i]); - for(int i = 0; i < 16; i++) if(conditions[i] > 0) data.setInteger("c" + i, conditions[i]); - INBTPacketReceiver.networkPack(this, data, 50); + sendStandard(50); } } @@ -150,12 +146,22 @@ public class TileEntityRadioTorchLogic extends TileEntity implements INBTPacketR for(int i = 0; i < 16; i++) if(conditions[i] > 0) nbt.setInteger("c" + i, conditions[i]); } - public void networkUnpack(NBTTagCompound nbt) { - this.polling = nbt.getBoolean("p"); - this.channel = nbt.getString("c"); - this.descending = nbt.getBoolean("d"); - for(int i = 0; i < 16; i++) this.mapping[i] = nbt.getString("m" + i); - for(int i = 0; i < 16; i++) this.conditions[i] = nbt.getInteger("c" + i); + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.polling); + BufferUtil.writeString(buf, this.channel); + buf.writeBoolean(this.descending); + for(int i = 0; i < 16; i++) BufferUtil.writeString(buf, this.mapping[i]); + for(int i = 0; i < 16; i++) buf.writeInt(this.conditions[i]); + } + + @Override + public void deserialize(ByteBuf buf) { + this.polling = buf.readBoolean(); + this.channel = BufferUtil.readString(buf); + this.descending = buf.readBoolean(); + for(int i = 0; i < 16; i++) this.mapping[i] = BufferUtil.readString(buf); + for(int i = 0; i < 16; i++) this.conditions[i] = buf.readInt(); } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java index 28c66c658..73e07b745 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetworkContainer.java @@ -1,9 +1,5 @@ package com.hbm.tileentity.network; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.NBTPacket; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; @@ -106,11 +102,7 @@ public abstract class TileEntityRequestNetworkContainer extends TileEntityReques return null; } } - - public void networkPack(NBTTagCompound nbt, int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 192812428..3866c7d4b 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -311,28 +311,6 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple this.trySubscribe(worldObj, xCoord + dir.offsetX * 2 + rot.offsetX * -1, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * -1, dir); } - @Override - public void networkUnpack(NBTTagCompound nbt) { - super.networkUnpack(nbt); - - this.turnProgress = 2; - this.syncRotationPitch = nbt.getDouble("pitch"); - this.syncRotationYaw = nbt.getDouble("yaw"); - this.power = nbt.getLong("power"); - this.isOn = nbt.getBoolean("isOn"); - this.targetPlayers = nbt.getBoolean("targetPlayers"); - this.targetAnimals = nbt.getBoolean("targetAnimals"); - this.targetMobs = nbt.getBoolean("targetMobs"); - this.targetMachines = nbt.getBoolean("targetMachines"); - this.stattrak = nbt.getInteger("stattrak"); - - if(nbt.hasKey("tX")) { - this.tPos = Vec3.createVectorHelper(nbt.getDouble("tX"), nbt.getDouble("tY"), nbt.getDouble("tZ")); - } else { - this.tPos = null; - } - } - @Override public void handleButtonPacket(int value, int meta) { From 0809bc223fe49aa24ea294814b38a07c6fb0f73d Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 30 Aug 2024 14:43:45 +0200 Subject: [PATCH 34/70] Merge master into branch Optimization, intelliJ couldn't do it, so I did it myself. --- src/main/java/com/hbm/blocks/generic/BlockEmitter.java | 5 ++++- src/main/java/com/hbm/blocks/machine/MachineCapacitor.java | 3 --- src/main/java/com/hbm/tileentity/TileEntityMachineBase.java | 1 - src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java | 1 - .../com/hbm/tileentity/machine/TileEntityHadronPower.java | 3 --- .../machine/oil/TileEntityMachineFractionTower.java | 3 --- .../com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java | 2 +- .../tileentity/machine/storage/TileEntityFileCabinet.java | 3 --- .../com/hbm/tileentity/network/TileEntityDroneWaypoint.java | 3 --- 9 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java index fa38c3618..c6d8d59f6 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java @@ -4,13 +4,16 @@ import java.awt.Color; import java.util.List; import com.hbm.blocks.ITooltipProvider; -import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IToolable; +import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockPistonBase; diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index b6044e274..fd525f9f6 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -10,8 +10,6 @@ import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityLoadedBase; @@ -22,7 +20,6 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 3e931baae..f385a6f9d 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -1,6 +1,5 @@ package com.hbm.tileentity; -import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxGaugePacket; import com.hbm.packet.toclient.BufPacket; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java index 9ad2765c0..4d4b08836 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java @@ -3,7 +3,6 @@ package com.hbm.tileentity.bomb; import com.hbm.blocks.bomb.BlockChargeBase; import com.hbm.tileentity.IBufPacketReceiver; -import cpw.mods.fml.common.network.NetworkRegistry; import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java index ce8f2daa9..c42db2790 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java @@ -1,13 +1,10 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.machine.BlockHadronPower; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energymk2.IEnergyReceiverMK2; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index 76e7714e2..15e1f0977 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -5,15 +5,12 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.FractionRecipes; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 76694847d..ff74f602a 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -224,7 +224,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements NeutronNodeWorld.removeNode(new BlockPos(this)); // woo-fucking-hoo!!! } - + @Override public void markDirty() { diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java index aa9aff809..7b66c3d55 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java @@ -2,12 +2,9 @@ package com.hbm.tileentity.machine.storage; import com.hbm.inventory.container.ContainerFileCabinet; import com.hbm.inventory.gui.GUIFileCabinet; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java index d2facb170..ffd51fb0f 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java @@ -4,12 +4,9 @@ import java.util.List; import com.hbm.entity.item.EntityDeliveryDrone; import com.hbm.util.ParticleUtil; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.util.fauxpointtwelve.BlockPos; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; From 1bd15dfa78706bb1b387d75ed674cbe25b847efb Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 6 Sep 2024 22:28:00 -0500 Subject: [PATCH 35/70] fixes after the merge conflicts (death) --- src/main/java/com/hbm/blocks/network/BlockCableGauge.java | 4 ---- src/main/java/com/hbm/blocks/network/FluidDuctGauge.java | 3 --- src/main/java/com/hbm/main/ModEventHandlerRenderer.java | 2 +- src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java | 2 +- .../com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java | 4 ++-- 5 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java index 3c6cc0425..292686f37 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java +++ b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java @@ -8,8 +8,6 @@ import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityCableBaseNT; @@ -18,7 +16,6 @@ import com.hbm.util.I18nUtil; import api.hbm.energymk2.PowerNetMK2; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -33,7 +30,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java index 153268f9f..77a347b17 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java @@ -11,8 +11,6 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.CompatHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; -import com.hbm.packet.BufPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityPipeBaseNT; @@ -20,7 +18,6 @@ import com.hbm.util.I18nUtil; import api.hbm.fluid.IPipeNet; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 693c8e20c..03e7834bd 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -418,7 +418,7 @@ public class ModEventHandlerRenderer { public void onRenderHand(RenderHandEvent event) { //can't use plaxer.getHeldItem() here because the item rendering persists for a few frames after hitting the switch key - ItemStack toRender = Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender; + ItemStack toRender = null; //Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender; if(toRender != null) { IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(toRender, ItemRenderType.EQUIPPED_FIRST_PERSON); diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java index 47fd69ef9..a72e81da4 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKLid.java @@ -35,7 +35,7 @@ public class RenderRBMKLid extends TileEntitySpecialRenderer { if(rod.hasRod) hasRod = true; - if(rod.fluxQuantity > 5) + if(rod.lastFluxQuantity > 5) cherenkov = true; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index e4b7e4f64..1b9a7a422 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -234,8 +234,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void writeToNBTDiag(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxSlow", this.fluxQuantity * (1 - fluxRatio)); - nbt.setDouble("fluxFast", this.fluxQuantity * fluxRatio); + nbt.setDouble("fluxSlow", this.lastFluxQuantity * (1 - fluxRatio)); + nbt.setDouble("fluxFast", this.lastFluxQuantity * fluxRatio); nbt.setBoolean("hasRod", this.hasRod); } From 7b65e45663d4aa435e3a061f85a76935db074ba7 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 6 Sep 2024 22:31:27 -0500 Subject: [PATCH 36/70] Unused import cleaning! --- src/main/java/api/hbm/energymk2/Nodespace.java | 1 - src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java | 1 - .../com/hbm/tileentity/bomb/TileEntityCompactLauncher.java | 1 - .../java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java | 1 - .../com/hbm/tileentity/machine/TileEntityConveyorPress.java | 1 - src/main/java/com/hbm/tileentity/machine/TileEntityCore.java | 1 - src/main/java/com/hbm/tileentity/machine/TileEntityITER.java | 1 - .../com/hbm/tileentity/machine/TileEntityMachineAssemfac.java | 1 - .../com/hbm/tileentity/machine/TileEntityMachineDrain.java | 3 --- .../com/hbm/tileentity/machine/TileEntityMachinePumpBase.java | 1 - .../hbm/tileentity/machine/TileEntityMachinePumpElectric.java | 1 - .../com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java | 1 - .../com/hbm/tileentity/machine/TileEntityMachineRadarNT.java | 3 --- src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java | 1 - .../com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java | 1 - .../hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java | 1 - 16 files changed, 20 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 07a5b94b2..cdc618f51 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -8,7 +8,6 @@ import java.util.Set; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; -import cpw.mods.fml.common.gameevent.TickEvent; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 1285b6ad2..cbfe473b7 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -3,7 +3,6 @@ package com.hbm.handler.neutron; import api.hbm.block.IPileNeutronReceiver; import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.machine.pile.TileEntityPileBase; -import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; import com.hbm.util.ContaminationUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index 40a3d4644..e52926b0d 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -17,7 +17,6 @@ import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.packet.toclient.TEMissileMultipartPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index cd1aa132d..84dc3561d 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -18,7 +18,6 @@ import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.packet.toclient.TEMissileMultipartPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java index 0cb68f8ec..02ecc68ef 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java @@ -16,7 +16,6 @@ import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java index 66c1f0e51..a84b55fdc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java @@ -21,7 +21,6 @@ import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.ArmorUtil; -import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import api.hbm.tile.IInfoProviderEC; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 3fd90d627..20d4be34d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -26,7 +26,6 @@ import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import com.hbm.util.BufferUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java index 50be9bd1b..50df07beb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java @@ -25,7 +25,6 @@ import net.minecraft.client.gui.GuiScreen; 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.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java index f019f0815..9df952ab3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java @@ -12,14 +12,11 @@ import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous; import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Liquid; import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Viscous; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardReceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java index 5c4b60c55..39624ca99 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java @@ -18,7 +18,6 @@ import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase implements IFluidStandardTransceiver, IBufPacketReceiver, IConfigurableMachine { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java index 39835837b..d0990e5f2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java @@ -6,7 +6,6 @@ import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; import io.netty.buffer.ByteBuf; -import net.minecraft.nbt.NBTTagCompound; public class TileEntityMachinePumpElectric extends TileEntityMachinePumpBase implements IEnergyReceiverMK2 { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java index fff843d0f..eb37f7d03 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpSteam.java @@ -5,7 +5,6 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.util.fauxpointtwelve.DirPos; import io.netty.buffer.ByteBuf; -import net.minecraft.nbt.NBTTagCompound; public class TileEntityMachinePumpSteam extends TileEntityMachinePumpBase { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index 9c224199a..8b0ce7c09 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -18,8 +18,6 @@ import com.hbm.items.ModItems; import com.hbm.items.tool.ItemCoordinateBase; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; import com.hbm.saveddata.SatelliteSavedData; import com.hbm.saveddata.satellites.Satellite; import com.hbm.saveddata.satellites.SatelliteHorizons; @@ -39,7 +37,6 @@ import api.hbm.entity.IRadarDetectableNT; import api.hbm.entity.IRadarDetectableNT.RadarScanParams; import api.hbm.entity.RadarEntry; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java index ee498d053..30d3d8df5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java @@ -21,7 +21,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.passive.EntityOcelot; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java index dcee0bbc2..515060fa4 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCoker.java @@ -12,7 +12,6 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import com.hbm.util.BufferUtil; import com.hbm.util.Tuple.Triplet; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java index 7308e13e7..c6c27de58 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java @@ -24,7 +24,6 @@ import net.minecraft.client.gui.GuiScreen; 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.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; From 063ab4032f513981d706b0eed17a6aeb4e6981f2 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:44:30 -0500 Subject: [PATCH 37/70] yeah these are commits from like a month ago idk what any of this is --- .../machine/TileEntityCondenser.java | 35 +- .../machine/TileEntityCrucible.java | 226 +++++++------ .../machine/TileEntityMachineRadiolysis.java | 84 ++--- .../TileEntityMachineStrandCaster.java | 17 +- .../oil/TileEntityMachineGasFlare.java | 52 +-- .../storage/TileEntityMassStorage.java | 56 ++-- .../turret/TileEntityTurretBaseNT.java | 313 +++++++++--------- .../turret/TileEntityTurretMaxwell.java | 55 ++- .../turret/TileEntityTurretSentry.java | 64 ++-- src/main/java/com/hbm/util/BufferUtil.java | 29 +- 10 files changed, 482 insertions(+), 449 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index f47765018..ae3bff75b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -7,6 +7,7 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.saveddata.TomSaveData; +import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IFluidCopiable; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.TileEntityLoadedBase; @@ -22,10 +23,10 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS public int age = 0; public FluidTank[] tanks; - + public int waterTimer = 0; protected int throughput; - + //Configurable values public static int inputTankSize = 100; public static int outputTankSize = 100; @@ -55,49 +56,49 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + age++; if(age >= 2) { age = 0; } - + NBTTagCompound data = new NBTTagCompound(); this.tanks[0].writeToNBT(data, "0"); - + if(this.waterTimer > 0) this.waterTimer--; int convert = Math.min(tanks[0].getFill(), tanks[1].getMaxFill() - tanks[1].getFill()); this.throughput = convert; - + if(extraCondition(convert)) { tanks[0].setFill(tanks[0].getFill() - convert); - + if(convert > 0) this.waterTimer = 20; - + int light = this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, this.xCoord, this.yCoord, this.zCoord); - + if(TomSaveData.forWorld(worldObj).fire > 1e-5 && light > 7) { // Make both steam and water evaporate during firestorms... tanks[1].setFill(tanks[1].getFill() - convert); } else { tanks[1].setFill(tanks[1].getFill() + convert); } - + postConvert(convert); } - + this.tanks[1].writeToNBT(data, "1"); - + this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); - + sendStandard(150); } } - + public void packExtra(NBTTagCompound data) { } public boolean extraCondition(int convert) { return true; } public void postConvert(int convert) { } @@ -115,14 +116,14 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS this.tanks[1].deserialize(buf); this.waterTimer = buf.readByte(); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tanks[0].readFromNBT(nbt, "water"); tanks[1].readFromNBT(nbt, "steam"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index a799ab1b6..fd3f5248d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -50,7 +50,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro public int heat; public int progress; - + public List recipeStack = new ArrayList(); public List wasteStack = new ArrayList(); @@ -102,21 +102,21 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro @Override public void updateEntity() { - + if(!worldObj.isRemote) { tryPullHeat(); - + /* collect items */ if(worldObj.getTotalWorldTime() % 5 == 0) { List list = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord + 0.5, zCoord - 0.5, xCoord + 1.5, yCoord + 1, zCoord + 1.5)); - + for(EntityItem item : list) { ItemStack stack = item.getEntityItem(); if(this.isItemSmeltable(stack)) { - + for(int i = 1; i < 10; i++) { if(slots[i] == null) { - + if(stack.stackSize == 1) { slots[i] = stack.copy(); item.setDead(); @@ -126,7 +126,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro slots[i].stackSize = 1; stack.stackSize--; } - + this.markChanged(); } } @@ -139,29 +139,29 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro for(MaterialStack stack : recipeStack) totalMass += stack.amount; for(MaterialStack stack : wasteStack) totalMass += stack.amount; - + double level = ((double) totalMass / (double) totalCap) * 0.875D; - + List living = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5 + level, zCoord + 0.5).expand(1, 0, 1)); for(EntityLivingBase entity : living) { entity.attackEntityFrom(DamageSource.lava, 5F); entity.setFire(5); } - + /* smelt items from buffer */ if(!trySmelt()) { this.progress = 0; } - + tryRecipe(); - + /* pour waste stack */ if(!this.wasteStack.isEmpty()) { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); Vec3 impact = Vec3.createVectorHelper(0, 0, 0); MaterialStack didPour = CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(3), impact); - + if(didPour != null) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "foundry"); @@ -171,24 +171,24 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875))); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord, zCoord + 0.5D + dir.offsetZ * 1.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); - + } PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND / 20F); } - + /* pour recipe stack */ if(!this.recipeStack.isEmpty()) { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); List toCast = new ArrayList(); - + CrucibleRecipe recipe = this.getLoadedRecipe(); //if no recipe is loaded, everything from the recipe stack will be drainable if(recipe == null) { toCast.addAll(this.recipeStack); } else { - + for(MaterialStack stack : this.recipeStack) { for(MaterialStack output : recipe.output) { if(stack.material == output.material) { @@ -198,7 +198,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } } } - + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); MaterialStack didPour = CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, toCast, MaterialShapes.NUGGET.q(3), impact); @@ -211,7 +211,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875))); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord, zCoord + 0.5D + dir.offsetZ * 1.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); - + } PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND / 20F); @@ -220,51 +220,63 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro /* clean up stacks */ this.recipeStack.removeIf(o -> o.amount <= 0); this.wasteStack.removeIf(x -> x.amount <= 0); - + /* sync */ this.networkPackNT(25); } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeInt(progress); buf.writeInt(heat); - + buf.writeShort(recipeStack.size()); for(MaterialStack sta : recipeStack) { - buf.writeInt(sta.material.id); + if (sta.material == null) + buf.writeInt(-1); + else + buf.writeInt(sta.material.id); buf.writeInt(sta.amount); } - + buf.writeShort(wasteStack.size()); for(MaterialStack sta : wasteStack) { - buf.writeInt(sta.material.id); + if (sta.material == null) + buf.writeInt(-1); + else + buf.writeInt(sta.material.id); buf.writeInt(sta.amount); } } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); progress = buf.readInt(); heat = buf.readInt(); - + recipeStack.clear(); wasteStack.clear(); - + int mats = buf.readShort(); for(int i = 0; i < mats; i++) { - recipeStack.add(new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt())); + int id = buf.readInt(); + if (id == -1) + continue; + recipeStack.add(new MaterialStack(Mats.matById.get(id), buf.readInt())); } - + mats = buf.readShort(); for(int i = 0; i < mats; i++) { - wasteStack.add(new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt())); + int id = buf.readInt(); + if (id == -1) + continue; + wasteStack.add(new MaterialStack(Mats.matById.get(id), buf.readInt())); } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -273,20 +285,20 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro for(int i = 0; i < rec.length / 2; i++) { recipeStack.add(new MaterialStack(Mats.matById.get(rec[i * 2]), rec[i * 2 + 1])); } - + int[] was = nbt.getIntArray("was"); for(int i = 0; i < was.length / 2; i++) { wasteStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); } - + this.progress = nbt.getInteger("progress"); this.heat = nbt.getInteger("heat"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + int[] rec = new int[recipeStack.size() * 2]; int[] was = new int[wasteStack.size() * 2]; for(int i = 0; i < recipeStack.size(); i++) { MaterialStack sta = recipeStack.get(i); rec[i * 2] = sta.material.id; rec[i * 2 + 1] = sta.amount; } @@ -296,21 +308,21 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro nbt.setInteger("progress", progress); nbt.setInteger("heat", heat); } - + protected void tryPullHeat() { - + if(this.heat >= this.maxHeat) return; - + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - + if(con instanceof IHeatSource) { IHeatSource source = (IHeatSource) con; int diff = source.getHeatStored() - this.heat; - + if(diff == 0) { return; } - + if(diff > 0) { diff = (int) Math.ceil(diff * diffusion); source.useUpHeat(diff); @@ -320,170 +332,170 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return; } } - + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } - + protected boolean trySmelt() { - + if(this.heat < maxHeat / 2) return false; - + int slot = this.getFirstSmeltableSlot(); if(slot == -1) return false; - + int delta = this.heat - (maxHeat / 2); delta *= 0.05; - + this.progress += delta; this.heat -= delta; - + if(this.progress >= processTime) { this.progress = 0; - + List materials = Mats.getSmeltingMaterialsFromItem(slots[slot]); CrucibleRecipe recipe = getLoadedRecipe(); - + for(MaterialStack material : materials) { boolean mainStack = recipe != null && (getQuantaFromType(recipe.input, material.material) > 0 || getQuantaFromType(recipe.output, material.material) > 0); - + if(mainStack) { this.addToStack(this.recipeStack, material); } else { this.addToStack(this.wasteStack, material); } } - + this.decrStackSize(slot, 1); } - + return true; } - + protected void tryRecipe() { CrucibleRecipe recipe = this.getLoadedRecipe(); - + if(recipe == null) return; if(worldObj.getTotalWorldTime() % recipe.frequency > 0) return; - + for(MaterialStack stack : recipe.input) { if(getQuantaFromType(this.recipeStack, stack.material) < stack.amount) return; } - + for(MaterialStack stack : this.recipeStack) { stack.amount -= getQuantaFromType(recipe.input, stack.material); } - + outer: for(MaterialStack out : recipe.output) { - + for(MaterialStack stack : this.recipeStack) { if(stack.material == out.material) { stack.amount += out.amount; continue outer; } } - + this.recipeStack.add(out.copy()); } } - + protected int getFirstSmeltableSlot() { - + for(int i = 1; i < 10; i++) { - + ItemStack stack = slots[i]; - + if(stack != null && isItemSmeltable(stack)) { return i; } } - + return -1; } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - + if(i == 0) { return stack.getItem() == ModItems.crucible_template; } - + return isItemSmeltable(stack); } - + public boolean isItemSmeltable(ItemStack stack) { - + List materials = Mats.getSmeltingMaterialsFromItem(stack); - + //if there's no materials in there at all, don't smelt if(materials.isEmpty()) return false; CrucibleRecipe recipe = getLoadedRecipe(); - + //needs to be true, will always be true if there's no recipe loaded boolean matchesRecipe = recipe == null; - + //the amount of material in the entire recipe input int recipeContent = recipe != null ? recipe.getInputAmount() : 0; //the total amount of the current waste stack, used for simulation int recipeAmount = getQuantaFromType(this.recipeStack, null); int wasteAmount = getQuantaFromType(this.wasteStack, null); - + for(MaterialStack mat : materials) { //if no recipe is loaded, everything will land in the waste stack int recipeInputRequired = recipe != null ? getQuantaFromType(recipe.input, mat.material) : 0; - + //this allows pouring the ouput material back into the crucible if(recipe != null && getQuantaFromType(recipe.output, mat.material) > 0) { recipeAmount += mat.amount; matchesRecipe = true; continue; } - + if(recipeInputRequired == 0) { //if this type isn't required by the recipe, add it to the waste stack wasteAmount += mat.amount; } else { - + //the maximum is the recipe's ratio scaled up to the recipe stack's capacity int matMaximum = recipeInputRequired * this.recipeZCapacity / recipeContent; int amountStored = getQuantaFromType(recipeStack, mat.material); - + matchesRecipe = true; - + recipeAmount += mat.amount; - + //if the amount of that input would exceed the amount dictated by the recipe, return false if(recipe != null && amountStored + mat.amount > matMaximum) return false; } } - + //if the amount doesn't exceed the capacity and the recipe matches (or isn't null), return true return recipeAmount <= this.recipeZCapacity && wasteAmount <= this.wasteZCapacity && matchesRecipe; } - + public void addToStack(List stack, MaterialStack matStack) { - + for(MaterialStack mat : stack) { if(mat.material == matStack.material) { mat.amount += matStack.amount; return; } } - + stack.add(matStack.copy()); } - + public CrucibleRecipe getLoadedRecipe() { - + if(slots[0] != null && slots[0].getItem() == ModItems.crucible_template) { return CrucibleRecipes.indexMapping.get(slots[0].getItemDamage()); } - + return null; } - + /* "Arrays and Lists don't have a common ancestor" my fucking ass */ public int getQuantaFromType(MaterialStack[] stacks, NTMMaterial mat) { for(MaterialStack stack : stacks) { @@ -493,7 +505,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } return 0; } - + public int getQuantaFromType(List stacks, NTMMaterial mat) { int sum = 0; for(MaterialStack stack : stacks) { @@ -522,12 +534,12 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUICrucible(player.inventory, this); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -538,10 +550,10 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -550,30 +562,30 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - + CrucibleRecipe recipe = getLoadedRecipe(); - + if(recipe == null) { return getQuantaFromType(this.wasteStack, null) < this.wasteZCapacity; } - + int recipeContent = recipe.getInputAmount(); int recipeInputRequired = getQuantaFromType(recipe.input, stack.material); int matMaximum = recipeInputRequired * this.recipeZCapacity / recipeContent; int amountStored = getQuantaFromType(recipeStack, stack.material); - + return amountStored < matMaximum && getQuantaFromType(this.recipeStack, null) < this.recipeZCapacity; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { - + CrucibleRecipe recipe = getLoadedRecipe(); - + if(recipe == null) { - + int amount = getQuantaFromType(this.wasteStack, null); - + if(amount + stack.amount <= this.wasteZCapacity) { this.addToStack(this.wasteStack, stack.copy()); return null; @@ -583,16 +595,16 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return new MaterialStack(stack.material, stack.amount - toAdd); } } - + int recipeContent = recipe.getInputAmount(); int recipeInputRequired = getQuantaFromType(recipe.input, stack.material); int matMaximum = recipeInputRequired * this.recipeZCapacity / recipeContent; - + if(recipeInputRequired + stack.amount <= matMaximum) { this.addToStack(this.recipeStack, stack.copy()); return null; } - + int toAdd = matMaximum - stack.amount; toAdd = Math.min(toAdd, this.recipeZCapacity - getQuantaFromType(this.recipeStack, null)); this.addToStack(this.recipeStack, new MaterialStack(stack.material, toAdd)); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java index 18de529d8..67c8f316b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java @@ -35,16 +35,16 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineRadiolysis extends TileEntityMachineBase implements IEnergyProviderMK2, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC, IFluidCopiable { - + public long power; public static final int maxPower = 1000000; public int heat; public FluidTank[] tanks; - + private static final int[] slot_io = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13 }; private static final int[] slot_rtg = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - + public TileEntityMachineRadiolysis() { super(15); //10 rtg slots, 2 fluid ID slots (io), 2 irradiation slots (io), battery slot tanks = new FluidTank[3]; @@ -52,12 +52,12 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement tanks[1] = new FluidTank(Fluids.NONE, 2_000); tanks[2] = new FluidTank(Fluids.NONE, 2_000); } - + @Override public String getName() { return "container.radiolysis"; } - + /* IO Methods */ @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { @@ -68,32 +68,32 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement public int[] getAccessibleSlotsFromSide(int side) { return slot_io; } - + @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { return (i < 10 && itemStack.getItem() instanceof ItemRTGPelletDepleted) || i == 13; } - + /* NBT Methods */ @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); this.heat = nbt.getInteger("heat"); - + tanks[0].readFromNBT(nbt, "input"); tanks[1].readFromNBT(nbt, "output1"); tanks[2].readFromNBT(nbt, "output2"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setInteger("heat", heat); - + tanks[0].writeToNBT(nbt, "input"); tanks[1].writeToNBT(nbt, "output1"); tanks[2].writeToNBT(nbt, "output2"); @@ -101,29 +101,29 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement @Override public void updateEntity() { - + if(!worldObj.isRemote) { power = Library.chargeItemsFromTE(slots, 14, power, maxPower); - + heat = RTGUtil.updateRTGs(slots, slot_rtg); power += heat * 10; - + if(power > maxPower) power = maxPower; - + tanks[0].setType(10, 11, slots); setupTanks(); - + if(heat > 100) { int crackTime = (int) Math.max(-0.1 * (heat - 100) + 30, 5); - + if(worldObj.getTotalWorldTime() % crackTime == 0) crack(); - + if(heat >= 200 && worldObj.getTotalWorldTime() % 100 == 0) sterilize(); } - + for(DirPos pos : getConPos()) { this.tryProvide(worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); @@ -150,9 +150,9 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement super.deserialize(buf); this.power = buf.readLong(); this.heat = buf.readInt(); - tanks[0].serialize(buf); - tanks[1].serialize(buf); - tanks[2].serialize(buf); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + tanks[2].deserialize(buf); } protected DirPos[] getConPos() { @@ -163,17 +163,17 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement new DirPos(xCoord, yCoord, zCoord - 2, Library.NEG_Z) }; } - + /* Processing Methods */ private void crack() { - + Pair quart = RadiolysisRecipes.getRadiolysis(tanks[0].getTankType()); - + if(quart != null) { - + int left = quart.getKey().fill; int right = quart.getValue().fill; - + if(tanks[0].getFill() >= 100 && hasSpace(left, right)) { tanks[0].setFill(tanks[0].getFill() - 100); tanks[1].setFill(tanks[1].getFill() + left); @@ -181,15 +181,15 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement } } } - + private boolean hasSpace(int left, int right) { return tanks[1].getFill() + left <= tanks[1].getMaxFill() && tanks[2].getFill() + right <= tanks[2].getMaxFill(); } - + private void setupTanks() { - + Pair quart = RadiolysisRecipes.getRadiolysis(tanks[0].getTankType()); - + if(quart != null) { tanks[1].setTankType(quart.getKey().type); tanks[2].setTankType(quart.getValue().type); @@ -198,21 +198,21 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement tanks[1].setTankType(Fluids.NONE); tanks[2].setTankType(Fluids.NONE); } - + } - + // Code: pressure, sword, sterilize. private void sterilize() { if(slots[12] != null) { if(slots[12].getItem() instanceof ItemFood && !(slots[12].getItem() == ModItems.pancake)) { this.decrStackSize(12, 1); } - + if(!checkIfValid()) return; - + ItemStack output = slots[12].copy(); output.stackSize = 1; - + if(slots[13] == null) { this.decrStackSize(12, output.stackSize); slots[13] = output; @@ -232,14 +232,14 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement } } } - + private boolean checkIfValid() { if(slots[12] == null) return false; if(!slots[12].hasTagCompound()) return false; if(!slots[12].getTagCompound().getBoolean("ntmContagion")) return false; return true; } - + /* Power methods */ @Override public void setPower(long power) { @@ -255,7 +255,7 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement public long getMaxPower() { return maxPower; } - + @Override public FluidTank[] getAllTanks() { return tanks; @@ -275,11 +275,11 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement public boolean canConnect(FluidType type, ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN && dir != ForgeDirection.DOWN; } - + public AxisAlignedBB getRenderBoundingBox() { return AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord, zCoord - 1, xCoord + 2, yCoord + 3, zCoord + 2); } - + @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index 920f891de..a8b20a0d0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -81,7 +81,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase if(canProcess()) { int minAmount = mold.getCost() * 9; - + // Makes it flush the buffers after 10 seconds of inactivity if(worldObj.getWorldTime() >= lastCastTick + 200) { minAmount = mold.getCost(); @@ -116,9 +116,10 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase lastCastTick = worldObj.getWorldTime(); } } - } - sendStandard(150); + sendStandard(150); + + } } @@ -190,7 +191,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase } return false; - } + } @Override public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { @@ -257,12 +258,14 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase return new GUIMachineStrandCaster(player.inventory, this); } - @Override public void serialize(ByteBuf buf) { + @Override + public void serialize(ByteBuf buf) { water.serialize(buf); steam.serialize(buf); } - @Override public void deserialize(ByteBuf buf) { + @Override + public void deserialize(ByteBuf buf) { water.deserialize(buf); steam.deserialize(buf); } @@ -341,7 +344,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase } public boolean isLoaded = true; - + @Override public boolean isLoaded() { return isLoaded; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index f87c5b542..c0a989199 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -100,7 +100,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements public void updateEntity() { if(!worldObj.isRemote) { - + this.fluidUsed = 0; this.output = 0; @@ -111,63 +111,63 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements tank.setType(3, slots); tank.loadTank(1, 2, slots); - + int maxVent = 50; int maxBurn = 10; - + if(isOn && tank.getFill() > 0) { - + UpgradeManager.eval(slots, 4, 5); int burn = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); int yield = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); maxVent += maxVent * burn; maxBurn += maxBurn * burn; - + if(!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) { - + if(tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class)) { int eject = Math.min(maxVent, tank.getFill()); this.fluidUsed = eject; tank.setFill(tank.getFill() - eject); tank.getTankType().onFluidRelease(this, tank, eject); - + if(worldObj.getTotalWorldTime() % 7 == 0) this.worldObj.playSoundEffect(this.xCoord, this.yCoord + 11, this.zCoord, "random.fizz", getVolume(1.5F), 0.5F); - + if(worldObj.getTotalWorldTime() % 5 == 0 && eject > 0) { FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.SPILL, eject * 5); } } } else { - + if(tank.getTankType().hasTrait(FT_Flammable.class)) { int eject = Math.min(maxBurn, tank.getFill()); this.fluidUsed = eject; tank.setFill(tank.getFill() - eject); - + int penalty = 5; if(!tank.getTankType().hasTrait(FT_Gaseous.class) && !tank.getTankType().hasTrait(FT_Gaseous_ART.class)) penalty = 10; - + long powerProd = tank.getTankType().getTrait(FT_Flammable.class).getHeatEnergy() * eject / 1_000; // divided by 1000 per mB powerProd /= penalty; powerProd += powerProd * yield / 3; - + this.output = (int) powerProd; power += powerProd; - + if(power > maxPower) power = maxPower; - + ParticleUtil.spawnGasFlame(worldObj, this.xCoord + 0.5F, this.yCoord + 11.75F, this.zCoord + 0.5F, worldObj.rand.nextGaussian() * 0.15, 0.2, worldObj.rand.nextGaussian() * 0.15); - + List list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord + 12, zCoord - 2, xCoord + 2, yCoord + 17, zCoord + 2)); for(Entity e : list) { e.setFire(5); e.attackEntityFrom(DamageSource.onFire, 5F); } - + if(worldObj.getTotalWorldTime() % 3 == 0) this.worldObj.playSoundEffect(this.xCoord, this.yCoord + 11, this.zCoord, "hbm:weapon.flamethrowerShoot", getVolume(1.5F), 0.75F); @@ -183,11 +183,11 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements this.networkPackNT(50); } else { - + if(isOn && tank.getFill() > 0) { - + if((!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) && (tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class))) { - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); data.setFloat("lift", 1F); @@ -199,13 +199,13 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements data.setDouble("posX", xCoord + 0.5); data.setDouble("posZ", zCoord + 0.5); data.setDouble("posY", yCoord + 11); - + MainRegistry.proxy.effectNT(data); - + } - + if(doesBurn && tank.getTankType().hasTrait(FT_Flammable.class) && MainRegistry.proxy.me().getDistanceSq(xCoord, yCoord + 10, zCoord) <= 1024) { - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "smoke"); @@ -221,13 +221,13 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements data.setDouble("posZ", zCoord - 0.5); data.setDouble("posY", yCoord + 11.75); } - + MainRegistry.proxy.effectNT(data); } } } } - + public DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), @@ -252,7 +252,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements this.power = buf.readLong(); this.isOn = buf.readBoolean(); this.doesBurn = buf.readBoolean(); - tank.serialize(buf); + tank.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index 5e3a8fa0f..0541dc52d 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -18,18 +18,18 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPacketReceiver, IControlReceiverFilter { - + private int stack = 0; public boolean output = false; private int capacity; public int redstone = 0; - + @SideOnly(Side.CLIENT) public ItemStack type; - + public TileEntityMassStorage() { super(3); } - + public TileEntityMassStorage(int capacity) { this(); this.capacity = capacity; @@ -39,43 +39,43 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa public String getInventoryName() { return "container.massStorage"; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + int newRed = this.getStockpile() * 15 / this.capacity; - + if(newRed != this.redstone) { this.redstone = newRed; this.markDirty(); } - + if(slots[0] != null && slots[0].getItem() == ModItems.fluid_barrel_infinite) { this.stack = this.getCapacity(); } - + if(this.getType() == null) this.stack = 0; - + if(getType() != null && getStockpile() < getCapacity() && slots[0] != null && slots[0].isItemEqual(getType()) && ItemStack.areItemStackTagsEqual(slots[0], getType())) { - + int remaining = getCapacity() - getStockpile(); int toRemove = Math.min(remaining, slots[0].stackSize); this.decrStackSize(0, toRemove); this.stack += toRemove; this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); } - + if(output && getType() != null) { - + if(slots[2] != null && !(slots[2].isItemEqual(getType()) && ItemStack.areItemStackTagsEqual(slots[2], getType()))) { return; } - + int amount = Math.min(getStockpile(), getType().getMaxStackSize()); - + if(amount > 0) { if(slots[2] == null) { slots[2] = slots[1].copy(); @@ -96,7 +96,7 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa public void serialize(ByteBuf buf) { buf.writeInt(this.stack); buf.writeBoolean(this.output); - BufferUtil.writeItemStack(buf, this.type); + BufferUtil.writeItemStack(buf, this.slots[1]); } @Override @@ -105,19 +105,19 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa this.output = buf.readBoolean(); this.type = BufferUtil.readItemStack(buf); } - + public int getCapacity() { return capacity; } - + public ItemStack getType() { return slots[1] == null ? null : slots[1].copy(); } - + public int getStockpile() { return stack; } - + public void setStockpile(int stack) { this.stack = stack; } @@ -144,7 +144,7 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa this.output = nbt.getBoolean("output"); this.capacity = nbt.getInteger("capacity"); this.redstone = nbt.getByte("redstone"); - + if(this.capacity <= 0) { this.capacity = 10_000; } @@ -166,20 +166,20 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa @Override public void receiveControl(NBTTagCompound data) { - + if(data.hasKey("provide") && slots[1] != null) { - + if(this.getStockpile() == 0) { return; } - + int amount = data.getBoolean("provide") ? slots[1].getMaxStackSize() : 1; amount = Math.min(amount, getStockpile()); - + if(slots[2] != null && !(slots[2].isItemEqual(getType()) && ItemStack.areItemStackTagsEqual(slots[2], getType()))) { return; } - + if(slots[2] == null) { slots[2] = slots[1].copy(); slots[2].stackSize = amount; @@ -189,7 +189,7 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa } this.stack -= amount; } - + if(data.hasKey("toggle")) { this.output = !output; } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 3866c7d4b..dd8e1d4bc 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -26,6 +26,7 @@ import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BufferUtil; import com.hbm.util.CompatExternal; import api.hbm.energymk2.IEnergyReceiverMK2; @@ -75,10 +76,10 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public void receiveControl(NBTTagCompound data) { - + if(data.hasKey("del")) { this.removeName(data.getInteger("del")); - + } else if(data.hasKey("name")) { this.addName(data.getString("name")); } @@ -101,7 +102,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public boolean aligned = false; //how many ticks until the next check public int searchTimer; - + public long power; public boolean targetPlayers = false; @@ -111,32 +112,32 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public Entity target; public Vec3 tPos; - + //tally marks! public int stattrak; public int casingDelay; protected SpentCasing cachedCasingConfig = null; - + /** * X - * + * * YYY * YYY * YYY Z - * + * * X -> ai slot (0) * Y -> ammo slots (1 - 9) * Z -> battery slot (10) */ - + public TileEntityTurretBaseNT() { super(11); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); this.isOn = nbt.getBoolean("isOn"); this.targetPlayers = nbt.getBoolean("targetPlayers"); @@ -145,11 +146,11 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple this.targetMachines = nbt.getBoolean("targetMachines"); this.stattrak = nbt.getInteger("stattrak"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", this.power); nbt.setBoolean("isOn", this.isOn); nbt.setBoolean("targetPlayers", this.targetPlayers); @@ -158,80 +159,80 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple nbt.setBoolean("targetMachines", this.targetMachines); nbt.setInteger("stattrak", this.stattrak); } - + public void manualSetup() { } - + @Override public void updateEntity() { - + if(worldObj.isRemote) { this.lastRotationPitch = this.rotationPitch; this.lastRotationYaw = this.rotationYaw; this.rotationPitch = this.syncRotationPitch; this.rotationYaw = this.syncRotationYaw; } - + if(!worldObj.isRemote) { this.aligned = false; this.updateConnections(); - + if(this.target != null && !target.isEntityAlive()) { this.target = null; this.stattrak++; } - + if(target != null) { if(!this.entityInLOS(this.target)) { this.target = null; } } - + if(target != null) { this.tPos = this.getEntityPos(target); } else { this.tPos = null; } - + if(isOn() && hasPower()) { - + if(tPos != null) this.alignTurret(); } else { - + this.target = null; this.tPos = null; } - + if(this.target != null && !target.isEntityAlive()) { this.target = null; this.tPos = null; this.stattrak++; } - + if(isOn() && hasPower()) { searchTimer--; - + this.setPower(this.getPower() - this.getConsumption()); - + if(searchTimer <= 0) { searchTimer = this.getDecetorInterval(); - + if(this.target == null) this.seekNewTarget(); } } else { searchTimer = 0; } - + if(this.aligned) { this.updateFiringTick(); } - + this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); this.networkPackNT(250); - + if(usesCasings() && this.casingDelay() > 0) { if(casingDelay > 0) { casingDelay--; @@ -239,12 +240,12 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple spawnCasing(); } } - + } else { - + //this will fix the interpolation error when the turret crosses the 360° point if(Math.abs(this.lastRotationYaw - this.rotationYaw) > Math.PI) { - + if(this.lastRotationYaw < this.rotationYaw) this.lastRotationYaw += Math.PI * 2; else @@ -256,12 +257,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public void serialize(ByteBuf buf) { super.serialize(buf); - buf.writeBoolean(this.tPos != null); - if(this.tPos != null) { - buf.writeDouble(this.tPos.xCoord); - buf.writeDouble(this.tPos.yCoord); - buf.writeDouble(this.tPos.zCoord); - } + BufferUtil.writeVec3(buf, this.tPos); buf.writeDouble(this.rotationPitch); buf.writeDouble(this.rotationYaw); buf.writeLong(this.power); @@ -276,12 +272,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); - boolean hasTPos = buf.readBoolean(); - if(hasTPos) { - this.tPos.xCoord = buf.readDouble(); - this.tPos.yCoord = buf.readDouble(); - this.tPos.zCoord = buf.readDouble(); - } + this.tPos = BufferUtil.readVec3(buf); this.rotationPitch = buf.readDouble(); this.rotationYaw = buf.readDouble(); this.power = buf.readLong(); @@ -292,7 +283,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple this.targetMachines = buf.readBoolean(); this.stattrak = buf.readInt(); } - + protected void updateConnections() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); @@ -313,7 +304,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public void handleButtonPacket(int value, int meta) { - + switch(meta) { case 0:this.isOn = !this.isOn; break; case 1:this.targetPlayers = !this.targetPlayers; break; @@ -322,51 +313,51 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple case 4:this.targetMachines = !this.targetMachines; break; } } - + public abstract void updateFiringTick(); - + public boolean usesCasings() { return false; } public int casingDelay() { return 0; } - + public BulletConfiguration getFirstConfigLoaded() { - + List list = getAmmoList(); - + if(list == null || list.isEmpty()) return null; - + //doing it like this will fire slots in the right order, not in the order of the configs //you know, the weird thing the IItemGunBase does for(int i = 1; i < 10; i++) { - + if(slots[i] != null) { - + for(Integer c : list) { //we can afford all this extra iteration trash on the count that a turret has at most like 4 bullet configs - + BulletConfiguration conf = BulletConfigSyncingUtil.pullConfig(c); - + if(conf.ammo != null && conf.ammo.matchesRecipe(slots[i], true)) return conf; } } } - + return null; } - + public void spawnBullet(BulletConfiguration bullet) { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + EntityBulletBaseNT proj = new EntityBulletBaseNT(worldObj, BulletConfigSyncingUtil.getKey(bullet)); proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); - + proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, bullet.velocity, bullet.spread); worldObj.spawnEntityInWorld(proj); - + if(usesCasings()) { if(this.casingDelay() == 0) { spawnCasing(); @@ -375,118 +366,118 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } } } - + public void conusmeAmmo(ComparableStack ammo) { - + for(int i = 1; i < 10; i++) { - + if(slots[i] != null && ammo.matchesRecipe(slots[i], true)) { - + this.decrStackSize(i, 1); return; } } - + this.markDirty(); } - + /** * Reads the namelist from the AI chip in slot 0 * @return null if there is either no chip to be found or if the name list is empty, otherwise it just reads the strings from the chip's NBT */ public List getWhitelist() { - + if(slots[0] != null && slots[0].getItem() == ModItems.turret_chip) { - + String[] array = ItemTurretBiometry.getNames(slots[0]); - + if(array == null) return null; - + return Arrays.asList(ItemTurretBiometry.getNames(slots[0])); } - + return null; } - + /** * Appends a new name to the chip * @param name */ public void addName(String name) { - + if(slots[0] != null && slots[0].getItem() == ModItems.turret_chip) { ItemTurretBiometry.addName(slots[0], name); } } - + /** - * Removes the chip's entry at a given + * Removes the chip's entry at a given * @param index */ public void removeName(int index) { - + if(slots[0] != null && slots[0].getItem() == ModItems.turret_chip) { - + String[] array = ItemTurretBiometry.getNames(slots[0]); - + if(array == null) return; - + List names = new ArrayList(Arrays.asList(array)); ItemTurretBiometry.clearNames(slots[0]); - + names.remove(index); - + for(String name : names) ItemTurretBiometry.addName(slots[0], name); } } - + /** * Finds the nearest acceptable target within range and in line of sight */ protected void seekNewTarget() { - + Vec3 pos = this.getTurretPos(); double range = this.getDecetorRange(); List entities = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(pos.xCoord, pos.yCoord, pos.zCoord, pos.xCoord, pos.yCoord, pos.zCoord).expand(range, range, range)); - + Entity target = null; double closest = range; - + for(Entity entity : entities) { Vec3 ent = this.getEntityPos(entity); Vec3 delta = Vec3.createVectorHelper(ent.xCoord - pos.xCoord, ent.yCoord - pos.yCoord, ent.zCoord - pos.zCoord); - + double dist = delta.lengthVector(); - + //check if it's in range if(dist > range) continue; - + //check if we should even fire at this entity if(!entityAcceptableTarget(entity)) continue; - + //check for visibility if(!entityInLOS(entity)) continue; - + //replace current target if this one is closer if(dist < closest) { closest = dist; target = entity; } } - + this.target = target; - + if(target != null) this.tPos = this.getEntityPos(this.target); } - + /** * Turns the turret by a specific amount of degrees towards the target * Assumes that the target is not null @@ -494,7 +485,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple protected void alignTurret() { this.turnTowards(tPos); } - + /** * Turns the turret towards the specified position */ @@ -502,32 +493,32 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple Vec3 pos = this.getTurretPos(); Vec3 delta = Vec3.createVectorHelper(ent.xCoord - pos.xCoord, ent.yCoord - pos.yCoord, ent.zCoord - pos.zCoord); - + double targetPitch = Math.asin(delta.yCoord / delta.lengthVector()); double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); - + this.turnTowardsAngle(targetPitch, targetYaw); } - + public void turnTowardsAngle(double targetPitch, double targetYaw) { - + double turnYaw = Math.toRadians(this.getTurretYawSpeed()); double turnPitch = Math.toRadians(this.getTurretPitchSpeed()); double pi2 = Math.PI * 2; - + //if we are about to overshoot the target by turning, just snap to the correct rotation if(Math.abs(this.rotationPitch - targetPitch) < turnPitch || Math.abs(this.rotationPitch - targetPitch) > pi2 - turnPitch) { this.rotationPitch = targetPitch; } else { - + if(targetPitch > this.rotationPitch) this.rotationPitch += turnPitch; else this.rotationPitch -= turnPitch; } - + double deltaYaw = (targetYaw - this.rotationYaw) % pi2; - + //determines what direction the turret should turn //used to prevent situations where the turret would do almost a full turn when //the target is only a couple degrees off while being on the other side of the 360° line @@ -541,68 +532,68 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple dir = -1; else if(deltaYaw > 0) dir = 1; - + if(Math.abs(this.rotationYaw - targetYaw) < turnYaw || Math.abs(this.rotationYaw - targetYaw) > pi2 - turnYaw) { this.rotationYaw = targetYaw; } else { this.rotationYaw += turnYaw * dir; } - + double deltaPitch = targetPitch - this.rotationPitch; deltaYaw = targetYaw - this.rotationYaw; - + double deltaAngle = Math.sqrt(deltaYaw * deltaYaw + deltaPitch * deltaPitch); this.rotationYaw = this.rotationYaw % pi2; this.rotationPitch = this.rotationPitch % pi2; - + if(deltaAngle <= Math.toRadians(this.getAcceptableInaccuracy())) { this.aligned = true; } } - + /** * Checks line of sight to the passed entity along with whether the angle falls within swivel range * @return */ public boolean entityInLOS(Entity e) { - + if(e.isDead || !e.isEntityAlive()) return false; - + if(!hasThermalVision() && e instanceof EntityLivingBase && ((EntityLivingBase)e).isPotionActive(Potion.invisibility)) return false; - + Vec3 pos = this.getTurretPos(); Vec3 ent = this.getEntityPos(e); Vec3 delta = Vec3.createVectorHelper(ent.xCoord - pos.xCoord, ent.yCoord - pos.yCoord, ent.zCoord - pos.zCoord); double length = delta.lengthVector(); - + if(length < this.getDecetorGrace() || length > this.getDecetorRange() * 1.1) //the latter statement is only relevant for entities that have already been detected return false; - + delta = delta.normalize(); double pitch = Math.asin(delta.yCoord / delta.lengthVector()); double pitchDeg = Math.toDegrees(pitch); - + //check if the entity is within swivel range if(pitchDeg < -this.getTurretDepression() || pitchDeg > this.getTurretElevation()) return false; - + return !Library.isObstructedOpaque(worldObj, ent.xCoord, ent.yCoord, ent.zCoord, pos.xCoord, pos.yCoord, pos.zCoord); } - + /** * Returns true if the entity is considered for targeting * @return */ public boolean entityAcceptableTarget(Entity e) { - + if(e.isDead || !e.isEntityAlive()) return false; - + for(Class c : CompatExternal.turretTargetBlacklist) if(c.isAssignableFrom(e.getClass())) return false; - + for(Class c : CompatExternal.turretTargetCondition.keySet()) { if(c.isAssignableFrom(e.getClass())) { BiFunction lambda = CompatExternal.turretTargetCondition.get(c); @@ -615,9 +606,9 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } List wl = getWhitelist(); - + if(wl != null) { - + if(e instanceof EntityPlayer) { if(wl.contains(((EntityPlayer)e).getDisplayName())) { return false; @@ -628,14 +619,14 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } } } - + if(targetAnimals) { - + if(e instanceof IAnimals) return true; if(e instanceof INpc) return true; for(Class c : CompatExternal.turretTargetFriendly) if(c.isAssignableFrom(e.getClass())) return true; } - + if(targetMobs) { //never target the ender dragon directly @@ -644,7 +635,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple if(e instanceof IMob) return true; for(Class c : CompatExternal.turretTargetHostile) if(c.isAssignableFrom(e.getClass())) return true; } - + if(targetMachines) { if(e instanceof IRadarDetectableNT && !((IRadarDetectableNT)e).canBeSeenBy(this)) return false; @@ -655,17 +646,17 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple if(e instanceof EntityBomber) return true; for(Class c : CompatExternal.turretTargetMachine) if(c.isAssignableFrom(e.getClass())) return true; } - + if(targetPlayers ) { - + if(e instanceof FakePlayer) return false; if(e instanceof EntityPlayer) return true; for(Class c : CompatExternal.turretTargetPlayer) if(c.isAssignableFrom(e.getClass())) return true; } - + return false; } - + /** * How many degrees the turret can deviate from the target to be acceptable to fire at * @return @@ -673,7 +664,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public double getAcceptableInaccuracy() { return 5; } - + /** * How many degrees the turret can rotate per tick (4.5°/t = 90°/s or a half turn in two seconds) * @return @@ -681,7 +672,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public double getTurretYawSpeed() { return 4.5D; } - + /** * How many degrees the turret can lift per tick (3°/t = 60°/s or roughly the lowest to the highest point of an average turret in one second) * @return @@ -705,7 +696,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public double getTurretElevation() { return 30D; } - + /** * How many ticks until a target rescan is required * @return @@ -713,7 +704,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public int getDecetorInterval() { return 10; } - + /** * How far away an entity can be to be picked up * @return @@ -721,7 +712,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public double getDecetorRange() { return 32D; } - + /** * How far away an entity needs to be to be picked up * @return @@ -729,7 +720,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public double getDecetorGrace() { return 3D; } - + /** * The pivot point of the turret, larger models have a default of 1.5 * @return @@ -737,7 +728,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public double getHeightOffset() { return 1.5D; } - + /** * Horizontal offset for the spawn point of bullets * @return @@ -753,7 +744,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public boolean hasThermalVision() { return true; } - + /** * The pivot point of the turret, this position is used for LOS calculation and more * @return @@ -762,7 +753,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple Vec3 offset = getHorizontalOffset(); return Vec3.createVectorHelper(xCoord + offset.xCoord, yCoord + getHeightOffset(), zCoord + offset.zCoord); } - + /** * The XZ offset for a standard 2x2 turret base * @return @@ -776,10 +767,10 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple return Vec3.createVectorHelper(1, 0, 0); if(meta == 5) return Vec3.createVectorHelper(0, 0, 1); - + return Vec3.createVectorHelper(0, 0, 0); } - + /** * The pivot point of the turret, this position is used for LOS calculation and more * @return @@ -787,32 +778,32 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public Vec3 getEntityPos(Entity e) { return Vec3.createVectorHelper(e.posX, e.posY + e.height * 0.5 - e.getYOffset(), e.posZ); } - + /** * Yes, new turrets fire BulletNTs. * @return */ protected abstract List getAmmoList(); - + @SideOnly(Side.CLIENT) protected List ammoStacks; @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { - + if(ammoStacks != null) return ammoStacks; - + ammoStacks = new ArrayList(); - + for(Integer i : getAmmoList()) { BulletConfiguration config = BulletConfigSyncingUtil.pullConfig(i); - + if(config != null && config.ammo != null) { ammoStacks.add(config.ammo.toStack()); } } - + return ammoStacks; } @@ -829,11 +820,11 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public boolean hasPower() { return this.getPower() >= this.getConsumption(); } - + public boolean isOn() { return this.isOn; } - + @Override public void setPower(long i) { this.power = i; @@ -843,15 +834,15 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public long getPower() { return this.power; } - + public int getPowerScaled(int scale) { return (int)(power * scale / this.getMaxPower()); } - + public long getConsumption() { return 100; } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; @@ -872,20 +863,20 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple public void closeInventory() { this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.closeC", 1.0F, 1.0F); } - + protected Vec3 getCasingSpawnPos() { return this.getTurretPos(); } - + protected CasingEjector getEjector() { return null; } - + protected void spawnCasing() { - + if(cachedCasingConfig == null) return; CasingEjector ej = getEjector(); - + Vec3 spawn = this.getCasingSpawnPos(); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "casing"); @@ -895,10 +886,10 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple data.setString("name", cachedCasingConfig.getName()); if(ej != null) data.setInteger("ej", ej.getId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, spawn.xCoord, spawn.yCoord, spawn.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + cachedCasingConfig = null; } - + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerTurretBase(player.inventory, this); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 1ddd6b7bd..2b4c5abde 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -44,10 +44,10 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { - + if(ammoStacks != null) return ammoStacks; - + ammoStacks = new ArrayList(); ammoStacks.add(new ItemStack(ModItems.upgrade_speed_1)); @@ -67,7 +67,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I ammoStacks.add(new ItemStack(ModItems.upgrade_overdrive_3)); ammoStacks.add(new ItemStack(ModItems.upgrade_5g)); ammoStacks.add(new ItemStack(ModItems.upgrade_screm)); - + return ammoStacks; } @@ -105,7 +105,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I if(type == UpgradeType.OVERDRIVE) return 27; return 0; } - + @Override public double getAcceptableInaccuracy() { return 2; @@ -160,28 +160,28 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I public double getHeightOffset() { return 2D; } - + public int beam; public double lastDist; - + @Override public void updateEntity() { - + if(worldObj.isRemote) { - + if(this.tPos != null) { Vec3 pos = this.getTurretPos(); double length = Vec3.createVectorHelper(tPos.xCoord - pos.xCoord, tPos.yCoord - pos.yCoord, tPos.zCoord - pos.zCoord).lengthVector(); this.lastDist = length; } - + if(beam > 0) beam--; } else { - + if(checkDelay <= 0) { checkDelay = 20; - + this.redLevel = 0; this.greenLevel = 0; this.blueLevel = 0; @@ -189,11 +189,11 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I this.pinkLevel = 0; this._5g = false; this.screm = false; - + for(int i = 1; i < 10; i++) { if(slots[i] != null) { Item item = slots[i].getItem(); - + if(item == ModItems.upgrade_speed_1) redLevel += 1; if(item == ModItems.upgrade_speed_2) redLevel += 2; if(item == ModItems.upgrade_speed_3) redLevel += 3; @@ -214,13 +214,13 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I } } } - + checkDelay--; } - + super.updateEntity(); } - + int redLevel; int greenLevel; int blueLevel; @@ -228,14 +228,14 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I int pinkLevel; boolean _5g; boolean screm; - + int checkDelay; @Override public void updateFiringTick() { - + long demand = this.getConsumption() * 10; - + if(this.target != null && this.getPower() >= demand) { if(_5g && target instanceof EntityPlayer) { @@ -244,38 +244,37 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I } else { EntityDamageUtil.attackEntityFromIgnoreIFrame(this.target, ModDamageSource.microwave, (this.blackLevel * 10 + this.redLevel + 1F) * 0.25F); } - + if(pinkLevel > 0) this.target.setFire(this.pinkLevel * 3); - + if(!this.target.isEntityAlive() && this.target instanceof EntityLivingBase) { NBTTagCompound vdat = new NBTTagCompound(); vdat.setString("type", "giblets"); vdat.setInteger("ent", this.target.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ), new TargetPoint(this.target.dimension, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ, 150)); - + if(this.screm) worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "hbm:block.screm", 20.0F, 1.0F); else worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } - + this.power -= demand; this.networkPackNT(250); } } - @Override public void serialize(ByteBuf buf) { - super.serialize(buf); buf.writeBoolean(true); } - @Override public void deserialize(ByteBuf buf) { - super.deserialize(buf); - this.beam = buf.readBoolean() ? 5 : 0; + if(buf.readBoolean()) + this.beam = 5; + else + this.beam = 0; } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java index 1a341fd01..7f3a8bea7 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java @@ -36,7 +36,7 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG public double lastBarrelRightPos = 0; static List configs = new ArrayList(); - + static { configs.add(BulletConfigSyncingUtil.R5_NORMAL); configs.add(BulletConfigSyncingUtil.R5_EXPLOSIVE); @@ -44,7 +44,7 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG configs.add(BulletConfigSyncingUtil.R5_STAR); configs.add(BulletConfigSyncingUtil.CHL_R5); } - + @Override protected List getAmmoList() { return configs; @@ -54,7 +54,7 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG public String getName() { return "container.turretSentry"; } - + @Override public double getTurretDepression() { return 20D; @@ -109,38 +109,38 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG public Vec3 getHorizontalOffset() { return Vec3.createVectorHelper(0.5, 0, 0.5); } - + @Override public void updateEntity() { - + if(worldObj.isRemote) { this.lastBarrelLeftPos = this.barrelLeftPos; this.lastBarrelRightPos = this.barrelRightPos; float retractSpeed = 0.5F; float pushSpeed = 0.25F; - + if(this.retractingLeft) { this.barrelLeftPos += retractSpeed; - + if(this.barrelLeftPos >= 1) { this.retractingLeft = false; } - + } else { this.barrelLeftPos -= pushSpeed; if(this.barrelLeftPos < 0) { this.barrelLeftPos = 0; } } - + if(this.retractingRight) { this.barrelRightPos += retractSpeed; - + if(this.barrelRightPos >= 1) { this.retractingRight = false; } - + } else { this.barrelRightPos -= pushSpeed; if(this.barrelRightPos < 0) { @@ -148,43 +148,43 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG } } } - + super.updateEntity(); } - + boolean shotSide = false; int timer; @Override public void updateFiringTick() { - + timer++; - + if(timer % 10 == 0) { - + BulletConfiguration conf = this.getFirstConfigLoaded(); - + if(conf != null) { this.cachedCasingConfig = conf.spentCasing; this.spawnBullet(conf); this.conusmeAmmo(conf.ammo); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.sentry_fire", 2.0F, 1.0F); - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + Vec3 side = Vec3.createVectorHelper(0.125 * (shotSide ? 1 : -1), 0, 0); side.rotateAroundY((float) -(this.rotationYaw)); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "largeexplode"); data.setFloat("size", 1F); data.setByte("count", (byte)1); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + side.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord + side.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + if(shotSide) { this.didJustShootLeft = true; } else { @@ -197,32 +197,32 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG @Override protected Vec3 getCasingSpawnPos() { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(0, 0.25,-0.125); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + return Vec3.createVectorHelper(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord); } protected static CasingEjector ejector = new CasingEjector().setMotion(-0.3, 0.6, 0).setAngleRange(0.01F, 0.01F); - + @Override protected CasingEjector getEjector() { return ejector.setMotion(0.3, 0.6, 0); } - + @Override public boolean usesCasings() { return true; } - + @Override protected void seekNewTarget() { Entity lastTarget = this.target; super.seekNewTarget(); - + if(lastTarget != this.target && this.target != null) { worldObj.playSoundAtEntity(target, "hbm:turret.sentry_lockon", 2.0F, 1.5F); } @@ -231,8 +231,8 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG @Override public void serialize(ByteBuf buf) { super.serialize(buf); - if(didJustShootLeft) buf.writeBoolean(didJustShootLeft); - if(didJustShootRight) buf.writeBoolean(didJustShootRight); + buf.writeBoolean(didJustShootLeft); + buf.writeBoolean(didJustShootRight); didJustShootLeft = false; didJustShootRight = false; } @@ -240,10 +240,10 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); - if(buf.readBoolean()) this.retractingLeft = true; - if(buf.readBoolean()) this.retractingRight = true; + this.retractingLeft = buf.readBoolean(); + this.retractingRight = buf.readBoolean(); } - + protected void updateConnections() { this.trySubscribe(worldObj, xCoord, yCoord - 1, zCoord, ForgeDirection.DOWN); } diff --git a/src/main/java/com/hbm/util/BufferUtil.java b/src/main/java/com/hbm/util/BufferUtil.java index e81d259ec..d456b7f1c 100644 --- a/src/main/java/com/hbm/util/BufferUtil.java +++ b/src/main/java/com/hbm/util/BufferUtil.java @@ -10,6 +10,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTSizeTracker; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; public class BufferUtil { @@ -62,6 +63,32 @@ public class BufferUtil { return array; } + /** + * Writes a vector to a buffer. + */ + public static void writeVec3(ByteBuf buf, Vec3 vector) { + buf.writeBoolean(vector != null); + if(vector == null) return; + buf.writeDouble(vector.xCoord); + buf.writeDouble(vector.yCoord); + buf.writeDouble(vector.zCoord); + } + + /** + * Reads a vector from a buffer. + */ + public static Vec3 readVec3(ByteBuf buf) { + boolean vectorExists = buf.readBoolean(); + if(!vectorExists) { + return null; + } + double x = buf.readDouble(); + double y = buf.readDouble(); + double z = buf.readDouble(); + + return Vec3.createVectorHelper(x, y, z); + } + /** * Writes a NBTTagCompound to a buffer. */ @@ -131,4 +158,4 @@ public class BufferUtil { } return item; } -} \ No newline at end of file +} From ccebbbca245baeaffa3ee27eea7a6d31827b9656 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:14:08 -0500 Subject: [PATCH 38/70] Holy SHIT! i think i fixed it --- .../turret/TileEntityTurretBaseNT.java | 1 + .../turret/TileEntityTurretMaxwell.java | 15 +++- .../turret/TileEntityTurretRichard.java | 72 +++++++++++-------- .../turret/TileEntityTurretTauon.java | 52 ++++++++------ 4 files changed, 87 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index dd8e1d4bc..579c6d6a1 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -272,6 +272,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); + this.turnProgress = 2; this.tPos = BufferUtil.readVec3(buf); this.rotationPitch = buf.readDouble(); this.rotationYaw = buf.readDouble(); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 2b4c5abde..8d4462b54 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -262,19 +262,30 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I this.power -= demand; + this.shot = true; this.networkPackNT(250); + this.shot = false; } } + private boolean shot = false; + + @Override public void serialize(ByteBuf buf) { - buf.writeBoolean(true); + if (this.shot) + buf.writeBoolean(true); + else { + buf.writeBoolean(false); + super.serialize(buf); + } } + @Override public void deserialize(ByteBuf buf) { if(buf.readBoolean()) this.beam = 5; else - this.beam = 0; + super.deserialize(buf); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java index 2547b92a6..61ea04dbd 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretRichard.java @@ -24,7 +24,7 @@ import net.minecraft.world.World; public class TileEntityTurretRichard extends TileEntityTurretBaseNT { static List configs = new ArrayList(); - + static { configs.add(BulletConfigSyncingUtil.ROCKET_NORMAL); configs.add(BulletConfigSyncingUtil.ROCKET_HE); @@ -39,7 +39,7 @@ public class TileEntityTurretRichard extends TileEntityTurretBaseNT { configs.add(BulletConfigSyncingUtil.ROCKET_PHOSPHORUS); configs.add(BulletConfigSyncingUtil.ROCKET_CANISTER); } - + @Override protected List getAmmoList() { return configs; @@ -69,7 +69,7 @@ public class TileEntityTurretRichard extends TileEntityTurretBaseNT { public long getMaxPower() { return 10000; } - + @Override public double getDecetorGrace() { return 8D; @@ -79,69 +79,81 @@ public class TileEntityTurretRichard extends TileEntityTurretBaseNT { public double getDecetorRange() { return 64D; } - + int timer; public int loaded; int reload; - + @Override public void updateEntity() { super.updateEntity(); - + if(!worldObj.isRemote) { - + if(reload > 0) { reload--; - + if(reload == 0) this.loaded = 17; } - + if(loaded <= 0 && reload <= 0 && this.getFirstConfigLoaded() != null) { reload = 100; } - + if(this.getFirstConfigLoaded() == null) { this.loaded = 0; } + this.isTurretPacket = true; this.networkPackNT(250); + this.isTurretPacket = false; + } + } + + // wow so descriptive, i dont wanna hear it; it solves the problem + private boolean isTurretPacket = false; + + @Override + public void serialize(ByteBuf buf) { + if (this.isTurretPacket) { + buf.writeBoolean(true); + buf.writeInt(this.loaded); + } else { + buf.writeBoolean(false); + super.serialize(buf); } } - @Override - public void serialize(ByteBuf buf) { - super.serialize(buf); - buf.writeInt(this.loaded); - } - @Override public void deserialize(ByteBuf buf) { - super.deserialize(buf); - this.loaded = buf.readInt(); + if(buf.readBoolean()) { + this.loaded = buf.readInt(); + } else + super.deserialize(buf); } @Override public void updateFiringTick() { - + if(reload > 0) return; - + timer++; - + if(timer > 0 && timer % 10 == 0) { - + BulletConfiguration conf = this.getFirstConfigLoaded(); - + if(conf != null) { this.spawnBullet(conf); this.conusmeAmmo(conf.ammo); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.richard_fire", 2.0F, 1.0F); this.loaded--; - + if(conf.ammo.equals(new ComparableStack(ModItems.ammo_rocket.stackFromEnum(AmmoRocket.NUCLEAR)))) timer = -50; - + } else { this.loaded = 0; } @@ -150,25 +162,25 @@ public class TileEntityTurretRichard extends TileEntityTurretBaseNT { @Override public void spawnBullet(BulletConfiguration bullet) { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + EntityBulletBaseNT proj = new EntityBulletBaseNT(worldObj, BulletConfigSyncingUtil.getKey(bullet)); proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); - + proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, bullet.velocity * 0.75F, bullet.spread); worldObj.spawnEntityInWorld(proj); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.loaded = nbt.getInteger("loaded"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java index c96fff434..2306cb2f4 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java @@ -22,11 +22,11 @@ import net.minecraft.world.World; public class TileEntityTurretTauon extends TileEntityTurretBaseNT { static List configs = new ArrayList(); - + static { configs.add(BulletConfigSyncingUtil.SPECIAL_GAUSS); } - + @Override protected List getAmmoList() { return configs; @@ -81,63 +81,65 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { public long getConsumption() { return 1000; } - + int timer; public int beam; public float spin; public float lastSpin; public double lastDist; - + @Override public void updateEntity() { - + if(worldObj.isRemote) { - + if(this.tPos != null) { Vec3 pos = this.getTurretPos(); double length = Vec3.createVectorHelper(tPos.xCoord - pos.xCoord, tPos.yCoord - pos.yCoord, tPos.zCoord - pos.zCoord).lengthVector(); this.lastDist = length; } - + if(beam > 0) beam--; - + this.lastSpin = this.spin; - + if(this.tPos != null) { this.spin += 45; } - + if(this.spin >= 360F) { this.spin -= 360F; this.lastSpin -= 360F; } } - + super.updateEntity(); } @Override public void updateFiringTick() { - + timer++; - + if(timer % 5 == 0) { - + BulletConfiguration conf = this.getFirstConfigLoaded(); - + if(conf != null && this.target != null) { this.target.attackEntityFrom(ModDamageSource.electricity, 30F + worldObj.rand.nextInt(11)); this.conusmeAmmo(conf.ammo); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.tauShoot", 4.0F, 0.9F + worldObj.rand.nextFloat() * 0.3F); + this.shot = true; this.networkPackNT(250); - + this.shot = false; + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", "tau"); dPart.setByte("count", (byte)5); @@ -146,16 +148,24 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { } } + private boolean shot = false; + @Override public void serialize(ByteBuf buf) { - super.serialize(buf); - buf.writeBoolean(true); + if (this.shot) + buf.writeBoolean(true); + else { + buf.writeBoolean(false); + super.serialize(buf); + } } @Override public void deserialize(ByteBuf buf) { - super.deserialize(buf); - this.beam = buf.readBoolean() ? 3 : 0; + if(buf.readBoolean()) + this.beam = 3; + else + super.deserialize(buf); } @Override From 5c909e156f806e47caae66e99bc7aa06344e3f02 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 12 Oct 2024 22:32:58 -0500 Subject: [PATCH 39/70] there i fixed it :woo: --- src/main/java/com/hbm/tileentity/TileEntityMachineBase.java | 1 - .../com/hbm/tileentity/turret/TileEntityTurretBaseNT.java | 6 ++---- .../com/hbm/tileentity/turret/TileEntityTurretMaxwell.java | 3 ++- .../com/hbm/tileentity/turret/TileEntityTurretTauon.java | 3 ++- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 06e2ca21e..3d623eea3 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -23,7 +23,6 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme private String customName; - private NBTTagCompound lastPackedNBT = null; private ByteBuf lastPackedBuf = null; public TileEntityMachineBase(int slotCount) { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 579c6d6a1..81359800c 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -256,7 +256,6 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public void serialize(ByteBuf buf) { - super.serialize(buf); BufferUtil.writeVec3(buf, this.tPos); buf.writeDouble(this.rotationPitch); buf.writeDouble(this.rotationYaw); @@ -271,11 +270,10 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple @Override public void deserialize(ByteBuf buf) { - super.deserialize(buf); this.turnProgress = 2; this.tPos = BufferUtil.readVec3(buf); - this.rotationPitch = buf.readDouble(); - this.rotationYaw = buf.readDouble(); + this.syncRotationPitch = buf.readDouble(); + this.syncRotationYaw = buf.readDouble(); this.power = buf.readLong(); this.isOn = buf.readBoolean(); this.targetPlayers = buf.readBoolean(); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 8d4462b54..fe4bbca21 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -282,7 +282,8 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I @Override public void deserialize(ByteBuf buf) { - if(buf.readBoolean()) + boolean shot = buf.readBoolean(); + if(shot) this.beam = 5; else super.deserialize(buf); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java index 2306cb2f4..7f9b163e6 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java @@ -162,7 +162,8 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { @Override public void deserialize(ByteBuf buf) { - if(buf.readBoolean()) + boolean shot = buf.readBoolean(); + if(shot) this.beam = 3; else super.deserialize(buf); From e3cf1575010ef4f6d1962065ec6d5071972da49c Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 13 Oct 2024 00:27:55 -0500 Subject: [PATCH 40/70] bug fixes part 1 (thank you radium) --- .../com/hbm/blocks/generic/BlockEmitter.java | 42 ++++----- .../com/hbm/main/ModEventHandlerRenderer.java | 76 +++++++-------- .../hbm/tileentity/TileEntityMachineBase.java | 2 +- .../machine/TileEntityConveyorPress.java | 80 ++++++++-------- .../machine/TileEntityHeatBoiler.java | 93 ++++++++++--------- .../machine/TileEntityHeaterHeatex.java | 52 +++++------ .../machine/TileEntityMachinePress.java | 84 ++++++++--------- 7 files changed, 214 insertions(+), 215 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java index c6d8d59f6..365343e26 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java @@ -42,7 +42,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityEmitter(); } - + @Override public boolean isOpaqueCube() { return false; @@ -57,12 +57,12 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float fx, float fy, float fz) { - + if(world.isRemote) return true; - + TileEntityEmitter te = (TileEntityEmitter)world.getTileEntity(x, y, z); - + if(player.getHeldItem() != null) { if(player.getHeldItem().getItem() instanceof ItemDye) { @@ -73,7 +73,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP return true; } } - + return false; } @@ -81,31 +81,31 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntityEmitter te = (TileEntityEmitter)world.getTileEntity(x, y, z); - + if(tool == ToolType.SCREWDRIVER) { te.girth += 0.125F; te.markDirty(); return true; } - + if(tool == ToolType.DEFUSER) { te.girth -= 0.125F; if(te.girth < 0.125F) te.girth = 0.125F; te.markDirty(); return true; } - + if(tool == ToolType.HAND_DRILL) { te.effect = (te.effect + 1) % te.effectCount; te.markDirty(); return true; } - + return false; } public static class TileEntityEmitter extends TileEntityLoadedBase implements IBufPacketReceiver { - + public static final int range = 100; public int color; public int beam; @@ -115,34 +115,34 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); - + if(worldObj.getTotalWorldTime() % 20 == 0) { for(int i = 1; i <= range; i++) { - + beam = i; - + int x = xCoord + dir.offsetX * i; int y = yCoord + dir.offsetY * i; int z = zCoord + dir.offsetZ * i; - + Block b = worldObj.getBlock(x, y, z); if(b.isBlockSolid(worldObj, x, y, z, dir.ordinal())) { break; } } } - + if(effect == 4 && beam > 0) { if(worldObj.getTotalWorldTime() % 5 == 0) { double x = (int) (xCoord + dir.offsetX * (worldObj.getTotalWorldTime() / 5L) % beam) + 0.5; double y = (int) (yCoord + dir.offsetY * (worldObj.getTotalWorldTime() / 5L) % beam) + 0.5; double z = (int) (zCoord + dir.offsetZ * (worldObj.getTotalWorldTime() / 5L) % beam) + 0.5; - + int prevColor = color; if(color == 0) { color = Color.HSBtoRGB(worldObj.getTotalWorldTime() / 50.0F, 0.5F, 0.25F) & 16777215; @@ -172,7 +172,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(worldObj.provider.dimensionId, x, y, z, 100)); - + color = prevColor; } } @@ -188,7 +188,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); @@ -209,7 +209,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP nbt.setFloat("girth", this.girth); nbt.setInteger("effect", this.effect); } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index f5745092d..853709009 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -115,11 +115,11 @@ public class ModEventHandlerRenderer { EntityPlayer player = event.entityPlayer; RenderPlayer renderer = event.renderer; - + boolean akimbo = false; ItemStack held = player.getHeldItem(); - + if(held != null) { IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(held, IItemRenderer.ItemRenderType.EQUIPPED); if(customRenderer instanceof ItemRenderWeaponBase) { @@ -131,7 +131,7 @@ public class ModEventHandlerRenderer { } boolean isManly = PermaSyncHandler.boykissers.contains(player.getEntityId()); - + if(akimbo) { ModelBiped biped = renderer.modelBipedMain; biped.bipedLeftArm.rotateAngleY = 0.1F + biped.bipedHead.rotateAngleY; @@ -157,7 +157,7 @@ public class ModEventHandlerRenderer { if(f6 > 1.0F) { f6 = 1.0F; } - + manlyModel.render(event.entityPlayer, f7, f6, yawWrapped, yaw, pitch, 0.0625F, renderer); } } @@ -174,13 +174,13 @@ public class ModEventHandlerRenderer { } } } - + @SubscribeEvent public void onRenderHeldGun(RenderPlayerEvent.Pre event) { EntityPlayer player = event.entityPlayer; RenderPlayer renderer = event.renderer; - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT) { renderer.modelBipedMain.aimedBow = true; renderer.modelArmor.aimedBow = true; @@ -197,7 +197,7 @@ public class ModEventHandlerRenderer { if(held == null) return; IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(held, IItemRenderer.ItemRenderType.EQUIPPED); - + if(customRenderer instanceof ItemRenderWeaponBase) { ItemRenderWeaponBase renderWeapon = (ItemRenderWeaponBase) customRenderer; if(renderWeapon.isAkimbo()) { @@ -238,16 +238,16 @@ public class ModEventHandlerRenderer { if(manlyModel == null) manlyModel = new ModelMan(); - + event.renderItem = false; float f2 = 1.3333334F; ItemStack held = player.getHeldItem(); - + if(held == null) return; - + GL11.glPushMatrix(); manlyModel.rightArm.postRender(0.0625F); GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); @@ -345,16 +345,16 @@ public class ModEventHandlerRenderer { default: return null; } } - + @SubscribeEvent public void onDrawHighlight(DrawBlockHighlightEvent event) { MovingObjectPosition mop = event.target; - + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { Block b = event.player.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ); if(b instanceof ICustomBlockHighlight) { ICustomBlockHighlight cus = (ICustomBlockHighlight) b; - + if(cus.shouldDrawHighlight(event.player.worldObj, mop.blockX, mop.blockY, mop.blockZ)) { cus.drawHighlight(event, event.player.worldObj, mop.blockX, mop.blockY, mop.blockZ); event.setCanceled(true); @@ -432,17 +432,17 @@ public class ModEventHandlerRenderer { GL11.glPopMatrix(); } }*/ - + float renderSoot = 0; - + @SubscribeEvent public void worldTick(WorldTickEvent event) { - + if(event.phase == event.phase.START && RadiationConfig.enableSootFog) { float step = 0.05F; float soot = PermaSyncHandler.pollution[PollutionType.SOOT.ordinal()]; - + if(Math.abs(renderSoot - soot) < step) { renderSoot = soot; } else if(renderSoot < soot) { @@ -457,7 +457,7 @@ public class ModEventHandlerRenderer { public void thickenFog(FogDensity event) { float soot = (float) (renderSoot - RadiationConfig.sootFogThreshold); if(soot > 0 && RadiationConfig.enableSootFog) { - + float farPlaneDistance = (float) (Minecraft.getMinecraft().gameSettings.renderDistanceChunks * 16); float fogDist = farPlaneDistance / (1 + soot * 5F / (float) RadiationConfig.sootFogDivisor); GL11.glFogf(GL11.GL_FOG_START, 0); @@ -471,10 +471,10 @@ public class ModEventHandlerRenderer { event.setCanceled(true); } } - + @SubscribeEvent(priority = EventPriority.LOW) public void tintFog(FogColors event) { - + EntityPlayer player = MainRegistry.proxy.me(); if(player.worldObj.getBlock((int) Math.floor(player.posX), (int) Math.floor(player.posY), (int) Math.floor(player.posZ)).getMaterial() != Material.water) { Vec3 color = getFogBlendColor(player.worldObj, (int) Math.floor(player.posX), (int) Math.floor(player.posZ), event.red, event.green, event.blue, event.renderPartialTicks); @@ -484,7 +484,7 @@ public class ModEventHandlerRenderer { event.blue = (float) color.zCoord; } } - + float soot = (float) (renderSoot - RadiationConfig.sootFogThreshold); float sootColor = 0.15F; float sootReq = (float) RadiationConfig.sootFogDivisor; @@ -495,10 +495,10 @@ public class ModEventHandlerRenderer { event.blue = event.blue * (1 - interp) + sootColor * interp; } } - + @SubscribeEvent public void onRenderHUD(RenderGameOverlayEvent.Pre event) { - + if(event.type == ElementType.HOTBAR && (ModEventHandlerClient.shakeTimestamp + ModEventHandlerClient.shakeDuration - System.currentTimeMillis()) > 0) { double mult = (ModEventHandlerClient.shakeTimestamp + ModEventHandlerClient.shakeDuration - System.currentTimeMillis()) / (double) ModEventHandlerClient.shakeDuration * 2; double horizontal = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.02), -0.7, 0.7) * 15; @@ -509,13 +509,13 @@ public class ModEventHandlerRenderer { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { - + //can't use plaxer.getHeldItem() here because the item rendering persists for a few frames after hitting the switch key - ItemStack toRender = null; //Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender; - + ItemStack toRender = Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender; + if(toRender != null) { IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(toRender, ItemRenderType.EQUIPPED_FIRST_PERSON); - + if(renderer instanceof ItemRenderWeaponBase) { ((ItemRenderWeaponBase) renderer).setPerspectiveAndRender(toRender, event.partialTicks); event.setCanceled(true); @@ -529,10 +529,10 @@ public class ModEventHandlerRenderer { private static Vec3 fogRGBMultiplier; private static boolean doesBiomeApply = false; private static long fogTimer = 0; - + /** Same procedure as getting the blended sky color but for fog */ public static Vec3 getFogBlendColor(World world, int playerX, int playerZ, float red, float green, float blue, double partialTicks) { - + long millis = System.currentTimeMillis() - fogTimer; if(playerX == fogX && playerZ == fogZ && fogInit && millis < 3000) return fogRGBMultiplier; @@ -541,7 +541,7 @@ public class ModEventHandlerRenderer { GameSettings settings = Minecraft.getMinecraft().gameSettings; int[] ranges = ForgeModContainer.blendRanges; int distance = 0; - + if(settings.fancyGraphics && settings.renderDistanceChunks >= 0) { distance = ranges[Math.min(settings.renderDistanceChunks, ranges.length - 1)]; } @@ -549,10 +549,10 @@ public class ModEventHandlerRenderer { float r = 0F; float g = 0F; float b = 0F; - + int divider = 0; doesBiomeApply = false; - + for(int x = -distance; x <= distance; x++) { for(int z = -distance; z <= distance; z++) { BiomeGenBase biome = world.getBiomeGenForCoords(playerX + x, playerZ + z); @@ -566,7 +566,7 @@ public class ModEventHandlerRenderer { fogX = playerX; fogZ = playerZ; - + if(doesBiomeApply) { fogRGBMultiplier = Vec3.createVectorHelper(r / divider, g / divider, b / divider); } else { @@ -575,25 +575,25 @@ public class ModEventHandlerRenderer { return fogRGBMultiplier; } - + /** Returns the current biome's fog color adjusted for brightness if in a crater, or the world's cached fog color if not */ public static Vec3 getBiomeFogColors(World world, BiomeGenBase biome, float r, float g, float b, double partialTicks) { - + if(biome instanceof BiomeGenCraterBase) { int color = biome.getSkyColorByTemp(biome.temperature); r = ((color & 0xff0000) >> 16) / 255F; g = ((color & 0x00ff00) >> 8) / 255F; b = (color & 0x0000ff) / 255F; - + float celestialAngle = world.getCelestialAngle((float) partialTicks); float skyBrightness = MathHelper.clamp_float(MathHelper.cos(celestialAngle * (float) Math.PI * 2.0F) * 2.0F + 0.5F, 0F, 1F); r *= skyBrightness; g *= skyBrightness; b *= skyBrightness; - + doesBiomeApply = true; } - + return Vec3.createVectorHelper(r, g, b); } } diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 3d623eea3..24231d3ef 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -174,7 +174,7 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme // In my testing, this can be reliably reproduced with a full fluid barrel, for instance. // I think it might be fixable by doing something with getDescriptionPacket() and onDataPacket(), // but this sidesteps the problem for the mean time. - if (lastPackedBuf != null && buf.equals(lastPackedBuf) && worldObj.getWorldTime() % 20 != 0) { + if (buf.equals(lastPackedBuf) && worldObj.getWorldTime() % 20 != 0) { return; } this.lastPackedBuf = buf; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java index 02ecc68ef..d7a93653e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java @@ -33,7 +33,7 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE private int turnProgress; protected boolean isRetracting = false; private int delay; - + public ItemStack syncStack; public TileEntityConveyorPress() { @@ -47,32 +47,32 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.updateConnections(); - + if(delay <= 0) { - + if(isRetracting) { - + if(this.canRetract()) { this.press -= speed; this.power -= this.usage; - + if(press <= 0) { press = 0; this.isRetracting = false; delay = 0; } } - + } else { - + if(this.canExtend()) { this.press += speed; this.power -= this.usage; - + if(press >= 1) { press = 1; this.isRetracting = true; @@ -81,17 +81,17 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE } } } - + } else { delay--; } - + this.networkPackNT(50); } else { - + // approach-based interpolation, GO! this.lastPress = this.renderPress; - + if(this.turnProgress > 0) { this.renderPress = this.renderPress + ((this.syncPress - this.renderPress) / (double) this.turnProgress); --this.turnProgress; @@ -100,11 +100,11 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE } } } - + protected void updateConnections() { for(DirPos pos : getConPos()) this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X), @@ -113,40 +113,40 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z), }; } - + public boolean canExtend() { - + if(this.power < usage) return false; if(slots[0] == null) return false; - + List items = worldObj.getEntitiesWithinAABB(EntityMovingItem.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 1.5, zCoord + 1)); if(items.isEmpty()) return false; - + for(EntityMovingItem item : items) { ItemStack stack = item.getItemStack(); if(PressRecipes.getOutput(stack, slots[0]) != null && stack.stackSize == 1) { - + double d0 = 0.35; double d1 = 0.65; if(item.posX > xCoord + d0 && item.posX < xCoord + d1 && item.posZ > zCoord + d0 && item.posZ < zCoord + d1) { item.setPosition(xCoord + 0.5, item.posY, zCoord + 0.5); } - + return true; } } - + return false; } - + public void process() { - + List items = worldObj.getEntitiesWithinAABB(EntityMovingItem.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 1.5, zCoord + 1)); - + for(EntityMovingItem item : items) { ItemStack stack = item.getItemStack(); ItemStack output = PressRecipes.getOutput(stack, slots[0]); - + if(output != null && stack.stackSize == 1) { item.setDead(); EntityMovingItem out = new EntityMovingItem(worldObj); @@ -155,9 +155,9 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE worldObj.spawnEntityInWorld(out); } } - + this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.pressOperate", getVolume(1.5F), 1.0F); - + if(slots[0].getMaxDamage() != 0) { slots[0].setItemDamage(slots[0].getItemDamage() + 1); if(slots[0].getItemDamage() >= slots[0].getMaxDamage()) { @@ -165,7 +165,7 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE } } } - + public boolean canRetract() { return this.power >= usage; } @@ -175,8 +175,8 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE super.serialize(buf); buf.writeLong(this.power); - buf.writeDouble(this.syncPress); - BufferUtil.writeItemStack(buf, syncStack); + buf.writeDouble(this.press); + BufferUtil.writeItemStack(buf, slots[0]); } @Override @@ -194,7 +194,7 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE public boolean isItemValidForSlot(int i, ItemStack stack) { return stack.getItem() instanceof ItemStamp; } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 0 }; @@ -224,26 +224,26 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE public boolean canConnect(ForgeDirection dir) { return dir != ForgeDirection.DOWN; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.power = nbt.getLong("power"); this.press = nbt.getDouble("press"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setLong("power", power); nbt.setDouble("press", press); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -254,10 +254,10 @@ public class TileEntityConveyorPress extends TileEntityMachineBase implements IE zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index 7485772a9..7bd2a4a27 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -43,10 +43,10 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa public FluidTank[] tanks; public boolean isOn; public boolean hasExploded = false; - + private AudioWrapper audio; private int audioTime; - + /* CONFIGURABLE */ public static int maxHeat = 3_200_000; public static double diffusion = 0.1D; @@ -66,12 +66,14 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa if(!worldObj.isRemote) { + buf.writeBoolean(this.hasExploded); + if(!this.hasExploded) { this.setupTanks(); this.updateConnections(); this.tryPullHeat(); int lastHeat = this.heat; - + int light = this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, this.xCoord, this.yCoord, this.zCoord); if(light > 7 && TomSaveData.forWorld(worldObj).fire > 1e-5) { this.heat += ((maxHeat - heat) * 0.000005D); //constantly heat up 0.0005% of the remaining heat buffer for rampant but diminishing heating @@ -83,24 +85,23 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa this.isOn = false; this.tryConvert(); tanks[1].serialize(buf); - + if(this.tanks[1].getFill() > 0) { this.sendFluid(); } } - buf.writeBoolean(this.hasExploded); buf.writeBoolean(this.muffled); buf.writeBoolean(this.isOn); sendStandard(25); } else { - + if(this.isOn) audioTime = 20; - + if(audioTime > 0) { - + audioTime--; - + if(audio == null) { audio = createAudioLoop(); audio.startSound(); @@ -110,9 +111,9 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa audio.updateVolume(getVolume(1F)); audio.keepAlive(); - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -120,7 +121,7 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa } } } - + @Override public AudioWrapper createAudioLoop() { return MainRegistry.proxy.getLoopedSound("hbm:block.boiler", xCoord, yCoord, zCoord, 0.125F, 10F, 1.0F, 20); @@ -154,25 +155,27 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa @Override public void deserialize(ByteBuf buf) { - this.heat = buf.readInt(); - this.tanks[0].deserialize(buf); - this.tanks[1].deserialize(buf); this.hasExploded = buf.readBoolean(); - this.muffled = buf.readBoolean(); - this.isOn = buf.readBoolean(); + if (!this.hasExploded) { + this.heat = buf.readInt(); + this.tanks[0].deserialize(buf); + this.tanks[1].deserialize(buf); + this.muffled = buf.readBoolean(); + this.isOn = buf.readBoolean(); + } } - + protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - + if(con instanceof IHeatSource) { IHeatSource source = (IHeatSource) con; int diff = source.getHeatStored() - this.heat; - + if(diff == 0) { return; } - + if(diff > 0) { diff = (int) Math.ceil(diff * diffusion); source.useUpHeat(diff); @@ -182,12 +185,12 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa return; } } - + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } - + protected void setupTanks() { - + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); if(trait.getEfficiency(HeatingType.BOILER) > 0) { @@ -201,32 +204,32 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa tanks[0].setTankType(Fluids.NONE); tanks[1].setTankType(Fluids.NONE); } - + protected void tryConvert() { - + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); if(trait.getEfficiency(HeatingType.BOILER) > 0) { - + HeatingStep entry = trait.getFirstStep(); int inputOps = this.tanks[0].getFill() / entry.amountReq; int outputOps = (this.tanks[1].getMaxFill() - this.tanks[1].getFill()) / entry.amountProduced; int heatOps = this.heat / entry.heatReq; - + int ops = Math.min(inputOps, Math.min(outputOps, heatOps)); this.tanks[0].setFill(this.tanks[0].getFill() - entry.amountReq * ops); this.tanks[1].setFill(this.tanks[1].getFill() + entry.amountProduced * ops); this.heat -= entry.heatReq * ops; - + if(ops > 0 && worldObj.rand.nextInt(400) == 0) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 2, zCoord + 0.5, "hbm:block.boilerGroan", 0.5F, 1.0F); } - + if(ops > 0) { this.isOn = true; } - + if(outputOps == 0 && canExplode) { this.hasExploded = true; BlockDummyable.safeRem = true; @@ -238,33 +241,33 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa } } worldObj.setBlockToAir(xCoord, yCoord + 1, zCoord); - + ExplosionVNT xnt = new ExplosionVNT(worldObj, xCoord + 0.5, yCoord + 2, zCoord + 0.5, 5F); xnt.setEntityProcessor(new EntityProcessorStandard().withRangeMod(3F)); xnt.setPlayerProcessor(new PlayerProcessorStandard()); xnt.setSFX(new ExplosionEffectStandard()); xnt.explode(); - + BlockDummyable.safeRem = false; } } } } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private void sendFluid() { - + for(DirPos pos : getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir().getOpposite()); } } - + private DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP); return new DirPos[] { @@ -273,7 +276,7 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa new DirPos(xCoord, yCoord + 4, zCoord, Library.POS_Y), }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -282,7 +285,7 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa heat = nbt.getInteger("heat"); hasExploded = nbt.getBoolean("exploded"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -306,12 +309,12 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -322,10 +325,10 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java index ea08a403f..272685e59 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java @@ -19,7 +19,6 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; @@ -29,12 +28,12 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHeatSource, IFluidStandardTransceiver, IGUIProvider, IControlReceiver, IFluidCopiable { - + public FluidTank[] tanks; public int amountToCool = 1; public int tickDelay = 1; public int heatEnergy; - + public TileEntityHeaterHeatex() { super(1); this.tanks = new FluidTank[2]; @@ -49,16 +48,16 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.tanks[0].setType(0, slots); this.setupTanks(); this.updateConnections(); - + this.heatEnergy *= 0.999; - + networkPackNT(25); - + for(DirPos pos : getConPos()) { if(this.tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } @@ -68,6 +67,7 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe @Override public void serialize(ByteBuf buf) { tanks[0].serialize(buf); + this.tryConvert(); tanks[1].serialize(buf); buf.writeInt(this.heatEnergy); buf.writeInt(this.amountToCool); @@ -82,9 +82,9 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe this.amountToCool = buf.readInt(); this.tickDelay = buf.readInt(); } - + protected void setupTanks() { - + if(tanks[0].getTankType().hasTrait(FT_Coolable.class)) { FT_Coolable trait = tanks[0].getTankType().getTrait(FT_Coolable.class); if(trait.getEfficiency(CoolingType.HEATEXCHANGER) > 0) { @@ -96,37 +96,37 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe tanks[0].setTankType(Fluids.NONE); tanks[1].setTankType(Fluids.NONE); } - + protected void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + protected void tryConvert() { - + if(!tanks[0].getTankType().hasTrait(FT_Coolable.class)) return; if(tickDelay < 1) tickDelay = 1; if(worldObj.getTotalWorldTime() % tickDelay != 0) return; - + FT_Coolable trait = tanks[0].getTankType().getTrait(FT_Coolable.class); - + int inputOps = tanks[0].getFill() / trait.amountReq; int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; int opCap = this.amountToCool; - + int ops = Math.min(inputOps, Math.min(outputOps, opCap)); tanks[0].setFill(tanks[0].getFill() - trait.amountReq * ops); tanks[1].setFill(tanks[1].getFill() + trait.amountProduced * ops); this.heatEnergy += trait.heatEnergy * ops * trait.getEfficiency(CoolingType.HEATEXCHANGER); this.markChanged(); } - + private DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX * 2 + rot.offsetX, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ, dir), new DirPos(xCoord + dir.offsetX * 2 - rot.offsetX, yCoord, zCoord + dir.offsetZ * 2 - rot.offsetZ, dir), @@ -134,7 +134,7 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ, dir.getOpposite()) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -145,7 +145,7 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe this.amountToCool = nbt.getInteger("toCool"); this.tickDelay = nbt.getInteger("delay"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -198,12 +198,12 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIHeaterHeatex(player.inventory, this); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -214,10 +214,10 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -233,7 +233,7 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe public void receiveControl(NBTTagCompound data) { if(data.hasKey("toCool")) this.amountToCool = MathHelper.clamp_int(data.getInteger("toCool"), 1, tanks[0].getMaxFill()); if(data.hasKey("delay")) this.tickDelay = Math.max(data.getInteger("delay"), 1); - + this.markChanged(); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index 3fadeafdd..c927edc0a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -36,9 +36,9 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU public final static int maxPress = 200; // max tick count per operation assuming speed is 1 boolean isRetracting = false; // direction the press is currently going private int delay; // delay between direction changes to look a bit more appealing - + public ItemStack syncStack; - + public TileEntityMachinePress() { super(4); } @@ -47,26 +47,26 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU public String getName() { return "container.press"; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + boolean preheated = false; - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { if(worldObj.getBlock(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ) == ModBlocks.press_preheater) { preheated = true; break; } } - + boolean canProcess = this.canProcess(); - + if((canProcess || this.isRetracting) && this.burnTime >= 200) { this.speed += preheated ? 4 : 1; - + if(this.speed > this.maxSpeed) { this.speed = this.maxSpeed; } @@ -76,21 +76,21 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU this.speed = 0; } } - + if(delay <= 0) { - + int stampSpeed = speed * progressAtMax / maxSpeed; - + if(this.isRetracting) { this.press -= stampSpeed; - + if(this.press <= 0) { this.isRetracting = false; this.delay = 5; } } else if(canProcess) { this.press += stampSpeed; - + if(this.press >= this.maxPress) { this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.pressOperate", getVolume(1.5F), 1.0F); ItemStack output = PressRecipes.getOutput(slots[2], slots[1]); @@ -100,20 +100,20 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU slots[3].stackSize += output.stackSize; } this.decrStackSize(2, 1); - + if(slots[1].getMaxDamage() != 0) { slots[1].setItemDamage(slots[1].getItemDamage() + 1); if(slots[1].getItemDamage() >= slots[1].getMaxDamage()) { slots[1] = null; } } - + this.isRetracting = true; this.delay = 5; if(this.burnTime >= 200) { this.burnTime -= 200; // only subtract fuel if operation was actually successful } - + this.markDirty(); } } else if(this.press > 0){ @@ -122,10 +122,10 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU } else { delay--; } - + if(slots[0] != null && burnTime < 200 && TileEntityFurnace.getItemBurnTime(slots[0]) > 0) { // less than one operation stored? burn more fuel! burnTime += TileEntityFurnace.getItemBurnTime(slots[0]); - + if(slots[0].stackSize == 1 && slots[0].getItem().hasContainerItem(slots[0])) { slots[0] = slots[0].getItem().getContainerItem(slots[0]).copy(); } else { @@ -133,14 +133,14 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU } this.markChanged(); } - + this.networkPackNT(50); - + } else { - + // approach-based interpolation, GO! this.lastPress = this.renderPress; - + if(this.turnProgress > 0) { this.renderPress = this.renderPress + ((this.syncPress - this.renderPress) / (double) this.turnProgress); --this.turnProgress; @@ -156,10 +156,7 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU buf.writeInt(this.speed); buf.writeInt(this.burnTime); buf.writeInt(this.press); - if (slots[2] == null) - buf.writeShort(-1); // indicate that the NBT doesn't actually exist to avoid null pointer errors. - else - BufferUtil.writeNBT(buf, slots[2].stackTagCompound); + BufferUtil.writeItemStack(buf, slots[2]); } @Override @@ -167,21 +164,20 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU super.deserialize(buf); this.speed = buf.readInt(); this.burnTime = buf.readInt(); - this.press = buf.readInt(); - NBTTagCompound stack = BufferUtil.readNBT(buf); - this.syncStack = ItemStack.loadItemStackFromNBT(stack); + this.syncPress = buf.readInt(); + this.syncStack = BufferUtil.readItemStack(buf); this.turnProgress = 2; } - + public boolean canProcess() { if(burnTime < 200) return false; if(slots[1] == null || slots[2] == null) return false; - + ItemStack output = PressRecipes.getOutput(slots[2], slots[1]); - + if(output == null) return false; - + if(slots[3] == null) return true; if(slots[3].stackSize + output.stackSize <= slots[3].getMaxStackSize() && slots[3].getItem() == output.getItem() && slots[3].getItemDamage() == output.getItemDamage()) return true; return false; @@ -189,16 +185,16 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - + if(stack.getItem() instanceof ItemStamp) return i == 1; - + if(TileEntityFurnace.getItemBurnTime(stack) > 0 && i == 0) return true; - + return i == 2; } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 0, 1, 2, 3 }; @@ -213,7 +209,7 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU public boolean canExtractItem(int i, ItemStack itemStack, int j) { return i == 3; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -231,19 +227,19 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU nbt.setInteger("speed", speed); nbt.setBoolean("ret", isRetracting); } - + AxisAlignedBB aabb; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(aabb != null) return aabb; - + aabb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 3, zCoord + 1); return aabb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { From 94c97bc87a86d1b60a32b278fd1def0db8f2fb51 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 13 Oct 2024 15:27:40 -0500 Subject: [PATCH 41/70] bug fixes part 2 (both me and radium did testing) --- .../com/hbm/packet/toclient/BufPacket.java | 16 +- .../machine/TileEntityMachineAutosaw.java | 114 ++++----- .../TileEntityMachineCombustionEngine.java | 66 ++--- .../machine/TileEntityMachineMiningLaser.java | 239 +++++++++--------- .../machine/TileEntityMachineTurbineGas.java | 194 +++++++------- .../machine/TileEntityPWRController.java | 2 +- .../machine/TileEntitySteamEngine.java | 40 +-- .../TileEntityMachineCatalyticCracker.java | 62 ++--- 8 files changed, 369 insertions(+), 364 deletions(-) diff --git a/src/main/java/com/hbm/packet/toclient/BufPacket.java b/src/main/java/com/hbm/packet/toclient/BufPacket.java index 2e9b32c12..c66ce6bdc 100644 --- a/src/main/java/com/hbm/packet/toclient/BufPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BufPacket.java @@ -9,6 +9,8 @@ import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; +import java.nio.BufferOverflowException; + public class BufPacket implements IMessage { int x; @@ -16,7 +18,7 @@ public class BufPacket implements IMessage { int z; IBufPacketReceiver rec; ByteBuf buf; - + public BufPacket() { } public BufPacket(int x, int y, int z, IBufPacketReceiver rec) { @@ -43,19 +45,19 @@ public class BufPacket implements IMessage { } public static class Handler implements IMessageHandler { - + @Override public IMessage onMessage(BufPacket m, MessageContext ctx) { - + if(Minecraft.getMinecraft().theWorld == null) return null; - + TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - - if(te instanceof IBufPacketReceiver) { + + if (te instanceof IBufPacketReceiver) { ((IBufPacketReceiver) te).deserialize(m.buf); } - + return null; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index 6fc25d3b7..0b264743a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -32,18 +32,18 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardReceiver, IFluidCopiable { - + public static final HashSet acceptedFuels = new HashSet(); - + static { acceptedFuels.add(Fluids.WOODOIL); acceptedFuels.add(Fluids.ETHANOL); acceptedFuels.add(Fluids.FISHOIL); acceptedFuels.add(Fluids.HEAVYOIL); } - + public FluidTank tank; - + public boolean isOn; public float syncYaw; public float rotationYaw; @@ -51,24 +51,24 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB public float syncPitch; public float rotationPitch; public float prevRotationPitch; - + // 0: searching, 1: extending, 2: retracting private int state = 0; - + private int turnProgress; - + public float spin; public float lastSpin; - + public TileEntityMachineAutosaw() { this.tank = new FluidTank(Fluids.WOODOIL, 100); } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(worldObj.getTotalWorldTime() % 20 == 0) { if(tank.getFill() > 0) { tank.setFill(tank.getFill() - 1); @@ -76,7 +76,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB } else { this.isOn = false; } - + this.subscribeToAllAround(tank.getTankType(), this); } @@ -90,13 +90,13 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB lowerArm.rotateAroundY(-(float) Math.toRadians(rotationYaw)); Vec3 armTip = Vec3.createVectorHelper(0, 0, -2); armTip.rotateAroundY(-(float) Math.toRadians(rotationYaw)); - + double cX = pivot.xCoord + upperArm.xCoord + lowerArm.xCoord + armTip.xCoord; double cY = pivot.yCoord; double cZ = pivot.zCoord + upperArm.zCoord + lowerArm.zCoord + armTip.zCoord; - + List affected = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(cX - 1, cY - 0.25, cZ - 1, cX + 1, cY + 0.25, cZ + 1)); - + for(EntityLivingBase e : affected) { if(e.isEntityAlive() && e.attackEntityFrom(ModDamageSource.turbofan, 100)) { worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); @@ -110,34 +110,34 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY, e.posZ, 50)); } } - + if(state == 0) { - + this.rotationYaw += 1; - + if(this.rotationYaw >= 360) { this.rotationYaw -= 360; } - + Vec3 grace = Vec3.createVectorHelper(0, 0, -3.5); grace.rotateAroundY(-(float) Math.toRadians(rotationYaw)); grace.xCoord += pivot.xCoord; grace.yCoord += pivot.yCoord; grace.zCoord += pivot.zCoord; - + Vec3 detector = Vec3.createVectorHelper(0, 0, -9); detector.rotateAroundY(-(float) Math.toRadians(rotationYaw)); detector.xCoord += pivot.xCoord; detector.yCoord += pivot.yCoord; detector.zCoord += pivot.zCoord; MovingObjectPosition pos = worldObj.func_147447_a(grace, detector, false, false, false); - + if(pos != null && pos.typeOfHit == pos.typeOfHit.BLOCK) { - + Block b = worldObj.getBlock(pos.blockX, pos.blockY, pos.blockZ); - + if(b.getMaterial() == Material.wood || b.getMaterial() == Material.leaves || b.getMaterial() == Material.plants) { - + int meta = worldObj.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ); if(!shouldIgnore(b, meta)) { state = 1; @@ -156,7 +156,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB this.tryInteract(hitX1, hitY, hitZ0); this.tryInteract(hitX0, hitY, hitZ1); this.tryInteract(hitX1, hitY, hitZ1); - + if(state == 1) { this.rotationPitch += 2; @@ -165,31 +165,31 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB state = 2; } } - + if(state == 2) { this.rotationPitch -= 2; - + if(this.rotationPitch <= 0) { this.rotationPitch = 0; state = 0; } } } - + sendStandard(100); } else { - + this.lastSpin = this.spin; - + if(isOn) { this.spin += 15F; - + Vec3 vec = Vec3.createVectorHelper(0.625, 0, 1.625); vec.rotateAroundY(-(float) Math.toRadians(rotationYaw)); - + worldObj.spawnParticle("smoke", xCoord + 0.5 + vec.xCoord, yCoord + 2.0625, zCoord + 0.5 + vec.zCoord, 0, 0, 0); } - + if(this.spin >= 360F) { this.spin -= 360F; this.lastSpin -= 360F; @@ -197,7 +197,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB this.prevRotationYaw = this.rotationYaw; this.prevRotationPitch = this.rotationPitch; - + if(this.turnProgress > 0) { double d0 = MathHelper.wrapAngleTo180_double(this.syncYaw - (double) this.rotationYaw); double d1 = MathHelper.wrapAngleTo180_double(this.syncPitch - (double) this.rotationPitch); @@ -210,30 +210,30 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB } } } - + /** Anything additionally that the detector nor the blades should pick up on, like non-mature willows */ public static boolean shouldIgnore(Block b, int meta) { if(b == ModBlocks.plant_tall) { return meta == EnumTallFlower.CD2.ordinal() + 8 || meta == EnumTallFlower.CD3.ordinal() + 8; } - + return false; } - + protected void tryInteract(int x, int y, int z) { - + Block b = worldObj.getBlock(x, y, z); int meta = worldObj.getBlockMetadata(x, y, z); - + if(shouldIgnore(b, meta)) { return; } - + if(b.getMaterial() == Material.leaves || b.getMaterial() == Material.plants) { worldObj.func_147480_a(x, y, z, true); return; } - + if(b.getMaterial() == Material.wood) { fellTree(x, y, z); if(state == 1) { @@ -241,22 +241,22 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB } } } - + protected void fellTree(int x, int y, int z) { - + if(worldObj.getBlock(x, y - 1, z).getMaterial() == Material.wood) { y--; if(worldObj.getBlock(x, y - 2, z).getMaterial() == Material.wood) { y--; } } - + int meta = -1; - + for(int i = y; i < y + 10; i++) { - + int[][] dir = new int[][] {{0, 0}, {1, 0}, {-1, 0}, {0, 1}, {0, -1}}; - + for(int[] d : dir) { Block b = worldObj.getBlock(x + d[0], i, z + d[1]); @@ -268,7 +268,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB } } } - + if(meta >= 0) { if(Blocks.sapling.canPlaceBlockAt(worldObj, x, y, z)) { worldObj.setBlock(x, y, z, Blocks.sapling, meta, 3); @@ -279,8 +279,8 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB @Override public void serialize(ByteBuf buf) { buf.writeBoolean(this.isOn); - buf.writeFloat(this.syncYaw); - buf.writeFloat(this.syncPitch); + buf.writeFloat(this.rotationYaw); + buf.writeFloat(this.rotationPitch); this.tank.serialize(buf); } @@ -292,7 +292,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB this.turnProgress = 3; //use 3-ply for extra smoothness this.tank.deserialize(buf); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -302,7 +302,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB this.state = nbt.getInteger("state"); this.tank.readFromNBT(nbt, "t"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -322,12 +322,12 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 12, @@ -338,10 +338,10 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB zCoord + 13 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java index a09063cbc..7c56a59f1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java @@ -34,19 +34,19 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineCombustionEngine extends TileEntityMachinePolluting implements IEnergyProviderMK2, IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IFluidCopiable { - + public boolean isOn = false; public static long maxPower = 2_500_000; public long power; private int playersUsing = 0; public int setting = 0; public boolean wasOn = false; - + public float doorAngle = 0; public float prevDoorAngle = 0; - + private AudioWrapper audio; - + public FluidTank tank; public int tenth = 0; @@ -62,26 +62,26 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.tank.loadTank(0, 1, slots); if(this.tank.setType(4, slots)) { this.tenth = 0; } - + wasOn = false; int fill = tank.getFill() * 10 + tenth; if(isOn && setting > 0 && slots[2] != null && slots[2].getItem() == ModItems.piston_set && fill > 0 && tank.getTankType().hasTrait(FT_Combustible.class)) { EnumPistonType piston = EnumUtil.grabEnumSafely(EnumPistonType.class, slots[2].getItemDamage()); FT_Combustible trait = tank.getTankType().getTrait(FT_Combustible.class); - + double eff = piston.eff[trait.getGrade().ordinal()]; - + if(eff > 0) { int speed = setting * 2; - + int toBurn = Math.min(fill, speed); this.power += toBurn * (trait.getCombustionEnergy() / 10_000D) * eff; fill -= toBurn; @@ -89,46 +89,46 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin if(worldObj.getTotalWorldTime() % 5 == 0 && toBurn > 0) { super.pollute(tank.getTankType(), FluidReleaseType.BURN, toBurn * 0.5F); } - + if(toBurn > 0) { wasOn = true; } - + tank.setFill(fill / 10); tenth = fill % 10; } } - + NBTTagCompound data = new NBTTagCompound(); data.setLong("power", Math.min(power, maxPower)); - + this.power = Library.chargeItemsFromTE(slots, 3, power, power); - + for(DirPos pos : getConPos()) { this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendSmoke(pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + if(power > maxPower) power = maxPower; this.networkPackNT(50); - + } else { this.prevDoorAngle = this.doorAngle; float swingSpeed = (doorAngle / 10F) + 3; - + if(this.playersUsing > 0) { this.doorAngle += swingSpeed; } else { this.doorAngle -= swingSpeed; } - + this.doorAngle = MathHelper.clamp_float(this.doorAngle, 0F, 135F); if(wasOn) { - + if(audio == null) { audio = createAudioLoop(); audio.startSound(); @@ -138,9 +138,9 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin audio.keepAlive(); audio.updateVolume(this.getVolume(1F)); - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -148,11 +148,11 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin } } } - + private DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX * 1 + rot.offsetX, yCoord, zCoord + dir.offsetZ * 1 + rot.offsetZ, dir), new DirPos(xCoord + dir.offsetX * 1 - rot.offsetX, yCoord, zCoord + dir.offsetZ * 1 - rot.offsetZ, dir), @@ -160,7 +160,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ, dir.getOpposite()) }; } - + @Override public AudioWrapper createAudioLoop() { return MainRegistry.proxy.getLoopedSound("hbm:block.igeneratorOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F, 20); @@ -200,6 +200,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin super.serialize(buf); buf.writeInt(this.playersUsing); buf.writeInt(this.setting); + buf.writeLong(this.power); buf.writeBoolean(this.isOn); buf.writeBoolean(this.wasOn); tank.serialize(buf); @@ -210,6 +211,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin super.deserialize(buf); this.playersUsing = buf.readInt(); this.setting = buf.readInt(); + this.power = buf.readLong(); this.isOn = buf.readBoolean(); this.wasOn = buf.readBoolean(); tank.deserialize(buf); @@ -234,12 +236,12 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin tank.writeToNBT(nbt, "tank"); nbt.setInteger("tenth", tenth); } - + @Override public void openInventory() { if(!worldObj.isRemote) this.playersUsing++; } - + @Override public void closeInventory() { if(!worldObj.isRemote) this.playersUsing--; @@ -285,12 +287,12 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin public FluidTank[] getSendingTanks() { return this.getSmokeTanks(); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 3, @@ -301,10 +303,10 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin zCoord + 4 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -320,7 +322,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin public void receiveControl(NBTTagCompound data) { if(data.hasKey("turnOn")) this.isOn = !this.isOn; if(data.hasKey("setting")) this.setting = data.getInteger("setting"); - + this.markChanged(); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index e1ccde5f0..8a4b70fa0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -51,7 +51,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineMiningLaser extends TileEntityMachineBase implements IEnergyReceiverMK2, IMiningDrill, IFluidStandardSender, IGUIProvider, IUpgradeInfoProvider { - + public long power; public int age = 0; public static final long maxPower = 100000000; @@ -70,7 +70,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen double breakProgress; public TileEntityMachineMiningLaser() { - + //slot 0: battery //slots 1 - 8: upgrades //slots 9 - 29: output @@ -87,31 +87,31 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.updateConnections(); this.sendFluid(tank, worldObj, xCoord + 2, yCoord, zCoord, Library.POS_X); this.sendFluid(tank, worldObj, xCoord - 2, yCoord, zCoord, Library.NEG_X); this.sendFluid(tank, worldObj, xCoord, yCoord + 2, zCoord, Library.POS_Z); this.sendFluid(tank, worldObj, xCoord, yCoord - 2, zCoord, Library.NEG_Z); - + power = Library.chargeTEFromItems(slots, 0, power, maxPower); - + //reset progress if the position changes if(lastTargetX != targetX || lastTargetY != targetY || lastTargetZ != targetZ) breakProgress = 0; - + //set last positions for interpolation and the like lastTargetX = targetX; lastTargetY = targetY; lastTargetZ = targetZ; - + if(isOn) { - + UpgradeManager.eval(slots, 1, 8); int cycles = 1 + UpgradeManager.getLevel(UpgradeType.OVERDRIVE); int speed = 1 + Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 12); @@ -120,35 +120,35 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen int consumption = this.consumption - (this.consumption * Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 12) / 16) + (this.consumption * Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 12) / 16); - + for(int i = 0; i < cycles; i++) { - + if(power < consumption) { beam = false; break; } - + power -= consumption; - + if(targetY <= 0) targetY = yCoord - 2; - + scan(range); - - + + Block block = worldObj.getBlock(targetX, targetY, targetZ); - + if(block.getMaterial().isLiquid()) { worldObj.setBlockToAir(targetX, targetY, targetZ); buildDam(); continue; } - + if(beam && canBreak(block, targetX, targetY, targetZ)) { - + breakProgress += getBreakSpeed(speed); clientBreakProgress = Math.min(breakProgress, 1); - + if(breakProgress < 1) { worldObj.destroyBlockInWorldPartially(-1, targetX, targetY, targetZ, (int) Math.floor(breakProgress * 10)); } else { @@ -166,17 +166,18 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen this.tryFillContainer(xCoord - 2, yCoord, zCoord); this.tryFillContainer(xCoord, yCoord, zCoord + 2); this.tryFillContainer(xCoord, yCoord, zCoord - 2); - + this.networkPackNT(250); } } - + private void updateConnections() { this.trySubscribe(worldObj, xCoord, yCoord + 2, zCoord, ForgeDirection.UP); } @Override public void serialize(ByteBuf buf) { + super.serialize(buf); buf.writeLong(this.power); buf.writeInt(this.lastTargetX); buf.writeInt(this.lastTargetY); @@ -213,76 +214,76 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen if(worldObj.getBlock(targetX, targetY, targetZ + 1).getMaterial().isLiquid()) worldObj.setBlock(targetX, targetY, targetZ + 1, ModBlocks.barricade); if(worldObj.getBlock(targetX, targetY, targetZ - 1).getMaterial().isLiquid()) worldObj.setBlock(targetX, targetY, targetZ - 1, ModBlocks.barricade); } - + private void tryFillContainer(int x, int y, int z) { - + Block b = worldObj.getBlock(x, y, z); if(b != Blocks.chest && b != Blocks.trapped_chest && b != ModBlocks.crate_iron && b != ModBlocks.crate_desh && b != ModBlocks.crate_steel && b != ModBlocks.safe && b != Blocks.hopper) return; - + IInventory inventory = (IInventory)worldObj.getTileEntity(x, y, z); if(inventory == null) return; - + for(int i = 9; i <= 29; i++) { - + if(slots[i] != null) { int prev = slots[i].stackSize; slots[i] = InventoryUtil.tryAddItemToInventory(inventory, 0, inventory.getSizeInventory() - 1, slots[i]); - + if(slots[i] == null || slots[i].stackSize < prev) return; } } } - + private void breakBlock(int fortune) { - + Block b = worldObj.getBlock(targetX, targetY, targetZ); int meta = worldObj.getBlockMetadata(targetX, targetY, targetZ); boolean normal = true; boolean doesBreak = true; - + if(b == Blocks.lit_redstone_ore) b = Blocks.redstone_ore; - + ItemStack stack = new ItemStack(b, 1, meta); - + if(stack != null && stack.getItem() != null) { if(hasCrystallizer()) { CrystallizerRecipe result = CrystallizerRecipes.getOutput(stack, Fluids.PEROXIDE); if(result == null) result = CrystallizerRecipes.getOutput(stack, Fluids.SULFURIC_ACID); - + if(result != null) { worldObj.spawnEntityInWorld(new EntityItem(worldObj, targetX + 0.5, targetY + 0.5, targetZ + 0.5, result.output.copy())); normal = false; } - + } else if(hasCentrifuge()) { - + ItemStack[] result = CentrifugeRecipes.getOutput(stack); if(result != null) { for(ItemStack sta : result) { - + if(sta != null) { worldObj.spawnEntityInWorld(new EntityItem(worldObj, targetX + 0.5, targetY + 0.5, targetZ + 0.5, sta.copy())); normal = false; } } } - + } else if(hasShredder()) { - + ItemStack result = ShredderRecipes.getShredderResult(stack); if(result != null && result.getItem() != ModItems.scrap) { worldObj.spawnEntityInWorld(new EntityItem(worldObj, targetX + 0.5, targetY + 0.5, targetZ + 0.5, result.copy())); normal = false; } - + } else if(hasSmelter()) { - + ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(stack); if(result != null) { worldObj.spawnEntityInWorld(new EntityItem(worldObj, targetX + 0.5, targetY + 0.5, targetZ + 0.5, result.copy())); @@ -290,32 +291,32 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } } } - + if(normal && b instanceof IDrillInteraction) { IDrillInteraction in = (IDrillInteraction) b; ItemStack drop = in.extractResource(worldObj, targetX, targetY, targetZ, meta, this); - + if(drop != null) { worldObj.spawnEntityInWorld(new EntityItem(worldObj, targetX + 0.5, targetY + 0.5, targetZ + 0.5, drop.copy())); } - + doesBreak = in.canBreak(worldObj, targetX, targetY, targetZ, meta, this); } - + if(doesBreak) { if(normal) b.dropBlockAsItem(worldObj, targetX, targetY, targetZ, meta, fortune); worldObj.func_147480_a(targetX, targetY, targetZ, false); } - + suckDrops(); if(doesScream()) { worldObj.playSoundEffect(targetX + 0.5, targetY + 0.5, targetZ + 0.5, "hbm:block.screm", 2000.0F, 1.0F); } - + breakProgress = 0; } - + private static final Set bad = Sets.newHashSet(new Item[] { Item.getItemFromBlock(Blocks.dirt), Item.getItemFromBlock(Blocks.stone), @@ -329,14 +330,14 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen Items.snowball, Items.wheat_seeds }); - + //hahahahahahahaha he said "suck" private void suckDrops() { - + int rangeHor = 3; int rangeVer = 1; boolean nullifier = hasNullifier(); - + List items = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox( targetX + 0.5 - rangeHor, targetY + 0.5 - rangeVer, @@ -345,36 +346,36 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen targetY + 0.5 + rangeVer, targetZ + 0.5 + rangeHor )); - + for(EntityItem item : items) { - + if(item.isDead) continue; - + if(nullifier && bad.contains(item.getEntityItem().getItem())) { item.setDead(); continue; } - + if(item.getEntityItem().getItem() == Item.getItemFromBlock(ModBlocks.ore_oil)) { - + tank.setTankType(Fluids.OIL); //just to be sure - + tank.setFill(tank.getFill() + 500); if(tank.getFill() > tank.getMaxFill()) tank.setFill(tank.getMaxFill()); - + item.setDead(); continue; } - + ItemStack stack = InventoryUtil.tryAddItemToInventory(slots, 9, 29, item.getEntityItem().copy()); - + if(stack == null) item.setDead(); else item.setEntityItemStack(stack.copy()); //copy is not necessary but i'm paranoid due to the kerfuffle of the old drill } - + List mobs = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox( targetX + 0.5 - 1, targetY + 0.5 - 1, @@ -383,31 +384,31 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen targetY + 0.5 + 1, targetZ + 0.5 + 1 )); - + for(EntityLivingBase mob : mobs) { mob.setFire(5); } } - + public double getBreakSpeed(int speed) { - + float hardness = worldObj.getBlock(targetX, targetY, targetZ).getBlockHardness(worldObj, targetX, targetY, targetZ) * 15 / speed; - + if(hardness == 0) return 1; - + return 1 / hardness; } - + public void scan(int range) { - + for(int x = -range; x <= range; x++) { for(int z = -range; z <= range; z++) { - + if(worldObj.getBlock(x + xCoord, targetY, z + zCoord).getMaterial().isLiquid()) { continue; } - + if(canBreak(worldObj.getBlock(x + xCoord, targetY, z + zCoord), x + xCoord, targetY, z + zCoord)) { targetX = x + xCoord; targetZ = z + zCoord; @@ -416,23 +417,23 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } } } - + beam = false; targetY--; } - + private boolean canBreak(Block block, int x, int y, int z) { return !block.isAir(worldObj, x, y, z) && block.getBlockHardness(worldObj, x, y, z) >= 0 && !block.getMaterial().isLiquid() && block != Blocks.bedrock; } - + public int getRange() { - + int range = 1; - + for(int i = 1; i < 9; i++) { - + if(slots[i] != null) { - + if(slots[i].getItem() == ModItems.upgrade_effect_1) range += 2; else if(slots[i].getItem() == ModItems.upgrade_effect_2) @@ -441,100 +442,100 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen range += 6; } } - + return Math.min(range, 25); } - + public boolean hasNullifier() { - + for(int i = 1; i < 9; i++) { - + if(slots[i] != null) { - + if(slots[i].getItem() == ModItems.upgrade_nullifier) return true; } } - + return false; } - + public boolean hasSmelter() { - + for(int i = 1; i < 9; i++) { - + if(slots[i] != null) { - + if(slots[i].getItem() == ModItems.upgrade_smelter) return true; } } - + return false; } - + public boolean hasShredder() { - + for(int i = 1; i < 9; i++) { - + if(slots[i] != null) { - + if(slots[i].getItem() == ModItems.upgrade_shredder) return true; } } - + return false; } - + public boolean hasCentrifuge() { - + for(int i = 1; i < 9; i++) { - + if(slots[i] != null) { - + if(slots[i].getItem() == ModItems.upgrade_centrifuge) return true; } } - + return false; } - + public boolean hasCrystallizer() { - + for(int i = 1; i < 9; i++) { - + if(slots[i] != null) { - + if(slots[i].getItem() == ModItems.upgrade_crystallizer) return true; } } - + return false; } - + public boolean doesScream() { - + for(int i = 1; i < 9; i++) { - + if(slots[i] != null) { - + if(slots[i].getItem() == ModItems.upgrade_screm) return true; } } - + return false; } - + public int getConsumption() { return this.consumption; } - + public int getWidth() { - + return 1 + getRange() * 2; } @@ -545,12 +546,12 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen public int getProgressScaled(int i) { return (int) (breakProgress * i); } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() @@ -570,20 +571,20 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen @Override public int[] getAccessibleSlotsFromSide(int slot) { - + int[] slots = new int[21]; - + for(int i = 0; i < 21; i++) { slots[i] = i + 9; } - + return slots; } @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && i >= 1 && i <= 8 && stack.getItem() instanceof ItemMachineUpgrade) worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } @@ -606,7 +607,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + tank.readFromNBT(nbt, "oil"); isOn = nbt.getBoolean("isOn"); } @@ -614,7 +615,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + tank.writeToNBT(nbt, "oil"); nbt.setBoolean("isOn", isOn); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index 7dfeb5793..59081ba7c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -44,30 +44,30 @@ import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityMachineTurbineGas extends TileEntityMachineBase implements IFluidStandardTransceiver, IEnergyProviderMK2, IControlReceiver, IGUIProvider, SimpleComponent, IInfoProviderEC, CompatHandler.OCComponent, IFluidCopiable { - + public long power; public static final long maxPower = 1000000L; - + public int rpm; //0-100, crescent moon gauge, used for calculating the amount of power generated, starts past 10% public int temp; //0-800, used for figuring out how much water to boil, starts boiling at 300°C public int rpmIdle = 10; public int tempIdle = 300; - + public int powerSliderPos; //goes from 0 to 60, 0 is idle, 60 is max power public int throttle; //the same thing, but goes from 0 to 100 - + public boolean autoMode; public int state = 0; //0 is offline, -1 is startup, 1 is online - + public int counter = 0; //used to startup and shutdown public int instantPowerOutput; - + public FluidTank[] tanks; - + private AudioWrapper audio; - + public static HashMap fuelMaxCons = new HashMap(); //fuel consumption per tick at max power - + static { fuelMaxCons.put(Fluids.GAS, 50D); // natgas doesn't burn well so it burns faster to compensate fuelMaxCons.put(Fluids.SYNGAS, 10D); // syngas just fucks @@ -75,9 +75,9 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement fuelMaxCons.put(Fluids.REFORMGAS, 5D); // fuck it we ball // default to 5 if not in list } - + //TODO particles from heat exchanger maybe? maybe in a future - + public TileEntityMachineTurbineGas() { super(2); this.tanks = new FluidTank[4]; @@ -91,23 +91,23 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + throttle = powerSliderPos * 100 / 60; - + if(slots[1] != null && slots[1].getItem() instanceof IItemFluidIdentifier) { FluidType fluid = ((IItemFluidIdentifier) slots[1].getItem()).getType(worldObj, xCoord, yCoord, zCoord, slots[1]); if(fluid.hasTrait(FT_Combustible.class) && fluid.getTrait(FT_Combustible.class).getGrade() == FuelGrade.GAS) { tanks[0].setTankType(fluid); } } - + if(autoMode) { //power production depending on power requirement - + //scales the slider proportionally to the power gauge int powerSliderTarget = 60 - (int) (60 * power / maxPower); - + if(powerSliderTarget > powerSliderPos) { //makes the auto slider slide instead of snapping into position powerSliderPos++; } @@ -115,23 +115,23 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement powerSliderPos--; } } - - switch(state) { //what to do when turbine offline, starting up and online + + switch(state) { //what to do when turbine offline, starting up and online case 0: - shutdown(); + shutdown(); break; case -1: stopIfNotReady(); startup(); break; - case 1: + case 1: stopIfNotReady(); run(); break; default: break; } - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); @@ -140,11 +140,11 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement //do net/battery deductions first... power = Library.chargeItemsFromTE(slots, 0, power, maxPower); this.tryProvide(worldObj, xCoord - dir.offsetZ * 5, yCoord + 1, zCoord + dir.offsetX * 5, rot); //sends out power - + //...and then cap it. Prevents potential future cases where power would be limited due to the fuel being too strong and the buffer too small. if(this.power > this.maxPower) this.power = this.maxPower; - + for(int i = 0; i < 2; i++) { //fuel and lube this.trySubscribe(tanks[i].getTankType(), worldObj, xCoord - dir.offsetX * 2 + rot.offsetX, yCoord, zCoord - dir.offsetZ * 2 + rot.offsetZ, dir.getOpposite()); this.trySubscribe(tanks[i].getTankType(), worldObj, xCoord + dir.offsetX * 2 + rot.offsetX, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ, dir); @@ -154,29 +154,29 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement this.trySubscribe(tanks[2].getTankType(), worldObj, xCoord + dir.offsetX * 2 + rot.offsetX * -4, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * -4, dir); //steam this.sendFluid(tanks[3], worldObj, xCoord + dir.offsetZ * 6, yCoord + 1, zCoord - dir.offsetX * 6, rot.getOpposite()); - + this.networkPackNT(150); - + } else { //client side, for sounds n shit - + if(rpm >= 10 && state != -1) { //if conditions are right, play the sound - + if(audio == null) { //if there is no sound playing, start it - + audio = MainRegistry.proxy.getLoopedSound("hbm:block.turbinegasRunning", xCoord, yCoord, zCoord, getVolume(1.0F), 20F, 2.0F); audio.startSound(); - + } else if(!audio.isPlaying()) { audio.stopSound(); audio = MainRegistry.proxy.getLoopedSound("hbm:block.turbinegasRunning", xCoord, yCoord, zCoord, getVolume(1.0F), 20F, 2.0F); audio.startSound(); } - + audio.updatePitch((float) (0.55 + 0.1 * rpm / 10)); //dynamic pitch update based on rpm audio.updateVolume(getVolume(2F)); //yeah i need this - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -216,8 +216,8 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement this.temp = buf.readInt(); this.state = buf.readInt(); this.autoMode = buf.readBoolean(); - this.powerSliderPos = buf.readInt(); this.throttle = buf.readInt(); + this.powerSliderPos = buf.readInt(); if(state != 1) this.counter = buf.readInt(); @@ -229,9 +229,9 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement this.tanks[2].deserialize(buf); this.tanks[3].deserialize(buf); } - + private void stopIfNotReady() { - + if(tanks[0].getFill() == 0 || tanks[1].getFill() == 0) { state = 0; } @@ -239,20 +239,20 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement state = 0; } } - + public boolean hasAcceptableFuel() { - + if(tanks[0].getTankType().hasTrait(FT_Combustible.class)) { return tanks[0].getTankType().getTrait(FT_Combustible.class).getGrade() == FuelGrade.GAS; } - + return false; } - + private void startup() { - + counter++; - + if(counter <= 20) //rpm gauge 0-100-0 rpm = 5 * counter; else if (counter > 20 && counter <= 40) @@ -261,43 +261,43 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement rpm = (int) (rpmIdle * (counter - 50) / 530); //slowly ramps up temp and RPM temp = (int) (tempIdle * (counter - 50) / 530); } - + if(counter == 50) { worldObj.playSoundEffect(xCoord, yCoord + 2, zCoord, "hbm:block.turbinegasStartup", getVolume(1.0F), 1.0F); } - + if(counter == 580) { state = 1; } } - - + + int rpmLast; //used to progressively slow down and cool the turbine without immediatly setting rpm and temp to 0 int tempLast; - + private void shutdown() { - + autoMode = false; instantPowerOutput = 0; - + if(powerSliderPos > 0) powerSliderPos--; - + if(rpm <= 10 && counter > 0) { - + if(counter == 225) { - + worldObj.playSoundEffect(xCoord, yCoord + 2, zCoord, "hbm:block.turbinegasShutdown", getVolume(1.0F), 1.0F); - + rpmLast = rpm; tempLast = temp; } - + counter--; - + rpm = (int) (rpmLast * (counter) / 225); temp = (int) (tempLast * (counter) / 225); - + } else if(rpm > 11) { //quickly slows down the turbine to idle before shutdown counter = 42069; //absolutely necessary to avoid fuckeries on shutdown rpm--; @@ -306,15 +306,15 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement rpm--; } } - + /** Dynamically calculates a (hopefully) sensible burn heat from the combustion energy, scales from 300°C - 800°C */ protected int getFluidBurnTemp(FluidType type) { double dFuel = type.hasTrait(FT_Combustible.class) ? type.getTrait(FT_Combustible.class).getCombustionEnergy() : 0; return (int) Math.floor(800D - (Math.pow(Math.E, -dFuel / 100_000D)) * 300D); } - + private void run() { - + if((int) (throttle * 0.9) > rpm - rpmIdle) { //simulates the rotor's moment of inertia if(worldObj.getTotalWorldTime() % 5 == 0) { rpm++; @@ -324,9 +324,9 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement rpm--; } } - + int maxTemp = getFluidBurnTemp(tanks[0].getTankType()); // fuelMaxTemp.get(tanks[0].getTankType()) - + if(throttle * 5 * (maxTemp - tempIdle) / 500 > temp - tempIdle) { //simulates the heat exchanger's resistance to temperature variation if(worldObj.getTotalWorldTime() % 2 == 0) { temp++; @@ -336,30 +336,30 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement temp--; } } - + double consumption = fuelMaxCons.containsKey(tanks[0].getTankType()) ? fuelMaxCons.get(tanks[0].getTankType()) : 5D; if(worldObj.getTotalWorldTime() % 20 == 0 && tanks[0].getTankType() != Fluids.OXYHYDROGEN) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND * 3); makePower(consumption, throttle); } - - + + double fuelToConsume; //used to consume 1 mb of fuel at a time when consumption is <1 mb/tick double waterToBoil; double waterPerTick = 0; - + private void makePower(double consMax, int throttle) { - + double idleConsumption = consMax * 0.05D; double consumption = idleConsumption + consMax * throttle / 100; - + fuelToConsume += consumption; - + tanks[0].setFill(tanks[0].getFill() - (int) Math.floor(fuelToConsume)); fuelToConsume -= (int) Math.floor(fuelToConsume); - - if(worldObj.getTotalWorldTime() % 10 == 0) //lube consumption + + if(worldObj.getTotalWorldTime() % 10 == 0) //lube consumption tanks[1].setFill(tanks[1].getFill() - 1); - + if(tanks[0].getFill() < 0) { //avoids negative amounts of fluid tanks[0].setFill(0); state = 0; @@ -368,16 +368,16 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement tanks[1].setFill(0); state = 0; } - - + + long energy = 0; //energy per mb of fuel - + if(tanks[0].getTankType().hasTrait(FT_Combustible.class)) { energy = tanks[0].getTankType().getTrait(FT_Combustible.class).getCombustionEnergy() / 1000L; } - + int rpmEff = rpm - rpmIdle; // RPM above idle level, 0-90 - + //consMax*energy is equivalent to power production at 100% if(instantPowerOutput < (consMax * energy * rpmEff / 90)) { //this shit avoids power rising in steps of 2000 or so HE at a time, instead it does it smoothly instantPowerOutput += Math.random() * 0.005 * consMax * energy; @@ -390,22 +390,22 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement instantPowerOutput = (int) (consMax * energy * rpmEff / 90); } this.power += instantPowerOutput; - + waterPerTick = (consMax * energy * (temp - tempIdle) / 220000); //it just works fuck you - + if(tanks[2].getFill() >= Math.ceil(waterPerTick)) { //checks if there's enough water to boil - + waterToBoil += waterPerTick; - + if(tanks[3].getFill() <= 160000 - waterToBoil * 10) { //checks if there's room for steam in the tank - + tanks[2].setFill(tanks[2].getFill() - (int) Math.floor(waterToBoil)); tanks[3].setFill(tanks[3].getFill() + 10 * (int) Math.floor(waterToBoil)); waterToBoil -= (int) Math.floor(waterToBoil); } } } - + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override @@ -424,11 +424,11 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement this.instantPowerOutput = nbt.getInteger("instPwr"); this.counter = nbt.getInteger("counter"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + tanks[0].writeToNBT(nbt, "gas"); tanks[1].writeToNBT(nbt, "lube"); tanks[2].writeToNBT(nbt, "water"); @@ -454,24 +454,24 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement @Override public void receiveControl(NBTTagCompound data) { - + if(data.hasKey("slidPos")) powerSliderPos = data.getInteger("slidPos"); - + if(data.hasKey("autoMode")) autoMode = data.getBoolean("autoMode"); - + if(data.hasKey("state")) state = data.getInteger("state"); this.markDirty(); } - + @Override public boolean hasPermission(EntityPlayer player) { return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 25; } - + @Override public void onChunkUnload() { @@ -501,17 +501,17 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement public long getPower() { return this.power; } - + @Override public long getMaxPower() { return this.maxPower; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 5, @@ -522,10 +522,10 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement zCoord + 6 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -551,7 +551,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement public FluidTank[] getSendingTanks() { return new FluidTank[] { tanks[3] }; } - + @Override public boolean canConnect(ForgeDirection dir) { return dir != ForgeDirection.DOWN; @@ -716,4 +716,4 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, this.waterToBoil); data.setDouble(CompatEnergyControl.D_OUTPUT_MB, this.waterToBoil * 10); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 28fe23172..07f87a3e3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -402,7 +402,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.typeLoaded = buf.readInt(); this.amountLoaded = buf.readInt(); this.rodLevel = buf.readDouble(); - this.rodTarget = buf.readInt(); + this.rodTarget = buf.readDouble(); this.coreHeatCapacity = buf.readLong(); tanks[0].deserialize(buf); tanks[1].deserialize(buf); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java index f954bc4cb..599ca66b9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java @@ -39,14 +39,14 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner private int turnProgress; private float acceleration = 0F; - + /* CONFIGURABLE */ private static int steamCap = 2_000; private static int ldsCap = 20; private static double efficiency = 0.85D; - + public TileEntitySteamEngine() { - + tanks = new FluidTank[2]; tanks[0] = new FluidTank(Fluids.STEAM, steamCap); tanks[1] = new FluidTank(Fluids.SPENTSTEAM, ldsCap); @@ -75,9 +75,9 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.powerBuffer = 0; tanks[0].setTankType(Fluids.STEAM); @@ -87,29 +87,29 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner FT_Coolable trait = tanks[0].getTankType().getTrait(FT_Coolable.class); double eff = trait.getEfficiency(CoolingType.TURBINE) * efficiency; - + int inputOps = tanks[0].getFill() / trait.amountReq; int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; int ops = Math.min(inputOps, outputOps); tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); this.powerBuffer += (ops * trait.heatEnergy * eff); - + if(ops > 0) { this.acceleration += 0.1F; } else { this.acceleration -= 0.1F; } - + this.acceleration = MathHelper.clamp_float(this.acceleration, 0F, 40F); this.rotor += this.acceleration; - + if(this.rotor >= 360D) { this.rotor -= 360D; - + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.steamEngineOperate", getVolume(1.0F), 0.5F + (acceleration / 80F)); } - + buf.writeLong(this.powerBuffer); buf.writeFloat(this.rotor); tanks[1].serialize(buf); @@ -119,11 +119,11 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + sendStandard(150); } else { this.lastRotor = this.rotor; - + if(this.turnProgress > 0) { double d = MathHelper.wrapAngleTo180_double(this.syncRotor - (double) this.rotor); this.rotor = (float) ((double) this.rotor + d / (double) this.turnProgress); @@ -133,11 +133,11 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner } } } - + protected DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + rot.offsetX * 2, yCoord + 1, zCoord + rot.offsetZ * 2, rot), new DirPos(xCoord + rot.offsetX * 2 + dir.offsetX, yCoord + 1, zCoord + rot.offsetZ * 2 + dir.offsetZ, rot), @@ -154,7 +154,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner this.tanks[0].readFromNBT(nbt, "s"); this.tanks[1].readFromNBT(nbt, "w"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -164,12 +164,12 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner tanks[0].writeToNBT(nbt, "s"); tanks[1].writeToNBT(nbt, "w"); } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -219,11 +219,11 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner @Override public void deserialize(ByteBuf buf) { + this.tanks[0].deserialize(buf); this.powerBuffer = buf.readLong(); this.syncRotor = buf.readFloat(); - this.turnProgress = 3; //use 3-ply for extra smoothness - this.tanks[0].deserialize(buf); this.tanks[1].deserialize(buf); + this.turnProgress = 3; //use 3-ply for extra smoothness } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java index 174166eb9..161d54be2 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java @@ -20,9 +20,9 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver, IFluidCopiable { - + public FluidTank[] tanks; - + public TileEntityMachineCatalyticCracker() { tanks = new FluidTank[5]; tanks[0] = new FluidTank(Fluids.BITUMEN, 4000); @@ -31,10 +31,10 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl tanks[3] = new FluidTank(Fluids.PETROLEUM, 4000); tanks[4] = new FluidTank(Fluids.SPENTSTEAM, 800); } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.worldObj.theProfiler.startSection("catalyticCracker_setup_tanks"); @@ -48,48 +48,48 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl this.worldObj.theProfiler.endStartSection("catalyticCracker_send_fluid"); if(worldObj.getTotalWorldTime() % 10 == 0) { - + for(DirPos pos : getConPos()) { for(int i = 2; i <= 4; i++) { if(tanks[i].getFill() > 0) this.sendFluid(tanks[i], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - sendStandard(25); } this.worldObj.theProfiler.endSection(); + sendStandard(25); } } @Override public void serialize(ByteBuf buf) { - for(int i = 0; i < 5; i++) - tanks[i].serialize(buf); + for(FluidTank tank : tanks) + tank.serialize(buf); } @Override public void deserialize(ByteBuf buf) { - for(int i = 0; i < 5; i++) - tanks[i].deserialize(buf); + for(FluidTank tank : tanks) + tank.deserialize(buf); } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private void crack() { - + Pair quart = CrackingRecipes.getCracking(tanks[0].getTankType()); - + if(quart != null) { - + int left = quart.getKey().fill; int right = quart.getValue().fill; - + for(int i = 0; i < 2; i++) { if(tanks[0].getFill() >= 100 && tanks[1].getFill() >= 200 && hasSpace(left, right)) { tanks[0].setFill(tanks[0].getFill() - 100); @@ -101,15 +101,15 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl } } } - + private boolean hasSpace(int left, int right) { return tanks[2].getFill() + left <= tanks[2].getMaxFill() && tanks[3].getFill() + right <= tanks[3].getMaxFill() && tanks[4].getFill() + 2 <= tanks[4].getMaxFill(); } - + private void setupTanks() { - + Pair quart = CrackingRecipes.getCracking(tanks[0].getTankType()); - + if(quart != null) { tanks[1].setTankType(Fluids.STEAM); tanks[2].setTankType(quart.getKey().type); @@ -123,7 +123,7 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl tanks[4].setTankType(Fluids.NONE); } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -131,7 +131,7 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl for(int i = 0; i < 5; i++) tanks[i].readFromNBT(nbt, "tank" + i); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -139,12 +139,12 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl for(int i = 0; i < 5; i++) tanks[i].writeToNBT(nbt, "tank" + i); } - + protected DirPos[] getConPos() { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX * 4 + rot.offsetX * 1, yCoord, zCoord + dir.offsetZ * 4 + rot.offsetZ * 1, dir), new DirPos(xCoord + dir.offsetX * 4 - rot.offsetX * 2, yCoord, zCoord + dir.offsetZ * 4 - rot.offsetZ * 2, dir), @@ -156,12 +156,12 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX * 4, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ * 4, rot.getOpposite()) }; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 3, @@ -172,10 +172,10 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl zCoord + 4 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { From b63ff682fdefe27201c8cdb8662ac4e663bf44a0 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 13 Oct 2024 15:50:00 -0500 Subject: [PATCH 42/70] Small fixes --- .../com/hbm/handler/neutron/NeutronNode.java | 1 + .../hbm/handler/neutron/NeutronNodeWorld.java | 2 +- .../handler/neutron/PileNeutronHandler.java | 8 ---- .../machine/pile/TileEntityPileFuel.java | 43 +++++++++---------- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNode.java b/src/main/java/com/hbm/handler/neutron/NeutronNode.java index 43d250949..e85a14081 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronNode.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronNode.java @@ -11,6 +11,7 @@ public abstract class NeutronNode { protected NeutronType type; protected TileEntity tile; // like NBT but less fucking CANCER + // Holds things like cached RBMK lid values. protected Map data = new HashMap<>(); public NeutronNode(TileEntity tile, NeutronType type) { diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java index cf1da973e..796589b6e 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java @@ -8,7 +8,7 @@ import java.util.HashMap; import java.util.List; public class NeutronNodeWorld { - // HashMap of all RBMK nodes and their positions. + // HashMap of all neutron nodes and their positions. protected static HashMap nodeCache = new HashMap<>(); public static void addNode(NeutronNode node) { diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index cbfe473b7..c38993127 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -143,14 +143,6 @@ public class PileNeutronHandler { } } - for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { - - for (NeutronStream stream : world.getValue().streams) { - stream.runStreamInteraction(world.getKey()); - } - world.getValue().removeAllStreams(); - } - for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { for (NeutronStream stream : world.getValue().streams) { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index aedcb0082..b920da829 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -22,17 +22,17 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr @Override public void updateEntity() { - + if(!worldObj.isRemote) { dissipateHeat(); checkRedstone(react()); transmute(); - + if(this.heat >= this.maxHeat) { worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 4, true, true); worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.gas_radon_dense); } - + if(worldObj.rand.nextFloat() * 2F <= this.heat / (float)this.maxHeat) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); @@ -40,55 +40,54 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr data.setDouble("mY", 0.05); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.25 + worldObj.rand.nextDouble() * 0.5, yCoord + 1, zCoord + 0.25 + worldObj.rand.nextDouble() * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 20)); - MainRegistry.proxy.effectNT(data); } - + if(this.progress >= this.maxProgress) { worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.block_graphite_plutonium, this.getBlockMetadata() & 7, 3); } } - + } - + private void dissipateHeat() { this.heat -= (this.getBlockMetadata() & 4) == 4 ? heat * 0.065 : heat * 0.05; //remove 5% of the stored heat per tick; 6.5% for windscale } - + private int react() { - + int reaction = (int) (this.neutrons * (1D - ((double)this.heat / (double)this.maxHeat) * 0.5D)); //max heat reduces reaction by 50% due to thermal expansion - + this.lastNeutrons = this.neutrons; this.neutrons = 0; - + int lastProgress = this.progress; - + this.progress += reaction; - + if(reaction <= 0) return lastProgress; - + this.heat += reaction; - + for(int i = 0; i < 12; i++) this.castRay((int) Math.max(reaction * 0.25, 1)); - + return lastProgress; } - + private void checkRedstone(int lastProgress) { int lastLevel = MathHelper.clamp_int((lastProgress * 16) / maxProgress, 0, 15); int newLevel = MathHelper.clamp_int((progress * 16) / maxProgress, 0, 15); if(lastLevel != newLevel) worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType()); } - + private void transmute() { - + if((this.getBlockMetadata() & 8) == 8) { if(this.progress < this.maxProgress - 1000) //Might be subject to change, but 1000 seems like a good number. this.progress = maxProgress - 1000; - + return; } else if(this.progress >= maxProgress - 1000) { worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata() | 8, 3); @@ -100,7 +99,7 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr public void receiveNeutrons(int n) { this.neutrons += n; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -108,7 +107,7 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr this.progress = nbt.getInteger("progress"); this.neutrons = nbt.getInteger("neutrons"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); From 42e200ac7ad24c7e628fc7033e553166dbdfec44 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 13 Oct 2024 17:04:36 -0500 Subject: [PATCH 43/70] just some final tweaks to make sure that I don't fuck anything up --- .../java/com/hbm/packet/toclient/BufPacket.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/packet/toclient/BufPacket.java b/src/main/java/com/hbm/packet/toclient/BufPacket.java index c66ce6bdc..383f9dd71 100644 --- a/src/main/java/com/hbm/packet/toclient/BufPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BufPacket.java @@ -8,8 +8,8 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; - -import java.nio.BufferOverflowException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class BufPacket implements IMessage { @@ -55,7 +55,15 @@ public class BufPacket implements IMessage { TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); if (te instanceof IBufPacketReceiver) { - ((IBufPacketReceiver) te).deserialize(m.buf); + try { + ((IBufPacketReceiver) te).deserialize(m.buf); + } catch(Exception e) { // just in case I fucked up + Logger logger = LogManager.getLogger("HBM"); + logger.warn("A ByteBuf packet failed to be read and has thrown an error. This normally means that there was a buffer underflow and more data was read than was actually in the packet."); + logger.warn("Tile: {}", te.getBlockType().getUnlocalizedName()); + logger.warn(e.getMessage()); + + } } return null; From e38ce02ccfe6d6b4627dd07112aa0b76a60a7a51 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 14 Oct 2024 22:00:39 -0500 Subject: [PATCH 44/70] Upgrade rework, now with 3463% more caching! (it was slow and needed a redo) --- .../com/hbm/inventory/UpgradeManager.java | 50 --- .../com/hbm/inventory/UpgradeManagerNT.java | 80 ++++ .../hbm/inventory/gui/GuiInfoContainer.java | 64 ++-- .../hbm/tileentity/IUpgradeInfoProvider.java | 5 +- .../machine/TileEntityElectrolyser.java | 34 +- .../machine/TileEntityFurnaceIron.java | 90 ++--- .../TileEntityMachineArcFurnaceLarge.java | 153 ++++---- .../machine/TileEntityMachineArcWelder.java | 118 +++--- .../machine/TileEntityMachineAssembler.java | 78 ++-- .../machine/TileEntityMachineAssemfac.java | 132 +++---- .../machine/TileEntityMachineCentrifuge.java | 78 ++-- .../machine/TileEntityMachineChemfac.java | 144 +++---- .../machine/TileEntityMachineChemplant.java | 230 ++++++------ .../machine/TileEntityMachineCompressor.java | 117 +++--- .../TileEntityMachineCrystallizer.java | 157 ++++---- .../machine/TileEntityMachineCyclotron.java | 164 ++++---- .../machine/TileEntityMachineEPress.java | 94 ++--- .../TileEntityMachineElectricFurnace.java | 40 +- .../machine/TileEntityMachineExcavator.java | 354 +++++++++--------- .../TileEntityMachineExposureChamber.java | 108 +++--- .../machine/TileEntityMachineMiningLaser.java | 34 +- .../machine/TileEntityMachineMixer.java | 124 +++--- .../machine/TileEntityMachineOreSlopper.java | 116 +++--- .../TileEntityMachineSolderingStation.java | 20 +- .../machine/TileEntityMachineTurbofan.java | 134 +++---- .../oil/TileEntityMachineGasFlare.java | 20 +- .../oil/TileEntityMachineLiquefactor.java | 74 ++-- .../oil/TileEntityMachinePyroOven.java | 124 +++--- .../oil/TileEntityMachineSolidifier.java | 82 ++-- .../machine/oil/TileEntityOilDrillBase.java | 106 +++--- .../turret/TileEntityTurretMaxwell.java | 16 +- 31 files changed, 1634 insertions(+), 1506 deletions(-) delete mode 100644 src/main/java/com/hbm/inventory/UpgradeManager.java create mode 100644 src/main/java/com/hbm/inventory/UpgradeManagerNT.java diff --git a/src/main/java/com/hbm/inventory/UpgradeManager.java b/src/main/java/com/hbm/inventory/UpgradeManager.java deleted file mode 100644 index 39c366de4..000000000 --- a/src/main/java/com/hbm/inventory/UpgradeManager.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.hbm.inventory; - -import java.util.HashMap; - -import com.hbm.interfaces.Untested; -import com.hbm.items.machine.ItemMachineUpgrade; -import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; - -import net.minecraft.item.ItemStack; - -public class UpgradeManager { - - private static HashMap upgrades = new HashMap(); - private static UpgradeType mutexType = null; - - @Untested - public static void eval(ItemStack[] slots, int start, int end) { - - upgrades.clear(); - - for(int i = start; i <= end; i++) { - - if(slots[i] != null && slots[i].getItem() instanceof ItemMachineUpgrade) { - ItemMachineUpgrade item = (ItemMachineUpgrade) slots[i].getItem(); - - if(item.type.mutex) { - - if(mutexType == null || mutexType.ordinal() < item.type.ordinal()) { - mutexType = item.type; - } - - } else { - Integer up = upgrades.get(item.type); - int upgrade = (up == null ? 0 : up); - upgrade += item.tier; - upgrades.put(item.type, upgrade); - } - } - } - } - - public static int getLevel(UpgradeType type) { - Integer up = upgrades.get(type); - return up == null ? 0 : up; - } - - public static UpgradeType getMinerMutex() { - return mutexType; - } -} diff --git a/src/main/java/com/hbm/inventory/UpgradeManagerNT.java b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java new file mode 100644 index 000000000..55422fb8d --- /dev/null +++ b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java @@ -0,0 +1,80 @@ +package com.hbm.inventory; + +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.tileentity.IUpgradeInfoProvider; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +import java.util.Arrays; +import java.util.HashMap; + +/* + Steps for use: + 1. TE implements IUpgradeInfoProvider + 2. TE creates a new instance of UpgradeManagerNT + 3. Upgrades and their levels can then be pulled from there. + */ + +/** + * Upgrade system, now with caching! + * @author BallOfEnergy1 + */ +public class UpgradeManagerNT { + + public ItemStack[] cachedSlots; + + private UpgradeType mutexType; + public HashMap upgrades = new HashMap<>(); + + public void checkSlots(TileEntity te, ItemStack[] slots, int start, int end) { + + if(!(te instanceof IUpgradeInfoProvider) || slots == null) + return; + + ItemStack[] upgradeSlots = Arrays.copyOfRange(slots, start, end + 1); + + if(Arrays.equals(upgradeSlots, cachedSlots)) + return; + + cachedSlots = upgradeSlots.clone(); + + upgrades.clear(); + + for (int i = 0; i <= end - start; i++) { + + if(upgradeSlots[i] != null && upgradeSlots[i].getItem() instanceof ItemMachineUpgrade) { + + ItemMachineUpgrade item = (ItemMachineUpgrade) upgradeSlots[i].getItem(); + IUpgradeInfoProvider upgradable = (IUpgradeInfoProvider) te; + + if(upgradable.getValidUpgrades() == null) + return; + + if (upgradable.getValidUpgrades().containsKey(item.type)) { // Check if upgrade can even be accepted by the machine. + if (item.type.mutex) { + if (mutexType == null) { + upgrades.put(item.type, 1); + mutexType = item.type; + } else if(item.type.ordinal() > mutexType.ordinal()) { + upgrades.remove(mutexType); + upgrades.put(item.type, 1); + mutexType = item.type; + } + } else { + + Integer levelBefore = upgrades.get(item.type); + int upgradeLevel = (levelBefore == null ? 0 : levelBefore); + upgradeLevel += item.tier; + // Add additional check to make sure it doesn't go over the max. + upgrades.put(item.type, Math.min(upgradeLevel, upgradable.getValidUpgrades().get(item.type))); + } + } + } + } + } + + public Integer getLevel(UpgradeType type) { + return upgrades.getOrDefault(type, 0); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index c77fcd6b9..3ccc333e6 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -40,36 +40,36 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa public GuiInfoContainer(Container p_i1072_1_) { super(p_i1072_1_); } - + public void drawElectricityInfo(GuiInfoContainer gui, int mouseX, int mouseY, int x, int y, int width, int height, long power, long maxPower) { if(x <= mouseX && x + width > mouseX && y < mouseY && y + height >= mouseY) gui.drawInfo(new String[] { BobMathUtil.getShortNumber(power) + "/" + BobMathUtil.getShortNumber(maxPower) + "HE" }, mouseX, mouseY); } - + public void drawCustomInfoStat(int mouseX, int mouseY, int x, int y, int width, int height, int tPosX, int tPosY, String... text) { drawCustomInfoStat(mouseX, mouseY, x, y, width, height, tPosX, tPosY, Arrays.asList(text)); } - + public void drawCustomInfoStat(int mouseX, int mouseY, int x, int y, int width, int height, int tPosX, int tPosY, List text) { - + if(x <= mouseX && x + width > mouseX && y < mouseY && y + height >= mouseY) this.func_146283_a(text, tPosX, tPosY); } - + public void drawInfo(String[] text, int x, int y) { this.func_146283_a(Arrays.asList(text), x, y); } - + /** Automatically grabs upgrade info out of the tile entity if it's a IUpgradeInfoProvider and crams the available info into a list for display. Automation, yeah! */ public List getUpgradeInfo(TileEntity tile) { List lines = new ArrayList(); - + if(tile instanceof IUpgradeInfoProvider) { IUpgradeInfoProvider provider = (IUpgradeInfoProvider) tile; - + lines.add(I18nUtil.resolveKey("upgrade.gui.title")); - + for(UpgradeType type : UpgradeType.values()) { if(provider.canProvideInfo(type, 0, false)) { - int maxLevel = provider.getMaxLevel(type); + int maxLevel = provider.getValidUpgrades().get(type); switch(type) { case SPEED: lines.add(I18nUtil.resolveKey("upgrade.gui.speed", maxLevel)); break; case POWER: lines.add(I18nUtil.resolveKey("upgrade.gui.power", maxLevel)); break; @@ -81,20 +81,20 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa } } } - + return lines; } - + @Deprecated public void drawCustomInfo(GuiInfoContainer gui, int mouseX, int mouseY, int x, int y, int width, int height, String[] text) { if(x <= mouseX && x + width > mouseX && y < mouseY && y + height >= mouseY) this.func_146283_a(Arrays.asList(text), mouseX, mouseY); } - + public void drawInfoPanel(int x, int y, int width, int height, int type) { Minecraft.getMinecraft().getTextureManager().bindTexture(guiUtil); - + switch(type) { case 0: drawTexturedModalRect(x, y, 0, 0, 8, 8); break; //Small blue I case 1: drawTexturedModalRect(x, y, 0, 8, 8, 8); break; //Small green I @@ -110,7 +110,7 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa case 11: drawTexturedModalRect(x, y, 24, 32, 16, 16); break; //Large grey * } } - + protected boolean isMouseOverSlot(Slot slot, int x, int y) { return this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, x, y); } @@ -130,32 +130,32 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa return null; } - + protected boolean checkClick(int x, int y, int left, int top, int sizeX, int sizeY) { return guiLeft + left <= x && guiLeft + left + sizeX > x && guiTop + top < y && guiTop + top + sizeY >= y; } - + /* Getters for external use of the GUI's rect rendering, such as NumberDisplay */ public int getGuiTop() { return this.guiTop; } - + public int getGuiLeft() { return this.guiLeft; } - + public float getZLevel() { return this.zLevel; } - + public void setZLevel(float level) { this.zLevel = level; } - + public RenderItem getItemRenderer() { return this.itemRender; } - + public FontRenderer getFontRenderer() { return this.fontRendererObj; } @@ -175,7 +175,7 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa } protected void drawStackText(List lines, int x, int y, FontRenderer font) { - + if(!lines.isEmpty()) { GL11.glDisable(GL12.GL_RESCALE_NORMAL); RenderHelper.disableStandardItemLighting(); @@ -189,11 +189,11 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa while(iterator.hasNext()) { Object[] line = (Object[]) iterator.next(); int lineWidth = 0; - + boolean hasStack = false; - + for(Object o : line) { - + if(o instanceof String) { lineWidth += font.getStringWidth((String) o); } else { @@ -201,7 +201,7 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa hasStack = true; } } - + if(hasStack) { height += 18; } else { @@ -243,19 +243,19 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa this.drawGradientRect(minX - 3, minY + height + 2, minX + longestline + 3, minY + height + 3, color1, color1); for(int index = 0; index < lines.size(); ++index) { - + Object[] line = (Object[]) lines.get(index); int indent = 0; boolean hasStack = false; - + for(Object o : line) { if(!(o instanceof String)) { hasStack = true; } } - + for(Object o : line) { - + if(o instanceof String) { font.drawStringWithShadow((String) o, minX + indent, minY + (hasStack ? 4 : 0), -1); indent += font.getStringWidth((String) o) + 2; @@ -301,7 +301,7 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa if(inventorySlots instanceof ContainerBase) { NBTTagCompound tag = new NBTTagCompound(); tag.setInteger("slot", slot.slotNumber); - + NBTTagCompound item = new NBTTagCompound(); stack.writeToNBT(item); tag.setTag("stack", item); diff --git a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java index 0fd4f7dab..1539d3eb0 100644 --- a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java +++ b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java @@ -1,5 +1,6 @@ package com.hbm.tileentity; +import java.util.HashMap; import java.util.List; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -13,8 +14,8 @@ public interface IUpgradeInfoProvider { /** If any of the automated display stuff should be applied for this upgrade. A level of 0 is used by the GUI's indicator, as opposed to the item tooltips */ public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo); public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo); - public int getMaxLevel(UpgradeType type); - + public HashMap getValidUpgrades(); + public static String getStandardLabel(Block block) { return EnumChatFormatting.GREEN.YELLOW + ">>> " + I18nUtil.resolveKey(block.getUnlocalizedName() + ".name") + " <<<"; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 1fd7f77bb..d3601d1fa 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -1,12 +1,13 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerElectrolyserFluid; import com.hbm.inventory.container.ContainerElectrolyserMetal; import com.hbm.inventory.fluid.Fluids; @@ -49,14 +50,14 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable, IMetalCopiable { - + public long power; public static final long maxPower = 20000000; public static final int usageOreBase = 10_000; public static final int usageFluidBase = 10_000; public int usageOre; public int usageFluid; - + public int progressFluid; public int processFluidTime = 100; public int progressOre; @@ -68,6 +69,8 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn public FluidTank[] tanks; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityElectrolyser() { //0: Battery //1-2: Upgrades @@ -129,9 +132,9 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn } } - UpgradeManager.eval(slots, 1, 2); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); + upgradeManager.checkSlots(this, slots, 1, 2); + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); usageOre = usageOreBase - usageOreBase * powerLevel / 4; usageFluid = usageFluidBase - usageFluidBase * powerLevel / 4; @@ -390,19 +393,19 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn public int getDurationMetal() { ElectrolysisMetalRecipe result = ElectrolyserMetalRecipes.getRecipe(slots[14]); int base = result != null ? result.duration : 600; - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) - Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 1); + int speed = upgradeManager.getLevel(UpgradeType.SPEED) - upgradeManager.getLevel(UpgradeType.POWER); return (int) Math.ceil((base * Math.max(1F - 0.25F * speed, 0.2))); } public int getDurationFluid() { ElectrolysisRecipe result = ElectrolyserFluidRecipes.getRecipe(tanks[0].getTankType()); int base = result != null ? result.duration : 100; - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) - Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 1); + int speed = upgradeManager.getLevel(UpgradeType.SPEED) - upgradeManager.getLevel(UpgradeType.POWER); return (int) Math.ceil((base * Math.max(1F - 0.25F * speed, 0.2))); } public int getCycleCount() { - int speed = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); + int speed = upgradeManager.getLevel(UpgradeType.OVERDRIVE); return Math.min(1 + speed * 2, 7); } @@ -513,7 +516,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public void receiveControl(NBTTagCompound data) { } - + @Override public void receiveControl(EntityPlayer player, NBTTagCompound data) { @@ -548,11 +551,12 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java index 7bac33241..76cb76189 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java @@ -1,11 +1,12 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerFurnaceIron; import com.hbm.inventory.gui.GUIFurnaceIron; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -29,7 +30,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUIProvider, IUpgradeInfoProvider { - + public int maxBurnTime; public int burnTime; public boolean wasOn = false; @@ -37,12 +38,14 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI public int progress; public int processingTime; public static final int baseTime = 160; - + public ModuleBurnTime burnModule; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityFurnaceIron() { super(5); - + burnModule = new ModuleBurnTime() .setLigniteTimeMod(1.25) .setCoalTimeMod(1.25) @@ -59,21 +62,21 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI @Override public void updateEntity() { - + if(!worldObj.isRemote) { - - UpgradeManager.eval(slots, 4, 4); - this.processingTime = baseTime - ((baseTime / 2) * Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) / 3); - + + upgradeManager.checkSlots(this, slots, 4, 4); + this.processingTime = baseTime - ((baseTime / 2) * upgradeManager.getLevel(UpgradeType.SPEED) / 3); + wasOn = false; - + if(burnTime <= 0) { - + for(int i = 1; i < 3; i++) { if(slots[i] != null) { - + int fuel = burnModule.getBurnTime(slots[i]); - + if(fuel > 0) { this.maxBurnTime = this.burnTime = fuel; slots[i].stackSize--; @@ -81,33 +84,33 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI if(slots[i].stackSize == 0) { slots[i] = slots[i].getItem().getContainerItem(slots[i]); } - + break; } } - } + } } - + if(canSmelt()) { wasOn = true; this.progress++; this.burnTime--; - + if(this.progress % 15 == 0 && !this.muffled) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "fire.fire", 1.0F, 0.5F + worldObj.rand.nextFloat() * 0.5F); } - + if(this.progress >= this.processingTime) { ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(slots[0]); - + if(slots[3] == null) { slots[3] = result.copy(); } else { slots[3].stackSize += result.stackSize; } - + this.decrStackSize(0, 1); - + this.progress = 0; this.markDirty(); } @@ -118,14 +121,14 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI this.networkPackNT(50); } else { - + if(this.progress > 0) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + double offset = this.progress % 2 == 0 ? 1 : 0.5; worldObj.spawnParticle("smoke", xCoord + 0.5 - dir.offsetX * offset - rot.offsetX * 0.1875, yCoord + 2, zCoord + 0.5 - dir.offsetZ * offset - rot.offsetZ * 0.1875, 0.0, 0.01, 0.0); - + if(this.progress % 5 == 0) { double rand = worldObj.rand.nextDouble(); worldObj.spawnParticle("flame", xCoord + 0.5 + dir.offsetX * 0.25 + rot.offsetX * rand, yCoord + 0.25 + worldObj.rand.nextDouble() * 0.25, zCoord + 0.5 + dir.offsetZ * 0.25 + rot.offsetZ * rand, 0.0, 0.0, 0.0); @@ -155,21 +158,21 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI } public boolean canSmelt() { - + if(this.burnTime <= 0) return false; if(slots[0] == null) return false; - + ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(slots[0]); - + if(result == null) return false; if(slots[3] == null) return true; - + if(!result.isItemEqual(slots[3])) return false; if(result.stackSize + slots[3].stackSize > slots[3].getMaxStackSize()) return false; - + return true; } - + @Override public int[] getAccessibleSlotsFromSide(int meta) { return new int[] { 0, 1, 2, 3 }; @@ -177,13 +180,13 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - + if(i == 0) return FurnaceRecipes.smelting().getSmeltingResult(itemStack) != null; - + if(i < 3) return burnModule.getBurnTime(itemStack) > 0; - + return false; } @@ -191,7 +194,7 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI public boolean canExtractItem(int i, ItemStack itemStack, int j) { return i == 3; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -200,7 +203,7 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI this.burnTime = nbt.getInteger("burnTime"); this.progress = nbt.getInteger("progress"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -220,12 +223,12 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIFurnaceIron(player.inventory, this); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -236,10 +239,10 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -260,8 +263,9 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + return upgrades; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java index 874a815ef..7ec5ae47f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java @@ -1,13 +1,14 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineArcFurnaceLarge; import com.hbm.inventory.gui.GUIMachineArcFurnaceLarge; import com.hbm.inventory.material.MaterialShapes; @@ -47,7 +48,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase implements IEnergyReceiverMK2, IControlReceiver, IGUIProvider, IUpgradeInfoProvider { - + public long power; public static final long maxPower = 2_500_000; public boolean liquidMode = false; @@ -56,25 +57,27 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl public boolean hasMaterial; public int delay; public int upgrade; - + public float lid; public float prevLid; public int approachNum; public float syncLid; - + private AudioWrapper audioLid; private AudioWrapper audioProgress; - + + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public byte[] electrodes = new byte[3]; public static final byte ELECTRODE_NONE = 0; public static final byte ELECTRODE_FRESH = 1; public static final byte ELECTRODE_USED = 2; public static final byte ELECTRODE_DEPLETED = 3; - + public int getMaxInputSize() { return upgrade == 0 ? 1 : upgrade == 1 ? 4 : upgrade == 2 ? 8 : 16; } - + public static final int maxLiquid = MaterialShapes.BLOCK.q(128); public List liquids = new ArrayList(); @@ -90,7 +93,7 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && stack.getItem() instanceof ItemMachineUpgrade && i == 4) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } @@ -98,31 +101,31 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl @Override public void updateEntity() { - - UpgradeManager.eval(slots, 4, 4); - this.upgrade = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - + + upgradeManager.checkSlots(this, slots, 4, 4); + this.upgrade = upgradeManager.getLevel(UpgradeType.SPEED); + if(!worldObj.isRemote) { - + this.power = Library.chargeTEFromItems(slots, 3, power, maxPower); this.isProgressing = false; - + for(DirPos pos : getConPos()) this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - + if(power > 0) { - + boolean ingredients = this.hasIngredients(); boolean electrodes = this.hasElectrodes(); - + int consumption = (int) (1_000 * Math.pow(5, upgrade)); - + if(ingredients && electrodes && delay <= 0 && this.liquids.isEmpty()) { if(lid > 0) { lid -= 1F / (60F / (upgrade * 0.5 + 1)); if(lid < 0) lid = 0; this.progress = 0; } else { - + if(power >= consumption) { int duration = 400 / (upgrade * 2 + 1); this.progress += 1F / duration; @@ -145,18 +148,18 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl if(lid > 1) lid = 1; } } - + hasMaterial = ingredients; } - + this.decideElectrodeState(); - + if(!hasMaterial) hasMaterial = this.hasIngredients(); - + if(!this.liquids.isEmpty() && this.lid > 0F) { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); - + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); MaterialStack didPour = CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 2.875D, yCoord + 1.25D, zCoord + 0.5D + dir.offsetZ * 2.875D, 6, true, this.liquids, MaterialShapes.INGOT.q(1), impact); @@ -171,21 +174,21 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 2.875D, yCoord + 1, zCoord + 0.5D + dir.offsetZ * 2.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); } } - + this.liquids.removeIf(o -> o.amount <= 0); - + this.networkPackNT(150); } else { this.prevLid = this.lid; - + if(this.approachNum > 0) { this.lid = this.lid + ((this.syncLid - this.lid) / (float) this.approachNum); --this.approachNum; } else { this.lid = this.syncLid; } - + if(this.lid != this.prevLid) { if(this.audioLid == null || !this.audioLid.isPlaying()) { this.audioLid = MainRegistry.proxy.getLoopedSound("hbm:door.wgh_start", xCoord, yCoord, zCoord, this.getVolume(0.75F), 15F, 1.0F, 5); @@ -198,11 +201,11 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl this.audioLid = null; } } - + if((lid == 1 || lid == 0) && lid != prevLid && !(this.prevLid == 0 && this.lid == 1)) { MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:door.wgh_stop", this.getVolume(1), 1F); } - + if(this.isProgressing) { if(this.audioProgress == null || !this.audioProgress.isPlaying()) { this.audioProgress = MainRegistry.proxy.getLoopedSound("hbm:block.electricHum", xCoord, yCoord, zCoord, this.getVolume(1.5F), 15F, 0.75F, 5); @@ -216,7 +219,7 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl this.audioProgress = null; } } - + if(this.lid != this.prevLid && this.lid > this.prevLid && !(this.prevLid == 0 && this.lid == 1) && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 4, zCoord + 0.5) < 50) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -233,7 +236,7 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl data.setFloat("strafe", 0.05F); for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); } - + if(this.lid != this.prevLid && this.lid < this.prevLid && this.lid > 0.5F && this.hasMaterial && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 4, zCoord + 0.5) < 50) { /*NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -249,7 +252,7 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl data.setInteger("color", 0x808080); data.setFloat("strafe", 0.15F); MainRegistry.proxy.effectNT(data);*/ - + if(worldObj.rand.nextInt(5) == 0) { NBTTagCompound flame = new NBTTagCompound(); flame.setString("type", "rbmkflame"); @@ -262,10 +265,10 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl } } } - + public void decideElectrodeState() { for(int i = 0; i < 3; i++) { - + if(slots[i] != null) { if(slots[i].getItem() == ModItems.arc_electrode_burnt) { this.electrodes[i] = this.ELECTRODE_DEPLETED; continue; } if(slots[i].getItem() == ModItems.arc_electrode) { @@ -277,26 +280,26 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl this.electrodes[i] = this.ELECTRODE_NONE; } } - + public void process() { - + for(int i = 5; i < 25; i++) { if(slots[i] == null) continue; ArcFurnaceRecipe recipe = ArcFurnaceRecipes.getOutput(slots[i], this.liquidMode); if(recipe == null) continue; - + if(!liquidMode && recipe.solidOutput != null) { int amount = slots[i].stackSize; slots[i] = recipe.solidOutput.copy(); slots[i].stackSize *= amount; } - + if(liquidMode && recipe.fluidOutput != null) { - + while(slots[i] != null && slots[i].stackSize > 0) { int liquid = this.getStackAmount(liquids); int toAdd = this.getStackAmount(recipe.fluidOutput); - + if(liquid + toAdd <= this.maxLiquid) { this.decrStackSize(i, 1); for(MaterialStack stack : recipe.fluidOutput) { @@ -308,16 +311,16 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl } } } - + for(int i = 0; i < 3; i++) { if(ItemArcElectrode.damage(slots[i])) { slots[i] = new ItemStack(ModItems.arc_electrode_burnt, 1, slots[i].getItemDamage()); } } } - + public boolean hasIngredients() { - + for(int i = 5; i < 25; i++) { if(slots[i] == null) continue; ArcFurnaceRecipe recipe = ArcFurnaceRecipes.getOutput(slots[i], this.liquidMode); @@ -325,10 +328,10 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl if(liquidMode && recipe.fluidOutput != null) return true; if(!liquidMode && recipe.solidOutput != null) return true; } - + return false; } - + public boolean hasElectrodes() { for(int i = 0; i < 3; i++) { if(slots[i] == null || slots[i].getItem() != ModItems.arc_electrode) return false; @@ -384,35 +387,35 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl if(slot > 4) return lid > 0 && ArcFurnaceRecipes.getOutput(stack, this.liquidMode) == null; return false; } - + public void addToStack(MaterialStack matStack) { - + for(MaterialStack mat : liquids) { if(mat.material == matStack.material) { mat.amount += matStack.amount; return; } } - + liquids.add(matStack.copy()); } - + public static int getStackAmount(List stack) { int amount = 0; for(MaterialStack mat : stack) amount += mat.amount; return amount; } - + public static int getStackAmount(MaterialStack[] stack) { int amount = 0; for(MaterialStack mat : stack) amount += mat.amount; return amount; } - + protected DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX * 3 + rot.offsetX, yCoord, zCoord + dir.offsetZ * 3 + rot.offsetZ, dir), new DirPos(xCoord + dir.offsetX * 3 - rot.offsetX, yCoord, zCoord + dir.offsetZ * 3 - rot.offsetZ, dir), @@ -432,17 +435,17 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl buf.writeBoolean(isProgressing); buf.writeBoolean(liquidMode); buf.writeBoolean(hasMaterial); - + for(int i = 0; i < 3; i++) buf.writeByte(electrodes[i]); - + buf.writeShort(liquids.size()); - + for(MaterialStack mat : liquids) { buf.writeInt(mat.material.id); buf.writeInt(mat.amount); } } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -452,32 +455,32 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl this.isProgressing = buf.readBoolean(); this.liquidMode = buf.readBoolean(); this.hasMaterial = buf.readBoolean(); - + for(int i = 0; i < 3; i++) electrodes[i] = buf.readByte(); - + int mats = buf.readShort(); - + this.liquids.clear(); for(int i = 0; i < mats; i++) { liquids.add(new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt())); } - + if(syncLid != 0 && syncLid != 1) this.approachNum = 2; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); this.liquidMode = nbt.getBoolean("liquidMode"); this.progress = nbt.getFloat("progress"); this.lid = nbt.getFloat("lid"); this.delay = nbt.getInteger("delay"); - + int count = nbt.getShort("count"); liquids.clear(); - + for(int i = 0; i < count; i++) { liquids.add(new MaterialStack(Mats.matById.get(nbt.getInteger("m" + i)), nbt.getInteger("a" + i))); } @@ -491,7 +494,7 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl nbt.setFloat("progress", progress); nbt.setFloat("lid", lid); nbt.setInteger("delay", delay); - + int count = liquids.size(); nbt.setShort("count", (short) count); for(int i = 0; i < count; i++) { @@ -515,12 +518,12 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl public long getMaxPower() { return maxPower; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 3, @@ -531,10 +534,10 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl zCoord + 4 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -580,8 +583,10 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + return upgrades; } + } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java index 82c0d7547..6ab6585c6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineArcWelder; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -38,17 +39,19 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineArcWelder extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IConditionalInvAccess, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable { - + public long power; public long maxPower = 2_000; public long consumption; - + public int progress; public int processTime = 1; - + public FluidTank tank; public ItemStack display; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineArcWelder() { super(8); this.tank = new FluidTank(Fluids.NONE, 24_000); @@ -62,7 +65,7 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && stack.getItem() instanceof ItemMachineUpgrade && i >= 6 && i <= 7) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } @@ -70,48 +73,48 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.power = Library.chargeTEFromItems(slots, 4, this.getPower(), this.getMaxPower()); this.tank.setType(5, slots); - + if(worldObj.getTotalWorldTime() % 20 == 0) { for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(tank.getTankType() != Fluids.NONE) this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + ArcWelderRecipe recipe = ArcWelderRecipes.getRecipe(slots[0], slots[1], slots[2]); long intendedMaxPower; - - UpgradeManager.eval(slots, 6, 7); - int redLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int blueLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - + + upgradeManager.checkSlots(this, slots, 6, 7); + int redLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int blueLevel = upgradeManager.getLevel(UpgradeType.POWER); + if(recipe != null) { this.processTime = recipe.duration - (recipe.duration * redLevel / 6) + (recipe.duration * blueLevel / 3); this.consumption = recipe.consumption + (recipe.consumption * redLevel) - (recipe.consumption * blueLevel / 6); intendedMaxPower = recipe.consumption * 20; - + if(canProcess(recipe)) { this.progress++; this.power -= this.consumption; - + if(progress >= processTime) { this.progress = 0; this.consumeItems(recipe); - + if(slots[3] == null) { slots[3] = recipe.output.copy(); } else { slots[3].stackSize += recipe.output.stackSize; } - + this.markDirty(); } - + if(worldObj.getTotalWorldTime() % 2 == 0) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); NBTTagCompound dPart = new NBTTagCompound(); @@ -119,23 +122,23 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements dPart.setByte("count", (byte) 5); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, xCoord + 0.5 - dir.offsetX * 0.5, yCoord + 1.25, zCoord + 0.5 - dir.offsetZ * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); } - + } else { this.progress = 0; } - + } else { this.progress = 0; this.consumption = 100; intendedMaxPower = 2000; } - + this.maxPower = Math.max(intendedMaxPower, power); - + this.networkPackNT(25); } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -144,11 +147,11 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements buf.writeLong(consumption); buf.writeInt(progress); buf.writeInt(processTime); - + tank.serialize(buf); - + ArcWelderRecipe recipe = ArcWelderRecipes.getRecipe(slots[0], slots[1], slots[2]); - + if(recipe != null) { buf.writeBoolean(true); buf.writeInt(Item.getIdFromItem(recipe.output.getItem())); @@ -156,7 +159,7 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements } else buf.writeBoolean(false); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -165,37 +168,37 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements consumption = buf.readLong(); progress = buf.readInt(); processTime = buf.readInt(); - + tank.deserialize(buf); - + if(buf.readBoolean()) { this.display = new ItemStack(Item.getItemById(buf.readInt()), 1, buf.readInt()); } else this.display = null; } - + public boolean canProcess(ArcWelderRecipe recipe) { - + if(this.power < this.consumption) return false; - + if(recipe.fluid != null) { if(this.tank.getTankType() != recipe.fluid.type) return false; if(this.tank.getFill() < recipe.fluid.fill) return false; } - + if(slots[3] != null) { if(slots[3].getItem() != recipe.output.getItem()) return false; if(slots[3].getItemDamage() != recipe.output.getItemDamage()) return false; if(slots[3].stackSize + recipe.output.stackSize > slots[3].getMaxStackSize()) return false; } - + return true; } - + public void consumeItems(ArcWelderRecipe recipe) { - + for(AStack aStack : recipe.ingredients) { - + for(int i = 0; i < 3; i++) { ItemStack stack = slots[i]; if(aStack.matchesRecipe(stack, true) && stack.stackSize >= aStack.stacksize) { @@ -204,17 +207,17 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements } } } - + if(recipe.fluid != null) { this.tank.setFill(tank.getFill() - recipe.fluid.fill); } } - + protected 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), @@ -228,7 +231,7 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements new DirPos(xCoord - dir.offsetX - rot.offsetX * 2, yCoord, zCoord - dir.offsetZ - rot.offsetZ * 2, rot.getOpposite()) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -239,7 +242,7 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements this.processTime = nbt.getInteger("processTime"); tank.readFromNBT(nbt, "t"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -312,19 +315,19 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); BlockPos core = new BlockPos(xCoord, yCoord, zCoord); - + //Red if(pos.equals(core.clone().offset(rot)) || pos.equals(core.clone().offset(rot.getOpposite()).offset(dir.getOpposite()))) return new int[] { 0, 3 }; - + //Yellow if(pos.equals(core.clone().offset(dir.getOpposite()))) return new int[] { 1, 3 }; - + //Green if(pos.equals(core.clone().offset(rot.getOpposite())) || pos.equals(core.clone().offset(rot).offset(dir.getOpposite()))) return new int[] { 2, 3 }; - + return new int[] { }; } @@ -338,12 +341,12 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineArcWelder(player.inventory, this); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -354,10 +357,10 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -383,10 +386,11 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java index 9755049d3..fd7d1b822 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java @@ -1,12 +1,13 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineAssembler; import com.hbm.inventory.gui.GUIMachineAssembler; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -31,11 +32,13 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase implements IUpgradeInfoProvider { - + public int recipe = -1; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + Random rand = new Random(); - + public TileEntityMachineAssembler() { super(18); } @@ -50,19 +53,19 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i if(i == 0) if(itemStack.getItem() instanceof IBatteryItem) return true; - + if(i == 1) return true; - + return false; } - + @Override public void updateEntity() { super.updateEntity(); - + if(!worldObj.isRemote) { - + //meta below 12 means that it's an old multiblock configuration if(this.getBlockMetadata() < 12) { int meta = this.getBlockMetadata(); @@ -83,18 +86,18 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i worldObj.getTileEntity(xCoord, yCoord, zCoord).readFromNBT(data); return; } - + this.updateConnections(); this.consumption = 100; this.speed = 100; - - UpgradeManager.eval(slots, 1, 3); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overLevel = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); - + upgradeManager.checkSlots(this, slots, 1, 3); + + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + int overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + speed -= speedLevel * 25; consumption += speedLevel * 300; speed += powerLevel * 5; @@ -107,14 +110,14 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i ComparableStack comp = ItemAssemblyTemplate.readType(slots[4]); rec = AssemblerRecipes.recipeList.indexOf(comp); }*/ - + this.networkPackNT(150); } else { - + float volume = this.getVolume(2F); if(isProgressing && volume > 0) { - + if(audio == null) { audio = this.createAudioLoop(); audio.updateVolume(volume); @@ -123,9 +126,9 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i audio = rebootAudio(audio); audio.updateVolume(volume); } - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -133,7 +136,7 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i } } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -142,11 +145,11 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i buf.writeInt(progress[i]); buf.writeInt(maxProgress[i]); } - + buf.writeBoolean(isProgressing); buf.writeInt(recipe); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -155,28 +158,28 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i progress[i] = buf.readInt(); maxProgress[i] = buf.readInt(); } - + isProgressing = buf.readBoolean(); recipe = buf.readInt(); } - + @Override public AudioWrapper createAudioLoop() { return MainRegistry.proxy.getLoopedSound("hbm:block.assemblerOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + return new DirPos[] { new DirPos(xCoord + rot.offsetX * 3, yCoord, zCoord + rot.offsetZ * 3, rot), new DirPos(xCoord - rot.offsetX * 2, yCoord, zCoord - rot.offsetZ * 2, rot.getOpposite()), @@ -204,7 +207,7 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i audio = null; } } - + private AudioWrapper audio; @Override @@ -244,12 +247,12 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i public long getMaxPower() { return 100_000; } - + @Override public AxisAlignedBB getRenderBoundingBox() { return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1).expand(2, 1, 2); } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -289,10 +292,11 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase i } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 9; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java index 54045989e..9919ffec1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java @@ -1,11 +1,12 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerAssemfac; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -31,15 +32,17 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase implements IFluidStandardTransceiver, IUpgradeInfoProvider, IFluidCopiable { - + public AssemblerArm[] arms; public FluidTank water; public FluidTank steam; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineAssemfac() { super(14 * 8 + 4 + 1); //8 assembler groups with 14 slots, 4 upgrade slots, 1 battery slot - + arms = new AssemblerArm[6]; for(int i = 0; i < arms.length; i++) { arms[i] = new AssemblerArm(i % 3 == 1 ? 1 : 0); //the second of every group of three becomes a welder @@ -57,7 +60,7 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && i >= 1 && i <= 4 && stack.getItem() instanceof ItemMachineUpgrade) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } @@ -66,37 +69,37 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im @Override public void updateEntity() { super.updateEntity(); - + if(!worldObj.isRemote) { - + if(worldObj.getTotalWorldTime() % 20 == 0) { this.updateConnections(); } - + this.speed = 100; this.consumption = 100; - - UpgradeManager.eval(slots, 1, 4); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 6); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overLevel = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); - + upgradeManager.checkSlots(this, slots, 1, 4); + + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + int overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + this.speed -= speedLevel * 15; this.consumption += speedLevel * 300; this.speed += powerLevel * 5; this.consumption -= powerLevel * 30; this.speed /= (overLevel + 1); this.consumption *= (overLevel + 1); - + for(DirPos pos : getConPos()) { this.sendFluid(steam, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + this.networkPackNT(150); - + } else { - + for(AssemblerArm arm : arms) { arm.updateInterp(); if(isProgressing) { @@ -105,7 +108,7 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im } } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -118,7 +121,7 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im water.serialize(buf); steam.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -131,7 +134,7 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im water.deserialize(buf); steam.deserialize(buf); } - + private int getWaterRequired() { return 1000 / this.speed; } @@ -147,19 +150,19 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im this.water.setFill(this.water.getFill() - getWaterRequired()); this.steam.setFill(this.steam.getFill() + getWaterRequired()); } - + private void updateConnections() { for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(water.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + public DirPos[] getConPos() { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord - dir.offsetX * 3 + rot.offsetX * 5, yCoord, zCoord - dir.offsetZ * 3 + rot.offsetZ * 5, rot), new DirPos(xCoord + dir.offsetX * 2 + rot.offsetX * 5, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * 5, rot), @@ -171,22 +174,22 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im new DirPos(xCoord + dir.offsetX * 4 - rot.offsetX * 2, yCoord, zCoord + dir.offsetZ * 4 - rot.offsetZ * 2, dir) }; } - + public static class AssemblerArm { public double[] angles = new double[4]; public double[] prevAngles = new double[4]; public double[] targetAngles = new double[4]; public double[] speed = new double[4]; - + Random rand = new Random(); - + int actionMode; ArmActionState state; int actionDelay = 0; - + public AssemblerArm(int actionMode) { this.actionMode = actionMode; - + if(this.actionMode == 0) { speed[0] = 15; //Pivot speed[1] = 15; //Arm @@ -198,19 +201,19 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im speed[2] = 1; //Piston speed[3] = 0.125; //Striker } - + state = ArmActionState.ASSUME_POSITION; chooseNewArmPoistion(); actionDelay = rand.nextInt(20); } - + public void updateArm() { - + if(actionDelay > 0) { actionDelay--; return; } - + switch(state) { //Move. If done moving, set a delay and progress to EXTEND case ASSUME_POSITION: @@ -254,12 +257,12 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im state = ArmActionState.ASSUME_POSITION; } break; - + } } - + public void chooseNewArmPoistion() { - + if(this.actionMode == 0) { targetAngles[0] = -rand.nextInt(50); //Pivot targetAngles[1] = -targetAngles[0]; //Arm @@ -270,45 +273,45 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im targetAngles[2] = rand.nextInt(10) + 10; //Piston } } - + private void updateInterp() { for(int i = 0; i < angles.length; i++) { prevAngles[i] = angles[i]; } } - + /** * @return True when it has finished moving */ private boolean move() { boolean didMove = false; - + for(int i = 0; i < angles.length; i++) { if(angles[i] == targetAngles[i]) continue; - + didMove = true; - + double angle = angles[i]; double target = targetAngles[i]; double turn = speed[i]; double delta = Math.abs(angle - target); - + if(delta <= turn) { angles[i] = targetAngles[i]; continue; } - + if(angle < target) { angles[i] += turn; } else { angles[i] -= turn; } } - + return !didMove; } - + public static enum ArmActionState { ASSUME_POSITION, EXTEND_STRIKER, @@ -316,12 +319,12 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im RETRACT_STRIKER } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 5, @@ -332,10 +335,10 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im zCoord + 5 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -364,42 +367,42 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im DirPos[] inpos; DirPos[] outpos; - + @Override public DirPos[] getInputPositions() { - + if(inpos != null) return inpos; - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + inpos = new DirPos[] { new DirPos(xCoord + dir.offsetX * 4 - rot.offsetX * 1, yCoord, zCoord + dir.offsetZ * 4 - rot.offsetZ * 1, dir), new DirPos(xCoord - dir.offsetX * 5 + rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 5 + rot.offsetZ * 2, dir.getOpposite()), new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX * 4, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ * 4, rot.getOpposite()), new DirPos(xCoord + dir.offsetX * 1 + rot.offsetX * 5, yCoord, zCoord + dir.offsetZ * 1 + rot.offsetZ * 5, rot) }; - + return inpos; } @Override public DirPos[] getOutputPositions() { - + if(outpos != null) return outpos; - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + outpos = new DirPos[] { new DirPos(xCoord + dir.offsetX * 4 + rot.offsetX * 2, yCoord, zCoord + dir.offsetZ * 4 + rot.offsetZ * 2, dir), new DirPos(xCoord - dir.offsetX * 5 - rot.offsetX * 1, yCoord, zCoord - dir.offsetZ * 5 - rot.offsetZ * 1, dir.getOpposite()), new DirPos(xCoord + dir.offsetX * 1 - rot.offsetX * 4, yCoord, zCoord + dir.offsetZ * 1 - rot.offsetZ * 4, rot.getOpposite()), new DirPos(xCoord - dir.offsetX * 2 + rot.offsetX * 5, yCoord, zCoord - dir.offsetZ * 2 + rot.offsetZ * 5, rot) }; - + return outpos; } @@ -456,11 +459,12 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 6; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 12; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 6); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 12); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index ebcb7381b..aeb067770 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -1,12 +1,13 @@ package com.hbm.tileentity.machine; import java.io.IOException; +import java.util.HashMap; import java.util.List; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerCentrifuge; import com.hbm.inventory.gui.GUIMachineCentrifuge; import com.hbm.inventory.recipes.CentrifugeRecipes; @@ -38,12 +39,12 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineCentrifuge extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC, IConfigurableMachine{ - + public int progress; public long power; public boolean isProgressing; private int audioDuration = 0; - + private AudioWrapper audio; //configurable values @@ -51,6 +52,8 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement public static int processingSpeed = 200; public static int baseConsumption = 200; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public String getConfigName() { return "centrifuge"; } @@ -70,7 +73,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement /* * So why do we do this now? You have a funny mekanism/thermal/whatever pipe and you want to output stuff from a side - * that isn't the bottom, what do? Answer: make all slots accessible from all sides and regulate in/output in the + * that isn't the bottom, what do? Answer: make all slots accessible from all sides and regulate in/output in the * dedicated methods. Duh. */ private static final int[] slot_io = new int[] { 0, 2, 3, 4, 5 }; @@ -78,11 +81,11 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement public TileEntityMachineCentrifuge() { super(8); } - + public String getName() { return "container.centrifuge"; } - + @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { return i == 0; @@ -126,7 +129,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement return false; } ItemStack[] out = CentrifugeRecipes.getOutput(slots[0]); - + if(out == null) { return false; } @@ -175,7 +178,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement public boolean isProcessing() { return this.progress > 0; } - + @Override public void updateEntity() { @@ -184,18 +187,18 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); power = Library.chargeTEFromItems(slots, 1, power, maxPower); - + int consumption = baseConsumption; int speed = 1; - - UpgradeManager.eval(slots, 6, 7); - speed += Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - consumption += Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) * baseConsumption; - - speed *= (1 + Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 5); - consumption += Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * baseConsumption * 50; - - consumption /= (1 + Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3)); + + upgradeManager.checkSlots(this, slots, 6, 7); + speed += upgradeManager.getLevel(UpgradeType.SPEED); + consumption += upgradeManager.getLevel(UpgradeType.SPEED) * baseConsumption; + + speed *= (1 + upgradeManager.getLevel(UpgradeType.OVERDRIVE) * 5); + consumption += upgradeManager.getLevel(UpgradeType.OVERDRIVE) * baseConsumption * 50; + + consumption /= (1 + upgradeManager.getLevel(UpgradeType.POWER)); if(hasPower() && isProcessing()) { this.power -= consumption; @@ -221,20 +224,20 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement } else { progress = 0; } - + this.networkPackNT(50); } else { - + if(isProgressing) { audioDuration += 2; } else { audioDuration -= 3; } - + audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); - + if(audioDuration > 10) { - + if(audio == null) { audio = createAudioLoop(); audio.startSound(); @@ -244,9 +247,9 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audio.updateVolume(getVolume(1F)); audio.updatePitch((audioDuration - 10) / 100F + 0.5F); - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -254,7 +257,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement } } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -262,7 +265,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement buf.writeInt(progress); buf.writeBoolean(isProgressing); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -295,12 +298,12 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audio = null; } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord, @@ -311,7 +314,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement zCoord + 1 ); } - + return bb; } @@ -369,11 +372,12 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; } @Override @@ -381,4 +385,4 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement data.setBoolean(CompatEnergyControl.B_ACTIVE, this.progress > 0); data.setInteger(CompatEnergyControl.B_ACTIVE, this.progress); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java index c1f38d691..e845b225b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java @@ -1,12 +1,13 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerChemfac; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -33,7 +34,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase implements IUpgradeInfoProvider, IFluidCopiable { - + float rotSpeed; public float rot; public float prevRot; @@ -41,6 +42,8 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp public FluidTank water; public FluidTank steam; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineChemfac() { super(77); @@ -51,7 +54,7 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && i >= 1 && i <= 4 && stack.getItem() instanceof ItemMachineUpgrade) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } @@ -60,14 +63,14 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp @Override public void updateEntity() { super.updateEntity(); - + if(!worldObj.isRemote) { - + if(worldObj.getTotalWorldTime() % 60 == 0) { - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - + for(FluidTank tank : inTanks()) { if(tank.getTankType() != Fluids.NONE) { this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); @@ -75,77 +78,77 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp } } } - + for(DirPos pos : getConPos()) for(FluidTank tank : outTanks()) { if(tank.getTankType() != Fluids.NONE && tank.getFill() > 0) { this.sendFluid(tank, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + this.speed = 100; this.consumption = 100; - - UpgradeManager.eval(slots, 1, 4); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 6); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overLevel = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); - + upgradeManager.checkSlots(this, slots, 1, 4); + + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + int overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + this.speed -= speedLevel * 15; this.consumption += speedLevel * 300; this.speed += powerLevel * 5; this.consumption -= powerLevel * 20; this.speed /= (overLevel + 1); this.consumption *= (overLevel + 1); - + if(this.speed <= 0) { this.speed = 1; } - + this.networkPackNT(150); } else { - + float maxSpeed = 30F; - + if(isProgressing) { - + rotSpeed += 0.1; - + if(rotSpeed > maxSpeed) rotSpeed = maxSpeed; - + if(rotSpeed == maxSpeed && this.worldObj.getTotalWorldTime() % 5 == 0) { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); Random rand = worldObj.rand; - + double x = xCoord + 0.5 - rot.offsetX * 0.5; double y = yCoord + 3; double z = zCoord + 0.5 - rot.offsetZ * 0.5; - + worldObj.spawnParticle("cloud", x + dir.offsetX * 1.5 + rand.nextGaussian() * 0.15, y, z + dir.offsetZ * 1.5 + rand.nextGaussian() * 0.15, 0.0, 0.15, 0.0); worldObj.spawnParticle("cloud", x - dir.offsetX * 0.5 + rand.nextGaussian() * 0.15, y, z - dir.offsetZ * 0.5 + rand.nextGaussian() * 0.15, 0.0, 0.15, 0.0); } } else { - + rotSpeed -= 0.1; - + if(rotSpeed < 0) rotSpeed = 0; } - + prevRot = rot; - + rot += rotSpeed; - + if(rot >= 360) { rot -= 360; prevRot -= 360; } } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -154,15 +157,15 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp buf.writeInt(progress[i]); buf.writeInt(maxProgress[i]); } - + buf.writeBoolean(isProgressing); - + for(int i = 0; i < tanks.length; i++) tanks[i].serialize(buf); - + water.serialize(buf); steam.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -171,15 +174,15 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp progress[i] = buf.readInt(); maxProgress[i] = buf.readInt(); } - + isProgressing = buf.readBoolean(); - + for(int i = 0; i < tanks.length; i++) tanks[i].deserialize(buf); - + water.deserialize(buf); steam.deserialize(buf); } - + private int getWaterRequired() { return 1000 / this.speed; } @@ -201,19 +204,19 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp public long getMaxPower() { return 10_000_000; } - + protected List conPos; - + protected List getConPos() { - + if(conPos != null && !conPos.isEmpty()) return conPos; - + conPos = new ArrayList(); ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + for(int i = 0; i < 6; i++) { conPos.add(new DirPos(xCoord + dir.offsetX * (3 - i) + rot.offsetX * 3, yCoord + 4, zCoord + dir.offsetZ * (3 - i) + rot.offsetZ * 3, Library.POS_Y)); conPos.add(new DirPos(xCoord + dir.offsetX * (3 - i) - rot.offsetX * 2, yCoord + 4, zCoord + dir.offsetZ * (3 - i) - rot.offsetZ * 2, Library.POS_Y)); @@ -223,7 +226,7 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp conPos.add(new DirPos(xCoord + dir.offsetX * (3 - i) - rot.offsetX * 4, yCoord + 1 + j, zCoord + dir.offsetZ * (3 - i) - rot.offsetZ * 4, rot.getOpposite())); } } - + return conPos; } @@ -249,52 +252,52 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp DirPos[] inpos; DirPos[] outpos; - + @Override public DirPos[] getInputPositions() { - + if(inpos != null) return inpos; - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + inpos = new DirPos[] { new DirPos(xCoord + dir.offsetX * 4 - rot.offsetX * 1, yCoord, zCoord + dir.offsetZ * 4 - rot.offsetZ * 1, dir), new DirPos(xCoord - dir.offsetX * 5 + rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 5 + rot.offsetZ * 2, dir.getOpposite()), new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX * 4, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ * 4, rot.getOpposite()), new DirPos(xCoord + dir.offsetX * 1 + rot.offsetX * 5, yCoord, zCoord + dir.offsetZ * 1 + rot.offsetZ * 5, rot) }; - + return inpos; } @Override public DirPos[] getOutputPositions() { - + if(outpos != null) return outpos; - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + outpos = new DirPos[] { new DirPos(xCoord + dir.offsetX * 4 + rot.offsetX * 2, yCoord, zCoord + dir.offsetZ * 4 + rot.offsetZ * 2, dir), new DirPos(xCoord - dir.offsetX * 5 - rot.offsetX * 1, yCoord, zCoord - dir.offsetZ * 5 - rot.offsetZ * 1, dir.getOpposite()), new DirPos(xCoord + dir.offsetX * 1 - rot.offsetX * 4, yCoord, zCoord + dir.offsetZ * 1 - rot.offsetZ * 4, rot.getOpposite()), new DirPos(xCoord - dir.offsetX * 2 + rot.offsetX * 5, yCoord, zCoord - dir.offsetZ * 2 + rot.offsetZ * 5, rot) }; - + return outpos; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); water.readFromNBT(nbt, "w"); steam.readFromNBT(nbt, "s"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -309,27 +312,27 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp @Override protected List inTanks() { - + List inTanks = super.inTanks(); inTanks.add(water); - + return inTanks; } @Override protected List outTanks() { - + List outTanks = super.outTanks(); outTanks.add(steam); - + return outTanks; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 5, @@ -340,10 +343,10 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp zCoord + 5 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -383,11 +386,12 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase imp } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 6; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 12; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 6); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 12); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 256b98e1f..d352430a5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -1,11 +1,12 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.RecipesCommon.AStack; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineChemplant; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -49,15 +50,17 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public int progress; public int maxProgress = 100; public boolean isProgressing; - + private AudioWrapper audio; - + public FluidTank[] tanks; - + //upgraded stats int consumption = 100; int speed = 100; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineChemplant() { super(21); /* @@ -71,7 +74,7 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements * 17-18 FIn In * 19-20 FIn Out */ - + tanks = new FluidTank[4]; for(int i = 0; i < 4; i++) { tanks[i] = new FluidTank(Fluids.NONE, 24_000); @@ -82,7 +85,7 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public String getName() { return "container.chemplant"; } - + // last successful load int lsl0 = 0; int lsl1 = 0; @@ -91,23 +94,23 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.speed = 100; this.consumption = 100; - + this.isProgressing = false; this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); int fluidDelay = 40; - + if(lsu0 >= fluidDelay && tanks[0].loadTank(17, 19, slots)) lsl0 = 0; if(lsu1 >= fluidDelay && tanks[1].loadTank(18, 20, slots)) lsl1 = 0; - + if(lsl0 >= fluidDelay && slots[17] != null && !FluidTank.noDualUnload.contains(slots[17].getItem())) if(tanks[0].unloadTank(17, 19, slots)) lsu0 = 0; if(lsl1 >= fluidDelay && slots[18] != null && !FluidTank.noDualUnload.contains(slots[18].getItem())) if(tanks[1].unloadTank(18, 20, slots)) lsu1 = 0; - + tanks[2].unloadTank(9, 11, slots); tanks[3].unloadTank(10, 12, slots); @@ -115,48 +118,48 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements if(lsl1 < fluidDelay) lsl1++; if(lsu0 < fluidDelay) lsu0++; if(lsu1 < fluidDelay) lsu1++; - + loadItems(); unloadItems(); - + if(worldObj.getTotalWorldTime() % 20 == 0) { this.updateConnections(); } - + for(DirPos pos : getConPos()) { if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(tanks[3].getFill() > 0) this.sendFluid(tanks[3], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - UpgradeManager.eval(slots, 1, 3); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overLevel = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); - + upgradeManager.checkSlots(this, slots, 1, 3); + + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + int overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + this.speed -= speedLevel * 25; this.consumption += speedLevel * 300; this.speed += powerLevel * 5; this.consumption -= powerLevel * 20; this.speed /= (overLevel + 1); this.consumption *= (overLevel + 1); - + if(this.speed <= 0) { this.speed = 1; } - + if(!canProcess()) { this.progress = 0; } else { isProgressing = true; process(); } - + this.networkPackNT(150); } else { - + if(isProgressing && this.worldObj.getTotalWorldTime() % 3 == 0) { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); double x = xCoord + 0.5 + dir.offsetX * 1.125 + rot.offsetX * 0.125; @@ -164,11 +167,11 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements double z = zCoord + 0.5 + dir.offsetZ * 1.125 + rot.offsetZ * 0.125; worldObj.spawnParticle("cloud", x, y, z, 0.0, 0.1, 0.0); } - + float volume = this.getVolume(1F); - + if(isProgressing && volume > 0) { - + if(audio == null) { audio = this.createAudioLoop(); audio.updateVolume(volume); @@ -177,9 +180,9 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements audio = rebootAudio(audio); audio.updateVolume(volume); } - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -199,7 +202,7 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements for(int i = 0; i < tanks.length; i++) tanks[i].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -211,7 +214,7 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements for(int i = 0; i < tanks.length; i++) tanks[i].deserialize(buf); } - + @Override public AudioWrapper createAudioLoop() { return MainRegistry.proxy.getLoopedSound("hbm:block.chemplantOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); @@ -236,21 +239,21 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements audio = null; } } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + return new DirPos[] { new DirPos(xCoord + rot.offsetX * 3, yCoord, zCoord + rot.offsetZ * 3, rot), new DirPos(xCoord - rot.offsetX * 2, yCoord, zCoord - rot.offsetZ * 2, rot.getOpposite()), @@ -258,69 +261,69 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements new DirPos(xCoord - rot.offsetX * 2 + dir.offsetX, yCoord, zCoord - rot.offsetZ * 2 + dir.offsetZ, rot.getOpposite()) }; } - + private boolean canProcess() { - + if(slots[4] == null || slots[4].getItem() != ModItems.chemistry_template) return false; - + ChemRecipe recipe = ChemplantRecipes.indexMapping.get(slots[4].getItemDamage()); - + if(recipe == null) return false; - + setupTanks(recipe); - + if(this.power < this.consumption) return false; if(!hasRequiredFluids(recipe)) return false; if(!hasSpaceForFluids(recipe)) return false; if(!hasRequiredItems(recipe)) return false; if(!hasSpaceForItems(recipe)) return false; - + return true; } - + private void setupTanks(ChemRecipe recipe) { if(recipe.inputFluids[0] != null) tanks[0].withPressure(recipe.inputFluids[0].pressure).setTankType(recipe.inputFluids[0].type); else tanks[0].setTankType(Fluids.NONE); if(recipe.inputFluids[1] != null) tanks[1].withPressure(recipe.inputFluids[1].pressure).setTankType(recipe.inputFluids[1].type); else tanks[1].setTankType(Fluids.NONE); if(recipe.outputFluids[0] != null) tanks[2].withPressure(recipe.outputFluids[0].pressure).setTankType(recipe.outputFluids[0].type); else tanks[2].setTankType(Fluids.NONE); if(recipe.outputFluids[1] != null) tanks[3].withPressure(recipe.outputFluids[1].pressure).setTankType(recipe.outputFluids[1].type); else tanks[3].setTankType(Fluids.NONE); } - + private boolean hasRequiredFluids(ChemRecipe recipe) { if(recipe.inputFluids[0] != null && tanks[0].getFill() < recipe.inputFluids[0].fill) return false; if(recipe.inputFluids[1] != null && tanks[1].getFill() < recipe.inputFluids[1].fill) return false; return true; } - + private boolean hasSpaceForFluids(ChemRecipe recipe) { if(recipe.outputFluids[0] != null && tanks[2].getFill() + recipe.outputFluids[0].fill > tanks[2].getMaxFill()) return false; if(recipe.outputFluids[1] != null && tanks[3].getFill() + recipe.outputFluids[1].fill > tanks[3].getMaxFill()) return false; return true; } - + private boolean hasRequiredItems(ChemRecipe recipe) { return InventoryUtil.doesArrayHaveIngredients(slots, 13, 16, recipe.inputs); } - + private boolean hasSpaceForItems(ChemRecipe recipe) { return InventoryUtil.doesArrayHaveSpace(slots, 5, 8, recipe.outputs); } - + private void process() { - + this.power -= this.consumption; this.progress++; - + if(slots[0] != null && slots[0].getItem() == ModItems.meteorite_sword_machined) slots[0] = new ItemStack(ModItems.meteorite_sword_treated); //fisfndmoivndlmgindgifgjfdnblfm - + ChemRecipe recipe = ChemplantRecipes.indexMapping.get(slots[4].getItemDamage()); - + this.maxProgress = recipe.getDuration() * this.speed / 100; - + if(maxProgress <= 0) maxProgress = 1; - + if(this.progress >= this.maxProgress) { consumeFluids(recipe); produceFluids(recipe); @@ -330,81 +333,81 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements this.markDirty(); } } - + private void consumeFluids(ChemRecipe recipe) { if(recipe.inputFluids[0] != null) tanks[0].setFill(tanks[0].getFill() - recipe.inputFluids[0].fill); if(recipe.inputFluids[1] != null) tanks[1].setFill(tanks[1].getFill() - recipe.inputFluids[1].fill); } - + private void produceFluids(ChemRecipe recipe) { if(recipe.outputFluids[0] != null) tanks[2].setFill(tanks[2].getFill() + recipe.outputFluids[0].fill); if(recipe.outputFluids[1] != null) tanks[3].setFill(tanks[3].getFill() + recipe.outputFluids[1].fill); } - + private void consumeItems(ChemRecipe recipe) { - + for(AStack in : recipe.inputs) { if(in != null) InventoryUtil.tryConsumeAStack(slots, 13, 16, in); } } - + private void produceItems(ChemRecipe recipe) { - + for(ItemStack out : recipe.outputs) { if(out != null) InventoryUtil.tryAddItemToInventory(slots, 5, 8, out.copy()); } } - + //TODO: move this into a util class private void loadItems() { - + if(slots[4] == null || slots[4].getItem() != ModItems.chemistry_template) return; - + ChemRecipe recipe = ChemplantRecipes.indexMapping.get(slots[4].getItemDamage()); - + if(recipe != null) { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); int x = xCoord - dir.offsetX * 2; int z = zCoord - dir.offsetZ * 2; - + TileEntity te = worldObj.getTileEntity(x, yCoord, z); - + if(te instanceof IInventory) { - + IInventory inv = (IInventory) te; ISidedInventory sided = inv instanceof ISidedInventory ? (ISidedInventory) inv : null; int[] access = sided != null ? sided.getAccessibleSlotsFromSide(dir.ordinal()) : null; - + for(AStack ingredient : recipe.inputs) { - + outer: while(!InventoryUtil.doesArrayHaveIngredients(slots, 13, 16, ingredient)) { - + boolean found = false; - + for(int i = 0; i < (access != null ? access.length : inv.getSizeInventory()); i++) { int slot = access != null ? access[i] : i; ItemStack stack = inv.getStackInSlot(slot); - + if(ingredient.matchesRecipe(stack, true) && (sided == null || sided.canExtractItem(slot, stack, 0))) { - + for(int j = 13; j <= 16; j++) { - + if(slots[j] != null && slots[j].stackSize < slots[j].getMaxStackSize() & InventoryUtil.doesStackDataMatch(slots[j], stack)) { inv.decrStackSize(slot, 1); slots[j].stackSize++; continue outer; } } - + for(int j = 13; j <= 16; j++) { - + if(slots[j] == null) { slots[j] = stack.copy(); slots[j].stackSize = 1; @@ -421,43 +424,43 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements } } } - + private void unloadItems() { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); int x = xCoord + dir.offsetX * 3 + rot.offsetX; int z = zCoord + dir.offsetZ * 3 + rot.offsetZ; - + TileEntity te = worldObj.getTileEntity(x, yCoord, z); - + if(te instanceof IInventory) { - + IInventory inv = (IInventory) te; ISidedInventory sided = inv instanceof ISidedInventory ? (ISidedInventory) inv : null; int[] access = sided != null ? sided.getAccessibleSlotsFromSide(dir.ordinal()) : null; - + boolean shouldOutput = true; - + while(shouldOutput) { shouldOutput = false; outer: for(int i = 5; i <= 8; i++) { - + ItemStack out = slots[i]; - + if(out != null) { - + for(int j = 0; j < (access != null ? access.length : inv.getSizeInventory()); j++) { - + int slot = access != null ? access[j] : j; - + if(!inv.isItemValidForSlot(slot, out)) continue; - + ItemStack target = inv.getStackInSlot(slot); - + if(InventoryUtil.doesStackDataMatch(out, target) && target.stackSize < Math.min(target.getMaxStackSize(), inv.getInventoryStackLimit())) { int toDec = Math.min(out.stackSize, Math.min(target.getMaxStackSize(), inv.getInventoryStackLimit()) - target.stackSize); this.decrStackSize(i, toDec); @@ -466,14 +469,14 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements break outer; } } - + for(int j = 0; j < (access != null ? access.length : inv.getSizeInventory()); j++) { - + int slot = access != null ? access[j] : j; - + if(!inv.isItemValidForSlot(slot, out)) continue; - + if(inv.getStackInSlot(slot) == null && (sided != null ? sided.canInsertItem(slot, out, dir.ordinal()) : inv.isItemValidForSlot(slot, out))) { ItemStack copy = out.copy(); copy.stackSize = 1; @@ -503,36 +506,36 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public long getMaxPower() { return maxPower; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); this.progress = nbt.getInteger("progress"); - + for(int i = 0; i < tanks.length; i++) { tanks[i].readFromNBT(nbt, "t" + i); } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setInteger("progress", progress); - + for(int i = 0; i < tanks.length; i++) { tanks[i].writeToNBT(nbt, "t" + i); } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -543,10 +546,10 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -601,10 +604,11 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 9; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 9); + return upgrades; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java index 844c9b705..e7e5ad2d5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java @@ -1,11 +1,12 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerCompressor; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -15,10 +16,7 @@ import com.hbm.inventory.recipes.CompressorRecipes.CompressorRecipe; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.IFluidCopiable; -import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.IUpgradeInfoProvider; -import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.tileentity.*; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; @@ -39,7 +37,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineCompressor extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider, IFluidCopiable { - + public FluidTank[] tanks; public long power; public static final long maxPower = 100_000; @@ -49,13 +47,15 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement public static final int processTimeBase = 100; public int powerRequirement; public static final int powerRequirementBase = 2_500; - + public float fanSpin; public float prevFanSpin; public float piston; public float prevPiston; public boolean pistonDir; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineCompressor() { super(4); this.tanks = new FluidTank[2]; @@ -70,23 +70,23 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(worldObj.getTotalWorldTime() % 20 == 0) { this.updateConnections(); } - + this.power = Library.chargeTEFromItems(slots, 1, power, maxPower); this.tanks[0].setType(0, slots); this.setupTanks(); - - UpgradeManager.eval(slots, 1, 3); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overLevel = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); - + upgradeManager.checkSlots(this, slots, 1, 3); + + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + int overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + CompressorRecipe rec = CompressorRecipes.recipes.get(new Pair(tanks[0].getTankType(), tanks[0].getPressure())); int timeBase = this.processTimeBase; if(rec != null) timeBase = rec.duration; @@ -98,44 +98,44 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement this.powerRequirement = this.powerRequirementBase / (powerLevel + 1); this.processTime = this.processTime / (overLevel + 1); this.powerRequirement = this.powerRequirement * ((overLevel * 2) + 1); - + if(processTime <= 0) processTime = 1; - + if(canProcess()) { this.progress++; this.isOn = true; this.power -= powerRequirement; - + if(progress >= this.processTime) { progress = 0; this.process(); this.markChanged(); } - + } else { this.progress = 0; this.isOn = false; } - + for(DirPos pos : getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } this.networkPackNT(100); - + } else { - + this.prevFanSpin = this.fanSpin; this.prevPiston = this.piston; - + if(this.isOn) { this.fanSpin += 15; - + if(this.fanSpin >= 360) { this.prevFanSpin -= 360; this.fanSpin -= 360; } - + if(this.pistonDir) { this.piston -= randSpeed; if(this.piston <= 0) { @@ -149,12 +149,12 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement this.pistonDir = !this.pistonDir; } } - + this.piston = MathHelper.clamp_float(this.piston, 0F, 1F); } } } - + private float randSpeed = 0.1F; @Override @@ -180,42 +180,42 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement tanks[1].deserialize(buf); this.isOn = buf.readBoolean(); } - + private void updateConnections() { for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + rot.offsetX * 2, yCoord, zCoord + rot.offsetZ * 2, rot), new DirPos(xCoord - rot.offsetX * 2, yCoord, zCoord - rot.offsetZ * 2, rot.getOpposite()), new DirPos(xCoord - dir.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2, dir.getOpposite()), }; } - + public boolean canProcess() { - + if(this.power <= powerRequirement) return false; - + CompressorRecipe recipe = CompressorRecipes.recipes.get(new Pair(tanks[0].getTankType(), tanks[0].getPressure())); - + if(recipe == null) { return tanks[0].getFill() >= 1000 && tanks[1].getFill() + 1000 <= tanks[1].getMaxFill(); } - + return tanks[0].getFill() > recipe.inputAmount && tanks[1].getFill() + recipe.output.fill <= tanks[1].getMaxFill(); } - + public void process() { - + CompressorRecipe recipe = CompressorRecipes.recipes.get(new Pair(tanks[0].getTankType(), tanks[0].getPressure())); - + if(recipe == null) { tanks[0].setFill(tanks[0].getFill() - 1_000); tanks[1].setFill(tanks[1].getFill() + 1_000); @@ -224,18 +224,18 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement tanks[1].setFill(tanks[1].getFill() + recipe.output.fill); } } - + protected void setupTanks() { - + CompressorRecipe recipe = CompressorRecipes.recipes.get(new Pair(tanks[0].getTankType(), tanks[0].getPressure())); - + if(recipe == null) { tanks[1].withPressure(tanks[0].getPressure() + 1).setTankType(tanks[0].getTankType()); } else { tanks[1].withPressure(recipe.output.pressure).setTankType(recipe.output.type); } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -244,7 +244,7 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement tanks[0].readFromNBT(nbt, "0"); tanks[1].readFromNBT(nbt, "1"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -273,18 +273,18 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement @Override public void receiveControl(NBTTagCompound data) { int compression = data.getInteger("compression"); - + if(compression != tanks[0].getPressure()) { tanks[0].withPressure(compression); - + CompressorRecipe recipe = CompressorRecipes.recipes.get(new Pair(tanks[0].getTankType(), compression)); - + if(recipe == null) { tanks[1].withPressure(compression + 1); } else { tanks[1].withPressure(recipe.output.pressure).setTankType(recipe.output.type); } - + this.markChanged(); } } @@ -318,12 +318,12 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -334,10 +334,10 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -365,11 +365,12 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 9; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 9); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index 0fe75035d..23771df85 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.extprop.HbmPlayerProps; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerCrystallizer; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -15,10 +16,7 @@ import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.IFluidCopiable; -import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.IUpgradeInfoProvider; -import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.tileentity.*; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; @@ -40,19 +38,21 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineCrystallizer extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable { - + public long power; public static final long maxPower = 1000000; public static final int demand = 1000; public short progress; public short duration = 600; public boolean isOn; - + public float angle; public float prevAngle; - + public FluidTank tank; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineCrystallizer() { super(8); tank = new FluidTank(Fluids.PEROXIDE, 8000); @@ -65,76 +65,76 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.isOn = false; - + this.updateConnections(); - + power = Library.chargeTEFromItems(slots, 1, power, maxPower); tank.setType(7, slots); tank.loadTank(3, 4, slots); - - UpgradeManager.eval(slots, 5, 6); - + + upgradeManager.checkSlots(this, slots, 5, 6); + for(int i = 0; i < getCycleCount(); i++) { - + if(canProcess()) { - + progress++; power -= getPowerRequired(); isOn = true; - + if(progress > getDuration()) { progress = 0; processItem(); - + this.markDirty(); } - + } else { progress = 0; } } - + this.networkPackNT(25); } else { - + prevAngle = angle; - + if(isOn) { angle += 5F * this.getCycleCount(); - + if(angle >= 360) { angle -= 360; prevAngle -= 360; } - + if(worldObj.rand.nextInt(20) == 0 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 6, zCoord + 0.5) < 50) { worldObj.spawnParticle("cloud", xCoord + worldObj.rand.nextDouble(), yCoord + 6.5D, zCoord + worldObj.rand.nextDouble(), 0.0, 0.1, 0.0); } } } - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.25, yCoord + 1, zCoord + 0.25, xCoord + 0.75, yCoord + 6, zCoord + 0.75).offset(rot.offsetX * 1.5, 0, rot.offsetZ * 1.5)); - + for(EntityPlayer player : players) { HbmPlayerProps props = HbmPlayerProps.getData(player); props.isOnLadder = true; } } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + protected DirPos[] getConPos() { return new DirPos[] { @@ -148,7 +148,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z) }; } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -158,7 +158,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme buf.writeBoolean(isOn); tank.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -168,103 +168,103 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme isOn = buf.readBoolean(); tank.deserialize(buf); } - + private void processItem() { CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0], tank.getTankType()); - + if(result == null) //never happens but you can't be sure enough return; - + ItemStack stack = result.output.copy(); - + if(slots[2] == null) slots[2] = stack; else if(slots[2].stackSize + stack.stackSize <= slots[2].getMaxStackSize()) slots[2].stackSize += stack.stackSize; - + tank.setFill(tank.getFill() - getRequiredAcid(result.acidAmount)); - + float freeChance = this.getFreeChance(); - + if(freeChance == 0 || freeChance < worldObj.rand.nextFloat()) this.decrStackSize(0, result.itemAmount); } - + private boolean canProcess() { - + //Is there no input? if(slots[0] == null) return false; - + if(power < getPowerRequired()) return false; - + CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0], tank.getTankType()); - + //Or output? if(result == null) return false; - + //Not enough of the input item? if(slots[0].stackSize < result.itemAmount) return false; - + if(tank.getFill() < getRequiredAcid(result.acidAmount)) return false; - + ItemStack stack = result.output.copy(); - + //Does the output not match? if(slots[2] != null && (slots[2].getItem() != stack.getItem() || slots[2].getItemDamage() != stack.getItemDamage())) return false; - + //Or is the output slot already full? if(slots[2] != null && slots[2].stackSize + stack.stackSize > slots[2].getMaxStackSize()) return false; - + return true; } - + public int getRequiredAcid(int base) { - int efficiency = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); + int efficiency = upgradeManager.getLevel(UpgradeType.EFFECT); if(efficiency > 0) { return base * (efficiency + 2); } return base; } - + public float getFreeChance() { - int efficiency = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); + int efficiency = upgradeManager.getLevel(UpgradeType.EFFECT); if(efficiency > 0) { return Math.min(efficiency * 0.05F, 0.15F); } return 0; } - + public short getDuration() { CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0], tank.getTankType()); int base = result != null ? result.duration : 600; - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); + int speed = upgradeManager.getLevel(UpgradeType.SPEED); if(speed > 0) { return (short) Math.ceil((base * Math.max(1F - 0.25F * speed, 0.25F))); } return (short) base; } - + public int getPowerRequired() { - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); + int speed = upgradeManager.getLevel(UpgradeType.SPEED); return (int) (demand + Math.min(speed * 1000, 3000)); } - + public float getCycleCount() { - int speed = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); + int speed = upgradeManager.getLevel(UpgradeType.OVERDRIVE); return Math.min(1 + speed * 2, 7); } - + public long getPowerScaled(int i) { return (power * i) / maxPower; } - + public int getProgressScaled(int i) { return (progress * i) / duration; } @@ -283,34 +283,34 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme public long getMaxPower() { return maxPower; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + power = nbt.getLong("power"); tank.readFromNBT(nbt, "tank"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); tank.writeToNBT(nbt, "tank"); } @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - + CrystallizerRecipe recipe = CrystallizerRecipes.getOutput(itemStack, tank.getTankType()); if(i == 0 && recipe != null) { return true; } - + if(i == 1 && itemStack.getItem() instanceof IBatteryItem) return true; - + return false; } @@ -321,15 +321,15 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public int[] getAccessibleSlotsFromSide(int side) { - + return side == 0 ? new int[] { 2 } : new int[] { 0, 2 }; } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -339,7 +339,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && i >= 5 && i <= 6 && stack.getItem() instanceof ItemMachineUpgrade) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } @@ -388,11 +388,12 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.EFFECT) return 3; - if(type == UpgradeType.OVERDRIVE) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.EFFECT, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index 7224feee4..b254d0fdf 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.container.ContainerMachineCyclotron; @@ -39,21 +40,23 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider, IInfoProviderEC, IFluidCopiable { - + public long power; public static final long maxPower = 100000000; public static int consumption = 1_000_000; - - private byte plugs; - + + private byte plugs; + public int progress; public static final int duration = 690; - + public FluidTank[] tanks; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineCyclotron() { super(12); - + this.tanks = new FluidTank[3]; this.tanks[0] = new FluidTank(Fluids.WATER, 32000); this.tanks[1] = new FluidTank(Fluids.SPENTSTEAM, 32000); @@ -67,67 +70,67 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.updateConnections(); this.power = Library.chargeTEFromItems(slots, 9, power, maxPower); - - UpgradeManager.eval(slots, 10, 11); - + + upgradeManager.checkSlots(this, slots, 10, 11); + if(canProcess()) { progress += getSpeed(); power -= getConsumption(); - + int convert = getCoolantConsumption(); tanks[0].setFill(tanks[0].getFill() - convert); tanks[1].setFill(tanks[1].getFill() + convert); - + if(progress >= duration) { process(); progress = 0; this.markDirty(); } - + } else { progress = 0; } - + this.sendFluid(); this.networkPackNT(25); } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeLong(power); buf.writeInt(progress); buf.writeByte(plugs); - + for(int i = 0; i < 3; i++) tanks[i].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); power = buf.readLong(); progress = buf.readInt(); plugs = buf.readByte(); - + for(int i = 0; i < 3; i++) tanks[i].deserialize(buf); } - + private void updateConnections() { for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private void sendFluid() { for(int i = 1; i < 3; i++) { if(tanks[i].getFill() > 0) { @@ -137,7 +140,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements } } } - + public DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 3, yCoord, zCoord + 1, Library.POS_X), @@ -150,93 +153,93 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements new DirPos(xCoord - 1, yCoord, zCoord - 3, Library.NEG_Z) }; } - + public boolean canProcess() { - + if(power < getConsumption()) return false; - + int convert = getCoolantConsumption(); - + if(tanks[0].getFill() < convert) return false; - + if(tanks[1].getFill() + convert > tanks[1].getMaxFill()) return false; - + for(int i = 0; i < 3; i++) { - + Object[] res = CyclotronRecipes.getOutput(slots[i + 3], slots[i]); - + if(res == null) continue; - + ItemStack out = (ItemStack)res[0]; - + if(out == null) continue; - + if(slots[i + 6] == null) return true; - + if(slots[i + 6].getItem() == out.getItem() && slots[i + 6].getItemDamage() == out.getItemDamage() && slots[i + 6].stackSize < out.getMaxStackSize()) return true; } - + return false; } - + public void process() { - + for(int i = 0; i < 3; i++) { - + Object[] res = CyclotronRecipes.getOutput(slots[i + 3], slots[i]); - + if(res == null) continue; - + ItemStack out = (ItemStack)res[0]; - + if(out == null) continue; - + if(slots[i + 6] == null) { - + this.decrStackSize(i, 1); this.decrStackSize(i + 3, 1); slots[i + 6] = out; - + this.tanks[2].setFill(this.tanks[2].getFill() + (Integer)res[1]); - + continue; } - + if(slots[i + 6].getItem() == out.getItem() && slots[i + 6].getItemDamage() == out.getItemDamage() && slots[i + 6].stackSize < out.getMaxStackSize()) { - + this.decrStackSize(i, 1); this.decrStackSize(i + 3, 1); slots[i + 6].stackSize++; - + this.tanks[2].setFill(this.tanks[2].getFill() + (Integer)res[1]); } } - + if(this.tanks[2].getFill() > this.tanks[2].getMaxFill()) this.tanks[2].setFill(this.tanks[2].getMaxFill()); } - + public int getSpeed() { - return Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) + 1; + return upgradeManager.getLevel(UpgradeType.SPEED) + 1; } - + public int getConsumption() { - int efficiency = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - + int efficiency = upgradeManager.getLevel(UpgradeType.POWER); + return consumption - 100_000 * efficiency; } - + public int getCoolantConsumption() { - int efficiency = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); + int efficiency = upgradeManager.getLevel(UpgradeType.EFFECT); //half a small tower's worth return 500 / (efficiency + 1) * getSpeed(); } @@ -248,67 +251,67 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements public int getProgressScaled(int i) { return (progress * i) / duration; } - + @Override public AxisAlignedBB getRenderBoundingBox() { return AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord, zCoord - 2, xCoord + 3, yCoord + 4, zCoord + 3); } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + for(int i = 0; i < 3; i++) tanks[i].readFromNBT(nbt, "t" + i); - + this.progress = nbt.getInteger("progress"); this.power = nbt.getLong("power"); this.plugs = nbt.getByte("plugs"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + for(int i = 0; i < 3; i++) tanks[i].writeToNBT(nbt, "t" + i); - + nbt.setInteger("progress", progress); nbt.setLong("power", power); nbt.setByte("plugs", plugs); } - + public void setPlug(int index) { this.plugs |= (1 << index); this.markDirty(); } - + public boolean getPlug(int index) { return (this.plugs & (1 << index)) > 0; } - + public static Item getItemForPlug(int i) { - + switch(i) { case 0: return ModItems.powder_balefire; case 1: return ModItems.book_of_; case 2: return ModItems.diamond_gavel; case 3: return ModItems.coin_maskman; } - + return null; } @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && i >= 14 && i <= 15 && stack.getItem() instanceof ItemMachineUpgrade) worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.5F, 1.0F); } @@ -356,7 +359,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements @Override public boolean isItemValidForSlot(int x, int y, int z, int slot, ItemStack stack) { - + if(slot < 3) { for(Entry, Pair> entry : CyclotronRecipes.recipes.entrySet()) { if(entry.getKey().getKey().matchesRecipe(stack, true)) return true; @@ -367,7 +370,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements if(entry.getKey().getValue().matchesRecipe(stack, true)) return true; } } - + return false; } @@ -383,7 +386,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements @Override public int[] getAccessibleSlotsFromSide(int x, int y, int z, int side) { - + for(int i = 2; i < 6; i++) { ForgeDirection dir = ForgeDirection.getOrientation(i); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); @@ -392,7 +395,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements if(x == xCoord + dir.offsetX * 2 && z == zCoord + dir.offsetZ * 2) return new int[] {1, 4, 6, 7, 8}; if(x == xCoord + dir.offsetX * 2 - rot.offsetX && z == zCoord + dir.offsetZ * 2 - rot.offsetZ) return new int[] {2, 5, 6, 7, 8}; } - + return new int[] {6, 7, 8}; } @@ -417,11 +420,12 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.EFFECT) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.EFFECT, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index 2327c79fb..0462f77f7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -1,9 +1,10 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineEPress; import com.hbm.inventory.gui.GUIMachineEPress; import com.hbm.inventory.recipes.PressRecipes; @@ -44,9 +45,11 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE public final static int maxPress = 200; boolean isRetracting = false; private int delay; - + public ItemStack syncStack; - + + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineEPress() { super(5); } @@ -55,39 +58,39 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE public String getName() { return "container.epress"; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.updateConnections(); power = Library.chargeTEFromItems(slots, 0, power, maxPower); - + boolean canProcess = this.canProcess(); - + if((canProcess || this.isRetracting || this.delay > 0) && power >= 100) { - + power -= 100; - + if(delay <= 0) { - - UpgradeManager.eval(slots, 4, 4); - int speed = 1 + Math.min(3, UpgradeManager.getLevel(UpgradeType.SPEED)); - + + upgradeManager.checkSlots(this, slots, 4, 4); + int speed = 1 + upgradeManager.getLevel(UpgradeType.SPEED); + int stampSpeed = this.isRetracting ? 20 : 45; stampSpeed *= (1D + (double) speed / 4D); - + if(this.isRetracting) { this.press -= stampSpeed; - + if(this.press <= 0) { this.isRetracting = false; this.delay = 5 - speed + 1; } } else if(canProcess) { this.press += stampSpeed; - + if(this.press >= this.maxPress) { this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.pressOperate", getVolume(1.5F), 1.0F); ItemStack output = PressRecipes.getOutput(slots[2], slots[1]); @@ -97,17 +100,17 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE slots[3].stackSize += output.stackSize; } this.decrStackSize(2, 1); - + if(slots[1].getMaxDamage() != 0) { slots[1].setItemDamage(slots[1].getItemDamage() + 1); if(slots[1].getItemDamage() >= slots[1].getMaxDamage()) { slots[1] = null; } } - + this.isRetracting = true; this.delay = 5 - speed + 1; - + this.markDirty(); } } else if(this.press > 0){ @@ -117,14 +120,14 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE delay--; } } - + this.networkPackNT(50); - + } else { - + // approach-based interpolation, GO! this.lastPress = this.renderPress; - + if(this.turnProgress > 0) { this.renderPress = this.renderPress + ((this.syncPress - this.renderPress) / (double) this.turnProgress); --this.turnProgress; @@ -156,35 +159,35 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE this.turnProgress = 2; } - + public boolean canProcess() { if(power < 100) return false; if(slots[1] == null || slots[2] == null) return false; - + ItemStack output = PressRecipes.getOutput(slots[2], slots[1]); - + if(output == null) return false; - + if(slots[3] == null) return true; if(slots[3].stackSize + output.stackSize <= slots[3].getMaxStackSize() && slots[3].getItem() == output.getItem() && slots[3].getItemDamage() == output.getItemDamage()) return true; return false; } - + private void updateConnections() { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - + if(stack.getItem() instanceof ItemStamp) return i == 1; - + return i == 2; } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 1, 2, 3 }; @@ -199,16 +202,16 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE public boolean canExtractItem(int i, ItemStack itemStack, int j) { return i == 3; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + press = nbt.getInteger("press"); power = nbt.getInteger("power"); isRetracting = nbt.getBoolean("ret"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -221,7 +224,7 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE @Override public void setPower(long i) { power = i; - + } @Override @@ -233,19 +236,19 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE public long getMaxPower() { return maxPower; } - + AxisAlignedBB aabb; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(aabb != null) return aabb; - + aabb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 3, zCoord + 1); return aabb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -277,9 +280,10 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index 0442a250d..3f8223d23 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -1,12 +1,13 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachineElectricFurnace; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerElectricFurnace; import com.hbm.inventory.gui.GUIMachineElectricFurnace; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -44,6 +45,8 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl private static final int[] slots_io = new int[] { 0, 1, 2 }; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineElectricFurnace() { super(4); } @@ -69,7 +72,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); this.progress = nbt.getInteger("progress"); } @@ -114,7 +117,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl } public boolean canProcess() { - + if(slots[1] == null || cooldown > 0) { return false; } @@ -167,7 +170,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl boolean markDirty = false; if(!worldObj.isRemote) { - + if(cooldown > 0) { cooldown--; } @@ -179,16 +182,16 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl this.consumption = 50; this.maxProgress = 100; - UpgradeManager.eval(slots, 3, 3); + upgradeManager.checkSlots(this, slots, 3, 3); - int speedLevel = UpgradeManager.getLevel(UpgradeType.SPEED); - int powerLevel = UpgradeManager.getLevel(UpgradeType.POWER); + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); maxProgress -= speedLevel * 25; consumption += speedLevel * 50; maxProgress += powerLevel * 10; consumption -= powerLevel * 15; - + if(!hasPower()) { cooldown = 20; } @@ -197,7 +200,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl progress++; power -= consumption; - + if(worldObj.getTotalWorldTime() % 20 == 0) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND); if(this.progress >= maxProgress) { @@ -219,7 +222,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl markDirty = true; MachineElectricFurnace.updateBlockState(this.progress > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); } - + this.networkPackNT(50); @@ -228,7 +231,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl } } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -236,7 +239,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl buf.writeInt(maxProgress); buf.writeInt(progress); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -244,7 +247,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl maxProgress = buf.readInt(); progress = buf.readInt(); } - + private void updateConnections() { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) @@ -298,9 +301,10 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + return upgrades; } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java index 479a91fe7..eb111033b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java @@ -1,10 +1,7 @@ package com.hbm.tileentity.machine; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Random; +import java.util.*; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; @@ -12,7 +9,7 @@ import com.hbm.blocks.generic.BlockBedrockOreTE.TileEntityBedrockOre; import com.hbm.blocks.network.CraneInserter; import com.hbm.entity.item.EntityMovingItem; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineExcavator; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -65,13 +62,13 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements public static final long maxPower = 1_000_000; public long power; public boolean operational = false; - + public boolean enableDrill = false; public boolean enableCrusher = false; public boolean enableWalling = false; public boolean enableVeinMiner = false; public boolean enableSilkTouch = false; - + protected int ticksWorked = 0; protected int targetDepth = 0; //0 is the first block below null position protected boolean bedrockDrilling = false; @@ -83,13 +80,15 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements public float crusherRotation = 0F; public float prevCrusherRotation = 0F; public int chuteTimer = 0; - + public double speed = 1.0D; public final long baseConsumption = 10_000L; public long consumption = baseConsumption; - + public FluidTank tank; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineExcavator() { super(14); this.tank = new FluidTank(Fluids.SULFURIC_ACID, 16_000); @@ -102,48 +101,48 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements @Override public void updateEntity() { - + //needs to happen on client too for GUI rendering - UpgradeManager.eval(slots, 2, 3); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - + upgradeManager.checkSlots(this, slots, 2, 3); + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + consumption = baseConsumption * (1 + speedLevel); consumption /= (1 + powerLevel); - + if(!worldObj.isRemote) { - + this.tank.setType(1, slots); - + if(worldObj.getTotalWorldTime() % 20 == 0) { tryEjectBuffer(); - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + if(chuteTimer > 0) chuteTimer--; - + this.power = Library.chargeTEFromItems(slots, 0, this.getPower(), this.getMaxPower()); this.operational = false; - int radiusLevel = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); - + int radiusLevel = upgradeManager.getLevel(UpgradeType.EFFECT); + EnumDrillType type = this.getInstalledDrill(); if(this.enableDrill && type != null && this.power >= this.getPowerConsumption()) { - + operational = true; this.power -= this.getPowerConsumption(); - + this.speed = type.speed; this.speed *= (1 + speedLevel / 2D); - + int maxDepth = this.yCoord - 4; if((bedrockDrilling || targetDepth <= maxDepth) && tryDrill(1 + radiusLevel * 2)) { targetDepth++; - + if(targetDepth > maxDepth) { this.enableDrill = false; } @@ -151,17 +150,17 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } else { this.targetDepth = 0; } - + this.networkPackNT(150); - + } else { - + this.prevDrillExtension = this.drillExtension; - + if(this.drillExtension != this.targetDepth) { float diff = Math.abs(this.drillExtension - this.targetDepth); float speed = Math.max(0.15F, diff / 10F); - + if(diff <= speed) { this.drillExtension = this.targetDepth; } else { @@ -172,31 +171,31 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements this.prevDrillRotation = this.drillRotation; this.prevCrusherRotation = this.crusherRotation; - + if(this.operational) { this.drillRotation += 15F; - + if(this.enableCrusher) { this.crusherRotation += 15F; } } - + if(this.drillRotation >= 360F) { this.drillRotation -= 360F; this.prevDrillRotation -= 360F; } - + if(this.crusherRotation >= 360F) { this.crusherRotation -= 360F; this.prevCrusherRotation -= 360F; } } } - + protected DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX * 4 + rot.offsetX, yCoord + 1, zCoord + dir.offsetZ * 4 + rot.offsetZ, dir), new DirPos(xCoord + dir.offsetX * 4 - rot.offsetX, yCoord + 1, zCoord + dir.offsetZ * 4 - rot.offsetZ, dir), @@ -204,7 +203,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements new DirPos(xCoord - rot.offsetX * 4, yCoord + 1, zCoord - rot.offsetZ * 4, rot.getOpposite()) }; } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -219,7 +218,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements buf.writeLong(power); tank.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -234,11 +233,11 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements power = buf.readLong(); tank.deserialize(buf); } - + protected int getY() { return yCoord - targetDepth - 4; } - + /** Works outwards and tries to break a ring, returns true if all rings are broken (or ignorable) and the drill should extend. */ protected boolean tryDrill(int radius) { int y = getY(); @@ -246,22 +245,22 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements if(targetDepth == 0 || y == 0) { radius = 1; } - + for(int ring = 1; ring <= radius; ring++) { - + boolean ignoreAll = true; float combinedHardness = 0F; BlockPos bedrockOre = null; bedrockDrilling = false; - + for(int x = xCoord - ring; x <= xCoord + ring; x++) { for(int z = zCoord - ring; z <= zCoord + ring; z++) { - + /* Process blocks either if we are in the inner ring (1 = 3x3) or if the target block is on the outer edge */ if(ring == 1 || (x == xCoord - ring || x == xCoord + ring || z == zCoord - ring || z == zCoord + ring)) { - + Block b = worldObj.getBlock(x, y, z); - + if(b == ModBlocks.ore_bedrock) { combinedHardness = 5 * 60 * 20; bedrockOre = new BlockPos(x, y, z); @@ -270,23 +269,23 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements ignoreAll = false; break; } - + if(shouldIgnoreBlock(b, x, y ,z)) continue; - + ignoreAll = false; - + combinedHardness += b.getBlockHardness(worldObj, x, y, z); } } } - + if(!ignoreAll) { ticksWorked++; - + int ticksToWork = (int) Math.ceil(combinedHardness / this.speed); - + if(ticksWorked >= ticksToWork) { - + if(bedrockOre == null) { breakBlocks(ring); buildWall(ring + 1, ring == radius && this.enableWalling); @@ -297,7 +296,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } ticksWorked = 0; } - + return false; } else { tryCollect(radius + 1); @@ -308,26 +307,26 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements ticksWorked = 0; return true; } - + protected void collectBedrock(BlockPos pos) { TileEntity oreTile = Compat.getTileStandard(worldObj, pos.getX(), pos.getY(), pos.getZ()); - + if(oreTile instanceof TileEntityBedrockOre) { TileEntityBedrockOre ore = (TileEntityBedrockOre) oreTile; - + if(ore.resource == null) return; if(ore.tier > this.getInstalledDrill().tier) return; if(ore.acidRequirement != null) { - + if(ore.acidRequirement.type != tank.getTankType() || ore.acidRequirement.fill > tank.getFill()) return; - + tank.setFill(tank.getFill() - ore.acidRequirement.fill); } - + ItemStack stack = ore.resource.copy(); List stacks = new ArrayList(); stacks.add(stack); - + if(stack.getItem() == ModItems.bedrock_ore_base) { ItemBedrockOreBase.setOreAmount(stack, pos.getX(), pos.getZ()); } @@ -337,63 +336,63 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements int x = xCoord + dir.offsetX * 4; int y = yCoord - 3; int z = zCoord + dir.offsetZ * 4; - + /* try to insert into a valid container */ TileEntity tile = worldObj.getTileEntity(x, y, z); if(tile instanceof IInventory) { supplyContainer((IInventory) tile, stacks, dir.getOpposite()); } - + if(stack.stackSize <= 0) return; - + /* try to place on conveyor belt */ Block b = worldObj.getBlock(x, y, z); if(b instanceof IConveyorBelt) { supplyConveyor((IConveyorBelt) b, stacks, x, y, z); } - + if(stack.stackSize <= 0) return; - + for(int i = 5; i < 14; i++) { - + if(slots[i] != null && slots[i].stackSize < slots[i].getMaxStackSize() && stack.isItemEqual(slots[i]) && ItemStack.areItemStackTagsEqual(stack, slots[i])) { int toAdd = Math.min(slots[i].getMaxStackSize() - slots[i].stackSize, stack.stackSize); slots[i].stackSize += toAdd; stack.stackSize -= toAdd; - + chuteTimer = 40; - + if(stack.stackSize <= 0) { return; } } } - + /* add leftovers to empty slots */ for(int i = 5; i < 14; i++) { - + if(slots[i] == null) { - + chuteTimer = 40; - + slots[i] = stack.copy(); return; } } } } - + /** breaks and drops all blocks in the specified ring */ protected void breakBlocks(int ring) { int y = getY(); - + for(int x = xCoord - ring; x <= xCoord + ring; x++) { for(int z = zCoord - ring; z <= zCoord + ring; z++) { - + if(ring == 1 || (x == xCoord - ring || x == xCoord + ring || z == zCoord - ring || z == zCoord + ring)) { - + Block b = worldObj.getBlock(x, y, z); - + if(!this.shouldIgnoreBlock(b, x, y, z)) { tryMineAtLocation(x, y, z); } @@ -401,13 +400,13 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } } } - + public void tryMineAtLocation(int x ,int y, int z) { Block b = worldObj.getBlock(x, y, z); - + if(this.enableVeinMiner && this.getInstalledDrill().vein) { - + if(isOre(x, y, z, b)) { minX = x; minY = y; @@ -417,51 +416,51 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements maxZ = z; breakRecursively(x, y, z, 10); recursionBrake.clear(); - + /* move all excavated items to the last drillable position which is also within collection range */ List items = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX + 1, maxY + 1, maxZ + 1)); for(EntityItem item : items) item.setPosition(x + 0.5, y + 0.5, z + 0.5); - + return; } } breakSingleBlock(b, x, y, z); } - + protected boolean isOre(int x ,int y, int z, Block b) { - + /* doing this isn't terribly accurate but just for figuring out if there's OD it works */ Item blockItem = Item.getItemFromBlock(b); - + if(blockItem != null) { List names = ItemStackUtil.getOreDictNames(new ItemStack(blockItem)); - + for(String name : names) { if(name.startsWith("ore")) { return true; } } } - + return false; } - + private HashSet recursionBrake = new HashSet(); private int minX = 0, minY = 0, minZ = 0, maxX = 0, maxY = 0, maxZ = 0; protected void breakRecursively(int x ,int y, int z, int depth) { - + if(depth < 0) return; BlockPos pos = new BlockPos(x, y, z); if(recursionBrake.contains(pos)) return; recursionBrake.add(pos); - + Block b = worldObj.getBlock(x, y, z); - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { int ix = x + dir.offsetX; int iy = y + dir.offsetY; int iz = z + dir.offsetZ; - + if(worldObj.getBlock(ix, iy, iz) == b) { breakRecursively(ix, iy, iz, depth - 1); } @@ -475,36 +474,36 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements if(y > maxY) maxY = y; if(z < minZ) minZ = z; if(z > maxZ) maxZ = z; - + if(this.enableWalling) { worldObj.setBlock(x, y, z, ModBlocks.barricade); } } - + protected void breakSingleBlock(Block b, int x ,int y, int z) { - + List items = b.getDrops(worldObj, x, y, z, worldObj.getBlockMetadata(x, y, z), this.getFortuneLevel()); - + if(this.canSilkTouch()) { - + try { Method createStackedBlock = ReflectionHelper.findMethod(Block.class, b, new String[] {"createStackedBlock", "func_149644_j"}, int.class); ItemStack result = (ItemStack) createStackedBlock.invoke(b, worldObj.getBlockMetadata(x, y, z)); - + if(result != null) { items.clear(); items.add(result.copy()); } } catch(Exception ex) { } } - + if(this.enableCrusher) { - + List list = new ArrayList(); - + for(ItemStack stack : items) { ItemStack crushed = ShredderRecipes.getShredderResult(stack).copy(); - + if(crushed.getItem() == ModItems.scrap || crushed.getItem() == ModItems.dust) { list.add(stack); } else { @@ -512,36 +511,36 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements list.add(crushed); } } - + items = list; } - + if(b == ModBlocks.barricade) items.clear(); - + for(ItemStack item : items) { worldObj.spawnEntityInWorld(new EntityItem(worldObj, x + 0.5, y + 0.5, z + 0.5, item)); } - + worldObj.func_147480_a(x, y, z, false); } - + /** builds a wall along the specified ring, replacing fluid blocks. if wallEverything is set, it will also wall off replacable blocks like air or grass */ protected void buildWall(int ring, boolean wallEverything) { int y = getY(); - + for(int x = xCoord - ring; x <= xCoord + ring; x++) { for(int z = zCoord - ring; z <= zCoord + ring; z++) { - + Block b = worldObj.getBlock(x, y, z); - + if(x == xCoord - ring || x == xCoord + ring || z == zCoord - ring || z == zCoord + ring) { - + if(b.isReplaceable(worldObj, x, y, z) && (wallEverything || b.getMaterial().isLiquid())) { worldObj.setBlock(x, y, z, ModBlocks.barricade); } } else { - + if(b.getMaterial().isLiquid()) { worldObj.setBlockToAir(x, y, z); continue; @@ -552,14 +551,14 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } protected void mineOuterOres(int ring) { int y = getY(); - + for(int x = xCoord - ring; x <= xCoord + ring; x++) { for(int z = zCoord - ring; z <= zCoord + ring; z++) { - + if(ring == 1 || (x == xCoord - ring || x == xCoord + ring || z == zCoord - ring || z == zCoord + ring)) { - + Block b = worldObj.getBlock(x, y, z); - + if(!this.shouldIgnoreBlock(b, x, y, z) && this.isOre(x, y, z, b)) { tryMineAtLocation(x, y, z); } @@ -567,7 +566,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } } } - + protected void tryEjectBuffer() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); @@ -575,32 +574,32 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements int x = xCoord + dir.offsetX * 4; int y = yCoord - 3; int z = zCoord + dir.offsetZ * 4; - + List items = new ArrayList(); for(int i = 5; i < 14; i++) { ItemStack stack = slots[i]; - + if(stack != null) { items.add(stack.copy()); } } - + TileEntity tile = worldObj.getTileEntity(x, y, z); if(tile instanceof IInventory) { supplyContainer((IInventory) tile, items, dir.getOpposite()); } - + Block b = worldObj.getBlock(x, y, z); if(b instanceof IConveyorBelt) { supplyConveyor((IConveyorBelt) b, items, x, y, z); } - + items.removeIf(i -> i == null || i.stackSize <= 0); for(int i = 5; i < 14; i++) { int index = i - 5; - + if(items.size() > index) { slots[i] = items.get(index).copy(); } else { @@ -608,66 +607,66 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } } } - + /** pulls up an AABB around the drillbit and tries to either conveyor output or buffer collected items */ protected void tryCollect(int radius) { int yLevel = getY(); - + List items = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(xCoord - radius, yLevel - 1, zCoord - radius, xCoord + radius + 1, yLevel + 2, zCoord + radius + 1)); - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); int x = xCoord + dir.offsetX * 4; int y = yCoord - 3; int z = zCoord + dir.offsetZ * 4; - + List stacks = new ArrayList(); items.forEach(i -> stacks.add(i.getEntityItem())); - + /* try to insert into a valid container */ TileEntity tile = worldObj.getTileEntity(x, y, z); if(tile instanceof IInventory) { supplyContainer((IInventory) tile, stacks, dir.getOpposite()); } - + /* try to place on conveyor belt */ Block b = worldObj.getBlock(x, y, z); if(b instanceof IConveyorBelt) { supplyConveyor((IConveyorBelt) b, stacks, x, y, z); } - + items.removeIf(i -> i.isDead || i.getEntityItem().stackSize <= 0); - + /* collect remaining items in internal buffer */ outer: for(EntityItem item : items) { - + ItemStack stack = item.getEntityItem(); - + /* adding items to existing stacks */ for(int i = 5; i < 14; i++) { - + if(slots[i] != null && slots[i].stackSize < slots[i].getMaxStackSize() && stack.isItemEqual(slots[i]) && ItemStack.areItemStackTagsEqual(stack, slots[i])) { int toAdd = Math.min(slots[i].getMaxStackSize() - slots[i].stackSize, stack.stackSize); slots[i].stackSize += toAdd; stack.stackSize -= toAdd; - + chuteTimer = 40; - + if(stack.stackSize <= 0) { item.setDead(); continue outer; } } } - + /* add leftovers to empty slots */ for(int i = 5; i < 14; i++) { - + if(slots[i] == null) { - + chuteTimer = 40; - + slots[i] = stack.copy(); item.setDead(); break; @@ -675,60 +674,60 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } } } - + /** places all items into a connected container, if possible */ protected void supplyContainer(IInventory inv, List items, ForgeDirection dir) { - + int side = dir.ordinal(); int[] access = null; - + if(inv instanceof ISidedInventory) { ISidedInventory sided = (ISidedInventory) inv; access = InventoryUtil.masquerade(sided, dir.ordinal()); } - + for(ItemStack item : items) { - + if(item.stackSize <= 0) continue; - + CraneInserter.addToInventory(inv, access, item, side); chuteTimer = 40; } } - + /** moves all items onto a connected conveyor belt */ protected void supplyConveyor(IConveyorBelt belt, List items, int x, int y, int z) { - + Random rand = worldObj.rand; - + for(ItemStack item : items) { - + if(item.stackSize <= 0) continue; - + Vec3 base = Vec3.createVectorHelper(x + rand.nextDouble(), y + 0.5, z + rand.nextDouble()); Vec3 vec = belt.getClosestSnappingPosition(worldObj, x, y, z, base); - + EntityMovingItem moving = new EntityMovingItem(worldObj); moving.setPosition(base.xCoord, vec.yCoord, base.zCoord); moving.setItemStack(item.copy()); worldObj.spawnEntityInWorld(moving); item.stackSize = 0; - + chuteTimer = 40; } } - + public long getPowerConsumption() { return consumption; } - + public int getFortuneLevel() { EnumDrillType type = getInstalledDrill(); - + if(type != null) return type.fortune; return 0; } - + public boolean shouldIgnoreBlock(Block block, int x, int y, int z) { return block.isAir(worldObj, x, y, z) || block.getMaterial() == ModBlocks.materialGas || block.getBlockHardness(worldObj, x, y, z) < 0 || block.getMaterial().isLiquid() || block == Blocks.bedrock; } @@ -740,32 +739,32 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements if(data.hasKey("walling")) this.enableWalling = !this.enableWalling; if(data.hasKey("veinminer")) this.enableVeinMiner = !this.enableVeinMiner; if(data.hasKey("silktouch")) this.enableSilkTouch = !this.enableSilkTouch; - + this.markChanged(); } - + public EnumDrillType getInstalledDrill() { if(slots[4] != null && slots[4].getItem() instanceof ItemDrillbit) { return EnumUtil.grabEnumSafely(EnumDrillType.class, slots[4].getItemDamage()); } - + return null; } - + public boolean canVeinMine() { EnumDrillType type = getInstalledDrill(); return this.enableVeinMiner && type != null && type.vein; } - + public boolean canSilkTouch() { EnumDrillType type = getInstalledDrill(); return this.enableSilkTouch && type != null && type.silk; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.enableDrill = nbt.getBoolean("d"); this.enableCrusher = nbt.getBoolean("c"); this.enableWalling = nbt.getBoolean("w"); @@ -775,11 +774,11 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements this.power = nbt.getLong("p"); this.tank.readFromNBT(nbt, "tank"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setBoolean("d", enableDrill); nbt.setBoolean("c", enableCrusher); nbt.setBoolean("w", enableWalling); @@ -805,12 +804,12 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineExcavator(player.inventory, this); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 3, @@ -821,10 +820,10 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements zCoord + 4 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -874,10 +873,11 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java index 190b9b7d2..77ac2635a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java @@ -1,9 +1,10 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineExposureChamber; import com.hbm.inventory.gui.GUIMachineExposureChamber; import com.hbm.inventory.recipes.ExposureChamberRecipes; @@ -31,10 +32,10 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineExposureChamber extends TileEntityMachineBase implements IGUIProvider, IEnergyReceiverMK2, IUpgradeInfoProvider { - + public long power; public static final long maxPower = 1_000_000; - + public int progress; public static final int processTimeBase = 200; public int processTime = processTimeBase; @@ -45,7 +46,9 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl public boolean isOn = false; public float rotation; public float prevRotation; - + + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -53,7 +56,7 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl this.power = nbt.getLong("power"); this.savedParticles = nbt.getInteger("savedParticles"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -82,39 +85,39 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.isOn = false; this.power = Library.chargeTEFromItems(slots, 5, power, maxPower); - + if(worldObj.getTotalWorldTime() % 20 == 0) { for(DirPos pos : getConPos()) this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - - UpgradeManager.eval(slots, 6, 7); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overdriveLevel = Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3); - + + upgradeManager.checkSlots(this, slots, 6, 7); + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + int overdriveLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + this.consumption = this.consumptionBase; - + this.processTime = this.processTimeBase - this.processTimeBase / 4 * speedLevel; this.consumption *= (speedLevel / 2 + 1); this.processTime *= (powerLevel / 2 + 1); this.consumption /= (powerLevel + 1); this.processTime /= (overdriveLevel + 1); this.consumption *= (overdriveLevel * 2 + 1); - + if(slots[1] == null && slots[0] != null && slots[3] != null && this.savedParticles <= 0) { ExposureChamberRecipe recipe = this.getRecipe(slots[0], slots[3]); - + if(recipe != null) { - + ItemStack container = slots[0].getItem().getContainerItem(slots[0]); - + boolean canStore = false; - + if(container == null) { canStore = true; } else if(slots[2] == null) { @@ -124,7 +127,7 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl slots[2].stackSize++; canStore = true; } - + if(canStore) { slots[1] = slots[0].copy(); slots[1].stackSize = 0; @@ -133,47 +136,47 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl } } } - + if(slots[1] != null && this.savedParticles > 0 && this.power >= this.consumption) { ExposureChamberRecipe recipe = this.getRecipe(slots[1], slots[3]); - + if(recipe != null && (slots[4] == null || (slots[4].getItem() == recipe.output.getItem() && slots[4].getItemDamage() == recipe.output.getItemDamage() && slots[4].stackSize + recipe.output.stackSize <= slots[4].getMaxStackSize()))) { this.progress++; this.power -= this.consumption; this.isOn = true; - + if(this.progress >= this.processTime) { this.progress = 0; this.savedParticles--; this.decrStackSize(3, 1); - + if(slots[4] == null) { slots[4] = recipe.output.copy(); } else { slots[4].stackSize += recipe.output.stackSize; } } - + } else { this.progress = 0; } } else { this.progress = 0; } - + if(this.savedParticles <= 0) { slots[1] = null; } - + this.networkPackNT(50); } else { - + this.prevRotation = this.rotation; - + if(this.isOn) { - + this.rotation += 10D; - + if(this.rotation >= 720D) { this.rotation -= 720D; this.prevRotation -= 720D; @@ -181,7 +184,7 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl } } } - + public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP).getOpposite(); @@ -193,44 +196,44 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl new DirPos(xCoord + rot.offsetX * 9, yCoord, zCoord + rot.offsetZ * 9, rot) }; } - + public ExposureChamberRecipe getRecipe(ItemStack particle, ItemStack ingredient) { return ExposureChamberRecipes.getRecipe(particle, ingredient); } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - + //will only load new capsules if there's no cached particles, this should prevent clogging //accept items when the slots are already partially filled, i.e. applicable if(i == 0 && slots[0] != null) return true; if(i == 3 && slots[3] != null) return true; - + //if there's no particle stored, use the un-consumed capsule for reference ItemStack particle = slots[1] != null ? slots[1] : slots[0]; - + //if no particle is loaded and an ingot is present if(i == 0 && particle == null && slots[3] != null) { ExposureChamberRecipe recipe = getRecipe(stack, slots[3]); return recipe != null; } - + //if a particle is loaded but no ingot present if(i == 3 && particle != null && slots[3] == null) { ExposureChamberRecipe recipe = getRecipe(slots[0], stack); return recipe != null; } - + //if there's nothing at all, find a reference recipe and see if the item matches anything if(particle == null && slots[3] == null) { - + for(ExposureChamberRecipe recipe : ExposureChamberRecipes.recipes) { if(i == 0 && recipe.particle.matchesRecipe(stack, true)) return true; - if(i == 3 && recipe.ingredient.matchesRecipe(stack, true)) return true; + if(i == 3 && recipe.ingredient.matchesRecipe(stack, true)) return true; } } - + return false; } @@ -253,7 +256,7 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl buf.writeLong(this.power); buf.writeByte((byte) this.savedParticles); } - + @Override public void deserialize(ByteBuf buf) { this.isOn = buf.readBoolean(); @@ -280,10 +283,10 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl } AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 8, @@ -294,10 +297,10 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl zCoord + 9 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -337,10 +340,11 @@ public class TileEntityMachineExposureChamber extends TileEntityMachineBase impl } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index 8a4b70fa0..6dff13040 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -1,11 +1,12 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import java.util.Set; import com.google.common.collect.Sets; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMiningLaser; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -69,6 +70,8 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen boolean lock = false; double breakProgress; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineMiningLaser() { //slot 0: battery @@ -112,14 +115,14 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen if(isOn) { - UpgradeManager.eval(slots, 1, 8); - int cycles = 1 + UpgradeManager.getLevel(UpgradeType.OVERDRIVE); - int speed = 1 + Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 12); - int range = 1 + Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT) * 2, 24); - int fortune = Math.min(UpgradeManager.getLevel(UpgradeType.FORTUNE), 3); + upgradeManager.checkSlots(this, slots, 1, 8); + int cycles = 1 + upgradeManager.getLevel(UpgradeType.OVERDRIVE); + int speed = 1 + upgradeManager.getLevel(UpgradeType.SPEED); + int range = 1 + upgradeManager.getLevel(UpgradeType.EFFECT) * 2; + int fortune = upgradeManager.getLevel(UpgradeType.FORTUNE); int consumption = this.consumption - - (this.consumption * Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 12) / 16) - + (this.consumption * Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 12) / 16); + - (this.consumption * upgradeManager.getLevel(UpgradeType.POWER) / 16) + + (this.consumption * upgradeManager.getLevel(UpgradeType.SPEED) / 16); for(int i = 0; i < cycles; i++) { @@ -678,12 +681,13 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 12; - if(type == UpgradeType.POWER) return 12; - if(type == UpgradeType.EFFECT) return 12; - if(type == UpgradeType.FORTUNE) return 3; - if(type == UpgradeType.OVERDRIVE) return 9; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 12); + upgrades.put(UpgradeType.POWER, 12); + upgrades.put(UpgradeType.EFFECT, 12); + upgrades.put(UpgradeType.FORTUNE, 3); + upgrades.put(UpgradeType.OVERDRIVE, 9); + return upgrades; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java index 59b99c638..b3b14eacd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMixer; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -32,21 +33,23 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; public class TileEntityMachineMixer extends TileEntityMachineBase implements IControlReceiver, IGUIProvider, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider, IFluidCopiable { - + public long power; public static final long maxPower = 10_000; public int progress; public int processTime; public int recipeIndex; - + public float rotation; public float prevRotation; public boolean wasOn = false; private int consumption = 50; - + public FluidTank[] tanks; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineMixer() { super(5); this.tanks = new FluidTank[3]; @@ -62,53 +65,53 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); tanks[2].setType(2, slots); - - UpgradeManager.eval(slots, 3, 4); - int speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overLevel = UpgradeManager.getLevel(UpgradeType.OVERDRIVE); - + + upgradeManager.checkSlots(this, slots, 3, 4); + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + int overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + this.consumption = 50; this.consumption += speedLevel * 150; this.consumption -= this.consumption * powerLevel * 0.25; this.consumption *= (overLevel * 3 + 1); - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(tanks[0].getTankType() != Fluids.NONE) this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(tanks[1].getTankType() != Fluids.NONE) this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + this.wasOn = this.canProcess(); - + if(this.wasOn) { this.progress++; this.power -= this.getConsumption(); - + this.processTime -= this.processTime * speedLevel / 4; this.processTime /= (overLevel + 1); - + if(processTime <= 0) this.processTime = 1; - + if(this.progress >= this.processTime) { this.process(); this.progress = 0; } - + } else { this.progress = 0; } - + for(DirPos pos : getConPos()) { if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + NBTTagCompound data = new NBTTagCompound(); data.setLong("power", power); data.setInteger("processTime", processTime); @@ -119,22 +122,22 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo tanks[i].writeToNBT(data, i + ""); } this.networkPackNT(50); - + } else { - + this.prevRotation = this.rotation; - + if(this.wasOn) { this.rotation += 20F; } - + if(this.rotation >= 360) { this.rotation -= 360; this.prevRotation -= 360; } } } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -143,10 +146,10 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo buf.writeInt(progress); buf.writeInt(recipeIndex); buf.writeBoolean(wasOn); - + for(int i = 0; i < tanks.length; i++) tanks[i].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -155,10 +158,10 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo progress = buf.readInt(); recipeIndex = buf.readInt(); wasOn = buf.readBoolean(); - + for(int i = 0; i < tanks.length; i++) tanks[i].deserialize(buf); } - + public boolean canProcess() { MixerRecipe[] recipes = MixerRecipes.getOutput(tanks[2].getTankType()); @@ -166,38 +169,38 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo this.recipeIndex = 0; return false; } - + this.recipeIndex = this.recipeIndex % recipes.length; MixerRecipe recipe = recipes[this.recipeIndex]; if(recipe == null) { this.recipeIndex = 0; return false; } - + tanks[0].setTankType(recipe.input1 != null ? recipe.input1.type : Fluids.NONE); tanks[1].setTankType(recipe.input2 != null ? recipe.input2.type : Fluids.NONE); if(recipe.input1 != null && tanks[0].getFill() < recipe.input1.fill) return false; if(recipe.input2 != null && tanks[1].getFill() < recipe.input2.fill) return false; - + /* simplest check would usually go first, but fluid checks also do the setup and we want that to happen even without power */ if(this.power < getConsumption()) return false; - + if(recipe.output + tanks[2].getFill() > tanks[2].getMaxFill()) return false; - + if(recipe.solidInput != null) { - + if(slots[1] == null) return false; - - if(!recipe.solidInput.matchesRecipe(slots[1], true) || recipe.solidInput.stacksize > slots[1].stackSize) return false; + + if(!recipe.solidInput.matchesRecipe(slots[1], true) || recipe.solidInput.stacksize > slots[1].stackSize) return false; } - + this.processTime = recipe.processTime; return true; } - + protected void process() { - + MixerRecipe[] recipes = MixerRecipes.getOutput(tanks[2].getTankType()); MixerRecipe recipe = recipes[this.recipeIndex % recipes.length]; @@ -206,11 +209,11 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo if(recipe.solidInput != null) this.decrStackSize(1, recipe.solidInput.stacksize); tanks[2].setFill(tanks[2].getFill() + recipe.output); } - + public int getConsumption() { return consumption; } - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord, yCoord - 1, zCoord, Library.NEG_Y), @@ -220,7 +223,7 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z), }; } - + @Override public int[] getAccessibleSlotsFromSide(int meta) { return new int[] { 1 }; @@ -228,16 +231,16 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - + MixerRecipe[] recipes = MixerRecipes.getOutput(tanks[2].getTankType()); if(recipes == null || recipes.length <= 0) return false; - + MixerRecipe recipe = recipes[this.recipeIndex % recipes.length]; if(recipe == null || recipe.solidInput == null) return false; - + return recipe.solidInput.matchesRecipe(itemStack, true); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -248,11 +251,11 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo this.recipeIndex = nbt.getInteger("recipe"); for(int i = 0; i < 3; i++) this.tanks[i].readFromNBT(nbt, i + ""); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setInteger("progress", progress); nbt.setInteger("processTime", processTime); @@ -300,19 +303,19 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMixer(player.inventory, this); } - + AxisAlignedBB aabb; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(aabb != null) return aabb; - + aabb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 3, zCoord + 1); return aabb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -350,11 +353,12 @@ public class TileEntityMachineMixer extends TileEntityMachineBase implements ICo } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 6; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 6); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java index b37ae8279..35fcc77e6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java @@ -1,9 +1,10 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerOreSlopper; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -47,18 +48,18 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineOreSlopper extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable { - + public long power; public static final long maxPower = 100_000; - + public static final int waterUsedBase = 1_000; public int waterUsed = waterUsedBase; public static final long consumptionBase = 200; public long consumption = consumptionBase; - + public float progress; public boolean processing; - + public SlopperAnimation animation = SlopperAnimation.LOWERING; public float slider; public float prevSlider; @@ -69,10 +70,12 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement public float fan; public float prevFan; public int delay; - + public FluidTank[] tanks; public double[] ores = new double[BedrockOreType.values().length]; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineOreSlopper() { super(11); tanks = new FluidTank[2]; @@ -84,75 +87,75 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement public String getName() { return "container.machineOreSlopper"; } - + public static enum SlopperAnimation { LOWERING, LIFTING, MOVE_SHREDDER, DUMPING, MOVE_BUCKET } @Override public void updateEntity() { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); - + if(!worldObj.isRemote) { - + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); - + tanks[0].setType(1, slots); FluidType conversion = this.getFluidOutput(tanks[0].getTankType()); if(conversion != null) tanks[1].setTankType(conversion); - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + this.processing = false; - - UpgradeManager.eval(slots, 9, 10); - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int efficiency = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); - + + upgradeManager.checkSlots(this, slots, 9, 10); + int speed = upgradeManager.getLevel(UpgradeType.SPEED); + int efficiency = upgradeManager.getLevel(UpgradeType.EFFECT); + this.consumption = this.consumptionBase + (this.consumptionBase * speed) / 2 + (this.consumptionBase * efficiency); - + if(canSlop()) { this.power -= this.consumption; this.progress += 1F / (600 - speed * 150); this.processing = true; boolean markDirty = false; - + while(progress >= 1F && canSlop()) { progress -= 1F; - + for(BedrockOreType type : BedrockOreType.values()) { ores[type.ordinal()] += (ItemBedrockOreBase.getOreAmount(slots[2], type) * (1D + efficiency * 0.1)); } - + this.decrStackSize(2, 1); this.tanks[0].setFill(this.tanks[0].getFill() - waterUsed); this.tanks[1].setFill(this.tanks[1].getFill() + waterUsed); markDirty = true; } - + if(markDirty) this.markDirty(); - + List entities = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord + 1, zCoord - 0.5, xCoord + 1.5, yCoord + 3, zCoord + 1.5).offset(dir.offsetX, 0, dir.offsetZ)); - + for(Entity e : entities) { e.attackEntityFrom(ModDamageSource.turbofan, 1000F); - + if(!e.isEntityAlive() && e instanceof EntityLivingBase) { NBTTagCompound vdat = new NBTTagCompound(); vdat.setString("type", "giblets"); vdat.setInteger("ent", e.getEntityId()); vdat.setInteger("cDiv", 5); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); - + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } } - + } else { this.progress = 0; } @@ -169,31 +172,31 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement break outer; } } - + this.networkPackNT(150); - + } else { - + this.prevSlider = this.slider; this.prevBucket = this.bucket; this.prevBlades = this.blades; this.prevFan = this.fan; - + if(this.processing) { - + this.blades += 15F; this.fan += 35F; - + if(blades >= 360) { blades -= 360; prevBlades -= 360; } - + if(fan >= 360) { fan -= 360; prevFan -= 360; } - + if(animation == animation.DUMPING && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 4, zCoord + 0.5) <= 50) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); @@ -205,12 +208,12 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement data.setDouble("mY", -0.2D); MainRegistry.proxy.effectNT(data); } - + if(delay > 0) { delay--; return; } - + switch(animation) { case LOWERING: this.bucket += 1F/40F; @@ -250,11 +253,11 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement } } } - + public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX * 4, yCoord, zCoord + dir.offsetZ * 4, dir), new DirPos(xCoord - dir.offsetX * 4, yCoord, zCoord - dir.offsetZ * 4, dir.getOpposite()), @@ -278,7 +281,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement } private static final int[] slot_access = new int[] {2, 3, 4, 5, 6, 7, 8}; - + @Override public int[] getAccessibleSlotsFromSide(int side) { return slot_access; @@ -293,7 +296,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement tanks[0].serialize(buf); tanks[1].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); this.power = buf.readLong(); @@ -303,7 +306,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement tanks[0].deserialize(buf); tanks[1].deserialize(buf); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -312,7 +315,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement tanks[0].readFromNBT(nbt, "water"); tanks[1].readFromNBT(nbt, "slop"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -321,16 +324,16 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement tanks[0].writeToNBT(nbt, "water"); tanks[1].writeToNBT(nbt, "slop"); } - + public boolean canSlop() { if(this.getFluidOutput(tanks[0].getTankType()) == null) return false; if(tanks[0].getFill() < waterUsed) return false; if(tanks[1].getFill() + waterUsed > tanks[1].getMaxFill()) return false; if(power < consumption) return false; - + return slots[2] != null && slots[2].getItem() == ModItems.bedrock_ore_base; } - + public FluidType getFluidOutput(FluidType input) { if(input == Fluids.WATER) return Fluids.SLOP; return null; @@ -343,12 +346,12 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement @Override public FluidTank[] getAllTanks() { return tanks; } @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {tanks[1]}; } @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 3, @@ -359,10 +362,10 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement zCoord + 4 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -399,9 +402,10 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.EFFECT) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.EFFECT, 3); + return upgrades; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java index 2df5b46a5..bf1c795da 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.container.ContainerMachineSolderingStation; import com.hbm.inventory.fluid.Fluids; @@ -53,6 +54,8 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp public FluidTank tank; public ItemStack display; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineSolderingStation() { super(11); this.tank = new FluidTank(Fluids.NONE, 8_000); @@ -92,9 +95,9 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp recipe = SolderingRecipes.getRecipe(new ItemStack[] {slots[0], slots[1], slots[2], slots[3], slots[4], slots[5]}); long intendedMaxPower; - UpgradeManager.eval(slots, 9, 10); - int redLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int blueLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); + upgradeManager.checkSlots(this, slots, 9, 10); + int redLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int blueLevel = upgradeManager.getLevel(UpgradeType.POWER); if(recipe != null) { this.processTime = recipe.duration - (recipe.duration * redLevel / 6) + (recipe.duration * blueLevel / 3); @@ -374,10 +377,11 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index 94a239fba..3af43d301 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -1,11 +1,12 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineTurbofan; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -54,7 +55,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem public static final long maxPower = 1_000_000; public FluidTank tank; public FluidTank blood; - + public int afterburner; public boolean wasOn; public boolean showBlood = false; @@ -64,9 +65,11 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem public float spin; public float lastSpin; public int momentum = 0; - + private AudioWrapper audio; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineTurbofan() { super(5, 150); tank = new FluidTank(Fluids.KEROSENE, 24000); @@ -91,7 +94,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("powerTime", power); tank.writeToNBT(nbt, "fuel"); blood.writeToNBT(nbt, "blood"); @@ -101,12 +104,12 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem public long getPowerScaled(long i) { return (power * i) / maxPower; } - + protected DirPos[] getConPos() { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.UP); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + return new DirPos[] { new DirPos(this.xCoord + rot.offsetX * 2, this.yCoord, this.zCoord + rot.offsetZ * 2, rot), new DirPos(this.xCoord + rot.offsetX * 2 - dir.offsetX, this.yCoord, this.zCoord + rot.offsetZ * 2 - dir.offsetZ, rot), @@ -117,12 +120,12 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.output = 0; this.consumption = 0; - + //meta below 12 means that it's an old multiblock configuration if(this.getBlockMetadata() < 12) { //get old direction @@ -144,54 +147,54 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem worldObj.getTileEntity(xCoord, yCoord, zCoord).readFromNBT(data); return; } - + tank.setType(4, slots); tank.loadTank(0, 1, slots); blood.setTankType(Fluids.BLOOD); - + this.wasOn = false; - - UpgradeManager.eval(slots, 2, 2); - this.afterburner = UpgradeManager.getLevel(UpgradeType.AFTERBURN); - + + upgradeManager.checkSlots(this, slots, 2, 2); + this.afterburner = upgradeManager.getLevel(UpgradeType.AFTERBURN); + if(slots[2] != null && slots[2].getItem() == ModItems.flame_pony) this.afterburner = 100; - + long burnValue = 0; int amount = 1 + this.afterburner; - + if(tank.getTankType().hasTrait(FT_Combustible.class) && tank.getTankType().getTrait(FT_Combustible.class).getGrade() == FuelGrade.AERO) { burnValue = tank.getTankType().getTrait(FT_Combustible.class).getCombustionEnergy() / 1_000; } - + int amountToBurn = Math.min(amount, this.tank.getFill()); - + if(amountToBurn > 0) { this.wasOn = true; this.tank.setFill(this.tank.getFill() - amountToBurn); this.output = (int) (burnValue * amountToBurn * (1 + Math.min(this.afterburner / 3D, 4))); this.power += this.output; this.consumption = amountToBurn; - + if(worldObj.getTotalWorldTime() % 20 == 0) super.pollute(tank.getTankType(), FluidTrait.FluidReleaseType.BURN, amountToBurn * 5);; } - + power = Library.chargeItemsFromTE(slots, 3, power, power); - + for(DirPos pos : getConPos()) { this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(this.blood.getFill() > 0) this.sendFluid(blood, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendSmoke(pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + if(burnValue > 0 && amountToBurn > 0) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.UP); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + if(this.afterburner > 0) { - + for(int i = 0; i < 2; i++) { double speed = 2 + worldObj.rand.nextDouble() * 3; double deviation = worldObj.rand.nextGaussian() * 0.2; @@ -202,15 +205,15 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem data.setFloat("scale", 8F); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, this.xCoord + 0.5F - dir.offsetX * (3 - i), this.yCoord + 1.5F, this.zCoord + 0.5F - dir.offsetZ * (3 - i)), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); } - + /*if(this.afterburner > 90 && worldObj.rand.nextInt(60) == 0) { worldObj.newExplosion(null, xCoord + 0.5 + dir.offsetX * 3.5, yCoord + 0.5, zCoord + 0.5 + dir.offsetZ * 3.5, 3F, false, false); }*/ - + if(this.afterburner > 90 && worldObj.rand.nextInt(30) == 0) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, "hbm:block.damage", 3.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } - + if(this.afterburner > 90) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "gasfire"); @@ -223,16 +226,16 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem ), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); } } - + double minX = this.xCoord + 0.5 - dir.offsetX * 3.5 - rot.offsetX * 1.5; double maxX = this.xCoord + 0.5 - dir.offsetX * 19.5 + rot.offsetX * 1.5; double minZ = this.zCoord + 0.5 - dir.offsetZ * 3.5 - rot.offsetZ * 1.5; double maxZ = this.zCoord + 0.5 - dir.offsetZ * 19.5 + rot.offsetZ * 1.5; - + List list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(Math.min(minX, maxX), yCoord, Math.min(minZ, maxZ), Math.max(minX, maxX), yCoord + 3, Math.max(minZ, maxZ))); - + for(Entity e : list) { - + if(this.afterburner > 0) { e.setFire(5); e.attackEntityFrom(DamageSource.onFire, 5F); @@ -240,40 +243,40 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem e.motionX -= dir.offsetX * 0.2; e.motionZ -= dir.offsetZ * 0.2; } - + minX = this.xCoord + 0.5 + dir.offsetX * 3.5 - rot.offsetX * 1.5; maxX = this.xCoord + 0.5 + dir.offsetX * 8.5 + rot.offsetX * 1.5; minZ = this.zCoord + 0.5 + dir.offsetZ * 3.5 - rot.offsetZ * 1.5; maxZ = this.zCoord + 0.5 + dir.offsetZ * 8.5 + rot.offsetZ * 1.5; - + list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(Math.min(minX, maxX), yCoord, Math.min(minZ, maxZ), Math.max(minX, maxX), yCoord + 3, Math.max(minZ, maxZ))); - + for(Entity e : list) { e.motionX -= dir.offsetX * 0.2; e.motionZ -= dir.offsetZ * 0.2; } - + minX = this.xCoord + 0.5 + dir.offsetX * 3.5 - rot.offsetX * 1.5; maxX = this.xCoord + 0.5 + dir.offsetX * 3.75 + rot.offsetX * 1.5; minZ = this.zCoord + 0.5 + dir.offsetZ * 3.5 - rot.offsetZ * 1.5; maxZ = this.zCoord + 0.5 + dir.offsetZ * 3.75 + rot.offsetZ * 1.5; - + list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(Math.min(minX, maxX), yCoord, Math.min(minZ, maxZ), Math.max(minX, maxX), yCoord + 3, Math.max(minZ, maxZ))); - + for(Entity e : list) { e.attackEntityFrom(ModDamageSource.turbofan, 1000); e.setInWeb(); - + if(!e.isEntityAlive() && e instanceof EntityLivingBase) { NBTTagCompound vdat = new NBTTagCompound(); vdat.setString("type", "giblets"); vdat.setInteger("ent", e.getEntityId()); vdat.setInteger("cDiv", 5); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); - + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); - - blood.setFill(blood.getFill() + 50); + + blood.setFill(blood.getFill() + 50); if(blood.getFill() > blood.getMaxFill()) { blood.setFill(blood.getMaxFill()); } @@ -281,17 +284,17 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem } } } - + if(this.power > this.maxPower) { this.power = this.maxPower; } this.networkPackNT(150); - + } else { - + this.lastSpin = this.spin; - + if(wasOn) { if(this.momentum < 100F) this.momentum++; @@ -299,16 +302,16 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem if(this.momentum > 0) this.momentum--; } - + this.spin += momentum / 2; - + if(this.spin >= 360) { this.spin -= 360F; this.lastSpin -= 360F; } if(momentum > 0) { - + if(audio == null) { audio = createAudioLoop(); audio.startSound(); @@ -319,9 +322,9 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem audio.keepAlive(); audio.updateVolume(getVolume(momentum / 50F)); audio.updatePitch(momentum / 200F + 0.5F + this.afterburner * 0.16F); - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -340,37 +343,37 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem double maxX = this.xCoord + 0.5 - dir.offsetX * 19.5 + rot.offsetX * 1.5; double minZ = this.zCoord + 0.5 - dir.offsetZ * 3.5 - rot.offsetZ * 1.5; double maxZ = this.zCoord + 0.5 - dir.offsetZ * 19.5 + rot.offsetZ * 1.5; - + List list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(Math.min(minX, maxX), yCoord, Math.min(minZ, maxZ), Math.max(minX, maxX), yCoord + 3, Math.max(minZ, maxZ))); - + for(Entity e : list) { if(e == MainRegistry.proxy.me()) { e.motionX -= dir.offsetX * 0.2; e.motionZ -= dir.offsetZ * 0.2; } } - + minX = this.xCoord + 0.5 + dir.offsetX * 3.5 - rot.offsetX * 1.5; maxX = this.xCoord + 0.5 + dir.offsetX * 8.5 + rot.offsetX * 1.5; minZ = this.zCoord + 0.5 + dir.offsetZ * 3.5 - rot.offsetZ * 1.5; maxZ = this.zCoord + 0.5 + dir.offsetZ * 8.5 + rot.offsetZ * 1.5; - + list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(Math.min(minX, maxX), yCoord, Math.min(minZ, maxZ), Math.max(minX, maxX), yCoord + 3, Math.max(minZ, maxZ))); - + for(Entity e : list) { if(e == MainRegistry.proxy.me()) { e.motionX -= dir.offsetX * 0.2; e.motionZ -= dir.offsetZ * 0.2; } } - + minX = this.xCoord + 0.5 + dir.offsetX * 3.5 - rot.offsetX * 1.5; maxX = this.xCoord + 0.5 + dir.offsetX * 3.75 + rot.offsetX * 1.5; minZ = this.zCoord + 0.5 + dir.offsetZ * 3.5 - rot.offsetZ * 1.5; maxZ = this.zCoord + 0.5 + dir.offsetZ * 3.75 + rot.offsetZ * 1.5; - + list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(Math.min(minX, maxX), yCoord, Math.min(minZ, maxZ), Math.max(minX, maxX), yCoord + 3, Math.max(minZ, maxZ))); - + for(Entity e : list) { if(e == MainRegistry.proxy.me()) { e.setInWeb(); @@ -401,7 +404,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem tank.deserialize(buf); blood.deserialize(buf); } - + public AudioWrapper createAudioLoop() { return MainRegistry.proxy.getLoopedSound("hbm:block.turbofanOperate", xCoord, yCoord, zCoord, 1.0F, 50F, 1.0F, 20); } @@ -440,7 +443,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem public void setPower(long i) { this.power = i; } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; @@ -493,9 +496,10 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.AFTERBURN) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.AFTERBURN, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index c0a989199..49eba901b 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine.oil; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineGasFlare; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -52,6 +53,8 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements protected int fluidUsed = 0; protected int output = 0; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineGasFlare() { super(6); tank = new FluidTank(Fluids.GAS, 64000); @@ -117,9 +120,9 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements if(isOn && tank.getFill() > 0) { - UpgradeManager.eval(slots, 4, 5); - int burn = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int yield = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); + upgradeManager.checkSlots(this, slots, 4, 5); + int burn = upgradeManager.getLevel(UpgradeType.SPEED); + int yield = upgradeManager.getLevel(UpgradeType.EFFECT); maxVent += maxVent * burn; maxBurn += maxBurn * burn; @@ -319,10 +322,11 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.EFFECT) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.EFFECT, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index 4ee8e50bf..072acadcf 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -1,10 +1,11 @@ package com.hbm.tileentity.machine.oil; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerLiquefactor; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -44,9 +45,11 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen public int progress; public static final int processTimeBase = 100; public int processTime; - + public FluidTank tank; - + + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineLiquefactor() { super(4); tank = new FluidTank(Fluids.NONE, 24_000); @@ -59,42 +62,42 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.power = Library.chargeTEFromItems(slots, 1, power, maxPower); - + this.updateConnections(); - UpgradeManager.eval(slots, 2, 3); - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int power = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); + upgradeManager.checkSlots(this, slots, 2, 3); + int speed = upgradeManager.getLevel(UpgradeType.SPEED); + int power = upgradeManager.getLevel(UpgradeType.POWER); this.processTime = processTimeBase - (processTimeBase / 4) * speed; this.usage = (usageBase + (usageBase * speed)) / (power + 1); - + if(this.canProcess()) this.process(); else this.progress = 0; - + this.sendFluid(); this.networkPackNT(50); } } - + private void updateConnections() { for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private void sendFluid() { for(DirPos pos : getConPos()) { this.sendFluid(tank, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord, yCoord + 4, zCoord, Library.POS_Y), @@ -115,36 +118,36 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 0 }; } - + public boolean canProcess() { - + if(this.power < usage) return false; if(slots[0] == null) return false; - + FluidStack out = LiquefactionRecipes.getOutput(slots[0]); - + if(out == null) return false; if(out.type != tank.getTankType() && tank.getFill() > 0) return false; if(out.fill + tank.getFill() > tank.getMaxFill()) return false; - + return true; } - + public void process() { - + this.power -= usage; - + progress++; - + if(progress >= processTime) { - + FluidStack out = LiquefactionRecipes.getOutput(slots[0]); tank.setTankType(out.type); tank.setFill(tank.getFill() + out.fill); this.decrStackSize(0, 1); - + progress = 0; - + this.markDirty(); } } @@ -168,13 +171,13 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen this.processTime = buf.readInt(); tank.deserialize(buf); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tank.readFromNBT(nbt, "tank"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -197,10 +200,10 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen } AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -211,10 +214,10 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -260,10 +263,11 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java index 17c9e8db8..146a4629b 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java @@ -1,11 +1,12 @@ package com.hbm.tileentity.machine.oil; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerPyroOven; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -40,21 +41,23 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implements IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable { - + public long power; public static final long maxPower = 10_000_000; public boolean isVenting; public boolean isProgressing; public float progress; public static int consumption = 10_000; - + public int prevAnim; public int anim = 0; - + public FluidTank[] tanks; - + private AudioWrapper audio; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachinePyroOven() { super(6, 50); tanks = new FluidTank[2]; @@ -65,7 +68,7 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && stack.getItem() instanceof ItemMachineUpgrade && i >= 4 && i <= 5) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } @@ -78,12 +81,12 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); tanks[0].setType(3, slots); - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(tanks[0].getTankType() != Fluids.NONE) this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); @@ -93,50 +96,50 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); if(smoke.getFill() > 0) this.sendFluid(smoke, worldObj, xCoord - rot.offsetX, yCoord + 3, zCoord - rot.offsetZ, Library.POS_Y); - - UpgradeManager.eval(slots, 4, 5); - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerSaving = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - int overdrive = Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3); - + + upgradeManager.checkSlots(this, slots, 4, 5); + int speed = upgradeManager.getLevel(UpgradeType.SPEED); + int powerSaving = upgradeManager.getLevel(UpgradeType.POWER); + int overdrive = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + this.isProgressing = false; this.isVenting = false; - + if(this.canProcess()) { PyroOvenRecipe recipe = getMatchingRecipe(); this.progress += 1F / Math.max((recipe.duration - speed * (recipe.duration / 4)) / (overdrive * 2 + 1), 1); this.isProgressing = true; this.power -= this.getConsumption(speed + overdrive * 2, powerSaving); - + if(progress >= 1F) { this.progress = 0F; this.finishRecipe(recipe); this.markDirty(); } - + this.pollute(PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND); - + } else { this.progress = 0F; } - + this.networkPackNT(50); } else { - + this.prevAnim = this.anim; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + if(isProgressing) { this.anim++; - + if(audio == null) { audio = createAudioLoop(); audio.startSound(); } else if(!audio.isPlaying()) { audio = rebootAudio(audio); } - + audio.keepAlive(); audio.updateVolume(this.getVolume(1F)); @@ -146,15 +149,15 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem if(worldObj.rand.nextInt(20) == 0) worldObj.spawnParticle("cloud", xCoord + 0.5 - rot.offsetX + dir.offsetX * 0.875, yCoord + 3, zCoord + 0.5 - rot.offsetZ + dir.offsetZ * 0.875, 0.0, 0.05, 0.0); if(worldObj.rand.nextInt(20) == 0) worldObj.spawnParticle("cloud", xCoord + 0.5 - rot.offsetX + dir.offsetX * 2.375, yCoord + 3, zCoord + 0.5 - rot.offsetZ + dir.offsetZ * 2.375, 0.0, 0.05, 0.0); } - + } else { - + if(audio != null) { audio.stopSound(); audio = null; } } - + if(this.isVenting) { if(worldObj.getTotalWorldTime() % 2 == 0) { @@ -173,29 +176,29 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem } } } - + public static int getConsumption(int speed, int powerSaving) { return (int) (consumption * Math.pow(speed + 1, 2)) / (powerSaving + 1); } - + protected PyroOvenRecipe lastValidRecipe; - + public PyroOvenRecipe getMatchingRecipe() { - + if(lastValidRecipe != null && doesRecipeMatch(lastValidRecipe)) return lastValidRecipe; - + for(PyroOvenRecipe rec : PyroOvenRecipes.recipes) { if(doesRecipeMatch(rec)) { lastValidRecipe = rec; return rec; } } - + return null; } - + public boolean doesRecipeMatch(PyroOvenRecipe recipe) { - + if(recipe.inputFluid != null) { if(tanks[0].getTankType() != recipe.inputFluid.type) return false; // recipe needs fluid, fluid doesn't match } @@ -205,15 +208,15 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem } else { if(slots[1] != null) return false; // recipe does not need item, but item is present } - + return true; } - + public boolean canProcess() { - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int powerSaving = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); + int speed = upgradeManager.getLevel(UpgradeType.SPEED); + int powerSaving = upgradeManager.getLevel(UpgradeType.POWER); if(power < this.getConsumption(speed, powerSaving)) return false; // not enough power - + PyroOvenRecipe recipe = this.getMatchingRecipe(); if(recipe == null) return false; // no matching recipe if(recipe.inputFluid != null && tanks[0].getFill() < recipe.inputFluid.fill) return false; // not enough input fluid @@ -222,10 +225,10 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem if(recipe.outputItem != null && slots[2] != null && recipe.outputItem.stackSize + slots[2].stackSize > slots[2].getMaxStackSize()) return false; // too much output item if(recipe.outputItem != null && slots[2] != null && recipe.outputItem.getItem() != slots[2].getItem()) return false; // output item doesn't match if(recipe.outputItem != null && slots[2] != null && recipe.outputItem.getItemDamage() != slots[2].getItemDamage()) return false; // output meta doesn't match - + return true; } - + public void finishRecipe(PyroOvenRecipe recipe) { if(recipe.outputItem != null) { if(slots[2] == null) { @@ -245,11 +248,11 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem tanks[0].setFill(tanks[0].getFill() - recipe.inputFluid.fill); } } - + protected DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX * 2 + rot.offsetX * 3, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * 3, rot), new DirPos(xCoord + dir.offsetX * 1 + rot.offsetX * 3, yCoord, zCoord + dir.offsetZ * 1 + rot.offsetZ * 3, rot), @@ -268,7 +271,7 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem buf.writeBoolean(isProgressing); buf.writeFloat(progress); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); tanks[0].deserialize(buf); @@ -278,7 +281,7 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem isProgressing = buf.readBoolean(); progress = buf.readFloat(); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -287,7 +290,7 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem this.progress = nbt.getFloat("prog"); this.power = nbt.getLong("power"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -296,18 +299,18 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem nbt.setFloat("prog", progress); nbt.setLong("power", power); } - + @Override public int[] getAccessibleSlotsFromSide(int meta) { return new int[] { 1, 2 }; } @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { return i == 1; } @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { return i == 2; } - + @Override public void pollute(PollutionType type, float amount) { FluidTank tank = type == PollutionType.SOOT ? smoke : type == PollutionType.HEAVYMETAL ? smoke_leaded : smoke_poison; - + int fluidAmount = (int) Math.ceil(amount * 100); tank.setFill(tank.getFill() + fluidAmount); - + if(tank.getFill() > tank.getMaxFill()) { int overflow = tank.getFill() - tank.getMaxFill(); tank.setFill(tank.getMaxFill()); @@ -319,7 +322,7 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem @Override public AudioWrapper createAudioLoop() { return MainRegistry.proxy.getLoopedSound("hbm:block.pyroOperate", xCoord, yCoord, zCoord, 1.0F, 15F, 1.0F, 20); } - + @Override public void onChunkUnload() { if(audio != null) { audio.stopSound(); audio = null; } } @@ -328,15 +331,15 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem super.invalidate(); if(audio != null) { audio.stopSound(); audio = null; } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { if(bb == null) bb = AxisAlignedBB.getBoundingBox(xCoord - 3, yCoord, zCoord - 3, xCoord + 4, yCoord + 3.5, zCoord + 4); return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -375,10 +378,11 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.OVERDRIVE) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index 3cb4425a5..67cc1e661 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -1,9 +1,10 @@ package com.hbm.tileentity.machine.oil; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerSolidifier; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -43,9 +44,11 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement public int progress; public static final int processTimeBase = 100; public int processTime; - + public FluidTank tank; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityMachineSolidifier() { super(5); tank = new FluidTank(Fluids.NONE, 24_000); @@ -58,20 +61,20 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.power = Library.chargeTEFromItems(slots, 1, power, maxPower); tank.setType(4, slots); this.updateConnections(); - UpgradeManager.eval(slots, 2, 3); - int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - int power = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); + upgradeManager.checkSlots(this, slots, 2, 3); + int speed = upgradeManager.getLevel(UpgradeType.SPEED); + int power = upgradeManager.getLevel(UpgradeType.POWER); this.processTime = processTimeBase - (processTimeBase / 4) * speed; this.usage = (usageBase + (usageBase * speed)) / (power + 1); - + if(this.canProcess()) this.process(); else @@ -80,14 +83,14 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement this.networkPackNT(50); } } - + private void updateConnections() { for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord, yCoord + 4, zCoord, Library.POS_Y), @@ -108,59 +111,59 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 0 }; } - + public boolean canProcess() { - + if(this.power < usage) return false; - + Pair out = SolidificationRecipes.getOutput(tank.getTankType()); - + if(out == null) return false; - + int req = out.getKey(); ItemStack stack = out.getValue(); - + if(req > tank.getFill()) return false; - + if(slots[0] != null) { - + if(slots[0].getItem() != stack.getItem()) return false; - + if(slots[0].getItemDamage() != stack.getItemDamage()) return false; - + if(slots[0].stackSize + stack.stackSize > slots[0].getMaxStackSize()) return false; } - + return true; } - + public void process() { - + this.power -= usage; - + progress++; - + if(progress >= processTime) { - + Pair out = SolidificationRecipes.getOutput(tank.getTankType()); int req = out.getKey(); ItemStack stack = out.getValue(); tank.setFill(tank.getFill() - req); - + if(slots[0] == null) { slots[0] = stack.copy(); } else { slots[0].stackSize += stack.stackSize; } - + progress = 0; - + this.markDirty(); } } @@ -184,13 +187,13 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement this.processTime = buf.readInt(); tank.deserialize(buf); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tank.readFromNBT(nbt, "tank"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -211,12 +214,12 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement public long getMaxPower() { return maxPower; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -227,10 +230,10 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -276,10 +279,11 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java index 89270682d..502d1bbbf 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java @@ -1,9 +1,10 @@ package com.hbm.tileentity.machine.oil; +import java.util.HashMap; import java.util.HashSet; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemMachineUpgrade; @@ -30,31 +31,33 @@ import net.minecraftforge.common.util.ForgeDirection; public abstract class TileEntityOilDrillBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IConfigurableMachine, IPersistentNBT, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable { public int indicator = 0; - + public long power; - + public FluidTank[] tanks; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public TileEntityOilDrillBase() { super(8); tanks = new FluidTank[2]; tanks[0] = new FluidTank(Fluids.OIL, 64_000); tanks[1] = new FluidTank(Fluids.GAS, 64_000); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); for(int i = 0; i < this.tanks.length; i++) this.tanks[i].readFromNBT(nbt, "t" + i); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); for(int i = 0; i < this.tanks.length; i++) this.tanks[i].writeToNBT(nbt, "t" + i); @@ -62,10 +65,10 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple @Override public void writeNBT(NBTTagCompound nbt) { - + boolean empty = power == 0; for(FluidTank tank : tanks) if(tank.getFill() > 0) empty = false; - + if(!empty) { nbt.setLong("power", power); for(int i = 0; i < this.tanks.length; i++) { @@ -95,11 +98,11 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple this.tanks[0].unloadTank(1, 2, slots); this.tanks[1].unloadTank(3, 4, slots); - UpgradeManager.eval(slots, 5, 7); - this.speedLevel = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); - this.energyLevel = Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3); - this.overLevel = Math.min(UpgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) + 1; - int abLevel = Math.min(UpgradeManager.getLevel(UpgradeType.AFTERBURN), 3); + upgradeManager.checkSlots(this, slots, 5, 7); + this.speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + this.energyLevel = upgradeManager.getLevel(UpgradeType.POWER); + this.overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE) + 1; + int abLevel = upgradeManager.getLevel(UpgradeType.AFTERBURN); int toBurn = Math.min(tanks[1].getFill(), abLevel * 10); @@ -169,7 +172,7 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple this.indicator = buf.readInt(); for (FluidTank tank : tanks) tank.deserialize(buf); } - + public boolean canPump() { return true; } @@ -177,27 +180,27 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple @Override public void setInventorySlotContents(int i, ItemStack stack) { super.setInventorySlotContents(i, stack); - + if(stack != null && i >= 5 && i <= 7 && stack.getItem() instanceof ItemMachineUpgrade) worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); } - + public int getPowerReqEff() { int req = this.getPowerReq(); return (req + (req / 4 * this.speedLevel) - (req / 4 * this.energyLevel)) * this.overLevel; } - + public int getDelayEff() { int delay = getDelay(); return Math.max((delay - (delay / 4 * this.speedLevel) + (delay / 10 * this.energyLevel)) / this.overLevel, 1); } - + public abstract int getPowerReq(); public abstract int getDelay(); - + public void tryDrill(int y) { Block b = worldObj.getBlock(xCoord, y, zCoord); - + if(b.getExplosionResistance(null) < 1000) { onDrill(y); worldObj.setBlock(xCoord, y, zCoord, ModBlocks.oil_pipe); @@ -205,72 +208,72 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple this.indicator = 2; } } - + public void onDrill(int y) { } - + public int getDrillDepth() { return 5; } - + public boolean trySuck(int y) { - + Block b = worldObj.getBlock(xCoord, y, zCoord); - + if(!canSuckBlock(b)) return false; - + if(!this.canPump()) return true; - + trace.clear(); - + return suckRec(xCoord, y, zCoord, 0); } - + public boolean canSuckBlock(Block b) { return b == ModBlocks.ore_oil || b == ModBlocks.ore_oil_empty; } - + protected HashSet> trace = new HashSet(); - + public boolean suckRec(int x, int y, int z, int layer) { - + Triplet pos = new Triplet(x, y, z); - + if(trace.contains(pos)) return false; - + trace.add(pos); - + if(layer > 64) return false; - + Block b = worldObj.getBlock(x, y, z); - + if(b == ModBlocks.ore_oil || b == ModBlocks.ore_bedrock_oil) { doSuck(x, y, z); return true; } - + if(b == ModBlocks.ore_oil_empty) { ForgeDirection[] dirs = BobMathUtil.getShuffledDirs(); - + for(ForgeDirection dir : dirs) { if(suckRec(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, layer + 1)) return true; } } - + return false; } - + public void doSuck(int x, int y, int z) { - + if(worldObj.getBlock(x, y, z) == ModBlocks.ore_oil) { onSuck(x, y, z); } } - + public abstract void onSuck(int x, int y, int z); @Override @@ -308,7 +311,7 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple public FluidTank[] getAllTanks() { return tanks; } - + public abstract DirPos[] getConPos(); protected void updateConnections() { @@ -323,12 +326,13 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 3; - if(type == UpgradeType.POWER) return 3; - if(type == UpgradeType.AFTERBURN) return 3; - if(type == UpgradeType.OVERDRIVE) return 3; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.AFTERBURN, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index fe4bbca21..5b8f99bbd 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.turret; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; @@ -97,13 +98,14 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I } @Override - public int getMaxLevel(UpgradeType type) { - if(type == UpgradeType.SPEED) return 27; - if(type == UpgradeType.POWER) return 27; - if(type == UpgradeType.EFFECT) return 27; - if(type == UpgradeType.AFTERBURN) return 27; - if(type == UpgradeType.OVERDRIVE) return 27; - return 0; + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 27); + upgrades.put(UpgradeType.POWER, 27); + upgrades.put(UpgradeType.EFFECT, 27); + upgrades.put(UpgradeType.AFTERBURN, 27); + upgrades.put(UpgradeType.OVERDRIVE, 27); + return upgrades; } @Override From b58891973666e63eb81dbfa90f4f564c05af111a Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 20 Oct 2024 14:24:04 -0500 Subject: [PATCH 45/70] pushing to prod without testing woo!! --- .../TileEntityMachineAssemblerBase.java | 112 ++++---- .../TileEntityMachineChemplantBase.java | 269 +++++++++--------- 2 files changed, 202 insertions(+), 179 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java index be6f29afa..8d3e0153d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java @@ -1,5 +1,7 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.inventory.RecipesCommon.AStack; @@ -11,6 +13,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.storage.TileEntityCrateTemplate; import com.hbm.util.InventoryUtil; +import com.hbm.util.ItemStackUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; @@ -27,13 +30,13 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa public int[] maxProgress; public boolean isProgressing; public boolean[] needsTemplateSwitch; - + int consumption = 100; int speed = 100; public TileEntityMachineAssemblerBase(int scount) { super(scount); - + int count = this.getRecipeCount(); progress = new int[count]; @@ -43,20 +46,20 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + int count = this.getRecipeCount(); - + this.isProgressing = false; this.power = Library.chargeTEFromItems(slots, getPowerSlot(), power, this.getMaxPower()); - + for(int i = 0; i < count; i++) { unloadItems(i); loadItems(i); } - + for(int i = 0; i < count; i++) { if(!canProcess(i)) { this.progress[i] = 0; @@ -67,53 +70,62 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa } } } - + protected boolean canProcess(int index) { - + int template = getTemplateIndex(index); - + if(slots[template] == null || slots[template].getItem() != ModItems.assembly_template) return false; List recipe = AssemblerRecipes.getRecipeFromTempate(slots[template]); ItemStack output = AssemblerRecipes.getOutputFromTempate(slots[template]); - + if(recipe == null) return false; - + if(this.power < this.consumption) return false; if(!hasRequiredItems(recipe, index)) return false; if(!hasSpaceForItems(output, index)) return false; - + return true; } - + + public HashMap cachedItems = new HashMap<>(); + private boolean hasRequiredItems(List recipe, int index) { int[] indices = getSlotIndicesFromIndex(index); - return InventoryUtil.doesArrayHaveIngredients(slots, indices[0], indices[1], recipe.toArray(new AStack[0])); + ItemStack[] copy = ItemStackUtil.carefulCopyArrayTruncate(slots, indices[0], indices[1]); + if (cachedItems.get(copy) != null) + return cachedItems.get(copy); + else { + boolean hasItems = InventoryUtil.doesArrayHaveIngredients(slots, indices[0], indices[1], recipe.toArray(new AStack[0])); + cachedItems.put(copy, hasItems); + return hasItems; + } } - + private boolean hasSpaceForItems(ItemStack recipe, int index) { int[] indices = getSlotIndicesFromIndex(index); return InventoryUtil.doesArrayHaveSpace(slots, indices[2], indices[2], new ItemStack[] { recipe }); } - + protected void process(int index) { - + this.power -= this.consumption; this.progress[index]++; - + if(slots[0] != null && slots[0].getItem() == ModItems.meteorite_sword_alloyed) slots[0] = new ItemStack(ModItems.meteorite_sword_machined); //fisfndmoivndlmgindgifgjfdnblfm - + int template = getTemplateIndex(index); List recipe = AssemblerRecipes.getRecipeFromTempate(slots[template]); ItemStack output = AssemblerRecipes.getOutputFromTempate(slots[template]); int time = ItemAssemblyTemplate.getProcessTime(slots[template]); - + this.maxProgress[index] = time * this.speed / 100; - + if(this.progress[index] >= this.maxProgress[index]) { consumeItems(recipe, index); produceItems(output, index); @@ -122,28 +134,28 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa this.markDirty(); } } - + private void consumeItems(List recipe, int index) { - + int[] indices = getSlotIndicesFromIndex(index); - + for(AStack in : recipe) { if(in != null) InventoryUtil.tryConsumeAStack(slots, indices[0], indices[1], in); } } - + private void produceItems(ItemStack out, int index) { - + int[] indices = getSlotIndicesFromIndex(index); - + if(out != null) { InventoryUtil.tryAddItemToInventory(slots, indices[2], indices[2], out.copy()); } } - + private void loadItems(int index) { - + int template = getTemplateIndex(index); DirPos[] positions = getInputPositions(); @@ -152,7 +164,7 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa for(DirPos coord : positions) { TileEntity te = worldObj.getTileEntity(coord.getX(), coord.getY(), coord.getZ()); - + if(te instanceof IInventory) { IInventory inv = (IInventory) te; @@ -174,7 +186,7 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa } } } - + boolean noTemplate = slots[template] == null || slots[template].getItem() != ModItems.assembly_template; if(!noTemplate) { @@ -184,17 +196,17 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa if(recipe != null) { for(AStack ingredient : recipe) { - + int tracker = 0; outer: while(!InventoryUtil.doesArrayHaveIngredients(slots, indices[0], indices[1], ingredient)) { - + if(tracker++ > 10) break; boolean found = false; for(int i = 0; i < (access != null ? access.length : inv.getSizeInventory()); i++) { - + int slot = access != null ? access[i] : i; ItemStack stack = inv.getStackInSlot(slot); if(ingredient.matchesRecipe(stack, true) && (sided == null || sided.canExtractItem(slot, stack, 0))) { @@ -229,25 +241,25 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa } } } - + private void unloadItems(int index) { DirPos[] positions = getOutputPositions(); int[] indices = getSlotIndicesFromIndex(index); - + for(DirPos coord : positions) { - + TileEntity te = worldObj.getTileEntity(coord.getX(), coord.getY(), coord.getZ()); - + if(te instanceof IInventory) { - + IInventory inv = (IInventory) te; ISidedInventory sided = inv instanceof ISidedInventory ? (ISidedInventory) inv : null; int[] access = sided != null ? sided.getAccessibleSlotsFromSide(coord.getDir().ordinal()) : null; - + int i = indices[2]; ItemStack out = slots[i]; - + int template = getTemplateIndex(index); if(this.needsTemplateSwitch[index] && te instanceof TileEntityCrateTemplate && slots[template] != null) { out = slots[template]; @@ -259,10 +271,10 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa for(int j = 0; j < (access != null ? access.length : inv.getSizeInventory()); j++) { int slot = access != null ? access[j] : j; - + if(!(sided != null ? sided.canInsertItem(slot, out, coord.getDir().ordinal()) : inv.isItemValidForSlot(slot, out))) continue; - + ItemStack target = inv.getStackInSlot(slot); if(InventoryUtil.doesStackDataMatch(out, target) && target.stackSize < target.getMaxStackSize() && target.stackSize < inv.getInventoryStackLimit()) { @@ -275,7 +287,7 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa for(int j = 0; j < (access != null ? access.length : inv.getSizeInventory()); j++) { int slot = access != null ? access[j] : j; - + if(!inv.isItemValidForSlot(slot, out)) continue; @@ -291,20 +303,20 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa } } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); if(nbt.hasKey("progress")) this.progress = nbt.getIntArray("progress"); if(nbt.hasKey("maxProgress")) this.maxProgress = nbt.getIntArray("maxProgress"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setIntArray("progress", progress); nbt.setIntArray("maxProgress", maxProgress); @@ -322,7 +334,7 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa public abstract int getRecipeCount(); public abstract int getTemplateIndex(int index); - + /** * @param index * @return A size 3 int array containing min input, max input and output indices in that order. diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java index 77eb13f89..64930bf2d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import com.hbm.inventory.RecipesCommon.AStack; @@ -14,6 +15,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.InventoryUtil; +import com.hbm.util.ItemStackUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; @@ -38,20 +40,20 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa public int[] progress; public int[] maxProgress; public boolean isProgressing; - + public FluidTank[] tanks; - + int consumption = 100; int speed = 100; public TileEntityMachineChemplantBase(int scount) { super(scount); - + int count = this.getRecipeCount(); progress = new int[count]; maxProgress = new int[count]; - + tanks = new FluidTank[4 * count]; for(int i = 0; i < 4 * count; i++) { tanks[i] = new FluidTank(Fluids.NONE, getTankCapacity()); @@ -60,20 +62,20 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + int count = this.getRecipeCount(); - + this.isProgressing = false; this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); - + for(int i = 0; i < count; i++) { loadItems(i); unloadItems(i); } - + for(int i = 0; i < count; i++) { if(!canProcess(i)) { this.progress[i] = 0; @@ -84,74 +86,83 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa } } } - + protected boolean canProcess(int index) { - + int template = getTemplateIndex(index); - + if(slots[template] == null || slots[template].getItem() != ModItems.chemistry_template) return false; - + ChemRecipe recipe = ChemplantRecipes.indexMapping.get(slots[template].getItemDamage()); - + if(recipe == null) return false; - + setupTanks(recipe, index); - + if(this.power < this.consumption) return false; if(!hasRequiredFluids(recipe, index)) return false; if(!hasSpaceForFluids(recipe, index)) return false; if(!hasRequiredItems(recipe, index)) return false; if(!hasSpaceForItems(recipe, index)) return false; - + return true; } - + private void setupTanks(ChemRecipe recipe, int index) { if(recipe.inputFluids[0] != null) tanks[index * 4].withPressure(recipe.inputFluids[0].pressure).setTankType(recipe.inputFluids[0].type); else tanks[index * 4].setTankType(Fluids.NONE); if(recipe.inputFluids[1] != null) tanks[index * 4 + 1].withPressure(recipe.inputFluids[1].pressure).setTankType(recipe.inputFluids[1].type); else tanks[index * 4 + 1].setTankType(Fluids.NONE); if(recipe.outputFluids[0] != null) tanks[index * 4 + 2].withPressure(recipe.outputFluids[0].pressure).setTankType(recipe.outputFluids[0].type); else tanks[index * 4 + 2].setTankType(Fluids.NONE); if(recipe.outputFluids[1] != null) tanks[index * 4 + 3].withPressure(recipe.outputFluids[1].pressure).setTankType(recipe.outputFluids[1].type); else tanks[index * 4 + 3].setTankType(Fluids.NONE); } - + private boolean hasRequiredFluids(ChemRecipe recipe, int index) { if(recipe.inputFluids[0] != null && tanks[index * 4].getFill() < recipe.inputFluids[0].fill) return false; if(recipe.inputFluids[1] != null && tanks[index * 4 + 1].getFill() < recipe.inputFluids[1].fill) return false; return true; } - + private boolean hasSpaceForFluids(ChemRecipe recipe, int index) { if(recipe.outputFluids[0] != null && tanks[index * 4 + 2].getFill() + recipe.outputFluids[0].fill > tanks[index * 4 + 2].getMaxFill()) return false; if(recipe.outputFluids[1] != null && tanks[index * 4 + 3].getFill() + recipe.outputFluids[1].fill > tanks[index * 4 + 3].getMaxFill()) return false; return true; } - + + public HashMap cachedItems = new HashMap<>(); + private boolean hasRequiredItems(ChemRecipe recipe, int index) { int[] indices = getSlotIndicesFromIndex(index); - return InventoryUtil.doesArrayHaveIngredients(slots, indices[0], indices[1], recipe.inputs); + ItemStack[] copy = ItemStackUtil.carefulCopyArrayTruncate(slots, indices[0], indices[1]); + if (cachedItems.get(copy) != null) + return cachedItems.get(copy); + else { + boolean hasItems = InventoryUtil.doesArrayHaveIngredients(slots, indices[0], indices[1], recipe.inputs); + cachedItems.put(copy, hasItems); + return hasItems; + } } - + private boolean hasSpaceForItems(ChemRecipe recipe, int index) { int[] indices = getSlotIndicesFromIndex(index); return InventoryUtil.doesArrayHaveSpace(slots, indices[2], indices[3], recipe.outputs); } - + protected void process(int index) { - + this.power -= this.consumption; this.progress[index]++; - + if(slots[0] != null && slots[0].getItem() == ModItems.meteorite_sword_machined) slots[0] = new ItemStack(ModItems.meteorite_sword_treated); //fisfndmoivndlmgindgifgjfdnblfm - + int template = getTemplateIndex(index); ChemRecipe recipe = ChemplantRecipes.indexMapping.get(slots[template].getItemDamage()); - + this.maxProgress[index] = recipe.getDuration() * this.speed / 100; - + if(maxProgress[index] <= 0) maxProgress[index] = 1; - + if(this.progress[index] >= this.maxProgress[index]) { consumeFluids(recipe, index); produceFluids(recipe, index); @@ -161,84 +172,84 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa this.markDirty(); } } - + private void consumeFluids(ChemRecipe recipe, int index) { if(recipe.inputFluids[0] != null) tanks[index * 4].setFill(tanks[index * 4].getFill() - recipe.inputFluids[0].fill); if(recipe.inputFluids[1] != null) tanks[index * 4 + 1].setFill(tanks[index * 4 + 1].getFill() - recipe.inputFluids[1].fill); } - + private void produceFluids(ChemRecipe recipe, int index) { if(recipe.outputFluids[0] != null) tanks[index * 4 + 2].setFill(tanks[index * 4 + 2].getFill() + recipe.outputFluids[0].fill); if(recipe.outputFluids[1] != null) tanks[index * 4 + 3].setFill(tanks[index * 4 + 3].getFill() + recipe.outputFluids[1].fill); } - + private void consumeItems(ChemRecipe recipe, int index) { - + int[] indices = getSlotIndicesFromIndex(index); - + for(AStack in : recipe.inputs) { if(in != null) InventoryUtil.tryConsumeAStack(slots, indices[0], indices[1], in); } } - + private void produceItems(ChemRecipe recipe, int index) { - + int[] indices = getSlotIndicesFromIndex(index); - + for(ItemStack out : recipe.outputs) { if(out != null) InventoryUtil.tryAddItemToInventory(slots, indices[2], indices[3], out.copy()); } } - + private void loadItems(int index) { - + int template = getTemplateIndex(index); if(slots[template] == null || slots[template].getItem() != ModItems.chemistry_template) return; - + ChemRecipe recipe = ChemplantRecipes.indexMapping.get(slots[template].getItemDamage()); - + if(recipe != null) { - + DirPos[] positions = getInputPositions(); int[] indices = getSlotIndicesFromIndex(index); - + for(DirPos coord : positions) { TileEntity te = worldObj.getTileEntity(coord.getX(), coord.getY(), coord.getZ()); - + if(te instanceof IInventory) { - + IInventory inv = (IInventory) te; ISidedInventory sided = inv instanceof ISidedInventory ? (ISidedInventory) inv : null; int[] access = sided != null ? sided.getAccessibleSlotsFromSide(coord.getDir().ordinal()) : null; - + for(AStack ingredient : recipe.inputs) { - + outer: while(!InventoryUtil.doesArrayHaveIngredients(slots, indices[0], indices[1], ingredient)) { - + boolean found = false; - + for(int i = 0; i < (access != null ? access.length : inv.getSizeInventory()); i++) { int slot = access != null ? access[i] : i; ItemStack stack = inv.getStackInSlot(slot); if(ingredient.matchesRecipe(stack, true) && (sided == null || sided.canExtractItem(slot, stack, 0))) { - + for(int j = indices[0]; j <= indices[1]; j++) { - + if(slots[j] != null && slots[j].stackSize < slots[j].getMaxStackSize() & InventoryUtil.doesStackDataMatch(slots[j], stack)) { inv.decrStackSize(slot, 1); slots[j].stackSize++; continue outer; } } - + for(int j = indices[0]; j <= indices[1]; j++) { - + if(slots[j] == null) { slots[j] = stack.copy(); slots[j].stackSize = 1; @@ -256,18 +267,18 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa } } } - + private void unloadItems(int index) { DirPos[] positions = getOutputPositions(); int[] indices = getSlotIndicesFromIndex(index); - + for(DirPos coord : positions) { TileEntity te = worldObj.getTileEntity(coord.getX(), coord.getY(), coord.getZ()); - + if(te instanceof IInventory) { - + IInventory inv = (IInventory) te; ISidedInventory sided = inv instanceof ISidedInventory ? (ISidedInventory) inv : null; int[] access = sided != null ? sided.getAccessibleSlotsFromSide(coord.getDir().ordinal()) : null; @@ -277,20 +288,20 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa shouldOutput = false; outer: for(int i = indices[2]; i <= indices[3]; i++) { - + ItemStack out = slots[i]; - + if(out != null) { - + for(int j = 0; j < (access != null ? access.length : inv.getSizeInventory()); j++) { - + int slot = access != null ? access[j] : j; - + if(!inv.isItemValidForSlot(slot, out)) continue; - + ItemStack target = inv.getStackInSlot(slot); - + if(InventoryUtil.doesStackDataMatch(out, target) && target.stackSize < target.getMaxStackSize() && target.stackSize < inv.getInventoryStackLimit()) { int toDec = Math.min(out.stackSize, Math.min(target.getMaxStackSize(), inv.getInventoryStackLimit()) - target.stackSize); this.decrStackSize(i, toDec); @@ -299,14 +310,14 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa break outer; } } - + for(int j = 0; j < (access != null ? access.length : inv.getSizeInventory()); j++) { - + int slot = access != null ? access[j] : j; - + if(!inv.isItemValidForSlot(slot, out)) continue; - + if(inv.getStackInSlot(slot) == null && (sided != null ? sided.canInsertItem(slot, out, coord.getDir().ordinal()) : inv.isItemValidForSlot(slot, out))) { ItemStack copy = out.copy(); copy.stackSize = 1; @@ -334,105 +345,105 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa } /*public int getFluidFill(FluidType type) { - + int fill = 0; - + for(FluidTank tank : inTanks()) { if(tank.getTankType() == type) { fill += tank.getFill(); } } - + for(FluidTank tank : outTanks()) { if(tank.getTankType() == type) { fill += tank.getFill(); } } - + return fill; }*/ /* For input only! */ public int getMaxFluidFill(FluidType type) { - + int maxFill = 0; - + for(FluidTank tank : inTanks()) { if(tank.getTankType() == type) { maxFill += tank.getMaxFill(); } } - + return maxFill; } - + protected List inTanks() { List inTanks = new ArrayList(); - + for(int i = 0; i < tanks.length; i++) { FluidTank tank = tanks[i]; if(i % 4 < 2) { inTanks.add(tank); } } - + return inTanks; } /*public void receiveFluid(int amount, FluidType type) { - + if(amount <= 0) return; - + List rec = new ArrayList(); - + for(FluidTank tank : inTanks()) { if(tank.getTankType() == type) { rec.add(tank); } } - + if(rec.size() == 0) return; - + int demand = 0; List weight = new ArrayList(); - + for(FluidTank tank : rec) { int fillWeight = tank.getMaxFill() - tank.getFill(); demand += fillWeight; weight.add(fillWeight); } - + for(int i = 0; i < rec.size(); i++) { - + if(demand <= 0) break; - + FluidTank tank = rec.get(i); int fillWeight = weight.get(i); int part = (int) (Math.min((long)amount, (long)demand) * (long)fillWeight / (long)demand); - + tank.setFill(tank.getFill() + part); } }*/ public int getFluidFillForTransfer(FluidType type, int pressure) { - + int fill = 0; - + for(FluidTank tank : outTanks()) { if(tank.getTankType() == type && tank.getPressure() == pressure) { fill += tank.getFill(); } } - + return fill; } - + public void transferFluid(int amount, FluidType type, int pressure) { - + /* * this whole new fluid mumbo jumbo extra abstraction layer might just be a bandaid * on the gushing wound that is the current fluid systemm but i'll be damned if it @@ -441,44 +452,44 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa */ if(amount <= 0) return; - + List send = new ArrayList(); - + for(FluidTank tank : outTanks()) { if(tank.getTankType() == type && tank.getPressure() == pressure) { send.add(tank); } } - + if(send.size() == 0) return; - + int offer = 0; List weight = new ArrayList(); - + for(FluidTank tank : send) { int fillWeight = tank.getFill(); offer += fillWeight; weight.add(fillWeight); } - + int tracker = amount; - + for(int i = 0; i < send.size(); i++) { - + FluidTank tank = send.get(i); int fillWeight = weight.get(i); int part = amount * fillWeight / offer; - + tank.setFill(tank.getFill() - part); tracker -= part; } - + //making sure to properly deduct even the last mB lost by rounding errors for(int i = 0; i < 100 && tracker > 0; i++) { - + FluidTank tank = send.get(i % send.size()); - + if(tank.getFill() > 0) { int total = Math.min(tank.getFill(), tracker); tracker -= total; @@ -486,18 +497,18 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa } } } - + protected List outTanks() { - + List outTanks = new ArrayList(); - + for(int i = 0; i < tanks.length; i++) { FluidTank tank = tanks[i]; if(i % 4 > 1) { outTanks.add(tank); } } - + return outTanks; } @@ -509,43 +520,43 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa @Override public long transferFluid(FluidType type, int pressure, long fluid) { int amount = (int) fluid; - + if(amount <= 0) return 0; - + List rec = new ArrayList(); - + for(FluidTank tank : inTanks()) { if(tank.getTankType() == type && tank.getPressure() == pressure) { rec.add(tank); } } - + if(rec.size() == 0) return fluid; - + int demand = 0; List weight = new ArrayList(); - + for(FluidTank tank : rec) { int fillWeight = tank.getMaxFill() - tank.getFill(); demand += fillWeight; weight.add(fillWeight); } - + for(int i = 0; i < rec.size(); i++) { - + if(demand <= 0) break; - + FluidTank tank = rec.get(i); int fillWeight = weight.get(i); int part = (int) (Math.min((long)amount, (long)demand) * (long)fillWeight / (long)demand); - + tank.setFill(tank.getFill() + part); fluid -= part; } - + return fluid; } @@ -563,29 +574,29 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa public void removeFluidForTransfer(FluidType type, int pressure, long amount) { this.transferFluid((int) amount, type, pressure); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); this.progress = nbt.getIntArray("progress"); - + if(progress.length == 0) progress = new int[this.getRecipeCount()]; - + for(int i = 0; i < tanks.length; i++) { tanks[i].readFromNBT(nbt, "t" + i); } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setIntArray("progress", progress); - + for(int i = 0; i < tanks.length; i++) { tanks[i].writeToNBT(nbt, "t" + i); } @@ -594,7 +605,7 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa public abstract int getRecipeCount(); public abstract int getTankCapacity(); public abstract int getTemplateIndex(int index); - + /** * @param index * @return A size 4 int array containing min input, max input, min output and max output indices in that order. From 6443a4c3915261f89c3b89250f002c69ee173d41 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 27 Oct 2024 23:06:40 -0500 Subject: [PATCH 46/70] Make ExtPropPacket ByteBuf based, along with some other performance improvements such as removing debug fluid net code and making RBMKDials more accepting of new gamerules. --- src/main/java/api/hbm/fluid/PipeNet.java | 66 ++-- .../java/com/hbm/extprop/HbmLivingProps.java | 198 +++++++---- .../java/com/hbm/extprop/HbmPlayerProps.java | 109 +++--- .../com/hbm/handler/EntityEffectHandler.java | 316 +++++++++--------- .../hbm/packet/toclient/ExtPropPacket.java | 50 ++- .../machine/TileEntityCondenser.java | 5 - .../tileentity/machine/rbmk/RBMKDials.java | 80 ++--- .../java/com/hbm/util/GameRuleHelper.java | 44 ++- 8 files changed, 473 insertions(+), 395 deletions(-) diff --git a/src/main/java/api/hbm/fluid/PipeNet.java b/src/main/java/api/hbm/fluid/PipeNet.java index 3dacf2f0b..f459ee32d 100644 --- a/src/main/java/api/hbm/fluid/PipeNet.java +++ b/src/main/java/api/hbm/fluid/PipeNet.java @@ -18,18 +18,18 @@ public class PipeNet implements IPipeNet { private FluidType type; private List links = new ArrayList(); private HashSet subscribers = new HashSet(); - + public static List trackingInstances = null; protected BigInteger totalTransfer = BigInteger.ZERO; public List debug = new ArrayList(); - + public PipeNet(FluidType type) { this.type = type; } @Override public void joinNetworks(IPipeNet network) { - + if(network == this) return; @@ -38,11 +38,11 @@ public class PipeNet implements IPipeNet { this.getLinks().add(conductor); } network.getLinks().clear(); - + for(IFluidConnector connector : network.getSubscribers()) { this.subscribe(connector); } - + network.destroy(); } @@ -58,10 +58,10 @@ public class PipeNet implements IPipeNet { @Override public IPipeNet joinLink(IFluidConductor conductor) { - + if(conductor.getPipeNet(type) != null) conductor.getPipeNet(type).leaveLink(conductor); - + conductor.setPipeNet(type, this); this.links.add(conductor); return this; @@ -91,53 +91,54 @@ public class PipeNet implements IPipeNet { @Override public long transferFluid(long fill, int pressure) { - subscribers.removeIf(x -> + subscribers.removeIf(x -> x == null || !(x instanceof TileEntity) || ((TileEntity)x).isInvalid() || !x.isLoaded() ); - + if(this.subscribers.isEmpty()) return fill; - + trackingInstances = new ArrayList(); trackingInstances.add(this); List subList = new ArrayList(subscribers); return fairTransfer(subList, type, pressure, fill); } - + public static long fairTransfer(List subList, FluidType type, int pressure, long fill) { - + if(fill <= 0) return 0; - + List weight = new ArrayList(); long totalReq = 0; - + for(IFluidConnector con : subList) { long req = con.getDemand(type, pressure); weight.add(req); totalReq += req; } - + if(totalReq == 0) return fill; - + long totalGiven = 0; - + for(int i = 0; i < subList.size(); i++) { IFluidConnector con = subList.get(i); long req = weight.get(i); double fraction = (double)req / (double)totalReq; - + long given = (long) Math.floor(fraction * fill); - + if(given > 0) { - + totalGiven += (given - con.transferFluid(type, pressure, given)); - + if(con instanceof TileEntity) { TileEntity tile = (TileEntity) con; tile.getWorldObj().markTileEntityChunkModified(tile.xCoord, tile.yCoord, tile.zCoord, tile); } - + + /* debug code if(trackingInstances != null) { for(int j = 0; j < trackingInstances.size(); j++) { PipeNet net = trackingInstances.get(j); @@ -146,17 +147,18 @@ public class PipeNet implements IPipeNet { log(net, sdf.format(new Date(System.currentTimeMillis())) + " Sending " + given + "mB to " + conToString(con)); } } + */ } } - + if(trackingInstances != null) { - + for(int i = 0; i < trackingInstances.size(); i++) { PipeNet net = trackingInstances.get(i); net.totalTransfer = net.totalTransfer.add(BigInteger.valueOf(totalGiven)); } } - + return fill - totalGiven; } @@ -169,10 +171,10 @@ public class PipeNet implements IPipeNet { public void destroy() { this.valid = false; this.subscribers.clear(); - + for(IFluidConductor con : this.links) con.setPipeNet(type, null); - + this.links.clear(); } @@ -185,22 +187,22 @@ public class PipeNet implements IPipeNet { public BigInteger getTotalTransfer() { return this.totalTransfer; } - + public static void log(PipeNet net, String msg) { net.debug.add(msg); - + while(net.debug.size() > 50) { net.debug.remove(0); } } - + public static String conToString(IFluidConnector con) { - + if(con instanceof TileEntity) { TileEntity tile = (TileEntity) con; return tile.getClass().getSimpleName() + " @ " + tile.xCoord + "/" + tile.yCoord + "/" + tile.zCoord; } - + return "" + con; } } diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 18c6a73fa..6a1746ed9 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -14,6 +14,7 @@ import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.util.ChatBuilder; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -30,11 +31,11 @@ import net.minecraft.world.World; import net.minecraftforge.common.IExtendedEntityProperties; public class HbmLivingProps implements IExtendedEntityProperties { - + public static final String key = "NTM_EXT_LIVING"; public static final UUID digamma_UUID = UUID.fromString("2a3d8aec-5ab9-4218-9b8b-ca812bdf378b"); public EntityLivingBase entity; - + /// VALS /// private float radiation; private float digamma; @@ -51,24 +52,24 @@ public class HbmLivingProps implements IExtendedEntityProperties { private boolean frozen = false; private boolean burning = false; private List contamination = new ArrayList(); - + public HbmLivingProps(EntityLivingBase entity) { this.entity = entity; } - + /// DATA /// public static HbmLivingProps registerData(EntityLivingBase entity) { - + entity.registerExtendedProperties(key, new HbmLivingProps(entity)); return (HbmLivingProps) entity.getExtendedProperties(key); } - + public static HbmLivingProps getData(EntityLivingBase entity) { - + HbmLivingProps props = (HbmLivingProps) entity.getExtendedProperties(key); return props != null ? props : registerData(entity); } - + /// RADIATION /// public static float getRadiation(EntityLivingBase entity) { if(!RadiationConfig.enableContamination) @@ -76,89 +77,89 @@ public class HbmLivingProps implements IExtendedEntityProperties { return getData(entity).radiation; } - + public static void setRadiation(EntityLivingBase entity, float rad) { if(RadiationConfig.enableContamination) getData(entity).radiation = rad; } - + public static void incrementRadiation(EntityLivingBase entity, float rad) { if(!RadiationConfig.enableContamination) return; - + HbmLivingProps data = getData(entity); float radiation = getData(entity).radiation + rad; - + if(radiation > 2500) radiation = 2500; if(radiation < 0) radiation = 0; - + data.setRadiation(entity, radiation); } - + /// RAD ENV /// public static float getRadEnv(EntityLivingBase entity) { return getData(entity).radEnv; } - + public static void setRadEnv(EntityLivingBase entity, float rad) { getData(entity).radEnv = rad; } - + /// RAD BUF /// public static float getRadBuf(EntityLivingBase entity) { return getData(entity).radBuf; } - + public static void setRadBuf(EntityLivingBase entity, float rad) { getData(entity).radBuf = rad; } - + /// CONTAMINATION /// public static List getCont(EntityLivingBase entity) { return getData(entity).contamination; } - + public static void addCont(EntityLivingBase entity, ContaminationEffect cont) { getData(entity).contamination.add(cont); } - + /// DIGAMA /// public static float getDigamma(EntityLivingBase entity) { return getData(entity).digamma; } - + public static void setDigamma(EntityLivingBase entity, float digamma) { - + if(entity.worldObj.isRemote) return; - + if(entity instanceof EntityDuck) digamma = 0.0F; - + getData(entity).digamma = digamma; - + float healthMod = (float)Math.pow(0.5, digamma) - 1F; - + IAttributeInstance attributeinstance = entity.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth); - + try { attributeinstance.removeModifier(attributeinstance.getModifier(digamma_UUID)); } catch(Exception ex) { } - + attributeinstance.applyModifier(new AttributeModifier(digamma_UUID, "digamma", healthMod, 2)); - + if(entity.getHealth() > entity.getMaxHealth() && entity.getMaxHealth() > 0) { entity.setHealth(entity.getMaxHealth()); } - + if((entity.getMaxHealth() <= 0 || digamma >= 10.0F) && entity.isEntityAlive()) { entity.setAbsorptionAmount(0); entity.attackEntityFrom(ModDamageSource.digamma, 500F); entity.setHealth(0); entity.onDeath(ModDamageSource.digamma); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "sweat"); data.setInteger("count", 50); @@ -166,9 +167,9 @@ public class HbmLivingProps implements IExtendedEntityProperties { data.setInteger("entity", entity.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 50)); } - + if(entity instanceof EntityPlayer) { - + float di = getData(entity).digamma; if(di > 0F) @@ -179,107 +180,107 @@ public class HbmLivingProps implements IExtendedEntityProperties { ((EntityPlayer) entity).triggerAchievement(MainRegistry.digammaKnow); } } - + public static void incrementDigamma(EntityLivingBase entity, float digamma) { - + if(entity instanceof EntityDuck) digamma = 0.0F; - + HbmLivingProps data = getData(entity); float dRad = getDigamma(entity) + digamma; - + if(dRad > 10) dRad = 10; if(dRad < 0) dRad = 0; - + data.setDigamma(entity, dRad); } - - + + /// ASBESTOS /// public static int getAsbestos(EntityLivingBase entity) { if(RadiationConfig.disableAsbestos) return 0; return getData(entity).asbestos; } - + public static void setAsbestos(EntityLivingBase entity, int asbestos) { if(RadiationConfig.disableAsbestos) return; getData(entity).asbestos = asbestos; - + if(asbestos >= maxAsbestos) { getData(entity).asbestos = 0; entity.attackEntityFrom(ModDamageSource.asbestos, 1000); } } - + public static void incrementAsbestos(EntityLivingBase entity, int asbestos) { if(RadiationConfig.disableAsbestos) return; setAsbestos(entity, getAsbestos(entity) + asbestos); - + if(entity instanceof EntityPlayerMP) { PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation("info.asbestos").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_GAS_HAZARD, 3000), (EntityPlayerMP) entity); } } - - + + /// BLACK LUNG DISEASE /// public static int getBlackLung(EntityLivingBase entity) { if(RadiationConfig.disableCoal) return 0; return getData(entity).blacklung; } - + public static void setBlackLung(EntityLivingBase entity, int blacklung) { if(RadiationConfig.disableCoal) return; getData(entity).blacklung = blacklung; - + if(blacklung >= maxBlacklung) { getData(entity).blacklung = 0; entity.attackEntityFrom(ModDamageSource.blacklung, 1000); } } - + public static void incrementBlackLung(EntityLivingBase entity, int blacklung) { if(RadiationConfig.disableCoal) return; setBlackLung(entity, getBlackLung(entity) + blacklung); - + if(entity instanceof EntityPlayerMP) { PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation("info.coaldust").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_GAS_HAZARD, 3000), (EntityPlayerMP) entity); } } - + /// TIME BOMB /// public static int getTimer(EntityLivingBase entity) { return getData(entity).bombTimer; } - + public static void setTimer(EntityLivingBase entity, int bombTimer) { getData(entity).bombTimer = bombTimer; } - + /// CONTAGION /// public static int getContagion(EntityLivingBase entity) { return getData(entity).contagion; } - + public static void setContagion(EntityLivingBase entity, int contageon) { getData(entity).contagion = contageon; } - + /// OIL /// public static int getOil(EntityLivingBase entity) { return getData(entity).oil; } - + public static void setOil(EntityLivingBase entity, int oil) { getData(entity).oil = oil; } - + /// TEMPERATURE /// public static int getTemperature(EntityLivingBase entity) { return getData(entity).temperature; } - + public static void setTemperature(EntityLivingBase entity, int temperature) { HbmLivingProps data = getData(entity); temperature = MathHelper.clamp_int(temperature, -2500, 2500); @@ -296,11 +297,42 @@ public class HbmLivingProps implements IExtendedEntityProperties { @Override public void init(Entity entity, World world) { } + public void serialize(ByteBuf buf) { + buf.writeFloat(radiation); + buf.writeFloat(digamma); + buf.writeInt(asbestos); + buf.writeInt(bombTimer); + buf.writeInt(contagion); + buf.writeInt(blacklung); + buf.writeInt(oil); + buf.writeInt(this.contamination.size()); + for (ContaminationEffect contaminationEffect : this.contamination) { + contaminationEffect.serialize(buf); // long ass buffers? uh, yes please! + } + } + + public void deserialize(ByteBuf buf) { + if(buf.readableBytes() > 0) { + radiation = buf.readFloat(); + digamma = buf.readFloat(); + asbestos = buf.readInt(); + bombTimer = buf.readInt(); + contagion = buf.readInt(); + blacklung = buf.readInt(); + oil = buf.readInt(); + int size = buf.readInt(); + for (int i = 0; i < size; i++) { + this.contamination.add(ContaminationEffect.deserialize(buf)); + } + } + } + + @Deprecated @Override public void saveNBTData(NBTTagCompound nbt) { - + NBTTagCompound props = new NBTTagCompound(); - + props.setFloat("hfr_radiation", radiation); props.setFloat("hfr_digamma", digamma); props.setInteger("hfr_asbestos", asbestos); @@ -308,21 +340,22 @@ public class HbmLivingProps implements IExtendedEntityProperties { props.setInteger("hfr_contagion", contagion); props.setInteger("hfr_blacklung", blacklung); props.setInteger("hfr_oil", oil); - + props.setInteger("hfr_cont_count", this.contamination.size()); - + for(int i = 0; i < this.contamination.size(); i++) { this.contamination.get(i).save(props, i); } - + nbt.setTag("HbmLivingProps", props); } + @Deprecated @Override public void loadNBTData(NBTTagCompound nbt) { - + NBTTagCompound props = (NBTTagCompound) nbt.getTag("HbmLivingProps"); - + if(props != null) { radiation = props.getFloat("hfr_radiation"); digamma = props.getFloat("hfr_digamma"); @@ -331,32 +364,49 @@ public class HbmLivingProps implements IExtendedEntityProperties { contagion = props.getInteger("hfr_contagion"); blacklung = props.getInteger("hfr_blacklung"); oil = props.getInteger("hfr_oil"); - + int cont = props.getInteger("hfr_cont_count"); - + for(int i = 0; i < cont; i++) { this.contamination.add(ContaminationEffect.load(props, i)); } } } - + public static class ContaminationEffect { - + public float maxRad; public int maxTime; public int time; public boolean ignoreArmor; - + public ContaminationEffect(float rad, int time, boolean ignoreArmor) { this.maxRad = rad; this.maxTime = this.time = time; this.ignoreArmor = ignoreArmor; } - + public float getRad() { return maxRad * ((float)time / (float)maxTime); } - + + public void serialize(ByteBuf buf) { + buf.writeFloat(this.maxRad); + buf.writeInt(this.maxTime); + buf.writeInt(this.time); + buf.writeBoolean(ignoreArmor); + } + + public static ContaminationEffect deserialize(ByteBuf buf) { + float maxRad = buf.readFloat(); + int maxTime = buf.readInt(); + int time = buf.readInt(); + boolean ignoreArmor = buf.readBoolean(); + ContaminationEffect effect = new ContaminationEffect(maxRad, maxTime, ignoreArmor); + effect.time = time; + return effect; + } + public void save(NBTTagCompound nbt, int index) { NBTTagCompound me = new NBTTagCompound(); me.setFloat("maxRad", this.maxRad); @@ -365,14 +415,14 @@ public class HbmLivingProps implements IExtendedEntityProperties { me.setBoolean("ignoreArmor", ignoreArmor); nbt.setTag("cont_" + index, me); } - + public static ContaminationEffect load(NBTTagCompound nbt, int index) { NBTTagCompound me = (NBTTagCompound) nbt.getTag("cont_" + index); float maxRad = me.getFloat("maxRad"); int maxTime = nbt.getInteger("maxTime"); int time = nbt.getInteger("time"); boolean ignoreArmor = nbt.getBoolean("ignoreArmor"); - + ContaminationEffect effect = new ContaminationEffect(maxRad, maxTime, ignoreArmor); effect.time = time; return effect; diff --git a/src/main/java/com/hbm/extprop/HbmPlayerProps.java b/src/main/java/com/hbm/extprop/HbmPlayerProps.java index b1dfbd74d..9439b5572 100644 --- a/src/main/java/com/hbm/extprop/HbmPlayerProps.java +++ b/src/main/java/com/hbm/extprop/HbmPlayerProps.java @@ -8,6 +8,7 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -17,68 +18,68 @@ import net.minecraft.world.World; import net.minecraftforge.common.IExtendedEntityProperties; public class HbmPlayerProps implements IExtendedEntityProperties { - + public static final String key = "NTM_EXT_PLAYER"; public EntityPlayer player; - + public boolean hasReceivedBook = false; - + public boolean enableHUD = true; public boolean enableBackpack = true; - + private boolean[] keysPressed = new boolean[EnumKeybind.values().length]; - + public boolean dashActivated = true; - + public static final int dashCooldownLength = 5; public int dashCooldown = 0; - + public int totalDashCount = 0; public int stamina = 0; - + public static final int plinkCooldownLength = 10; public int plinkCooldown = 0; - + public float shield = 0; public float maxShield = 0; public int lastDamage = 0; public static final float shieldCap = 100; - + public int reputation; - + public boolean isOnLadder = false; - + public HbmPlayerProps(EntityPlayer player) { this.player = player; } - + public static HbmPlayerProps registerData(EntityPlayer player) { player.registerExtendedProperties(key, new HbmPlayerProps(player)); return (HbmPlayerProps) player.getExtendedProperties(key); } - + public static HbmPlayerProps getData(EntityPlayer player) { HbmPlayerProps props = (HbmPlayerProps) player.getExtendedProperties(key); return props != null ? props : registerData(player); } - + public boolean getKeyPressed(EnumKeybind key) { return keysPressed[key.ordinal()]; } - + public boolean isJetpackActive() { return this.enableBackpack && getKeyPressed(EnumKeybind.JETPACK); } - + public void setKeyPressed(EnumKeybind key, boolean pressed) { - + if(!getKeyPressed(key) && pressed) { - + if(key == EnumKeybind.TOGGLE_JETPACK) { - + if(!player.worldObj.isRemote) { this.enableBackpack = !this.enableBackpack; - + if(this.enableBackpack) MainRegistry.proxy.displayTooltip(EnumChatFormatting.GREEN + "Jetpack ON", MainRegistry.proxy.ID_JETPACK); else @@ -86,19 +87,19 @@ public class HbmPlayerProps implements IExtendedEntityProperties { } } if(key == EnumKeybind.TOGGLE_HEAD) { - + if(!player.worldObj.isRemote) { this.enableHUD = !this.enableHUD; - + if(this.enableHUD) MainRegistry.proxy.displayTooltip(EnumChatFormatting.GREEN + "HUD ON", MainRegistry.proxy.ID_HUD); else MainRegistry.proxy.displayTooltip(EnumChatFormatting.RED + "HUD OFF", MainRegistry.proxy.ID_HUD); } } - + if(key == EnumKeybind.TRAIN) { - + if(!this.player.worldObj.isRemote) { if(player.ridingEntity != null && player.ridingEntity instanceof EntityRailCarBase && player.ridingEntity instanceof IGUIProvider) { @@ -107,50 +108,50 @@ public class HbmPlayerProps implements IExtendedEntityProperties { } } } - + keysPressed[key.ordinal()] = pressed; } - + public void setDashCooldown(int cooldown) { this.dashCooldown = cooldown; return; } - + public int getDashCooldown() { return this.dashCooldown; } - + public void setStamina(int stamina) { this.stamina = stamina; return; } - + public int getStamina() { return this.stamina; } - + public void setDashCount(int count) { this.totalDashCount = count; return; } - + public int getDashCount() { return this.totalDashCount; } - + public static void plink(EntityPlayer player, String sound, float volume, float pitch) { HbmPlayerProps props = HbmPlayerProps.getData(player); - + if(props.plinkCooldown <= 0) { player.worldObj.playSoundAtEntity(player, sound, volume, pitch); props.plinkCooldown = props.plinkCooldownLength; } } - + public float getEffectiveMaxShield() { - + float max = this.maxShield; - + if(player.getCurrentArmor(2) != null) { ItemStack[] mods = ArmorModHandler.pryMods(player.getCurrentArmor(2)); if(mods[ArmorModHandler.kevlar] != null && mods[ArmorModHandler.kevlar].getItem() instanceof ItemModShield) { @@ -158,16 +159,39 @@ public class HbmPlayerProps implements IExtendedEntityProperties { max += mod.shield; } } - + return max; } @Override public void init(Entity entity, World world) { } + public void serialize(ByteBuf buf) { + buf.writeBoolean(this.hasReceivedBook); + buf.writeFloat(this.shield); + buf.writeFloat(this.maxShield); + buf.writeBoolean(this.enableBackpack); + buf.writeBoolean(this.enableHUD); + buf.writeInt(this.reputation); + buf.writeBoolean(this.isOnLadder); + } + + public void deserialize(ByteBuf buf) { + if(buf.readableBytes() > 0) { + this.hasReceivedBook = buf.readBoolean(); + this.shield = buf.readFloat(); + this.maxShield = buf.readFloat(); + this.enableBackpack = buf.readBoolean(); + this.enableHUD = buf.readBoolean(); + this.reputation = buf.readInt(); + this.isOnLadder = buf.readBoolean(); + } + } + + @Deprecated @Override public void saveNBTData(NBTTagCompound nbt) { - + NBTTagCompound props = new NBTTagCompound(); props.setBoolean("hasReceivedBook", hasReceivedBook); @@ -177,15 +201,16 @@ public class HbmPlayerProps implements IExtendedEntityProperties { props.setBoolean("enableHUD", enableHUD); props.setInteger("reputation", reputation); props.setBoolean("isOnLadder", isOnLadder); - + nbt.setTag("HbmPlayerProps", props); } + @Deprecated @Override public void loadNBTData(NBTTagCompound nbt) { - + NBTTagCompound props = (NBTTagCompound) nbt.getTag("HbmPlayerProps"); - + if(props != null) { this.hasReceivedBook = props.getBoolean("hasReceivedBook"); this.shield = props.getFloat("shield"); diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 2ce39d4ce..9e4ed7089 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -34,6 +34,8 @@ import com.hbm.util.ContaminationUtil.HazardType; import com.hbm.world.biome.BiomeGenCraterBase; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -55,12 +57,12 @@ import net.minecraft.world.biome.BiomeGenBase; public class EntityEffectHandler { public static void onUpdate(EntityLivingBase entity) { - + if(entity.ticksExisted % 20 == 0) { HbmLivingProps.setRadBuf(entity, HbmLivingProps.getRadEnv(entity)); HbmLivingProps.setRadEnv(entity, 0); } - + if(entity instanceof EntityPlayer && entity == MainRegistry.proxy.me()) { EntityPlayer player = MainRegistry.proxy.me(); if(player != null) { @@ -75,7 +77,7 @@ public class EntityEffectHandler { if(entity instanceof EntityPlayerMP) { HbmLivingProps props = HbmLivingProps.getData(entity); HbmPlayerProps pprps = HbmPlayerProps.getData((EntityPlayerMP) entity); - NBTTagCompound data = new NBTTagCompound(); + ByteBuf buf = Unpooled.buffer(); if(pprps.shield < pprps.getEffectiveMaxShield() && entity.ticksExisted > pprps.lastDamage + 60) { int tsd = entity.ticksExisted - (pprps.lastDamage + 60); @@ -85,16 +87,16 @@ public class EntityEffectHandler { if(pprps.shield > pprps.getEffectiveMaxShield()) pprps.shield = pprps.getEffectiveMaxShield(); - props.saveNBTData(data); - pprps.saveNBTData(data); - PacketDispatcher.wrapper.sendTo(new ExtPropPacket(data), (EntityPlayerMP) entity); + props.serialize(buf); + pprps.serialize(buf); + PacketDispatcher.wrapper.sendTo(new ExtPropPacket(buf), (EntityPlayerMP) entity); } if(!entity.worldObj.isRemote) { int timer = HbmLivingProps.getTimer(entity); if(timer > 0) { HbmLivingProps.setTimer(entity, timer - 1); - + if(timer == 1) { ExplosionNukeSmall.explode(entity.worldObj, entity.posX, entity.posY, entity.posZ, ExplosionNukeSmall.PARAMS_MEDIUM); } @@ -103,15 +105,15 @@ public class EntityEffectHandler { if((GeneralConfig.enable528 && GeneralConfig.enable528NetherBurn) && entity instanceof EntityPlayer && !entity.isImmuneToFire() && entity.worldObj.provider.isHellWorld) { entity.setFire(5); } - + BiomeGenBase biome = entity.worldObj.getBiomeGenForCoords((int) Math.floor(entity.posX), (int) Math.floor(entity.posZ)); float radiation = 0; if(biome == BiomeGenCraterBase.craterOuterBiome) radiation = WorldConfig.craterBiomeOuterRad; if(biome == BiomeGenCraterBase.craterBiome) radiation = WorldConfig.craterBiomeRad; if(biome == BiomeGenCraterBase.craterInnerBiome) radiation = WorldConfig.craterBiomeInnerRad; - + if(entity.isWet()) radiation *= WorldConfig.craterBiomeWaterMult; - + if(radiation > 0) { ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, radiation / 20F); } @@ -128,14 +130,14 @@ public class EntityEffectHandler { handleDashing(entity); handlePlinking(entity); - + if(entity instanceof EntityPlayer) handleFauxLadder((EntityPlayer) entity); } - + private static void handleFauxLadder(EntityPlayer player) { - + HbmPlayerProps props = HbmPlayerProps.getData(player); - + if(props.isOnLadder) { float f5 = 0.15F; @@ -170,67 +172,67 @@ public class EntityEffectHandler { } props.isOnLadder = false; - + if(!player.worldObj.isRemote) ArmorUtil.resetFlightTime(player); } } - + private static void handleContamination(EntityLivingBase entity) { - + if(entity.worldObj.isRemote) return; - + List contamination = HbmLivingProps.getCont(entity); List rem = new ArrayList(); - + for(ContaminationEffect con : contamination) { ContaminationUtil.contaminate(entity, HazardType.RADIATION, con.ignoreArmor ? ContaminationType.RAD_BYPASS : ContaminationType.CREATIVE, con.getRad()); - + con.time--; - + if(con.time <= 0) rem.add(con); } - + contamination.removeAll(rem); } - + private static void handleRadiation(EntityLivingBase entity) { - + World world = entity.worldObj; - + if(!world.isRemote) { - + if(ContaminationUtil.isRadImmune(entity)) return; - + int ix = (int)MathHelper.floor_double(entity.posX); int iy = (int)MathHelper.floor_double(entity.posY); int iz = (int)MathHelper.floor_double(entity.posZ); - + float rad = ChunkRadiationManager.proxy.getRadiation(world, ix, iy, iz); - + if(world.provider.isHellWorld && RadiationConfig.hellRad > 0 && rad < RadiationConfig.hellRad) rad = (float) RadiationConfig.hellRad; - + if(rad > 0) { ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, rad / 20F); } - + if(entity.worldObj.isRaining() && BombConfig.cont > 0 && AuxSavedData.getThunder(entity.worldObj) > 0 && entity.worldObj.canBlockSeeTheSky(ix, iy, iz)) { ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, BombConfig.cont * 0.0005F); } - + if(entity instanceof EntityPlayer && ((EntityPlayer)entity).capabilities.isCreativeMode) return; - + Random rand = new Random(entity.getEntityId()); int r600 = rand.nextInt(600); int r1200 = rand.nextInt(1200); - + if(HbmLivingProps.getRadiation(entity) > 600) { - + if((world.getTotalWorldTime() + r600) % 600 < 20 && canVomit(entity)) { NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vomit"); @@ -238,44 +240,44 @@ public class EntityEffectHandler { nbt.setInteger("count", 25); nbt.setInteger("entity", entity.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); - + if((world.getTotalWorldTime() + r600) % 600 == 1) { world.playSoundEffect(ix, iy, iz, "hbm:player.vomit", 1.0F, 1.0F); entity.addPotionEffect(new PotionEffect(Potion.hunger.id, 60, 19)); } } - + } else if(HbmLivingProps.getRadiation(entity) > 200 && (world.getTotalWorldTime() + r1200) % 1200 < 20 && canVomit(entity)) { - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vomit"); nbt.setString("mode", "normal"); nbt.setInteger("count", 15); nbt.setInteger("entity", entity.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); - + if((world.getTotalWorldTime() + r1200) % 1200 == 1) { world.playSoundEffect(ix, iy, iz, "hbm:player.vomit", 1.0F, 1.0F); entity.addPotionEffect(new PotionEffect(Potion.hunger.id, 60, 19)); } - + } - + if(HbmLivingProps.getRadiation(entity) > 900 && (world.getTotalWorldTime() + rand.nextInt(10)) % 10 == 0) { - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "sweat"); nbt.setInteger("count", 1); nbt.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block)); nbt.setInteger("entity", entity.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); - + } } else { float radiation = HbmLivingProps.getRadiation(entity); - + if(entity instanceof EntityPlayer && radiation > 600) { - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "radiation"); nbt.setInteger("count", radiation > 900 ? 4 : radiation > 800 ? 2 : 1); @@ -283,20 +285,20 @@ public class EntityEffectHandler { } } } - + private static void handleDigamma(EntityLivingBase entity) { - + if(!entity.worldObj.isRemote) { - + float digamma = HbmLivingProps.getDigamma(entity); - + if(digamma < 0.01F) return; - + int chance = Math.max(10 - (int)(digamma), 1); - + if(chance == 1 || entity.getRNG().nextInt(chance) == 0) { - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "sweat"); data.setInteger("count", 1); @@ -306,41 +308,41 @@ public class EntityEffectHandler { } } } - + private static void handleContagion(EntityLivingBase entity) { - + World world = entity.worldObj; - + if(!entity.worldObj.isRemote) { - + Random rand = entity.getRNG(); int minute = 60 * 20; int hour = 60 * minute; - + int contagion = HbmLivingProps.getContagion(entity); - + if(entity instanceof EntityPlayer) { - + EntityPlayer player = (EntityPlayer) entity; int randSlot = rand.nextInt(player.inventory.mainInventory.length); ItemStack stack = player.inventory.getStackInSlot(randSlot); - + if(rand.nextInt(100) == 0) { stack = player.inventory.armorItemInSlot(rand.nextInt(4)); } - + //only affect unstackables (e.g. tools and armor) so that the NBT tag's stack restrictions isn't noticeable if(stack != null && stack.getMaxStackSize() == 1) { - + if(contagion > 0) { - + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); - + stack.stackTagCompound.setBoolean("ntmContagion", true); - + } else { - + if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("ntmContagion")) { if(!ArmorUtil.checkForHaz2(player) || !ArmorRegistry.hasProtection(player, 3, HazardClass.BACTERIA)) //liable to change to hazmat 1 at bob's pleasure HbmLivingProps.setContagion(player, 3 * hour); @@ -348,19 +350,19 @@ public class EntityEffectHandler { } } } - + if(contagion > 0) { HbmLivingProps.setContagion(entity, contagion - 1); - + //aerial transmission only happens once a second 5 minutes into the contagion if(contagion < (2 * hour + 55 * minute) && contagion % 20 == 0) { - + double range = entity.isWet() ? 16D : 2D; //avoid rain, just avoid it - + List list = world.getEntitiesWithinAABBExcludingEntity(entity, entity.boundingBox.expand(range, range, range)); - + for(Entity ent : list) { - + if(ent instanceof EntityLivingBase) { EntityLivingBase living = (EntityLivingBase) ent; if(HbmLivingProps.getContagion(living) <= 0) { @@ -368,39 +370,39 @@ public class EntityEffectHandler { HbmLivingProps.setContagion(living, 3 * hour); } } - + if(ent instanceof EntityItem) { ItemStack stack = ((EntityItem)ent).getEntityItem(); - + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); - + stack.stackTagCompound.setBoolean("ntmContagion", true); } } } - + //one hour in, add rare and subtle screen fuckery if(contagion < 2 * hour && rand.nextInt(1000) == 0) { entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 20, 0)); } - + //two hours in, give 'em the full blast if(contagion < 1 * hour && rand.nextInt(100) == 0) { entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 60, 0)); entity.addPotionEffect(new PotionEffect(Potion.weakness.id, 300, 4)); } - + //T-30 minutes, take damage every 20 seconds if(contagion < 30 * minute && rand.nextInt(400) == 0) { entity.attackEntityFrom(ModDamageSource.mku, 1F); } - + //T-5 minutes, take damage every 5 seconds if(contagion < 5 * minute && rand.nextInt(100) == 0) { entity.attackEntityFrom(ModDamageSource.mku, 2F); } - + if(contagion < 30 * minute && (contagion + entity.getEntityId()) % 200 < 20 && canVomit(entity)) { NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vomit"); @@ -408,11 +410,11 @@ public class EntityEffectHandler { nbt.setInteger("count", 25); nbt.setInteger("entity", entity.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); - + if((contagion + entity.getEntityId()) % 200 == 19) world.playSoundEffect(entity.posX, entity.posY, entity.posZ, "hbm:player.vomit", 1.0F, 1.0F); } - + //end of contagion, drop dead if(contagion == 0) { entity.attackEntityFrom(ModDamageSource.mku, 1000F); @@ -420,20 +422,20 @@ public class EntityEffectHandler { } } } - + private static void handleLungDisease(EntityLivingBase entity) { - + if(entity.worldObj.isRemote) return; - + if(entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isCreativeMode) { HbmLivingProps.setBlackLung(entity, 0); HbmLivingProps.setAsbestos(entity, 0); return; } else { - + int bl = HbmLivingProps.getBlackLung(entity); - + if(bl > 0 && bl < HbmLivingProps.maxBlacklung * 0.5) HbmLivingProps.setBlackLung(entity, HbmLivingProps.getBlackLung(entity) - 1); } @@ -441,13 +443,13 @@ public class EntityEffectHandler { double blacklung = Math.min(HbmLivingProps.getBlackLung(entity), HbmLivingProps.maxBlacklung); double asbestos = Math.min(HbmLivingProps.getAsbestos(entity), HbmLivingProps.maxAsbestos); double soot = PollutionHandler.getPollution(entity.worldObj, (int) Math.floor(entity.posX), (int) Math.floor(entity.posY + entity.getEyeHeight()), (int) Math.floor(entity.posZ), PollutionType.SOOT); - + if(!(entity instanceof EntityPlayer)) soot = 0; - + if(ArmorRegistry.hasProtection(entity, 3, HazardClass.PARTICLE_COARSE)) soot = 0; - + boolean coughs = blacklung / HbmLivingProps.maxBlacklung > 0.25D || asbestos / HbmLivingProps.maxAsbestos > 0.25D || soot > 30; - + if(!coughs) return; @@ -458,25 +460,25 @@ public class EntityEffectHandler { double blacklungDelta = 1D - (blacklung / (double)HbmLivingProps.maxBlacklung); double asbestosDelta = 1D - (asbestos / (double)HbmLivingProps.maxAsbestos); double sootDelta = 1D - Math.min(soot / 100, 1D); - + double total = 1 - (blacklungDelta * asbestosDelta); - + World world = entity.worldObj; - + if(total > 0.75D) { entity.addPotionEffect(new PotionEffect(Potion.weakness.id, 100, 2)); } - + if(total > 0.95D) { entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); } - + total = 1 - (blacklungDelta * asbestosDelta * sootDelta); int freq = Math.max((int) (1000 - 950 * total), 20); - + if(world.getTotalWorldTime() % freq == entity.getEntityId() % freq) { world.playSoundEffect(entity.posX, entity.posY, entity.posZ, "hbm:player.cough", 1.0F, 1.0F); - + if(coughsBlood) { NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vomit"); @@ -485,7 +487,7 @@ public class EntityEffectHandler { nbt.setInteger("entity", entity.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); } - + if(coughsCoal) { NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vomit"); @@ -496,23 +498,23 @@ public class EntityEffectHandler { } } } - + private static void handleOil(EntityLivingBase entity) { - + if(entity.worldObj.isRemote) return; - + int oil = HbmLivingProps.getOil(entity); - + if(oil > 0) { - + if(entity.isBurning()) { HbmLivingProps.setOil(entity, 0); entity.worldObj.newExplosion(null, entity.posX, entity.posY + entity.height / 2, entity.posZ, 3F, false, true); } else { HbmLivingProps.setOil(entity, oil - 1); } - + if(entity.ticksExisted % 5 == 0) { NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "sweat"); @@ -523,17 +525,17 @@ public class EntityEffectHandler { } } } - + private static void handlePollution(EntityLivingBase entity) { - + if(!RadiationConfig.enablePollution) return; - + if(RadiationConfig.enablePoison && !ArmorRegistry.hasProtection(entity, 3, HazardClass.GAS_BLISTERING) && entity.ticksExisted % 60 == 0) { - + float poison = PollutionHandler.getPollution(entity.worldObj, (int) Math.floor(entity.posX), (int) Math.floor(entity.posY + entity.getEyeHeight()), (int) Math.floor(entity.posZ), PollutionType.POISON); - + if(poison > 10) { - + if(poison < 25) { entity.addPotionEffect(new PotionEffect(Potion.poison.id, 100, 0)); } else if(poison < 50) { @@ -543,13 +545,13 @@ public class EntityEffectHandler { } } } - + if(RadiationConfig.enableLeadPoisoning && !ArmorRegistry.hasProtection(entity, 3, HazardClass.PARTICLE_FINE) && entity.ticksExisted % 60 == 0) { - + float poison = PollutionHandler.getPollution(entity.worldObj, (int) Math.floor(entity.posX), (int) Math.floor(entity.posY + entity.getEyeHeight()), (int) Math.floor(entity.posZ), PollutionType.HEAVYMETAL); - + if(poison > 25) { - + if(poison < 50) { entity.addPotionEffect(new PotionEffect(HbmPotion.lead.id, 100, 0)); } else if(poison < 75) { @@ -560,23 +562,23 @@ public class EntityEffectHandler { } } } - + private static void handleTemperature(Entity entity) { - + if(!(entity instanceof EntityLivingBase)) return; if(entity.worldObj.isRemote) return; - + EntityLivingBase living = (EntityLivingBase) entity; int temp = HbmLivingProps.getTemperature(living); if(temp < 0) HbmLivingProps.setTemperature(living, temp + Math.min(-temp, 5)); if(temp > 0) HbmLivingProps.setTemperature(living, temp - Math.min(temp, 5)); - + if(HbmLivingProps.isFrozen(living)) { living.motionX = 0; living.motionZ = 0; living.motionY = Math.min(living.motionY, 0); - + if(entity.ticksExisted % 5 == 0) { NBTTagCompound nbt0 = new NBTTagCompound(); nbt0.setString("type", "sweat"); @@ -584,7 +586,7 @@ public class EntityEffectHandler { nbt0.setInteger("block", Block.getIdFromBlock(Blocks.snow)); nbt0.setInteger("entity", entity.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt0, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); - + if(entity instanceof EntityPlayerMP) { NBTTagCompound nbt1 = new NBTTagCompound(); nbt1.setString("type", "frozen"); @@ -592,44 +594,44 @@ public class EntityEffectHandler { } } } - + if(HbmLivingProps.isBurning(living)) { living.setFire(1); } } - + private static void handleDashing(Entity entity) { - + //AAAAAAAAAAAAAAAAAAAAEEEEEEEEEEEEEEEEEEEE if(entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; - + HbmPlayerProps props = HbmPlayerProps.getData(player); - + props.setDashCount(0); - + ArmorFSB chestplate = null; - + int armorDashCount = 0; int armorModDashCount = 0; - + if(ArmorFSB.hasFSBArmor(player)) { - ItemStack plate = player.inventory.armorInventory[2]; - + ItemStack plate = player.inventory.armorInventory[2]; + chestplate = (ArmorFSB)plate.getItem(); } - + if(chestplate != null) armorDashCount = chestplate.dashCount; - + for(int armorSlot = 0; armorSlot < 4; armorSlot++) { ItemStack armorStack = player.inventory.armorInventory[armorSlot]; - + if(armorStack != null && armorStack.getItem() instanceof ItemArmor) { - + for(int modSlot = 0; modSlot < 8; modSlot++) { ItemStack mod = ArmorModHandler.pryMods(armorStack)[modSlot]; - + if(mod != null && mod.getItem() instanceof IArmorModDash) { int count = ((IArmorModDash)mod.getItem()).getDashes(); armorModDashCount += count; @@ -637,24 +639,24 @@ public class EntityEffectHandler { } } } - + int dashCount = armorDashCount + armorModDashCount; - + boolean dashActivated = props.getKeyPressed(EnumKeybind.DASH); - + if(dashCount * 30 < props.getStamina()) props.setStamina(dashCount * 30); - + if(dashCount > 0) { int perDash = 30; - + props.setDashCount(dashCount); - + int stamina = props.getStamina(); - + if(props.getDashCooldown() <= 0) { - + if(dashActivated && stamina >= perDash) { Vec3 lookingIn = player.getLookVec(); @@ -663,7 +665,7 @@ public class EntityEffectHandler { int forward = (int) Math.signum(player.moveForward); int strafe = (int) Math.signum(player.moveStrafing); - + if(forward == 0 && strafe == 0) forward = 1; @@ -671,42 +673,42 @@ public class EntityEffectHandler { player.motionY = 0; player.fallDistance = 0F; player.playSound("hbm:weapon.rocketFlame", 1.0F, 1.0F); - + props.setDashCooldown(HbmPlayerProps.dashCooldownLength); stamina -= perDash; } - } else { + } else { props.setDashCooldown(props.getDashCooldown() - 1); props.setKeyPressed(EnumKeybind.DASH, false); } - + if(stamina < props.getDashCount() * perDash) { stamina++; - + if(stamina % perDash == perDash-1) { - + player.playSound("hbm:item.techBoop", 1.0F, (1.0F + ((1F/12F)*(stamina/perDash)))); stamina++; } } - + props.setStamina(stamina); - } - + } + } } - + private static void handlePlinking(Entity entity) { - + if(entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; HbmPlayerProps props = HbmPlayerProps.getData(player); - + if(props.plinkCooldown > 0) props.plinkCooldown--; } } - + private static boolean canVomit(Entity e) { if(e.isCreatureType(EnumCreatureType.waterCreature, false)) return false; return true; diff --git a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java index 0364bf7e9..b4c33e12f 100644 --- a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java @@ -15,28 +15,24 @@ import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class ExtPropPacket implements IMessage { - - PacketBuffer buffer; + + ByteBuf buffer; public ExtPropPacket() { } - public ExtPropPacket(NBTTagCompound nbt) { - - this.buffer = new PacketBuffer(Unpooled.buffer()); - - try { - buffer.writeNBTTagCompoundToBuffer(nbt); - - } catch (IOException e) { - e.printStackTrace(); - } + public ExtPropPacket(ByteBuf buf) { + + this.buffer = Unpooled.buffer(); + buffer.writeBytes(buf); } @Override public void fromBytes(ByteBuf buf) { - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -45,7 +41,7 @@ public class ExtPropPacket implements IMessage { @Override public void toBytes(ByteBuf buf) { - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -53,26 +49,22 @@ public class ExtPropPacket implements IMessage { } public static class Handler implements IMessageHandler { - + @Override @SideOnly(Side.CLIENT) public IMessage onMessage(ExtPropPacket m, MessageContext ctx) { - + if(Minecraft.getMinecraft().theWorld == null) return null; - - try { - - NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); - HbmLivingProps props = HbmLivingProps.getData(Minecraft.getMinecraft().thePlayer); - HbmPlayerProps pprps = HbmPlayerProps.getData(Minecraft.getMinecraft().thePlayer); - props.loadNBTData(nbt); - pprps.loadNBTData(nbt); - - } catch (IOException e) { - e.printStackTrace(); - } - + + ByteBuf buf = Unpooled.buffer(); + + HbmLivingProps props = HbmLivingProps.getData(Minecraft.getMinecraft().thePlayer); + HbmPlayerProps pprps = HbmPlayerProps.getData(Minecraft.getMinecraft().thePlayer); + + props.deserialize(buf); + pprps.deserialize(buf); + return null; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index ae3bff75b..443ab576e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -64,9 +64,6 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS age = 0; } - NBTTagCompound data = new NBTTagCompound(); - this.tanks[0].writeToNBT(data, "0"); - if(this.waterTimer > 0) this.waterTimer--; @@ -90,8 +87,6 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS postConvert(convert); } - this.tanks[1].writeToNBT(data, "1"); - this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index c52555c23..a25703556 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -10,7 +10,7 @@ import net.minecraft.world.World; public class RBMKDials { public static final String KEY_SAVE_DIALS = "dialSaveDials"; - + public static final String KEY_PASSIVE_COOLING = "dialPassiveCooling"; public static final String KEY_COLUMN_HEAT_FLOW = "dialColumnHeatFlow"; public static final String KEY_FUEL_DIFFUSION_MOD = "dialDiffusionMod"; @@ -34,10 +34,10 @@ public class RBMKDials { public static final String KEY_MODERATOR_EFFICIENCY = "dialModeratorEfficiency"; public static final String KEY_ABSORBER_EFFICIENCY = "dialAbsorberEfficiency"; public static final String KEY_REFLECTOR_EFFICIENCY = "dialReflectorEfficiency"; - + public static void createDials(World world) { GameRules rules = world.getGameRules(); - + if(!rules.getGameRuleBooleanValue(KEY_SAVE_DIALS)) { rules.setOrCreateGameRule(KEY_PASSIVE_COOLING, "1.0"); rules.setOrCreateGameRule(KEY_COLUMN_HEAT_FLOW, "0.2"); @@ -64,52 +64,52 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_REFLECTOR_EFFICIENCY, "1.0"); } } - + /** * Returns the amount of heat per tick removed from components passively * @param world * @return >0 */ public static double getPassiveCooling(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_PASSIVE_COOLING), 1.0D), 0.0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_PASSIVE_COOLING), 1.0D), 0.0D); } - + /** * Returns the percentual step size how quickly neighboring component heat equalizes. 1 is instant, 0.5 is in 50% steps, et cetera. * @param world * @return [0;1] */ public static double getColumnHeatFlow(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEAT_FLOW), 0.2D), 0.0D, 1.0D); + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEAT_FLOW), 0.2D), 0.0D, 1.0D); } - + /** * Returns a modifier for fuel rod diffusion, i.e. how quickly the core and hull temperatures equalize. * @param world * @return >0 */ public static double getFuelDiffusionMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_FUEL_DIFFUSION_MOD), 1.0D), 0.0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_FUEL_DIFFUSION_MOD), 1.0D), 0.0D); } - + /** * Returns the percentual step size how quickly the fuel hull heat and the component heat equalizes. 1 is instant, 0.5 is in 50% steps, et cetera. * @param world * @return [0;1] */ public static double getFuelHeatProvision(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_HEAT_PROVISION), 0.2D), 0.0D, 1.0D); + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_HEAT_PROVISION), 0.2D), 0.0D, 1.0D); } - + /** * Simple integer that decides how tall the structure is. * @param world * @return [0;15] */ public static int getColumnHeight(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEIGHT), 4), 2, 16) - 1; + return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEIGHT), 4), 2, 16) - 1; } - + /** * Whether or not scrap entities despawn on their own or remain alive until picked up. * @param world @@ -118,88 +118,88 @@ public class RBMKDials { public static boolean getPermaScrap(World world) { return world.getGameRules().getGameRuleBooleanValue(KEY_PERMANENT_SCRAP); } - + /** * How many heat units are consumed per mB water used. * @param world * @return >0 */ public static double getBoilerHeatConsumption(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_BOILER_HEAT_CONSUMPTION), 0.1D), 0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_BOILER_HEAT_CONSUMPTION), 0.1D), 0D); } - + /** * A multiplier for how quickly the control rods move. * @param world * @return >0 */ public static double getControlSpeed(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_CONTROL_SPEED_MOD), 1.0D), 0.0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_CONTROL_SPEED_MOD), 1.0D), 0.0D); } - + /** * A multiplier for how much flux the rods give out. * @param world * @return >0 */ public static double getReactivityMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_REACTIVITY_MOD), 1.0D), 0.0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REACTIVITY_MOD), 1.0D), 0.0D); } - + /** * A multiplier for how much flux the rods give out. * @param world * @return >0 */ public static double getOutgasserMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_OUTGASSER_MOD), 1.0D), 0.0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_OUTGASSER_MOD), 1.0D), 0.0D); } - + /** * A multiplier for how high the power surge goes when inserting control rods. * @param world * @return >0 */ public static double getSurgeMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_SURGE_MOD), 1.0D), 0.0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_SURGE_MOD), 1.0D), 0.0D); } - + /** * Simple integer that decides how far the flux of a normal fuel rod reaches. * @param world * @return [1;100] */ public static int getFluxRange(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world.getGameRules().getGameRuleStringValue(KEY_FLUX_RANGE), 5), 1, 100); + return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_FLUX_RANGE), 5), 1, 100); } - + /** * Simple integer that decides how far the flux of a ReaSim fuel rod reaches. * @param world * @return [1;100] */ public static int getReaSimRange(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world.getGameRules().getGameRuleStringValue(KEY_REASIM_RANGE), 10), 1, 100); + return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_RANGE), 10), 1, 100); } - + /** * Simple integer that decides how many neutrons are created from ReaSim fuel rods. * @param world * @return [1;24] */ public static int getReaSimCount(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world.getGameRules().getGameRuleStringValue(KEY_REASIM_COUNT), 6), 1, 24); + return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_COUNT), 6), 1, 24); } - + /** * Returns a modifier for the outgoing flux of individual streams from the ReaSim fuel rod to compensate for the potentially increased stream count. * @param world * @return >0 */ public static double getReaSimOutputMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_REASIM_MOD), 1.0D), 0.0D); + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_MOD), 1.0D), 0.0D); } - + /** * Whether or not all components should act like boilers with dedicated in/outlet blocks * @param world @@ -208,16 +208,16 @@ public class RBMKDials { public static boolean getReasimBoilers(World world) { return world.getGameRules().getGameRuleBooleanValue(KEY_REASIM_BOILERS) || (GeneralConfig.enable528 && GeneralConfig.enable528ReasimBoilers); } - + /** * How much % of the possible steam ends up being produced per tick * @param world * @return [0;1] */ public static double getReaSimBoilerSpeed(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_REASIM_BOILER_SPEED), 0.05D), 0.0D, 1.0D); + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_BOILER_SPEED), 0.05D), 0.0D, 1.0D); } - + /** * Whether or not fuel columns should initiate a meltdown when overheating * The method is in reverse because the default for older worlds will be 'false' @@ -227,7 +227,7 @@ public class RBMKDials { public static boolean getMeltdownsDisabled(World world) { return world.getGameRules().getGameRuleBooleanValue(KEY_DISABLE_MELTDOWNS); } - + /** * Whether or not connected pipes and turbines should explode when the reactor undergoes a meltdown. * @param world @@ -243,7 +243,7 @@ public class RBMKDials { * @return */ public static double getModeratorEfficiency(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + return GameRuleHelper.getClampedDouble(world, world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D, 0.0D, 1.0D); } /** @@ -252,7 +252,7 @@ public class RBMKDials { * @return */ public static double getAbsorberEfficiency(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + return GameRuleHelper.getClampedDouble(world, world.getGameRules().getGameRuleStringValue(KEY_ABSORBER_EFFICIENCY), 1D, 0.0D, 1.0D); } /** @@ -261,6 +261,6 @@ public class RBMKDials { * @return */ public static double getReflectorEfficiency(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D), 0.0D, 1.0D); + return GameRuleHelper.getClampedDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REFLECTOR_EFFICIENCY), 1D, 0.0D, 1.0D); } } diff --git a/src/main/java/com/hbm/util/GameRuleHelper.java b/src/main/java/com/hbm/util/GameRuleHelper.java index 0811aa2a1..45f19ed9b 100644 --- a/src/main/java/com/hbm/util/GameRuleHelper.java +++ b/src/main/java/com/hbm/util/GameRuleHelper.java @@ -1,37 +1,49 @@ package com.hbm.util; import net.minecraft.util.MathHelper; +import net.minecraft.world.GameRules; import net.minecraft.world.World; public class GameRuleHelper { - + public static double getClampedDouble(World world, String rule, double def, double min, double max) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(rule), def), min, max); - } - - public static double getDoubleMinimum(World world, String rule, double def, double min) { - return Math.max(GameRuleHelper.parseDouble(world.getGameRules().getGameRuleStringValue(rule), def), min); - } - - public static int getIntegerMinimum(World world, String rule, int def, int min) { - return Math.max(GameRuleHelper.parseInt(world.getGameRules().getGameRuleStringValue(rule), def), min); + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(rule), def), min, max); } - public static double parseDouble(String s, double def) { - + public static double getDoubleMinimum(World world, String rule, double def, double min) { + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(rule), def), min); + } + + public static int getIntegerMinimum(World world, String rule, int def, int min) { + return Math.max(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(rule), def), min); + } + + public static double parseDouble(World world, String s, double def) { + + GameRules rules = world.getGameRules(); + if(s.isEmpty() && !rules.hasRule(s)) { + rules.addGameRule(s, String.valueOf(def)); + return def; + } + try { return Double.parseDouble(s); } catch(Exception ex) { } - + return def; } - public static int parseInt(String s, int def) { - + public static int parseInt(World world, String s, int def) { + + GameRules rules = world.getGameRules(); + if(s.isEmpty() && !rules.hasRule(s)) { + rules.addGameRule(s, String.valueOf(def)); + } + try { return Integer.parseInt(s); } catch(Exception ex) { } - + return def; } From 970485f68c271bc5a199bf50ead099f9ef732f3b Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:34:48 -0600 Subject: [PATCH 47/70] there's actually so many optimizations here that it'd be impossible for be to explain them all --- .../com/hbm/handler/ImpactWorldHandler.java | 28 +- .../hbm/handler/neutron/NeutronHandler.java | 74 ++ .../com/hbm/handler/neutron/NeutronNode.java | 6 + .../hbm/handler/neutron/NeutronNodeWorld.java | 8 +- .../hbm/handler/neutron/NeutronStream.java | 39 +- .../handler/neutron/PileNeutronHandler.java | 39 -- .../handler/neutron/RBMKNeutronHandler.java | 190 +++-- .../handler/threading/BufPacketThreading.java | 57 ++ .../java/com/hbm/main/ModEventHandler.java | 648 +++++++++--------- .../java/com/hbm/main/NetworkHandler.java | 79 +++ .../java/com/hbm/packet/PacketDispatcher.java | 12 +- .../com/hbm/packet/toclient/BufPacket.java | 11 +- .../hbm/tileentity/IBufPacketReceiver.java | 11 +- .../hbm/tileentity/TileEntityMachineBase.java | 3 +- .../tileentity/machine/rbmk/RBMKDials.java | 181 +++-- .../machine/rbmk/TileEntityRBMKRod.java | 41 +- .../machine/rbmk/TileEntityRBMKRodReaSim.java | 9 +- .../java/com/hbm/util/GameRuleHelper.java | 17 +- 18 files changed, 860 insertions(+), 593 deletions(-) create mode 100644 src/main/java/com/hbm/handler/neutron/NeutronHandler.java create mode 100644 src/main/java/com/hbm/handler/threading/BufPacketThreading.java create mode 100644 src/main/java/com/hbm/main/NetworkHandler.java diff --git a/src/main/java/com/hbm/handler/ImpactWorldHandler.java b/src/main/java/com/hbm/handler/ImpactWorldHandler.java index fc528fc6d..365f17cd4 100644 --- a/src/main/java/com/hbm/handler/ImpactWorldHandler.java +++ b/src/main/java/com/hbm/handler/ImpactWorldHandler.java @@ -31,28 +31,32 @@ public class ImpactWorldHandler { return; } + TomSaveData data = TomSaveData.forWorld(world); + + if (data.dust <= 0 && data.fire <= 0) + return; + WorldServer serv = (WorldServer) world; List list = serv.theChunkProviderServer.loadedChunks; int listSize = list.size(); - + if(listSize > 0) { for(int i = 0; i < 3; i++) { - + Chunk chunk = list.get(serv.rand.nextInt(listSize)); ChunkCoordIntPair coord = chunk.getChunkCoordIntPair(); - + for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { - + if(world.rand.nextBoolean()) continue; - + int X = coord.getCenterXPos() - 8 + x; int Z = coord.getCenterZPosition() - 8 + z; int Y = world.getHeightValue(X, Z) - world.rand.nextInt(Math.max(1, world.getHeightValue(X, Z))); - TomSaveData data = TomSaveData.forWorld(world); - + if(data.dust > 0) { die(world, X, Y, Z); } @@ -70,7 +74,7 @@ public class ImpactWorldHandler { TomSaveData data = TomSaveData.forWorld(world); int light = Math.max(world.getSavedLightValue(EnumSkyBlock.Block, x, y + 1, z), (int) (world.getBlockLightValue(x, y + 1, z) * (1 - data.dust))); - + if(light < 4) { if(world.getBlock(x, y, z) == Blocks.grass) { world.setBlock(x, y, z, Blocks.dirt); @@ -86,18 +90,18 @@ public class ImpactWorldHandler { /// Burn the world. public static void burn(World world, int x, int y, int z) { - + Block b = world.getBlock(x, y, z); if(b.isFlammable(world, x, y, z, ForgeDirection.UP) && world.getBlock(x, y + 1, z) == Blocks.air && world.getSavedLightValue(EnumSkyBlock.Sky, x, y + 1, z) >= 7) { if(b instanceof BlockLeaves || b instanceof BlockBush) { world.setBlockToAir(x, y, z); } world.setBlock(x, y + 1, z, Blocks.fire); - + } else if((b == Blocks.grass || b == Blocks.mycelium || b == ModBlocks.waste_earth || b == ModBlocks.frozen_grass || b == ModBlocks.waste_mycelium) && !world.canLightningStrikeAt(x, y, z) && world.getSavedLightValue(EnumSkyBlock.Sky, x, y + 1, z) >= 7) { world.setBlock(x, y, z, ModBlocks.burning_earth); - + } else if(b == ModBlocks.frozen_dirt && world.getSavedLightValue(EnumSkyBlock.Sky, x, y + 1, z) >= 7) { world.setBlock(x, y, z, Blocks.dirt); } @@ -125,4 +129,4 @@ public class ImpactWorldHandler { if(world != lastSyncWorld) return false; return impact; } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/handler/neutron/NeutronHandler.java b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java new file mode 100644 index 000000000..a6bd17f4f --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java @@ -0,0 +1,74 @@ +package com.hbm.handler.neutron; + +import com.hbm.tileentity.machine.rbmk.RBMKDials; +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +// General neutron handler because I didn't feel like having each handler class have its own interaction function. +public class NeutronHandler { + + private static int ticks = 0; + + public static void onWorldTick() { + // Remove `StreamWorld` objects if they have no streams. + { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn + List toRemove = new ArrayList<>(); + NeutronNodeWorld.streamWorlds.forEach((world, streamWorld) -> { + if (streamWorld.streams.isEmpty()) + toRemove.add(world); + }); + + for (World world : toRemove) { + NeutronNodeWorld.streamWorlds.remove(world); + } + } + + for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { + + // Gamerule caching because this apparently is kinda slow? + // meh, good enough + RBMKNeutronHandler.reflectorEfficiency = RBMKDials.getReflectorEfficiency(world.getKey()); + RBMKNeutronHandler.absorberEfficiency = RBMKDials.getAbsorberEfficiency(world.getKey()); + RBMKNeutronHandler.moderatorEfficiency = RBMKDials.getModeratorEfficiency(world.getKey()); + + // I hate this. + // this broke everything because it was ONE OFF + // IT'S NOT THE TOTAL HEIGHT IT'S THE AMOUNT OF BLOCKS ABOVE AAAAAAAAAAAAA + RBMKNeutronHandler.columnHeight = RBMKDials.getColumnHeight(world.getKey()) + 1; + RBMKNeutronHandler.fluxRange = RBMKDials.getFluxRange(world.getKey()); + + for (NeutronStream stream : world.getValue().streams) { + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreams(); + } + + // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage from idle nodes. + int cacheTime = 20; + if (ticks >= cacheTime) { + ticks = 0; + List toRemove = new ArrayList<>(); + for (NeutronNode cachedNode : NeutronNodeWorld.nodeCache.values()) { + if (cachedNode.type == NeutronStream.NeutronType.RBMK) { + RBMKNeutronHandler.RBMKNeutronNode node = (RBMKNeutronHandler.RBMKNeutronNode) cachedNode; + toRemove.addAll(node.checkNode()); + } + /* + if (cachedNode.type == NeutronStream.NeutronType.PILE) { + PileNeutronNode node = (PileNeutronNode) cachedNode; + toRemove.addAll(node.checkNode()); + } + */ + } + + toRemove.forEach(NeutronNodeWorld::removeNode); + + } + ticks++; + } +} diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNode.java b/src/main/java/com/hbm/handler/neutron/NeutronNode.java index e85a14081..0c11d3a05 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronNode.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronNode.java @@ -1,6 +1,7 @@ package com.hbm.handler.neutron; import com.hbm.handler.neutron.NeutronStream.NeutronType; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.tileentity.TileEntity; import java.util.HashMap; @@ -9,7 +10,11 @@ import java.util.Map; public abstract class NeutronNode { protected NeutronType type; + + protected BlockPos pos; + protected TileEntity tile; + // like NBT but less fucking CANCER // Holds things like cached RBMK lid values. protected Map data = new HashMap<>(); @@ -17,5 +22,6 @@ public abstract class NeutronNode { public NeutronNode(TileEntity tile, NeutronType type) { this.type = type; this.tile = tile; + this.pos = new BlockPos(tile); } } diff --git a/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java index 796589b6e..1f544ae7f 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronNodeWorld.java @@ -12,7 +12,7 @@ public class NeutronNodeWorld { protected static HashMap nodeCache = new HashMap<>(); public static void addNode(NeutronNode node) { - nodeCache.put(new BlockPos(node.tile), node); + nodeCache.put(node.pos, node); } public static void removeNode(BlockPos position) { @@ -54,9 +54,9 @@ public class NeutronNodeWorld { } toRemove.forEach((stream) -> streams.remove(stream)); } + } - public static void removeAllWorlds() { - streamWorlds.clear(); - } + public static void removeAllWorlds() { + streamWorlds.clear(); } } diff --git a/src/main/java/com/hbm/handler/neutron/NeutronStream.java b/src/main/java/com/hbm/handler/neutron/NeutronStream.java index 69b1d8eeb..7de1cc4aa 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronStream.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronStream.java @@ -5,13 +5,12 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import com.hbm.handler.neutron.NeutronNodeWorld.StreamWorld; -import java.util.ArrayList; -import java.util.List; +import java.util.Iterator; public abstract class NeutronStream { public enum NeutronType { - DUMMY, // Dummy streams for testing + DUMMY, // Dummy streams for node decaying RBMK, // RBMK neutron streams PILE // Chicago pile streams } @@ -34,11 +33,13 @@ public abstract class NeutronStream { public NeutronStream(NeutronNode origin, Vec3 vector) { this.origin = origin; this.vector = vector; + posInstance = origin.pos.clone(); } public NeutronStream(NeutronNode origin, Vec3 vector, double flux, double ratio, NeutronType type) { this.origin = origin; this.vector = vector; + posInstance = origin.pos.clone(); this.fluxQuantity = flux; this.fluxRatio = ratio; this.type = type; @@ -51,19 +52,31 @@ public abstract class NeutronStream { NeutronNodeWorld.streamWorlds.get(worldObj).addStream(this); } + protected BlockPos posInstance; + + private int i; + // USES THE CACHE!!! - public List getBlocks(int range) { - List positions = new ArrayList<>(); + public Iterator getBlocks(int range) { - for (int i = 1; i <= range; i++) { - int x = (int) Math.floor(0.5 + vector.xCoord * i); - int z = (int) Math.floor(0.5 + vector.zCoord * i); + i = 1; - BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); - positions.add(pos); - } - return positions; + return new Iterator() { + @Override + public boolean hasNext() { + return i <= range; + } + + @Override + public BlockPos next() { + int x = (int) Math.floor(0.5 + vector.xCoord * i); + int z = (int) Math.floor(0.5 + vector.zCoord * i); + + i++; + return posInstance.mutate(origin.tile.xCoord + x, origin.tile.yCoord, origin.tile.zCoord + z); + } + }; } public abstract void runStreamInteraction(World worldObj); -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index c38993127..965f1ed0b 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -12,9 +12,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; -import java.util.Map; public class PileNeutronHandler { @@ -41,10 +39,6 @@ public class PileNeutronHandler { public static class PileNeutronStream extends NeutronStream { - public PileNeutronStream(NeutronNode origin, Vec3 vector) { - super(origin, vector); - } - public PileNeutronStream(NeutronNode origin, Vec3 vector, double flux) { super(origin, vector, flux, 0D, NeutronType.PILE); } @@ -52,12 +46,6 @@ public class PileNeutronHandler { @Override public void runStreamInteraction(World worldObj) { - //Random rand = origin.tile.getWorldObj().rand; - //Vec3 vec = Vec3.createVectorHelper(1, 0, 0); - //vec.rotateAroundZ((float)(rand.nextDouble() * Math.PI * 2D)); - //vec.rotateAroundY((float)(rand.nextDouble() * Math.PI * 2D)); - //vec.rotateAroundX((float)(rand.nextDouble() * Math.PI * 2D)); - TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; BlockPos pos = new BlockPos(originTE); @@ -126,31 +114,4 @@ public class PileNeutronHandler { } } } - - // The big one!! Runs all interactions for neutrons. - public static void runAllInteractions() { - - // Remove `StreamWorld` objects if they have no streams. - { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn - List toRemove = new ArrayList<>(); - NeutronNodeWorld.streamWorlds.forEach((world, streamWorld) -> { - if (streamWorld.streams.isEmpty()) - toRemove.add(world); - }); - - for (World world : toRemove) { - NeutronNodeWorld.streamWorlds.remove(world); - } - } - - for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { - - for (NeutronStream stream : world.getValue().streams) { - if (stream.type == NeutronStream.NeutronType.PILE) - stream.runStreamInteraction(world.getKey()); - } - world.getValue().removeAllStreamsOfType(NeutronStream.NeutronType.PILE); - } - - } } diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index d02c17629..437fd28c3 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -7,7 +7,7 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import java.util.ArrayList; import java.util.List; -import java.util.Map.Entry; +import java.util.Iterator; import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; @@ -50,6 +50,7 @@ public class RBMKNeutronHandler { super(tile, NeutronStream.NeutronType.RBMK); this.data.put("hasLid", hasLid); this.data.put("type", type); + posInstance = new BlockPos(tile); } public void addLid() { @@ -60,13 +61,41 @@ public class RBMKNeutronHandler { this.data.replace("hasLid", false); } - public List getReaSimNodes() { - List list = new ArrayList<>(); - for (int x = -fluxRange; x <= fluxRange; x++) - for (int z = -fluxRange; z <= fluxRange; z++) - if (Math.pow(x, 2) + Math.pow(z, 2) <= fluxRange * fluxRange) - list.add(new BlockPos(tile).add(x, 0, z)); - return list; + protected BlockPos posInstance; + + private int x; + private int z; + + public Iterator getReaSimNodes() { + + x = -fluxRange; + z = -fluxRange; + + return new Iterator() { + @Override + public boolean hasNext() { + return (fluxRange + x) * (fluxRange * 2 + 1) + z + fluxRange + 1 < (fluxRange * 2 + 1) * (fluxRange * 2 + 1); + } + + @Override + public BlockPos next() { + if (Math.pow(x, 2) + Math.pow(z, 2) <= fluxRange * fluxRange) { + z++; + if (z > fluxRange) { + z = -fluxRange; + x++; + } + return posInstance.mutate(tile.xCoord + x, tile.yCoord, tile.zCoord + z); + } else { + z++; + if (z > fluxRange) { + z = -fluxRange; + x++; + } + return null; + } + } + }; } public List checkNode() { @@ -74,11 +103,12 @@ public class RBMKNeutronHandler { BlockPos pos = new BlockPos(this.tile); - List streams = new ArrayList<>(); + RBMKNeutronStream[] streams = new RBMKNeutronStream[TileEntityRBMKRod.fluxDirs.length]; // Simulate streams coming out of the RBMK rod. - for (ForgeDirection dir : TileEntityRBMKRod.fluxDirs) { - streams.add(new RBMKNeutronStream(this, Vec3.createVectorHelper(dir.offsetX, 0, dir.offsetZ))); + ForgeDirection[] fluxDirs = TileEntityRBMKRod.fluxDirs; + for (int i = 0; i < fluxDirs.length; i++) { + streams[i] = (new RBMKNeutronStream(this, Vec3.createVectorHelper(fluxDirs[i].offsetX, 0, fluxDirs[i].offsetZ))); } // Check if the rod should uncache nodes. @@ -87,38 +117,47 @@ public class RBMKNeutronHandler { if (!rod.hasRod || rod.lastFluxQuantity == 0) { for (RBMKNeutronStream stream : streams) { - stream.getNodes(false).forEach(node -> list.add(new BlockPos(node.tile))); + for(RBMKNeutronNode node : stream.getNodes(false)) + if (node != null) + list.add(new BlockPos(node.tile)); } return list; } } - List points = getReaSimNodes(); + { + Iterator reaSimNodes = getReaSimNodes(); - // Check if the ReaSim rod should be culled from the cache due to no rod or no flux. - if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk - TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; - if (!rod.hasRod || rod.lastFluxQuantity == 0) { - list.addAll(points); - return list; + // Check if the ReaSim rod should be culled from the cache due to no rod or no flux. + if (tile instanceof TileEntityRBMKRodReaSim) { // fuckkkkkkk + TileEntityRBMKRodReaSim rod = (TileEntityRBMKRodReaSim) tile; + if (!rod.hasRod || rod.lastFluxQuantity == 0) { + reaSimNodes.forEachRemaining((a) -> { + if (a != null) + list.add(a.clone()); // ae The RAM usage will be really high here but hopefully the GC can take care of it :pray: + }); + return list; + } } } // Check if non-rod nodes should be uncached... but now with ReaSim! { // Yeah, I don't want to contaminate the surrounding scope. - List nodes = new ArrayList<>(); - points.forEach(nodePos -> { - RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.getNode(nodePos); - if (node != null) - nodes.add(node); - }); + Iterator reaSimNodes = getReaSimNodes(); boolean hasRod = false; - for (RBMKNeutronNode node : nodes) { + while(reaSimNodes.hasNext()) { - if (node.tile instanceof TileEntityRBMKRod) { + BlockPos nodePos = reaSimNodes.next(); + + if(nodePos == null) + continue; + + NeutronNode node = NeutronNodeWorld.nodeCache.get(nodePos); + + if (node != null && node.tile instanceof TileEntityRBMKRod) { TileEntityRBMKRod rod = (TileEntityRBMKRod) node.tile; @@ -129,7 +168,7 @@ public class RBMKNeutronHandler { } } - if (nodes.isEmpty() || !hasRod) { + if (!hasRod) { list.add(pos); return list; } @@ -138,10 +177,10 @@ public class RBMKNeutronHandler { // Check if non-rod nodes should be uncached due to no rod in range. for (RBMKNeutronStream stream : streams) { - List nodes = stream.getNodes(false); + RBMKNeutronNode[] nodes = stream.getNodes(false); for (RBMKNeutronNode node : nodes) { - if (node.tile instanceof TileEntityRBMKRod) + if (!(node == null) && node.tile instanceof TileEntityRBMKRod) return list; } } @@ -170,24 +209,26 @@ public class RBMKNeutronHandler { // Does NOT include the origin node // USES THE CACHE!!! - public List getNodes(boolean addNode) { - List positions = new ArrayList<>(); + public RBMKNeutronNode[] getNodes(boolean addNode) { + RBMKNeutronNode[] positions = new RBMKNeutronNode[fluxRange]; + + BlockPos pos = new BlockPos(origin.tile); for (int i = 1; i <= fluxRange; i++) { int x = (int) Math.floor(0.5 + vector.xCoord * i); int z = (int) Math.floor(0.5 + vector.zCoord * i); - BlockPos pos = new BlockPos(origin.tile).add(x, 0, z); + pos.mutate(origin.tile.xCoord + x, origin.tile.yCoord, origin.tile.zCoord + z); if (NeutronNodeWorld.nodeCache.containsKey(pos)) - positions.add((RBMKNeutronNode) NeutronNodeWorld.getNode(pos)); + positions[i - 1] = (RBMKNeutronNode) NeutronNodeWorld.getNode(pos); else if (this.origin.tile.getBlockType() instanceof RBMKBase) { TileEntity te = blockPosToTE(this.origin.tile.getWorldObj(), pos); if (te instanceof TileEntityRBMKBase) { TileEntityRBMKBase rbmkBase = (TileEntityRBMKBase) te; RBMKNeutronNode node = makeNode(rbmkBase); - positions.add(node); + positions[i - 1] = node; if (addNode) NeutronNodeWorld.addNode(node); } @@ -218,7 +259,11 @@ public class RBMKNeutronHandler { int moderatedCount = 0; - for (BlockPos nodePos : getBlocks(fluxRange)) { + Iterator iterator = getBlocks(fluxRange); + + while(iterator.hasNext()) { + + BlockPos nodePos = iterator.next(); if (fluxQuantity == 0D) // Whoops, used it all up! return; @@ -315,22 +360,26 @@ public class RBMKNeutronHandler { } } - List nodes = getNodes(true); - if (nodes.isEmpty()) - return; + RBMKNeutronNode[] nodes = getNodes(true); - RBMKNeutronNode lastNode = nodes.get(nodes.size() - 1); + RBMKNeutronNode lastNode = nodes[(nodes.length - 1)]; + + if(lastNode == null) { // This implies that there was *no* last node, meaning either way it was never caught. + // There is really no good way to figure out where exactly it should irradiate, so just irradiate at the origin tile. + irradiateFromFlux(new BlockPos(origin.tile.xCoord + this.vector.xCoord, origin.tile.yCoord, origin.tile.zCoord + this.vector.zCoord)); + return; + } RBMKType lastNodeType = (RBMKType) lastNode.data.get("type"); if (lastNodeType != RBMKType.REFLECTOR && lastNodeType != RBMKType.ABSORBER && lastNodeType != RBMKType.CONTROL_ROD) - irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); + irradiateFromFlux(new BlockPos(lastNode.tile.xCoord + this.vector.xCoord, lastNode.tile.yCoord, lastNode.tile.zCoord + this.vector.zCoord)); if (lastNodeType == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl) lastNode.tile; if (rod.getMult() > 0.0D) { this.fluxQuantity *= rod.getMult(); - irradiateFromFlux((new BlockPos(lastNode.tile)).add(this.vector.xCoord, 0.0D, this.vector.zCoord)); + irradiateFromFlux(new BlockPos(lastNode.tile.xCoord + this.vector.xCoord, lastNode.tile.yCoord, lastNode.tile.zCoord + this.vector.zCoord)); } } } @@ -364,61 +413,4 @@ public class RBMKNeutronHandler { } } - - private static int ticks = 0; - - // The big one!! Runs all interactions for neutrons. - public static void runAllInteractions() { - - // Remove `StreamWorld` objects if they have no streams. - { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn - List toRemove = new ArrayList<>(); - NeutronNodeWorld.streamWorlds.forEach((world, streamWorld) -> { - if (streamWorld.streams.isEmpty()) - toRemove.add(world); - }); - - for (World world : toRemove) { - NeutronNodeWorld.streamWorlds.remove(world); - } - } - - for (Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { - - // Gamerule caching because this apparently is kinda slow? - // meh, good enough - reflectorEfficiency = RBMKDials.getReflectorEfficiency(world.getKey()); - absorberEfficiency = RBMKDials.getAbsorberEfficiency(world.getKey()); - moderatorEfficiency = RBMKDials.getModeratorEfficiency(world.getKey()); - - // I hate this. - // this broke everything because it was ONE OFF - // IT'S NOT THE TOTAL HEIGHT IT'S THE AMOUNT OF BLOCKS ABOVE AAAAAAAAAAAAA - columnHeight = RBMKDials.getColumnHeight(world.getKey()) + 1; - fluxRange = RBMKDials.getFluxRange(world.getKey()); - - for (NeutronStream stream : world.getValue().streams) { - if (stream.type == NeutronStream.NeutronType.RBMK) - stream.runStreamInteraction(world.getKey()); - } - world.getValue().removeAllStreamsOfType(NeutronStream.NeutronType.RBMK); - } - - // Freshen the node cache every `cacheTime` ticks to prevent huge RAM usage. - int cacheTime = 40; - if (ticks >= cacheTime) { - ticks = 0; - List toRemove = new ArrayList<>(); - for(NeutronNode cachedNode : NeutronNodeWorld.nodeCache.values()) { - if (cachedNode.type == NeutronStream.NeutronType.RBMK) { - RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; - toRemove.addAll(node.checkNode()); - } - } - - for(BlockPos pos : toRemove) - NeutronNodeWorld.removeNode(pos); - } - ticks++; - } } diff --git a/src/main/java/com/hbm/handler/threading/BufPacketThreading.java b/src/main/java/com/hbm/handler/threading/BufPacketThreading.java new file mode 100644 index 000000000..86400ae3c --- /dev/null +++ b/src/main/java/com/hbm/handler/threading/BufPacketThreading.java @@ -0,0 +1,57 @@ +package com.hbm.handler.threading; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.BufPacket; +import com.hbm.tileentity.IBufPacketReceiver; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import net.minecraft.tileentity.TileEntity; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; + +public class BufPacketThreading { + + private static final ThreadFactory packetThreadFactory = new ThreadFactoryBuilder().setNameFormat("NTM-Packet-Thread").build(); + + private static final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(1, packetThreadFactory); + + private static int total = 0; + + private static final List> futureList = new ArrayList<>(); + + public static void createBufPacket(IMessage message, TargetPoint target) { + Runnable task = () -> PacketDispatcher.wrapper.sendToAllAround(message, target); + total++; + futureList.add(threadPool.submit(task)); + } + + public static void createBufPacket(IBufPacketReceiver that, int range) { + Runnable task = () -> { + TileEntity te = (TileEntity) that; + TargetPoint target = new TargetPoint(te.getWorldObj().provider.dimensionId, te.xCoord, te.yCoord, te.zCoord, range); + BufPacket message = new BufPacket(te.xCoord, te.yCoord, te.zCoord, that); + PacketDispatcher.wrapper.sendToAllAround(message, target); + }; + total++; + futureList.add(threadPool.submit(task)); + } + + public static void waitUntilThreadFinished() { + try { + for(Future future : futureList) { + future.get(200, TimeUnit.MILLISECONDS); // I HATE EVERYTHING + } + } catch (ExecutionException ignored) { + // impossible + } catch (TimeoutException e) { + MainRegistry.logger.warn("A packet has taken >200ms to process, discarding {}/{} ({}%) packets to prevent pausing of main thread.", threadPool.getQueue().size(), total, (double) (threadPool.getQueue().size() / total * 100)); + threadPool.getQueue().clear(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); // maybe not the best thing but it's gotta be here + } + } +} diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index a1c5b9cde..c86c2208f 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -9,9 +9,16 @@ import java.util.Map; import java.util.Random; import java.util.UUID; +import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.neutron.NeutronNodeWorld; -import com.hbm.handler.neutron.PileNeutronHandler; -import com.hbm.handler.neutron.RBMKNeutronHandler; +import com.hbm.tileentity.machine.rbmk.RBMKDials; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import com.hbm.handler.threading.BufPacketThreading; +import net.minecraft.command.CommandGameRule; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandSender; +import net.minecraftforge.event.CommandEvent; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; @@ -142,17 +149,17 @@ import net.minecraftforge.event.world.BlockEvent.BreakEvent; import net.minecraftforge.event.world.WorldEvent; public class ModEventHandler { - + private static Random rand = new Random(); - + @SubscribeEvent public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { if(!event.player.worldObj.isRemote) { - + if(GeneralConfig.enableMOTD) { event.player.addChatMessage(new ChatComponentText("Loaded world with Hbm's Nuclear Tech Mod " + RefStrings.VERSION + " for Minecraft 1.7.10!")); - + if(HTTPHandler.newVersion) { event.player.addChatMessage( new ChatComponentText("New version " + HTTPHandler.versionNumber + " is available! Click ") @@ -168,14 +175,14 @@ public class ModEventHandler { ); } } - + if(MobConfig.enableDucks && event.player instanceof EntityPlayerMP && !event.player.getEntityData().getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG).getBoolean("hasDucked")) PacketDispatcher.wrapper.sendTo(new PlayerInformPacket("Press O to Duck!", MainRegistry.proxy.ID_DUCK, 30_000), (EntityPlayerMP) event.player); - + if(GeneralConfig.enableGuideBook) { HbmPlayerProps props = HbmPlayerProps.getData(event.player); - + if(!props.hasReceivedBook) { event.player.inventory.addItemStackToInventory(new ItemStack(ModItems.book_guide, 1, BookType.STARTER.ordinal())); event.player.inventoryContainer.detectAndSendChanges(); @@ -184,17 +191,17 @@ public class ModEventHandler { } } } - + @SubscribeEvent public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { - + EntityPlayer player = event.player; - + if((player.getUniqueID().toString().equals(ShadyUtil.Dr_Nostalgia) || player.getDisplayName().equals("Dr_Nostalgia")) && !player.worldObj.isRemote) { - + if(!player.inventory.hasItem(ModItems.hat)) player.inventory.addItemStackToInventory(new ItemStack(ModItems.hat)); - + if(!player.inventory.hasItem(ModItems.beta)) player.inventory.addItemStackToInventory(new ItemStack(ModItems.beta)); } @@ -202,18 +209,18 @@ public class ModEventHandler { @SubscribeEvent public void onEntityConstructing(EntityEvent.EntityConstructing event) { - + if(event.entity instanceof EntityPlayer) { - + EntityPlayer player = (EntityPlayer) event.entity; HbmPlayerProps.getData(player); //this already calls the register method if it's null so no further action required - + if(event.entity == MainRegistry.proxy.me()) BlockAshes.ashes = 0; } - + if(event.entity instanceof EntityLivingBase) { - + EntityLivingBase living = (EntityLivingBase) event.entity; HbmLivingProps.getData(living); //ditto } @@ -226,44 +233,44 @@ public class ModEventHandler { data.setKeyPressed(EnumKeybind.JETPACK, false); data.setKeyPressed(EnumKeybind.DASH, false); } - + @SubscribeEvent(priority = EventPriority.HIGHEST) public void onEntityDeathFirst(LivingDeathEvent event) { - + for(int i = 1; i < 5; i++) { - + ItemStack stack = event.entityLiving.getEquipmentInSlot(i); - + if(stack != null && stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { - + ItemStack revive = ArmorModHandler.pryMods(stack)[ArmorModHandler.extra]; - + if(revive != null) { - + //Classic revive if(revive.getItem() instanceof ItemModRevive) { revive.setItemDamage(revive.getItemDamage() + 1); - + if(revive.getItemDamage() >= revive.getMaxDamage()) { ArmorModHandler.removeMod(stack, ArmorModHandler.extra); } else { ArmorModHandler.applyMod(stack, revive); } - + event.entityLiving.setHealth(event.entityLiving.getMaxHealth()); event.entityLiving.addPotionEffect(new PotionEffect(Potion.resistance.id, 60, 99)); event.setCanceled(true); return; } - + //Shackles if(revive.getItem() instanceof ItemModShackles && HbmLivingProps.getRadiation(event.entityLiving) < 1000F) { - + revive.setItemDamage(revive.getItemDamage() + 1); - + int dmg = revive.getItemDamage(); ArmorModHandler.applyMod(stack, revive); - + event.entityLiving.setHealth(event.entityLiving.getMaxHealth()); HbmLivingProps.incrementRadiation(event.entityLiving, dmg * dmg); event.setCanceled(true); @@ -272,104 +279,104 @@ public class ModEventHandler { } } } - + } - + @SubscribeEvent public void onEntityDeath(LivingDeathEvent event) { - + HbmLivingProps.setRadiation(event.entityLiving, 0); - + if(event.entity.worldObj.isRemote) return; - + if(GeneralConfig.enableCataclysm) { EntityBurningFOEQ foeq = new EntityBurningFOEQ(event.entity.worldObj); foeq.setPositionAndRotation(event.entity.posX, 500, event.entity.posZ, 0.0F, 0.0F); event.entity.worldObj.spawnEntityInWorld(foeq); } - + if(event.entity.getUniqueID().toString().equals(ShadyUtil.HbMinecraft) || event.entity.getCommandSenderName().equals("HbMinecraft")) { event.entity.dropItem(ModItems.book_of_, 1); } - + if(event.entity instanceof EntityCreeperTainted && event.source == ModDamageSource.boxcar) { - + for(Object o : event.entity.worldObj.getEntitiesWithinAABB(EntityPlayer.class, event.entity.boundingBox.expand(50, 50, 50))) { EntityPlayer player = (EntityPlayer)o; player.triggerAchievement(MainRegistry.bobHidden); } } - + if(!event.entityLiving.worldObj.isRemote) { - + if(event.source instanceof EntityDamageSource && ((EntityDamageSource)event.source).getEntity() instanceof EntityPlayer && !(((EntityDamageSource)event.source).getEntity() instanceof FakePlayer)) { - + if(event.entityLiving instanceof EntitySpider && event.entityLiving.getRNG().nextInt(500) == 0) { event.entityLiving.dropItem(ModItems.spider_milk, 1); } - + if(event.entityLiving instanceof EntityCaveSpider && event.entityLiving.getRNG().nextInt(100) == 0) { event.entityLiving.dropItem(ModItems.serum, 1); } - + if(event.entityLiving instanceof EntityAnimal && event.entityLiving.getRNG().nextInt(500) == 0) { event.entityLiving.dropItem(ModItems.bandaid, 1); } - + if(event.entityLiving instanceof IMob) { if(event.entityLiving.getRNG().nextInt(1000) == 0) event.entityLiving.dropItem(ModItems.heart_piece, 1); if(event.entityLiving.getRNG().nextInt(250) == 0) event.entityLiving.dropItem(ModItems.key_red_cracked, 1); if(event.entityLiving.getRNG().nextInt(250) == 0) event.entityLiving.dropItem(ModItems.launch_code_piece, 1); } - + if(event.entityLiving instanceof EntityCyberCrab && event.entityLiving.getRNG().nextInt(500) == 0) { event.entityLiving.dropItem(ModItems.wd40, 1); } } } } - + @SubscribeEvent(priority = EventPriority.LOWEST) public void onEntityDeathLast(LivingDeathEvent event) { - + if(event.entityLiving instanceof EntityPlayer) { - + EntityPlayer player = (EntityPlayer) event.entityLiving; - + for(int i = 0; i < player.inventory.getSizeInventory(); i++) { - + ItemStack stack = player.inventory.getStackInSlot(i); - + if(stack != null && stack.getItem() == ModItems.detonator_deadman) { - + if(stack.stackTagCompound != null) { - + int x = stack.stackTagCompound.getInteger("x"); int y = stack.stackTagCompound.getInteger("y"); int z = stack.stackTagCompound.getInteger("z"); if(!player.worldObj.isRemote && player.worldObj.getBlock(x, y, z) instanceof IBomb) { - + ((IBomb) player.worldObj.getBlock(x, y, z)).explode(player.worldObj, x, y, z); - + if(GeneralConfig.enableExtendedLogging) MainRegistry.logger.log(Level.INFO, "[DET] Tried to detonate block at " + x + " / " + y + " / " + z + " by dead man's switch from " + player.getDisplayName() + "!"); } - + player.inventory.setInventorySlotContents(i, null); } } } } } - + @SubscribeEvent public void decorateMob(LivingSpawnEvent event) { EntityLivingBase entity = event.entityLiving; World world = event.world; - + if(!MobConfig.enableMobGear || entity.isChild() || world.isRemote) return; @@ -388,7 +395,7 @@ public class ModEventHandler { entity.setCurrentItemOrArmor(4, new ItemStack(ModItems.mask_of_infamy, 1, world.rand.nextInt(100))); if(rand.nextInt(1024) == 0) entity.setCurrentItemOrArmor(3, new ItemStack(ModItems.starmetal_plate, 1, world.rand.nextInt(ModItems.starmetal_plate.getMaxDamage()))); - + if(rand.nextInt(128) == 0) entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.pipe_lead, 1, world.rand.nextInt(100))); if(rand.nextInt(128) == 0) @@ -416,7 +423,7 @@ public class ModEventHandler { } if(rand.nextInt(64) == 0) entity.setCurrentItemOrArmor(3, new ItemStack(ModItems.steel_plate, 1, world.rand.nextInt(ModItems.steel_plate.getMaxDamage()))); - + float soot = PollutionHandler.getPollution(entity.worldObj, MathHelper.floor_double(event.x), MathHelper.floor_double(event.y), MathHelper.floor_double(event.z), PollutionType.SOOT); ItemStack bowReplacement = getSkelegun(soot, entity.worldObj.rand); if(bowReplacement != null) { @@ -462,7 +469,7 @@ public class ModEventHandler { entity.tasks.addTask(3, new EntityAIFireGun(entity)); } - + @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -474,96 +481,96 @@ public class ModEventHandler { addFireTask(living); } } - + @SubscribeEvent public void onItemToss(ItemTossEvent event) { - + ItemStack yeet = event.entityItem.getEntityItem(); - + if(yeet.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(yeet)) { - + ItemStack[] mods = ArmorModHandler.pryMods(yeet); ItemStack cladding = mods[ArmorModHandler.cladding]; - + if(cladding != null && cladding.getItem() == ModItems.cladding_obsidian) { ReflectionHelper.setPrivateValue(Entity.class, event.entityItem, true, "field_149119_a", "field_83001_bt", "field_149500_a", "invulnerable"); } } - + if(yeet.getItem() == ModItems.bismuth_tool) { ReflectionHelper.setPrivateValue(Entity.class, event.entityItem, true, "field_149119_a", "field_83001_bt", "field_149500_a", "invulnerable"); } } - + @SubscribeEvent public void onLivingDrop(LivingDropsEvent event) { - + if(!event.entityLiving.worldObj.isRemote) { boolean contaminated = HbmLivingProps.getContagion(event.entityLiving) > 0; - + if(contaminated) { - + for(EntityItem item : event.drops) { ItemStack stack = item.getEntityItem(); - + if(!stack.hasTagCompound()) { stack.stackTagCompound = new NBTTagCompound(); } - + stack.stackTagCompound.setBoolean("ntmContagion", true); } } } } - + @SubscribeEvent public void onLivingUpdate(LivingUpdateEvent event) { - + ItemStack[] prevArmor = event.entityLiving.previousEquipment; - if(event.entityLiving instanceof EntityPlayer && prevArmor != null && event.entityLiving.getHeldItem() != null + if(event.entityLiving instanceof EntityPlayer && prevArmor != null && event.entityLiving.getHeldItem() != null && (prevArmor[0] == null || prevArmor[0].getItem() != event.entityLiving.getHeldItem().getItem()) && event.entityLiving.getHeldItem().getItem() instanceof IEquipReceiver) { ((IEquipReceiver)event.entityLiving.getHeldItem().getItem()).onEquip((EntityPlayer) event.entityLiving, event.entityLiving.getHeldItem()); } - + for(int i = 1; i < 5; i++) { - + ItemStack prev = prevArmor != null ? prevArmor[i] : null; ItemStack armor = event.entityLiving.getEquipmentInSlot(i); - + boolean reapply = prevArmor != null && !ItemStack.areItemStacksEqual(prev, armor); - + if(reapply) { - + if(prev != null && ArmorModHandler.hasMods(prev)) { - + for(ItemStack mod : ArmorModHandler.pryMods(prev)) { - + if(mod != null && mod.getItem() instanceof ItemArmorMod) { - + Multimap map = ((ItemArmorMod)mod.getItem()).getModifiers(prev); - + if(map != null) event.entityLiving.getAttributeMap().removeAttributeModifiers(map); } } } } - + if(armor != null && ArmorModHandler.hasMods(armor)) { - + for(ItemStack mod : ArmorModHandler.pryMods(armor)) { - + if(mod != null && mod.getItem() instanceof ItemArmorMod) { ((ItemArmorMod)mod.getItem()).modUpdate(event.entityLiving, armor); HazardSystem.applyHazards(mod, event.entityLiving); - + if(reapply) { - + Multimap map = ((ItemArmorMod)mod.getItem()).getModifiers(armor); - + if(map != null) event.entityLiving.getAttributeMap().applyAttributeModifiers(map); } @@ -571,14 +578,14 @@ public class ModEventHandler { } } } - + EntityEffectHandler.onUpdate(event.entityLiving); - + if(!event.entity.worldObj.isRemote && !(event.entityLiving instanceof EntityPlayer)) { HazardSystem.updateLivingInventory(event.entityLiving); } } - + @SubscribeEvent(priority = EventPriority.LOWEST) public void onLoad(WorldEvent.Load event) { BobmazonOfferFactory.init(); @@ -586,19 +593,19 @@ public class ModEventHandler { @SubscribeEvent public void onUnload(WorldEvent.Unload event) { - NeutronNodeWorld.StreamWorld.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. + NeutronNodeWorld.removeAllWorlds(); // Remove world from worlds when unloaded to avoid world issues. NeutronNodeWorld.removeAllNodes(); // Remove all nodes. } - + public static boolean didSit = false; public static Field reference = null; - + @SubscribeEvent public void worldTick(WorldTickEvent event) { - + /// RADIATION STUFF START /// if(event.world != null && !event.world.isRemote) { - + if(reference != null) { for(Object player : event.world.playerEntities) { if(((EntityPlayer) player).ridingEntity != null) { didSit = true; } @@ -607,37 +614,37 @@ public class ModEventHandler { try { reference.setFloat(null, (float) (rand.nextGaussian() * 0.1 + Math.PI)); } catch(Throwable e) { } } } - + int thunder = AuxSavedData.getThunder(event.world); - + if(thunder > 0) AuxSavedData.setThunder(event.world, thunder - 1); - + if(!event.world.loadedEntityList.isEmpty()) { - + List oList = new ArrayList(); oList.addAll(event.world.loadedEntityList); - + /** * REMOVE THIS V V V */ for(Object e : oList) { if(e instanceof EntityLivingBase) { - + //effect for radiation EntityLivingBase entity = (EntityLivingBase) e; - + if(entity instanceof EntityPlayer && ((EntityPlayer)entity).capabilities.isCreativeMode) continue; - + float eRad = HbmLivingProps.getRadiation(entity); - + if(entity.getClass().equals(EntityCreeper.class) && eRad >= 200 && entity.getHealth() > 0) { - + if(event.world.rand.nextInt(3) == 0 ) { EntityCreeperNuclear creep = new EntityCreeperNuclear(event.world); creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); - + if(!entity.isDead) if(!event.world.isRemote) event.world.spawnEntityInWorld(creep); @@ -646,7 +653,7 @@ public class ModEventHandler { entity.attackEntityFrom(ModDamageSource.radiation, 100F); } continue; - + } else if(entity instanceof EntityCow && !(entity instanceof EntityMooshroom) && eRad >= 50) { EntityMooshroom creep = new EntityMooshroom(event.world); creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); @@ -656,47 +663,47 @@ public class ModEventHandler { event.world.spawnEntityInWorld(creep); entity.setDead(); continue; - + } else if(entity instanceof EntityVillager && eRad >= 500) { EntityZombie creep = new EntityZombie(event.world); creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); - + if(!entity.isDead) if(!event.world.isRemote) event.world.spawnEntityInWorld(creep); entity.setDead(); continue; } else if(entity.getClass().equals(EntityDuck.class) && eRad >= 200) { - + EntityQuackos quacc = new EntityQuackos(event.world); quacc.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); - + if(!entity.isDead && !event.world.isRemote) event.world.spawnEntityInWorld(quacc); - + entity.setDead(); continue; } - + if(eRad < 200 || ContaminationUtil.isRadImmune(entity)) continue; - + if(eRad > 2500) HbmLivingProps.setRadiation(entity, 2500); - + if(eRad >= 1000) { entity.attackEntityFrom(ModDamageSource.radiation, 1000F); HbmLivingProps.setRadiation(entity, 0); - + if(entity.getHealth() > 0) { entity.setHealth(0); entity.onDeath(ModDamageSource.radiation); } - + if(entity instanceof EntityPlayer) ((EntityPlayer)entity).triggerAchievement(MainRegistry.achRadDeath); - + } else if(eRad >= 800) { if(event.world.rand.nextInt(300) == 0) entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 5 * 30, 0)); @@ -708,7 +715,7 @@ public class ModEventHandler { entity.addPotionEffect(new PotionEffect(Potion.poison.id, 3 * 20, 2)); if(event.world.rand.nextInt(700) == 0) entity.addPotionEffect(new PotionEffect(Potion.wither.id, 3 * 20, 1)); - + } else if(eRad >= 600) { if(event.world.rand.nextInt(300) == 0) entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 5 * 30, 0)); @@ -718,7 +725,7 @@ public class ModEventHandler { entity.addPotionEffect(new PotionEffect(Potion.weakness.id, 10 * 20, 2)); if(event.world.rand.nextInt(500) == 0) entity.addPotionEffect(new PotionEffect(Potion.poison.id, 3 * 20, 1)); - + } else if(eRad >= 400) { if(event.world.rand.nextInt(300) == 0) entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 5 * 30, 0)); @@ -726,18 +733,18 @@ public class ModEventHandler { entity.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 5 * 20, 0)); if(event.world.rand.nextInt(300) == 0) entity.addPotionEffect(new PotionEffect(Potion.weakness.id, 5 * 20, 1)); - + } else if(eRad >= 200) { if(event.world.rand.nextInt(300) == 0) entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 5 * 20, 0)); if(event.world.rand.nextInt(500) == 0) entity.addPotionEffect(new PotionEffect(Potion.weakness.id, 5 * 20, 0)); - + if(entity instanceof EntityPlayer) ((EntityPlayer)entity).triggerAchievement(MainRegistry.achRadPoison); } } - + if(e instanceof EntityItem) { EntityItem item = (EntityItem) e; HazardSystem.updateDroppedItem(item); @@ -748,36 +755,36 @@ public class ModEventHandler { */ } /// RADIATION STUFF END /// - - + + if(event.phase == Phase.END) { EntityRailCarBase.updateMotion(event.world); } } - + if(event.phase == Phase.START) { BossSpawnHandler.rollTheDice(event.world); TimedGenerator.automaton(event.world, 100); } } - + @SubscribeEvent public void onEntityAttacked(LivingAttackEvent event) { - + EntityLivingBase e = event.entityLiving; if(e instanceof EntityPlayer) { - + EntityPlayer player = (EntityPlayer) e; - + if(ArmorUtil.checkArmor(player, ModItems.euphemium_helmet, ModItems.euphemium_plate, ModItems.euphemium_legs, ModItems.euphemium_boots)) { HbmPlayerProps.plink(player, "random.break", 0.5F, 1.0F + e.getRNG().nextFloat() * 0.5F); event.setCanceled(true); } - + if(player.inventory.armorInventory[2] != null && player.inventory.armorInventory[2].getItem() instanceof ArmorFSB) ((ArmorFSB)player.inventory.armorInventory[2].getItem()).handleAttack(event); - + for(ItemStack stack : player.inventory.armorInventory) { if(stack != null && stack.getItem() instanceof IAttackHandler) { ((IAttackHandler)stack.getItem()).handleAttack(event, stack); @@ -785,16 +792,16 @@ public class ModEventHandler { } } } - + @SubscribeEvent public void onEntityDamaged(LivingHurtEvent event) { - + EntityLivingBase e = event.entityLiving; - + if(e instanceof EntityPlayer) { - + EntityPlayer player = (EntityPlayer) e; - + HbmPlayerProps props = HbmPlayerProps.getData(player); if(props.shield > 0) { float reduce = Math.min(props.shield, event.ammount); @@ -803,35 +810,35 @@ public class ModEventHandler { } props.lastDamage = player.ticksExisted; } - + if(HbmLivingProps.getContagion(e) > 0 && event.ammount < 100) event.ammount *= 2F; - + /// ARMOR MODS /// for(int i = 1; i < 5; i++) { - + ItemStack armor = e.getEquipmentInSlot(i); - + if(armor != null && ArmorModHandler.hasMods(armor)) { - + for(ItemStack mod : ArmorModHandler.pryMods(armor)) { - + if(mod != null && mod.getItem() instanceof ItemArmorMod) { ((ItemArmorMod)mod.getItem()).modDamage(event, armor); } } } } - + if(e instanceof EntityPlayer) { - + EntityPlayer player = (EntityPlayer) e; - + /// FSB ARMOR /// if(player.inventory.armorInventory[2] != null && player.inventory.armorInventory[2].getItem() instanceof ArmorFSB) ((ArmorFSB)player.inventory.armorInventory[2].getItem()).handleHurt(event); - - + + for(ItemStack stack : player.inventory.armorInventory) { if(stack != null && stack.getItem() instanceof IDamageHandler) { ((IDamageHandler)stack.getItem()).handleDamage(event, stack); @@ -839,103 +846,103 @@ public class ModEventHandler { } } } - + @SubscribeEvent public void onPlayerFall(PlayerFlyableFallEvent event) { - + EntityPlayer e = event.entityPlayer; - + if(e.inventory.armorInventory[2] != null && e.inventory.armorInventory[2].getItem() instanceof ArmorFSB) ((ArmorFSB)e.inventory.armorInventory[2].getItem()).handleFall(e); } - + @SubscribeEvent public void onPlayerPunch(AttackEntityEvent event) { - + EntityPlayer player = event.entityPlayer; ItemStack chestplate = player.inventory.armorInventory[2]; - + if(!player.worldObj.isRemote && player.getHeldItem() == null && chestplate != null && ArmorModHandler.hasMods(chestplate)) { ItemStack[] mods = ArmorModHandler.pryMods(chestplate); ItemStack servo = mods[ArmorModHandler.servos]; - + if(servo != null && servo.getItem() == ModItems.ballistic_gauntlet) { - + BulletConfiguration firedConfig = null; for(Integer config : HbmCollection.g12) { BulletConfiguration cfg = BulletConfigSyncingUtil.pullConfig(config); - + if(InventoryUtil.doesPlayerHaveAStack(player, cfg.ammo, true, true)) { firedConfig = cfg; break; } } - + if(firedConfig != null) { int bullets = firedConfig.bulletsMin; - + if(firedConfig.bulletsMax > firedConfig.bulletsMin) { bullets += player.getRNG().nextInt(firedConfig.bulletsMax - firedConfig.bulletsMin); } - + for(int i = 0; i < bullets; i++) { EntityBulletBaseNT bullet = new EntityBulletBaseNT(player.worldObj, BulletConfigSyncingUtil.getKey(firedConfig), player); player.worldObj.spawnEntityInWorld(bullet); } - + player.worldObj.playSoundAtEntity(player, "hbm:weapon.shotgunShoot", 1.0F, 1.0F); } } } } - + @SubscribeEvent public void onEntityJump(LivingJumpEvent event) { - + EntityLivingBase e = event.entityLiving; - + if(e instanceof EntityPlayer && ((EntityPlayer)e).inventory.armorInventory[2] != null && ((EntityPlayer)e).inventory.armorInventory[2].getItem() instanceof ArmorFSB) ((ArmorFSB)((EntityPlayer)e).inventory.armorInventory[2].getItem()).handleJump((EntityPlayer)e); } - + @SubscribeEvent public void onEntityFall(LivingFallEvent event) { - + EntityLivingBase e = event.entityLiving; - + if(e instanceof EntityPlayer && ((EntityPlayer)e).inventory.armorInventory[2] != null && ((EntityPlayer)e).inventory.armorInventory[2].getItem() instanceof ArmorFSB) ((ArmorFSB)((EntityPlayer)e).inventory.armorInventory[2].getItem()).handleFall((EntityPlayer)e); } - + private static final UUID fopSpeed = UUID.fromString("e5a8c95d-c7a0-4ecf-8126-76fb8c949389"); - + @SubscribeEvent public void onWingFlop(TickEvent.PlayerTickEvent event) { EntityPlayer player = event.player; - + if(event.phase == TickEvent.Phase.START) { - + if(player.getCurrentArmor(2) == null && !player.onGround) { - + if(player.getUniqueID().toString().equals(ShadyUtil.Barnaby99_x) || player.getDisplayName().equals("pheo7")) { ArmorUtil.resetFlightTime(player); HbmPlayerProps props = HbmPlayerProps.getData(player); - + if(props.isJetpackActive()) { - + if(player.motionY < 0.4D) player.motionY += 0.1D; - + Vec3 look = player.getLookVec(); - + if(Vec3.createVectorHelper(player.motionX, player.motionY, player.motionZ).lengthVector() < 2) { player.motionX += look.xCoord * 0.2; player.motionY += look.yCoord * 0.2; player.motionZ += look.zCoord * 0.2; - + if(look.yCoord > 0) player.fallDistance = 0; } @@ -944,42 +951,42 @@ public class ModEventHandler { if(player.fallDistance > 0) player.fallDistance = 0; } } - + boolean isBob = player.getUniqueID().toString().equals(ShadyUtil.HbMinecraft) || player.getDisplayName().equals("HbMinecraft"); boolean isOther = player.getUniqueID().toString().equals(ShadyUtil.the_NCR) || player.getDisplayName().equals("the_NCR"); - + if(isBob || isOther) { - + ArmorUtil.resetFlightTime(player); - + if(player.fallDistance > 0) player.fallDistance = 0; - + if(player.motionY < -0.4D) player.motionY = -0.4D; - + HbmPlayerProps props = HbmPlayerProps.getData(player); - + if(isBob || player.getFoodStats().getFoodLevel() > 6) { - + if(props.isJetpackActive()) { - + double cap = (isBob ? 0.8D : 0.4D); - + if(player.motionY < cap) player.motionY += 0.15D; else player.motionY = cap + 0.15D; - + if(isOther) { if(player.getFoodStats().getSaturationLevel() > 0F) player.addExhaustion(4F); //burn up saturation so that super-saturating foods have no effect else player.addExhaustion(0.2F); //4:1 -> 0.05 hunger per tick or 1 per second } - + } else if(props.enableBackpack && !player.isSneaking()) { - + if(player.motionY < -1) player.motionY += 0.4D; else if(player.motionY < -0.1) @@ -993,35 +1000,35 @@ public class ModEventHandler { else player.addExhaustion(0.04F); } - + } else if(!props.enableBackpack && player.isSneaking()) { - + if(player.motionY < -0.08) { - + double mo = player.motionY * (isBob ? -0.6 : -0.4); player.motionY += mo; - + Vec3 vec = player.getLookVec(); vec.xCoord *= mo; vec.yCoord *= mo; vec.zCoord *= mo; - + player.motionX += vec.xCoord; player.motionY += vec.yCoord; player.motionZ += vec.zCoord; } } } - + Vec3 orig = player.getLookVec(); Vec3 look = Vec3.createVectorHelper(orig.xCoord, 0, orig.zCoord).normalize(); double mod = props.enableBackpack ? (isBob ? 0.5D : 0.25D) : 0.125D; - + if(player.moveForward != 0) { player.motionX += look.xCoord * 0.35 * player.moveForward * mod; player.motionZ += look.zCoord * 0.35 * player.moveForward * mod; } - + if(player.moveStrafing != 0) { look.rotateAroundY((float) Math.PI * 0.5F); player.motionX += look.xCoord * 0.15 * player.moveStrafing * mod; @@ -1029,65 +1036,65 @@ public class ModEventHandler { } } } - + if(player.getUniqueID().toString().equals(ShadyUtil.LePeeperSauvage) || player.getDisplayName().equals("LePeeperSauvage")) { - + Multimap multimap = HashMultimap.create(); multimap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(fopSpeed, "FOP SPEED", 0.5, 1)); player.getAttributeMap().removeAttributeModifiers(multimap); - + if(player.isSprinting()) { player.getAttributeMap().applyAttributeModifiers(multimap); } } } } - + @SubscribeEvent public void onPlayerTick(TickEvent.PlayerTickEvent event) { - + EntityPlayer player = event.player; - + if(player.inventory.armorInventory[2] != null && player.inventory.armorInventory[2].getItem() instanceof ArmorFSB) ((ArmorFSB)player.inventory.armorInventory[2].getItem()).handleTick(event); - + if(player.ticksExisted == 100 || player.ticksExisted == 200) CraftingManager.crumple(); - + if(event.phase == TickEvent.Phase.START) { int x = MathHelper.floor_double(player.posX); int y = MathHelper.floor_double(player.posY - player.yOffset - 0.01); int z = MathHelper.floor_double(player.posZ); Block b = player.worldObj.getBlock(x, y, z); - + if(b instanceof IStepTickReceiver && !player.capabilities.isFlying) { IStepTickReceiver step = (IStepTickReceiver) b; step.onPlayerStep(player.worldObj, x, y, z, player); } } - + if(!player.worldObj.isRemote && event.phase == TickEvent.Phase.START) { - + /// GHOST FIX START /// - + if(!Float.isFinite(player.getHealth()) || !Float.isFinite(player.getAbsorptionAmount())) { player.addChatComponentMessage(new ChatComponentText("Your health has been restored!")); player.worldObj.playSoundAtEntity(player, "hbm:item.syringe", 1.0F, 1.0F); player.setHealth(player.getMaxHealth()); player.setAbsorptionAmount(0); } - + /// GHOST FIX END /// - + /// BETA HEALTH START /// if(player.inventory.hasItem(ModItems.beta)) { - + if(player.getFoodStats().getFoodLevel() > 10) { player.heal(player.getFoodStats().getFoodLevel() - 10); } - + if(player.getFoodStats().getFoodLevel() != 10) { - + // Why can't you be normal?? try { Field food = ReflectionHelper.findField(FoodStats.class, "field_75127_a", "foodLevel"); @@ -1098,27 +1105,27 @@ public class ModEventHandler { /// BETA HEALTH END /// /// PU RADIATION START /// - + if(player.getUniqueID().toString().equals(ShadyUtil.Pu_238)) { - + List entities = player.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, player.boundingBox.expand(3, 3, 3)); - + for(EntityLivingBase e : entities) { - + if(e != player) { e.addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 300, 2)); } } } - + /// PU RADIATION END /// - + /*if(player instanceof EntityPlayerMP) { int x = (int) Math.floor(player.posX); int y = (int) Math.floor(player.posY - 0.01); int z = (int) Math.floor(player.posZ); - + if(player.worldObj.getTileEntity(x, y, z) instanceof IEnergyConductor) { PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(((IEnergyConductor) player.worldObj.getTileEntity(x, y, z)).getPowerNet() + ""), (EntityPlayerMP) player); } @@ -1127,46 +1134,46 @@ public class ModEventHandler { /// NEW ITEM SYS START /// HazardSystem.updatePlayerInventory(player); /// NEW ITEM SYS END /// - + /// SYNC START /// if(!player.worldObj.isRemote && player instanceof EntityPlayerMP) PacketDispatcher.wrapper.sendTo(new PermaSyncPacket((EntityPlayerMP) player), (EntityPlayerMP) player); /// SYNC END /// } if(player.worldObj.isRemote && event.phase == event.phase.START && !player.isInvisible() && !player.isSneaking()) { - + if(player.getUniqueID().toString().equals(ShadyUtil.Pu_238)) { - + Vec3 vec = Vec3.createVectorHelper(3 * rand.nextDouble(), 0, 0); vec.rotateAroundZ((float) (rand.nextDouble() * Math.PI)); vec.rotateAroundY((float) (rand.nextDouble() * Math.PI * 2)); player.worldObj.spawnParticle("townaura", player.posX + vec.xCoord, player.posY + 1 + vec.yCoord, player.posZ + vec.zCoord, 0.0, 0.0, 0.0); } } - + // OREDBG /*if(!event.player.worldObj.isRemote) { for(BedrockOreType type : BedrockOreType.values()) { PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(StatCollector.translateToLocalFormatted("item.bedrock_ore.type." + type.suffix + ".name") + ": " + ((int) (ItemBedrockOreBase.getOreLevel((int) Math.floor(player.posX), (int) Math.floor(player.posZ), type) * 100) / 100D), 777 + type.ordinal()), (EntityPlayerMP) player); } }*/ - + // PRISMDBG /*if(!event.player.worldObj.isRemote) { ChunkRadiationHandlerPRISM prism = (ChunkRadiationHandlerPRISM) ChunkRadiationManager.proxy; - + RadPerWorld perWorld = prism.perWorld.get(player.worldObj); - + if(perWorld != null) { SubChunk[] chunk = perWorld.radiation.get(new ChunkCoordIntPair(((int) Math.floor(player.posX)) >> 4, ((int) Math.floor(player.posZ)) >> 4)); - + if(chunk != null) { - + int y = ((int) Math.floor(player.posY)) >> 4; - + if(y >= 0 && y <= 15) { SubChunk sub = chunk[y]; - + if(sub != null) { float xSum = 0, ySum = 0, zSum = 0; for(int i = 0; i < 16; i++) { @@ -1190,25 +1197,50 @@ public class ModEventHandler { } }*/ } - + @SubscribeEvent public void onServerTick(TickEvent.ServerTickEvent event) { - - if(event.phase == event.phase.START) { + + if(event.phase == Phase.START) { + + NetworkHandler.flush(); // Flush ALL network packets. + // Yes this technically happens a tick late, I am aware. + // I was encountering some kind of race condition when I flushed packets at the end of the tick, + // leading to occasional ticks of incorrect packets. + + NeutronHandler.onWorldTick(); // All neutron interactions + + // do other shit I guess? RTTYSystem.updateBroadcastQueue(); RequestNetwork.updateEntries(); TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); - // RBMK!!!! - RBMKNeutronHandler.runAllInteractions(); - // Chicago Pile!!!! - PileNeutronHandler.runAllInteractions(); + // bob i beg of you i need fluid nodespace :pray: + } + + if(event.phase == Phase.END) { + // As ByteBufs are added to the queue in `com.hbm.packet.toclient.BufPacketThreading`, they are processed by the packet thread. + // This waits until the thread is finished, which most of the time will be instantly since it has plenty of time to process in parallel to everything else. + BufPacketThreading.waitUntilThreadFinished(); } } - + + @SubscribeEvent + public void commandEvent(CommandEvent event) { + ICommand command = event.command; + ICommandSender sender = event.sender; + if(command instanceof CommandGameRule) { + if(command.canCommandSenderUseCommand(sender)) { + command.processCommand(sender,event.parameters); + RBMKDials.refresh(sender.getEntityWorld()); + event.setCanceled(true); + } + } + } + @SubscribeEvent public void enteringChunk(EnteringChunk evt) { - + /*if(evt.entity instanceof EntityMissileBaseNT) { ((EntityMissileBaseNT) evt.entity).loadNeighboringChunks(evt.newChunkX, evt.newChunkZ); } @@ -1217,41 +1249,41 @@ public class ModEventHandler { ((EntityMissileCustom) evt.entity).loadNeighboringChunks(evt.newChunkX, evt.newChunkZ); }*/ } - + @SubscribeEvent public void onPlayerClone(net.minecraftforge.event.entity.player.PlayerEvent.Clone event) { - - NBTTagCompound data = new NBTTagCompound(); - HbmPlayerProps.getData(event.original).saveNBTData(data); - HbmPlayerProps.getData(event.entityPlayer).loadNBTData(data); + + ByteBuf buf = Unpooled.buffer(); + HbmPlayerProps.getData(event.original).serialize(buf); + HbmPlayerProps.getData(event.entityPlayer).deserialize(buf); } - + @SubscribeEvent public void itemCrafted(PlayerEvent.ItemCraftedEvent e) { AchievementHandler.fire(e.player, e.crafting); } - + @SubscribeEvent public void itemSmelted(PlayerEvent.ItemSmeltedEvent e) { AchievementHandler.fire(e.player, e.smelting); - + if(!e.player.worldObj.isRemote && e.smelting.getItem() == Items.iron_ingot && e.player.getRNG().nextInt(64) == 0) { - + if(!e.player.inventory.addItemStackToInventory(new ItemStack(ModItems.lodestone))) e.player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.lodestone), false); else e.player.inventoryContainer.detectAndSendChanges(); } - + if(!e.player.worldObj.isRemote && e.smelting.getItem() == ModItems.ingot_uranium && e.player.getRNG().nextInt(64) == 0) { - + if(!e.player.inventory.addItemStackToInventory(new ItemStack(ModItems.quartz_plutonium))) e.player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.quartz_plutonium), false); else e.player.inventoryContainer.detectAndSendChanges(); } } - + @SubscribeEvent public void onItemPickup(PlayerEvent.ItemPickupEvent event) { if(event.pickedUp.getEntityItem().getItem() == ModItems.canned_conserve && EnumUtil.grabEnumSafely(EnumFoodType.class, event.pickedUp.getEntityItem().getItemDamage()) == EnumFoodType.JIZZ) @@ -1259,40 +1291,40 @@ public class ModEventHandler { if(event.pickedUp.getEntityItem().getItem() == Items.slime_ball) event.player.triggerAchievement(MainRegistry.achSlimeball); } - + @SubscribeEvent public void onBlockBreak(BreakEvent event) { - + EntityPlayer player = event.getPlayer(); - + if(!(player instanceof EntityPlayerMP)) return; - + if(event.block == ModBlocks.stone_gneiss && !((EntityPlayerMP) player).func_147099_x().hasAchievementUnlocked(MainRegistry.achStratum)) { event.getPlayer().triggerAchievement(MainRegistry.achStratum); event.setExpToDrop(500); } - + if(event.block == Blocks.coal_ore || event.block == Blocks.coal_block || event.block == ModBlocks.ore_lignite) { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { int x = event.x + dir.offsetX; int y = event.y + dir.offsetY; int z = event.z + dir.offsetZ; - + if(event.world.rand.nextInt(2) == 0 && event.world.getBlock(x, y, z) == Blocks.air) event.world.setBlock(x, y, z, ModBlocks.gas_coal); } } - + if(RadiationConfig.enablePollution && RadiationConfig.enableLeadFromBlocks) { if(!ArmorRegistry.hasProtection(player, 3, HazardClass.PARTICLE_FINE)) { - + float metal = PollutionHandler.getPollution(player.worldObj, event.x, event.y, event.z, PollutionType.HEAVYMETAL); - + if(metal < 5) return; - + if(metal < 10) { player.addPotionEffect(new PotionEffect(HbmPotion.lead.id, 100, 0)); } else if(metal < 25) { @@ -1303,7 +1335,7 @@ public class ModEventHandler { } } } - + @SubscribeEvent public void onClickSign(PlayerInteractEvent event) { @@ -1311,13 +1343,13 @@ public class ModEventHandler { int y = event.y; int z = event.z; World world = event.world; - + if(!world.isRemote && event.action == Action.RIGHT_CLICK_BLOCK && world.getTileEntity(x, y, z) instanceof TileEntitySign) { - + TileEntitySign sign = (TileEntitySign)world.getTileEntity(x, y, z); - + String result = ShadyUtil.smoosh(sign.signText[0], sign.signText[1], sign.signText[2], sign.signText[3]); - + if(ShadyUtil.hashes.contains(result)) { world.func_147480_a(x, y, z, false); EntityItem entityitem = new EntityItem(world, x, y, z, new ItemStack(ModItems.bobmazon_hidden)); @@ -1326,22 +1358,22 @@ public class ModEventHandler { } } } - + @SubscribeEvent public void chatEvent(ServerChatEvent event) { - + EntityPlayerMP player = event.player; String message = event.message; - + //boolean conditions for the illiterate, edition 1 //bellow you can see the header of an if-block. inside the brackets, there is a boolean statement. //that means nothing other than its value totaling either 'true' or 'false' //examples: 'true' would just mean true //'1 > 3' would equal false //'i < 10' would equal true if 'i' is smaller than 10, if equal or greater, it will result in false - + //let's start from the back: - + //this part means that the message's first character has to equal a '!': ----------------------------+ // | //this is a logical AND operator: ----------------------------------------------------------------+ | @@ -1367,72 +1399,72 @@ public class ModEventHandler { //the config file: | | | | | | // V V V V V V if(GeneralConfig.enableDebugMode && player.getUniqueID().toString().equals(ShadyUtil.HbMinecraft) && message.startsWith("!")) { - + String[] msg = message.split(" "); - + String m = msg[0].substring(1, msg[0].length()).toLowerCase(Locale.US); - + if("gv".equals(m)) { - + int id = 0; int size = 1; int meta = 0; - + if(msg.length > 1 && NumberUtils.isNumber(msg[1])) { id = (int)(double)NumberUtils.createDouble(msg[1]); } - + if(msg.length > 2 && NumberUtils.isNumber(msg[2])) { size = (int)(double)NumberUtils.createDouble(msg[2]); } - + if(msg.length > 3 && NumberUtils.isNumber(msg[3])) { meta = (int)(double)NumberUtils.createDouble(msg[3]); } - + Item item = Item.getItemById(id); - + if(item != null && size > 0 && meta >= 0) { player.inventory.addItemStackToInventory(new ItemStack(item, size, meta)); } } - + player.inventoryContainer.detectAndSendChanges(); event.setCanceled(true); } } - + @SubscribeEvent public void anvilUpdateEvent(AnvilUpdateEvent event) { - + if(event.left.getItem() instanceof ItemGunBase && event.right.getItem() == Items.enchanted_book) { - + event.output = event.left.copy(); - + Map mapright = EnchantmentHelper.getEnchantments(event.right); Iterator itr = mapright.keySet().iterator(); - + while(itr.hasNext()) { - + int i = ((Integer) itr.next()).intValue(); int j = ((Integer) mapright.get(Integer.valueOf(i))).intValue(); Enchantment e = Enchantment.enchantmentsList[i]; - + EnchantmentUtil.removeEnchantment(event.output, e); EnchantmentUtil.addEnchantment(event.output, e, j); } - + event.cost = 10; } } - + @SubscribeEvent public void onFoodEaten(PlayerUseItemEvent.Finish event) { - + ItemStack stack = event.item; - + if(stack != null && stack.getItem() instanceof ItemFood) { - + if(stack.hasTagCompound() && stack.getTagCompound().getBoolean("ntmCyanide")) { for(int i = 0; i < 10; i++) { event.entityPlayer.attackEntityFrom(rand.nextBoolean() ? ModDamageSource.euthanizedSelf : ModDamageSource.euthanizedSelf2, 1000); @@ -1440,17 +1472,17 @@ public class ModEventHandler { } } } - + @SubscribeEvent public void filterBrokenEntity(EntityJoinWorldEvent event) { - + Entity entity = event.entity; Entity[] parts = entity.getParts(); - + //MainRegistry.logger.error("Trying to spawn entity " + entity.getClass().getCanonicalName()); - + if(parts != null) { - + for(int i = 0; i < parts.length; i++) { if(parts[i] == null) { MainRegistry.logger.error("Prevented spawning of multipart entity " + entity.getClass().getCanonicalName() + " due to parts being null!"); diff --git a/src/main/java/com/hbm/main/NetworkHandler.java b/src/main/java/com/hbm/main/NetworkHandler.java new file mode 100644 index 000000000..99d8a4e8c --- /dev/null +++ b/src/main/java/com/hbm/main/NetworkHandler.java @@ -0,0 +1,79 @@ +package com.hbm.main; + +import cpw.mods.fml.common.network.FMLEmbeddedChannel; +import cpw.mods.fml.common.network.FMLOutboundHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.simpleimpl.*; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.entity.player.EntityPlayerMP; + +import java.util.EnumMap; + +// Essentially the `SimpleNetworkWrapper` from FML but doesn't flush the packets immediately. +public class NetworkHandler { + + private static FMLEmbeddedChannel clientChannel; + private static FMLEmbeddedChannel serverChannel; + + private static SimpleIndexedCodec packetCodec; + + public NetworkHandler(String name) { + packetCodec = new SimpleIndexedCodec(); + EnumMap channels = NetworkRegistry.INSTANCE.newChannel(name, packetCodec); + clientChannel = channels.get(Side.CLIENT); + serverChannel = channels.get(Side.SERVER); + } + + public void registerMessage(Class> messageHandler, Class requestMessageType, int discriminator, Side side) { + + packetCodec.addDiscriminator(discriminator, requestMessageType); + FMLEmbeddedChannel channel; + if(side.isClient()) + channel = clientChannel; + else + channel = serverChannel; + String type = channel.findChannelHandlerNameForType(SimpleIndexedCodec.class); + SimpleChannelHandlerWrapper handler; + if (side == Side.SERVER) { + handler = new SimpleChannelHandlerWrapper<>(messageHandler, side, requestMessageType); + } else { + handler = new SimpleChannelHandlerWrapper<>(messageHandler, side, requestMessageType); + } + channel.pipeline().addAfter(type, messageHandler.getName(), handler); + } + + public static void flush() { + clientChannel.flush(); + serverChannel.flush(); + } + + public void sendToServer(IMessage message) { + clientChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER); + clientChannel.write(message); + } + + public void sendToDimension(IMessage message, int dimensionId) { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId); + serverChannel.write(message); + + } + + public void sendToAllAround(IMessage message, NetworkRegistry.TargetPoint point) { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + serverChannel.write(message); + + } + + public void sendTo(IMessage message, EntityPlayerMP player) { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); + serverChannel.write(message); + } + + public void sendToAll(IMessage message) { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); + serverChannel.write(message); + } +} diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 903a7939a..2d5cd9583 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -1,21 +1,23 @@ package com.hbm.packet; import com.hbm.lib.RefStrings; +import com.hbm.main.NetworkHandler; import com.hbm.packet.toclient.*; import com.hbm.packet.toserver.*; +import cpw.mods.fml.common.network.FMLEventChannel; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; public class PacketDispatcher { - //Mark 1 Packet Sending Device - public static final SimpleNetworkWrapper wrapper = NetworkRegistry.INSTANCE.newSimpleChannel(RefStrings.MODID); + //Mark 1.5 Packet Sending Device + public static final NetworkHandler wrapper = new NetworkHandler(RefStrings.MODID); - public static final void registerPackets() { + public static void registerPackets() { int i = 0; - + //Sound packet that keeps client and server separated wrapper.registerMessage(LoopedSoundPacket.Handler.class, LoopedSoundPacket.class, i++, Side.CLIENT); //Signals server to consume items and create template @@ -83,5 +85,5 @@ public class PacketDispatcher { //wrapper.registerMessage(NBTPacket.Handler.class, NBTPacket.class, i++, Side.CLIENT); //The convenient but laggy one wrapper.registerMessage(BufPacket.Handler.class, BufPacket.class, i++, Side.CLIENT); //The not-so-convenient but not laggy one } - + } diff --git a/src/main/java/com/hbm/packet/toclient/BufPacket.java b/src/main/java/com/hbm/packet/toclient/BufPacket.java index 383f9dd71..720be19df 100644 --- a/src/main/java/com/hbm/packet/toclient/BufPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BufPacket.java @@ -1,5 +1,6 @@ package com.hbm.packet.toclient; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.IBufPacketReceiver; import cpw.mods.fml.common.network.simpleimpl.IMessage; @@ -8,8 +9,6 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; public class BufPacket implements IMessage { @@ -58,11 +57,9 @@ public class BufPacket implements IMessage { try { ((IBufPacketReceiver) te).deserialize(m.buf); } catch(Exception e) { // just in case I fucked up - Logger logger = LogManager.getLogger("HBM"); - logger.warn("A ByteBuf packet failed to be read and has thrown an error. This normally means that there was a buffer underflow and more data was read than was actually in the packet."); - logger.warn("Tile: {}", te.getBlockType().getUnlocalizedName()); - logger.warn(e.getMessage()); - + MainRegistry.logger.warn("A ByteBuf packet failed to be read and has thrown an error. This normally means that there was a buffer underflow and more data was read than was actually in the packet."); + MainRegistry.logger.warn("Tile: {}", te.getBlockType().getUnlocalizedName()); + MainRegistry.logger.warn(e.getMessage()); } } diff --git a/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java b/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java index 04d1fe52a..7c1422820 100644 --- a/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java +++ b/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java @@ -1,19 +1,14 @@ package com.hbm.tileentity; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import com.hbm.handler.threading.BufPacketThreading; import io.netty.buffer.ByteBuf; -import net.minecraft.tileentity.TileEntity; public interface IBufPacketReceiver { public void serialize(ByteBuf buf); public void deserialize(ByteBuf buf); - + public default void sendStandard(int range) { - TileEntity te = (TileEntity) this; - PacketDispatcher.wrapper.sendToAllAround(new BufPacket(te.xCoord, te.yCoord, te.zCoord, this), new TargetPoint(te.getWorldObj().provider.dimensionId, te.xCoord, te.yCoord, te.zCoord, range)); + BufPacketThreading.createBufPacket(this, range); } } diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 24231d3ef..82eb25fa1 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -3,6 +3,7 @@ package com.hbm.tileentity; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxGaugePacket; import com.hbm.packet.toclient.BufPacket; +import com.hbm.handler.threading.BufPacketThreading; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -179,7 +180,7 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme } this.lastPackedBuf = buf; - PacketDispatcher.wrapper.sendToAllAround(packet, new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + BufPacketThreading.createBufPacket(packet, new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } @Override public void serialize(ByteBuf buf) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index a25703556..40efccc6b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -1,77 +1,118 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.config.GeneralConfig; +import com.hbm.main.MainRegistry; import com.hbm.util.GameRuleHelper; -import net.minecraft.util.MathHelper; +import com.hbm.util.Tuple; import net.minecraft.world.GameRules; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + public class RBMKDials { - public static final String KEY_SAVE_DIALS = "dialSaveDials"; + public enum RBMKKeys { + KEY_SAVE_DIALS("dialSaveDials", true), + KEY_PASSIVE_COOLING("dialPassiveCooling", 1.0), + KEY_COLUMN_HEAT_FLOW("dialColumnHeatFlow", 0.2), + KEY_FUEL_DIFFUSION_MOD("dialDiffusionMod", 1.0), + KEY_HEAT_PROVISION("dialHeatProvision", 0.2), + KEY_COLUMN_HEIGHT("dialColumnHeight", 4), + KEY_PERMANENT_SCRAP("dialEnablePermaScrap", true), + KEY_BOILER_HEAT_CONSUMPTION("dialBoilerHeatConsumption", 0.1), + KEY_CONTROL_SPEED_MOD("dialControlSpeed", 1.0), + KEY_REACTIVITY_MOD("dialReactivityMod", 1.0), + KEY_OUTGASSER_MOD("dialOutgasserSpeedMod", 1.0), + KEY_SURGE_MOD("dialControlSurgeMod", 1.0), + KEY_FLUX_RANGE("dialFluxRange", 5), + KEY_REASIM_RANGE("dialReasimRange", 10), + KEY_REASIM_COUNT("dialReasimCount", 6), + KEY_REASIM_MOD("dialReasimOutputMod", 1.0), + KEY_REASIM_BOILERS("dialReasimBoilers", false), + KEY_REASIM_BOILER_SPEED("dialReasimBoilerSpeed", 0.05), + KEY_DISABLE_MELTDOWNS("dialDisableMeltdowns", false), + KEY_ENABLE_MELTDOWN_OVERPRESSURE("dialEnableMeltdownOverpressure", false), + KEY_MODERATOR_EFFICIENCY("dialModeratorEfficiency", 1.0), + KEY_ABSORBER_EFFICIENCY("dialAbsorberEfficiency", 1.0), + KEY_REFLECTOR_EFFICIENCY("dialReflectorEfficiency", 1.0); - public static final String KEY_PASSIVE_COOLING = "dialPassiveCooling"; - public static final String KEY_COLUMN_HEAT_FLOW = "dialColumnHeatFlow"; - public static final String KEY_FUEL_DIFFUSION_MOD = "dialDiffusionMod"; - public static final String KEY_HEAT_PROVISION = "dialHeatProvision"; - public static final String KEY_COLUMN_HEIGHT = "dialColumnHeight"; - public static final String KEY_PERMANENT_SCRAP = "dialEnablePermaScrap"; - public static final String KEY_BOILER_HEAT_CONSUMPTION = "dialBoilerHeatConsumption"; - public static final String KEY_CONTROL_SPEED_MOD = "dialControlSpeed"; - public static final String KEY_REACTIVITY_MOD = "dialReactivityMod"; - public static final String KEY_OUTGASSER_MOD = "dialOutgasserSpeedMod"; - public static final String KEY_SURGE_MOD = "dialControlSurgeMod"; - public static final String KEY_FLUX_RANGE = "dialFluxRange"; - public static final String KEY_REASIM_RANGE = "dialReasimRange"; - public static final String KEY_REASIM_COUNT = "dialReasimCount"; - public static final String KEY_REASIM_MOD = "dialReasimOutputMod"; - public static final String KEY_REASIM_BOILERS = "dialReasimBoilers"; - public static final String KEY_REASIM_BOILER_SPEED = "dialReasimBoilerSpeed"; - public static final String KEY_DISABLE_MELTDOWNS = "dialDisableMeltdowns"; - public static final String KEY_ENABLE_MELTDOWN_OVERPRESSURE = "dialEnableMeltdownOverpressure"; + public final String keyString; + public final Object defValue; - public static final String KEY_MODERATOR_EFFICIENCY = "dialModeratorEfficiency"; - public static final String KEY_ABSORBER_EFFICIENCY = "dialAbsorberEfficiency"; - public static final String KEY_REFLECTOR_EFFICIENCY = "dialReflectorEfficiency"; + RBMKKeys(String key, Object def) { + keyString = key; + defValue = def; + } + } + + public static HashMap>> gameRules = new HashMap<>(); public static void createDials(World world) { GameRules rules = world.getGameRules(); - if(!rules.getGameRuleBooleanValue(KEY_SAVE_DIALS)) { - rules.setOrCreateGameRule(KEY_PASSIVE_COOLING, "1.0"); - rules.setOrCreateGameRule(KEY_COLUMN_HEAT_FLOW, "0.2"); - rules.setOrCreateGameRule(KEY_FUEL_DIFFUSION_MOD, "1.0"); - rules.setOrCreateGameRule(KEY_HEAT_PROVISION, "0.2"); - rules.setOrCreateGameRule(KEY_COLUMN_HEIGHT, "4"); - rules.setOrCreateGameRule(KEY_PERMANENT_SCRAP, "true"); - rules.setOrCreateGameRule(KEY_BOILER_HEAT_CONSUMPTION, "0.1"); - rules.setOrCreateGameRule(KEY_CONTROL_SPEED_MOD, "1.0"); - rules.setOrCreateGameRule(KEY_REACTIVITY_MOD, "1.0"); - rules.setOrCreateGameRule(KEY_SAVE_DIALS, "true"); - rules.setOrCreateGameRule(KEY_OUTGASSER_MOD, "1.0"); - rules.setOrCreateGameRule(KEY_SURGE_MOD, "1.0"); - rules.setOrCreateGameRule(KEY_FLUX_RANGE, "5"); - rules.setOrCreateGameRule(KEY_REASIM_RANGE, "10"); - rules.setOrCreateGameRule(KEY_REASIM_COUNT, "6"); - rules.setOrCreateGameRule(KEY_REASIM_MOD, "1.0"); - rules.setOrCreateGameRule(KEY_REASIM_BOILERS, "false"); - rules.setOrCreateGameRule(KEY_REASIM_BOILER_SPEED, "0.05"); - rules.setOrCreateGameRule(KEY_DISABLE_MELTDOWNS, "false"); - rules.setOrCreateGameRule(KEY_ENABLE_MELTDOWN_OVERPRESSURE, "false"); - rules.setOrCreateGameRule(KEY_MODERATOR_EFFICIENCY, "1.0"); - rules.setOrCreateGameRule(KEY_ABSORBER_EFFICIENCY, "1.0"); - rules.setOrCreateGameRule(KEY_REFLECTOR_EFFICIENCY, "1.0"); + for(RBMKKeys key : RBMKKeys.values()) + gameRules.put(key, new ArrayList<>()); + refresh(world); + + if(!rules.getGameRuleBooleanValue(RBMKKeys.KEY_SAVE_DIALS.keyString)) { + for(RBMKKeys key : RBMKKeys.values()) + rules.setOrCreateGameRule(key.keyString, String.valueOf(key.defValue)); } } + // Refresh all gamerules. + public static void refresh(World world) { + for(List> values : gameRules.values()) { + values.removeAll(values.stream().filter(a -> a.key == world).collect(Collectors.toList())); + } + + gameRules.get(RBMKKeys.KEY_PASSIVE_COOLING).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_PASSIVE_COOLING, 0.0D))); + gameRules.get(RBMKKeys.KEY_COLUMN_HEAT_FLOW).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_COLUMN_HEAT_FLOW, 0.0D, 1.0D))); + gameRules.get(RBMKKeys.KEY_FUEL_DIFFUSION_MOD).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_FUEL_DIFFUSION_MOD, 0.0D))); + gameRules.get(RBMKKeys.KEY_HEAT_PROVISION).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_HEAT_PROVISION, 0.0D, 1.0D))); + gameRules.get(RBMKKeys.KEY_COLUMN_HEIGHT).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedInt(world, RBMKKeys.KEY_COLUMN_HEIGHT, 2, 16) - 1)); + gameRules.get(RBMKKeys.KEY_PERMANENT_SCRAP).add(new Tuple.Pair<>(world, world.getGameRules().getGameRuleBooleanValue(RBMKKeys.KEY_PERMANENT_SCRAP.keyString))); + gameRules.get(RBMKKeys.KEY_BOILER_HEAT_CONSUMPTION).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_BOILER_HEAT_CONSUMPTION, 0D))); + gameRules.get(RBMKKeys.KEY_CONTROL_SPEED_MOD).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_CONTROL_SPEED_MOD, 0.0D))); + gameRules.get(RBMKKeys.KEY_REACTIVITY_MOD).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_REACTIVITY_MOD, 0.0D))); + gameRules.get(RBMKKeys.KEY_OUTGASSER_MOD).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_OUTGASSER_MOD, 0.0D))); + gameRules.get(RBMKKeys.KEY_SURGE_MOD).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_SURGE_MOD, 0.0D))); + gameRules.get(RBMKKeys.KEY_FLUX_RANGE).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedInt(world, RBMKKeys.KEY_FLUX_RANGE, 1, 100))); + gameRules.get(RBMKKeys.KEY_REASIM_RANGE).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedInt(world, RBMKKeys.KEY_REASIM_RANGE, 1, 100))); + gameRules.get(RBMKKeys.KEY_REASIM_COUNT).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedInt(world, RBMKKeys.KEY_REASIM_COUNT, 1, 24))); + gameRules.get(RBMKKeys.KEY_REASIM_MOD).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_REASIM_MOD, 0.0D))); + gameRules.get(RBMKKeys.KEY_REASIM_BOILERS).add(new Tuple.Pair<>(world, world.getGameRules().getGameRuleBooleanValue(RBMKKeys.KEY_REASIM_BOILERS.keyString) || (GeneralConfig.enable528 && GeneralConfig.enable528ReasimBoilers))); + gameRules.get(RBMKKeys.KEY_REASIM_BOILER_SPEED).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_REASIM_BOILER_SPEED, 0.0D, 1.0D))); + gameRules.get(RBMKKeys.KEY_DISABLE_MELTDOWNS).add(new Tuple.Pair<>(world, world.getGameRules().getGameRuleBooleanValue(RBMKKeys.KEY_DISABLE_MELTDOWNS.keyString))); + gameRules.get(RBMKKeys.KEY_ENABLE_MELTDOWN_OVERPRESSURE).add(new Tuple.Pair<>(world, world.getGameRules().getGameRuleBooleanValue(RBMKKeys.KEY_ENABLE_MELTDOWN_OVERPRESSURE.keyString))); + gameRules.get(RBMKKeys.KEY_MODERATOR_EFFICIENCY).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_MODERATOR_EFFICIENCY, 0.0D, 1.0D))); + gameRules.get(RBMKKeys.KEY_ABSORBER_EFFICIENCY).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_ABSORBER_EFFICIENCY, 0.0D, 1.0D))); + gameRules.get(RBMKKeys.KEY_REFLECTOR_EFFICIENCY).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_REFLECTOR_EFFICIENCY, 0.0D, 1.0D))); + } + + public static Object getGameRule(World world, RBMKKeys rule) { + List> rulesList = gameRules.get(rule).stream().filter(a -> a.key == world).collect(Collectors.toList()); + + if(rulesList.isEmpty()) + throw new NullPointerException("No gamerule found for " + rule.keyString); + else if(rulesList.size() > 1) + // what??? why??? + MainRegistry.logger.warn("Duplicate values for gamerules detected! Found {} rules for gamerule {}", rulesList.size(), rule.keyString); + + return rulesList.get(0).value; // realistically there should only be one of this gamerule that satisfies the filter sooooo... + } + /** * Returns the amount of heat per tick removed from components passively * @param world * @return >0 */ public static double getPassiveCooling(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_PASSIVE_COOLING), 1.0D), 0.0D); + return (double) getGameRule(world, RBMKKeys.KEY_PASSIVE_COOLING); } /** @@ -80,7 +121,7 @@ public class RBMKDials { * @return [0;1] */ public static double getColumnHeatFlow(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEAT_FLOW), 0.2D), 0.0D, 1.0D); + return (double) getGameRule(world, RBMKKeys.KEY_COLUMN_HEAT_FLOW); } /** @@ -89,7 +130,7 @@ public class RBMKDials { * @return >0 */ public static double getFuelDiffusionMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_FUEL_DIFFUSION_MOD), 1.0D), 0.0D); + return (double) getGameRule(world, RBMKKeys.KEY_FUEL_DIFFUSION_MOD); } /** @@ -98,7 +139,7 @@ public class RBMKDials { * @return [0;1] */ public static double getFuelHeatProvision(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_HEAT_PROVISION), 0.2D), 0.0D, 1.0D); + return (double) getGameRule(world, RBMKKeys.KEY_HEAT_PROVISION); } /** @@ -107,7 +148,7 @@ public class RBMKDials { * @return [0;15] */ public static int getColumnHeight(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEIGHT), 4), 2, 16) - 1; + return (int) getGameRule(world, RBMKKeys.KEY_COLUMN_HEIGHT); } /** @@ -116,7 +157,7 @@ public class RBMKDials { * @return */ public static boolean getPermaScrap(World world) { - return world.getGameRules().getGameRuleBooleanValue(KEY_PERMANENT_SCRAP); + return (boolean) getGameRule(world, RBMKKeys.KEY_PERMANENT_SCRAP); } /** @@ -125,7 +166,7 @@ public class RBMKDials { * @return >0 */ public static double getBoilerHeatConsumption(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_BOILER_HEAT_CONSUMPTION), 0.1D), 0D); + return (double) getGameRule(world, RBMKKeys.KEY_BOILER_HEAT_CONSUMPTION); } /** @@ -134,7 +175,7 @@ public class RBMKDials { * @return >0 */ public static double getControlSpeed(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_CONTROL_SPEED_MOD), 1.0D), 0.0D); + return (double) getGameRule(world, RBMKKeys.KEY_CONTROL_SPEED_MOD); } /** @@ -143,7 +184,7 @@ public class RBMKDials { * @return >0 */ public static double getReactivityMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REACTIVITY_MOD), 1.0D), 0.0D); + return (double) getGameRule(world, RBMKKeys.KEY_REACTIVITY_MOD); } /** @@ -152,7 +193,7 @@ public class RBMKDials { * @return >0 */ public static double getOutgasserMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_OUTGASSER_MOD), 1.0D), 0.0D); + return (double) getGameRule(world, RBMKKeys.KEY_OUTGASSER_MOD); } /** @@ -161,7 +202,7 @@ public class RBMKDials { * @return >0 */ public static double getSurgeMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_SURGE_MOD), 1.0D), 0.0D); + return (double) getGameRule(world, RBMKKeys.KEY_SURGE_MOD); } /** @@ -170,7 +211,7 @@ public class RBMKDials { * @return [1;100] */ public static int getFluxRange(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_FLUX_RANGE), 5), 1, 100); + return (int) getGameRule(world, RBMKKeys.KEY_FLUX_RANGE); } /** @@ -179,7 +220,7 @@ public class RBMKDials { * @return [1;100] */ public static int getReaSimRange(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_RANGE), 10), 1, 100); + return (int) getGameRule(world, RBMKKeys.KEY_REASIM_RANGE); } /** @@ -188,7 +229,7 @@ public class RBMKDials { * @return [1;24] */ public static int getReaSimCount(World world) { - return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_COUNT), 6), 1, 24); + return (int) getGameRule(world, RBMKKeys.KEY_REASIM_COUNT); } /** @@ -197,7 +238,7 @@ public class RBMKDials { * @return >0 */ public static double getReaSimOutputMod(World world) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_MOD), 1.0D), 0.0D); + return (double) getGameRule(world, RBMKKeys.KEY_REASIM_MOD); } /** @@ -206,7 +247,7 @@ public class RBMKDials { * @return */ public static boolean getReasimBoilers(World world) { - return world.getGameRules().getGameRuleBooleanValue(KEY_REASIM_BOILERS) || (GeneralConfig.enable528 && GeneralConfig.enable528ReasimBoilers); + return (boolean) getGameRule(world, RBMKKeys.KEY_REASIM_BOILERS); } /** @@ -215,7 +256,7 @@ public class RBMKDials { * @return [0;1] */ public static double getReaSimBoilerSpeed(World world) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REASIM_BOILER_SPEED), 0.05D), 0.0D, 1.0D); + return (double) getGameRule(world, RBMKKeys.KEY_REASIM_BOILER_SPEED); } /** @@ -225,7 +266,7 @@ public class RBMKDials { * @return */ public static boolean getMeltdownsDisabled(World world) { - return world.getGameRules().getGameRuleBooleanValue(KEY_DISABLE_MELTDOWNS); + return (boolean) getGameRule(world, RBMKKeys.KEY_DISABLE_MELTDOWNS); } /** @@ -234,7 +275,7 @@ public class RBMKDials { * @return */ public static boolean getOverpressure(World world) { - return world.getGameRules().getGameRuleBooleanValue(KEY_ENABLE_MELTDOWN_OVERPRESSURE); + return (boolean) getGameRule(world, RBMKKeys.KEY_ENABLE_MELTDOWN_OVERPRESSURE); } /** @@ -243,7 +284,7 @@ public class RBMKDials { * @return */ public static double getModeratorEfficiency(World world) { - return GameRuleHelper.getClampedDouble(world, world.getGameRules().getGameRuleStringValue(KEY_MODERATOR_EFFICIENCY), 1D, 0.0D, 1.0D); + return (double) getGameRule(world, RBMKKeys.KEY_MODERATOR_EFFICIENCY); } /** @@ -252,7 +293,7 @@ public class RBMKDials { * @return */ public static double getAbsorberEfficiency(World world) { - return GameRuleHelper.getClampedDouble(world, world.getGameRules().getGameRuleStringValue(KEY_ABSORBER_EFFICIENCY), 1D, 0.0D, 1.0D); + return (double) getGameRule(world, RBMKKeys.KEY_ABSORBER_EFFICIENCY); } /** @@ -261,6 +302,6 @@ public class RBMKDials { * @return */ public static double getReflectorEfficiency(World world) { - return GameRuleHelper.getClampedDouble(world, world.getGameRules().getGameRuleStringValue(KEY_REFLECTOR_EFFICIENCY), 1D, 0.0D, 1.0D); + return (double) getGameRule(world, RBMKKeys.KEY_REFLECTOR_EFFICIENCY); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 6fb3d9ee7..6a7acf1bf 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -48,6 +48,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public double fluxRatio; public double fluxQuantity; public double lastFluxQuantity; + public double lastFluxRatio; public boolean hasRod; @@ -129,6 +130,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } else { this.meltdown(); } + this.lastFluxRatio = 0; this.lastFluxQuantity = 0; this.fluxQuantity = 0; return; @@ -136,11 +138,13 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM if(this.heat > 10_000) this.heat = 10_000; - this.lastFluxQuantity = this.fluxQuantity; - //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back + this.lastFluxQuantity = this.fluxQuantity; + this.lastFluxRatio = this.fluxRatio; + this.fluxQuantity = 0; + this.fluxRatio = 0; spreadFlux(fluxQuantityOut, fluxRatioOut); @@ -148,6 +152,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } else { + this.lastFluxRatio = 0; this.lastFluxQuantity = 0; this.fluxQuantity = 0; this.fluxRatio = 0; @@ -177,9 +182,12 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM ForgeDirection.WEST }; + private BlockPos pos; + public void spreadFlux(double flux, double ratio) { - BlockPos pos = new BlockPos(this); + if(pos == null) + pos = new BlockPos(this); if (flux == 0) { // simple way to remove the node from the cache when no flux is going into it! @@ -202,7 +210,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM new RBMKNeutronHandler.RBMKNeutronStream(node, neutronVector, flux, ratio); } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -221,28 +229,25 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM this.hasRod = nbt.getBoolean("hasRod"); } + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setDouble("fluxQuantity", this.fluxQuantity); - nbt.setDouble("fluxMod", this.fluxRatio); - nbt.setBoolean("hasRod", this.hasRod); - } - - // aaaaaaaa - public void writeToNBTDiag(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setDouble("fluxSlow", this.lastFluxQuantity * (1 - fluxRatio)); - nbt.setDouble("fluxFast", this.lastFluxQuantity * fluxRatio); + if (!diag) { + nbt.setDouble("fluxQuantity", this.lastFluxQuantity); + nbt.setDouble("fluxMod", this.lastFluxRatio); + } else { + nbt.setDouble("fluxSlow", this.fluxQuantity * (1 - fluxRatio)); + nbt.setDouble("fluxFast", this.fluxQuantity * fluxRatio); + } nbt.setBoolean("hasRod", this.hasRod); } @Override public void serialize(ByteBuf buf) { super.serialize(buf); - buf.writeDouble(this.fluxQuantity); - buf.writeDouble(this.fluxRatio); + buf.writeDouble(this.lastFluxQuantity); + buf.writeDouble(this.lastFluxRatio); buf.writeBoolean(this.hasRod); } @@ -256,7 +261,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM public void getDiagData(NBTTagCompound nbt) { diag = true; - this.writeToNBTDiag(nbt); + this.writeToNBT(nbt); diag = false; if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index d638e4795..a23c5f2e3 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -10,7 +10,7 @@ import net.minecraft.util.Vec3; import static com.hbm.handler.neutron.RBMKNeutronHandler.*; public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { - + public TileEntityRBMKRodReaSim() { super(); } @@ -19,11 +19,14 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { public String getName() { return "container.rbmkReaSim"; } - + + private BlockPos pos; + @Override public void spreadFlux(double flux, double ratio) { - BlockPos pos = new BlockPos(this); + if(pos == null) + pos = new BlockPos(this); if (flux == 0) { // simple way to remove the node from the cache when no flux is going into it! diff --git a/src/main/java/com/hbm/util/GameRuleHelper.java b/src/main/java/com/hbm/util/GameRuleHelper.java index 45f19ed9b..1551d02d1 100644 --- a/src/main/java/com/hbm/util/GameRuleHelper.java +++ b/src/main/java/com/hbm/util/GameRuleHelper.java @@ -1,21 +1,26 @@ package com.hbm.util; +import com.hbm.tileentity.machine.rbmk.RBMKDials; import net.minecraft.util.MathHelper; import net.minecraft.world.GameRules; import net.minecraft.world.World; public class GameRuleHelper { - public static double getClampedDouble(World world, String rule, double def, double min, double max) { - return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(rule), def), min, max); + public static double getClampedDouble(World world, RBMKDials.RBMKKeys rule, double min, double max) { + return MathHelper.clamp_double(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(rule.keyString), (double) rule.defValue), min, max); } - public static double getDoubleMinimum(World world, String rule, double def, double min) { - return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(rule), def), min); + public static int getClampedInt(World world, RBMKDials.RBMKKeys rule, int min, int max) { + return MathHelper.clamp_int(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(rule.keyString), (int) rule.defValue), min, max); } - public static int getIntegerMinimum(World world, String rule, int def, int min) { - return Math.max(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(rule), def), min); + public static double getDoubleMinimum(World world, RBMKDials.RBMKKeys rule, double min) { + return Math.max(GameRuleHelper.parseDouble(world, world.getGameRules().getGameRuleStringValue(rule.keyString), (double) rule.defValue), min); + } + + public static int getIntegerMinimum(World world, RBMKDials.RBMKKeys rule, int min) { + return Math.max(GameRuleHelper.parseInt(world, world.getGameRules().getGameRuleStringValue(rule.keyString), (int) rule.defValue), min); } public static double parseDouble(World world, String s, double def) { From 4bd6f0df53c40bbc65273a0ecce0f2440f515c81 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 9 Nov 2024 17:04:19 -0600 Subject: [PATCH 48/70] More shit, also precompiled packets. also holy shit the whitespace changes, intelliJ wanted to optimize the imports and refactored a ton of whitespace in the process. --- src/main/java/com/hbm/blocks/BlockBase.java | 13 +- .../java/com/hbm/blocks/BlockDummyable.java | 67 +- .../java/com/hbm/blocks/BlockEnumMulti.java | 23 +- .../java/com/hbm/blocks/BlockFallingNT.java | 7 +- src/main/java/com/hbm/blocks/BlockMulti.java | 4 +- src/main/java/com/hbm/blocks/BlockRemap.java | 10 +- src/main/java/com/hbm/blocks/IAnalyzable.java | 4 +- .../com/hbm/blocks/ICustomBlockHighlight.java | 7 +- .../java/com/hbm/blocks/ILookOverlay.java | 11 +- .../hbm/blocks/IPersistentInfoProvider.java | 4 +- .../java/com/hbm/blocks/ITooltipProvider.java | 12 +- src/main/java/com/hbm/blocks/ModBlocks.java | 451 +++++----- .../com/hbm/blocks/generic/BlockEmitter.java | 5 +- .../machine/BlockICFLaserComponent.java | 9 +- .../blocks/machine/DummyBlockAssembler.java | 5 +- .../blocks/machine/DummyBlockRefinery.java | 5 +- .../blocks/machine/DummyBlockTurbofan.java | 5 +- .../blocks/machine/FoundryCastingBase.java | 63 +- .../blocks/machine/FurnaceCombination.java | 7 +- .../machine/MachineArcFurnaceLarge.java | 15 +- .../blocks/machine/MachineAutocrafter.java | 7 +- .../blocks/machine/MachineBigAssTank9000.java | 35 +- .../blocks/machine/MachineBrickFurnace.java | 33 +- .../hbm/blocks/machine/MachineCapacitor.java | 65 +- .../blocks/machine/MachineCapacitorBus.java | 11 +- .../machine/MachineCatalyticCracker.java | 43 +- .../machine/MachineCatalyticReformer.java | 11 +- .../blocks/machine/MachineChimneyBrick.java | 7 +- .../machine/MachineChimneyIndustrial.java | 7 +- .../machine/MachineCombustionEngine.java | 7 +- .../machine/MachineCondenserPowered.java | 11 +- .../blocks/machine/MachineConveyorPress.java | 59 +- .../blocks/machine/MachineCrystallizer.java | 7 +- .../machine/MachineDeuteriumExtractor.java | 19 +- .../machine/MachineDiFurnaceExtension.java | 9 +- .../blocks/machine/MachineDiFurnaceRTG.java | 11 +- .../machine/MachineElectricFurnace.java | 43 +- .../blocks/machine/MachineElectrolyser.java | 13 +- .../machine/MachineExposureChamber.java | 13 +- .../blocks/machine/MachineFieldDisturber.java | 7 +- .../blocks/machine/MachineFrackingTower.java | 29 +- .../blocks/machine/MachineFractionTower.java | 45 +- .../machine/MachineHeatBoilerIndustrial.java | 45 +- .../blocks/machine/MachineHydrotreater.java | 9 +- .../blocks/machine/MachineICFController.java | 69 +- .../blocks/machine/MachineLargeTurbine.java | 29 +- .../blocks/machine/MachineLiquefactor.java | 17 +- .../blocks/machine/MachineMiningLaser.java | 21 +- .../machine/MachineMissileAssembly.java | 15 +- .../blocks/machine/MachineNukeFurnace.java | 41 +- .../blocks/machine/MachinePWRController.java | 71 +- .../blocks/machine/MachinePlasmaHeater.java | 43 +- .../blocks/machine/MachineRadarScreen.java | 7 +- .../machine/MachineReactorBreeding.java | 13 +- .../blocks/machine/MachineReactorControl.java | 37 +- .../blocks/machine/MachineRotaryFurnace.java | 5 +- .../MachineSchrabidiumTransmutator.java | 17 +- .../blocks/machine/MachineSolarBoiler.java | 23 +- .../machine/MachineSolderingStation.java | 3 +- .../blocks/machine/MachineSteamEngine.java | 25 +- .../blocks/machine/MachineTransformer.java | 7 +- .../blocks/machine/MachineVacuumDistill.java | 3 +- .../blocks/machine/PinkCloudBroadcaster.java | 21 +- .../hbm/blocks/machine/PistonInserter.java | 149 ++-- .../com/hbm/blocks/network/BlockCable.java | 27 +- .../hbm/blocks/network/BlockCableGauge.java | 40 +- .../blocks/network/BlockCablePaintable.java | 39 +- .../hbm/blocks/network/BlockConveyorBase.java | 23 +- .../blocks/network/BlockConveyorClassic.java | 19 +- .../com/hbm/blocks/network/CableDetector.java | 13 +- .../com/hbm/blocks/network/CableDiode.java | 87 +- .../com/hbm/blocks/network/CableSwitch.java | 11 +- .../hbm/blocks/network/ConnectorRedWire.java | 17 +- .../com/hbm/blocks/network/CraneInserter.java | 49 +- .../hbm/blocks/network/CranePartitioner.java | 37 +- .../com/hbm/blocks/network/CraneRouter.java | 61 +- .../com/hbm/blocks/network/CraneSplitter.java | 25 +- .../com/hbm/blocks/network/DroneCrate.java | 19 +- .../com/hbm/blocks/network/DroneDock.java | 9 +- .../com/hbm/blocks/network/DroneWaypoint.java | 45 +- .../blocks/network/DroneWaypointRequest.java | 25 +- .../com/hbm/blocks/network/FluidDuctBase.java | 47 +- .../com/hbm/blocks/network/FluidDuctBox.java | 73 +- .../blocks/network/FluidDuctBoxExhaust.java | 13 +- .../hbm/blocks/network/FluidDuctGauge.java | 42 +- .../blocks/network/FluidDuctPaintable.java | 63 +- .../hbm/blocks/network/FluidDuctStandard.java | 49 +- .../com/hbm/blocks/network/FluidSwitch.java | 27 +- .../com/hbm/blocks/network/FluidValve.java | 31 +- .../hbm/blocks/network/IBlockFluidDuct.java | 1 - .../com/hbm/blocks/network/PylonBase.java | 15 +- .../com/hbm/blocks/network/PylonLarge.java | 19 +- .../com/hbm/blocks/network/PylonMedium.java | 9 +- .../com/hbm/blocks/network/PylonRedWire.java | 5 +- .../com/hbm/blocks/network/RadioTelex.java | 3 +- .../hbm/blocks/network/RadioTorchBase.java | 33 +- .../hbm/blocks/network/RadioTorchCounter.java | 15 +- .../hbm/blocks/network/RadioTorchLogic.java | 31 +- .../hbm/blocks/network/RadioTorchRWBase.java | 15 +- .../blocks/network/RadioTorchReceiver.java | 13 +- .../hbm/blocks/network/RadioTorchSender.java | 3 +- .../com/hbm/blocks/network/Substation.java | 19 +- .../com/hbm/blocks/network/WireCoated.java | 1 - .../java/com/hbm/config/ClientConfig.java | 58 +- .../handler/neutron/RBMKNeutronHandler.java | 3 - .../handler/threading/BufPacketThreading.java | 57 -- .../handler/threading/PacketThreading.java | 67 ++ .../java/com/hbm/lib/HbmChestContents.java | 15 +- src/main/java/com/hbm/lib/HbmCollection.java | 16 +- src/main/java/com/hbm/lib/HbmWorld.java | 21 +- src/main/java/com/hbm/lib/HbmWorldGen.java | 139 ++-- src/main/java/com/hbm/lib/Library.java | 93 ++- .../java/com/hbm/lib/ModDamageSource.java | 8 +- src/main/java/com/hbm/main/ClientProxy.java | 769 +++++++++--------- .../java/com/hbm/main/CraftingManager.java | 186 +++-- src/main/java/com/hbm/main/MainRegistry.java | 93 ++- .../java/com/hbm/main/ModEventHandler.java | 105 +-- .../com/hbm/main/ModEventHandlerClient.java | 536 ++++++------ .../com/hbm/main/ModEventHandlerImpact.java | 94 +-- .../com/hbm/main/ModEventHandlerRenderer.java | 84 +- src/main/java/com/hbm/main/NEIConfig.java | 23 +- src/main/java/com/hbm/main/NEIRegistry.java | 15 +- .../java/com/hbm/main/NetworkHandler.java | 103 ++- .../java/com/hbm/main/ResourceManager.java | 341 ++++---- src/main/java/com/hbm/main/ServerProxy.java | 33 +- .../com/hbm/packet/PrecompiledPacket.java | 31 + .../packet/toclient/AuxParticlePacketNT.java | 24 +- .../com/hbm/packet/toclient/BufPacket.java | 3 +- .../hbm/packet/toclient/ExtPropPacket.java | 5 - .../java/com/hbm/test/ExplosionTests.java | 23 +- src/main/java/com/hbm/test/MK5Frame.java | 69 +- .../hbm/tileentity/IBufPacketReceiver.java | 5 - .../hbm/tileentity/TileEntityLoadedBase.java | 59 +- .../hbm/tileentity/TileEntityMachineBase.java | 41 +- .../hbm/tileentity/TileEntityTickingBase.java | 20 +- .../hbm/tileentity/bomb/TileEntityCharge.java | 33 +- .../bomb/TileEntityCompactLauncher.java | 170 ++-- .../bomb/TileEntityLaunchTable.java | 166 ++-- .../deco/TileEntityLanternBehemoth.java | 37 +- .../tileentity/machine/TileEntityCharger.java | 58 +- .../machine/TileEntityChimneyBase.java | 36 +- .../tileentity/machine/TileEntityChungus.java | 58 +- .../machine/TileEntityCondenser.java | 2 +- .../machine/TileEntityFoundryBase.java | 38 +- .../machine/TileEntityHadronPower.java | 12 +- .../machine/TileEntityHeatBoiler.java | 11 +- .../TileEntityHeatBoilerIndustrial.java | 83 +- .../machine/TileEntityHeaterElectric.java | 2 +- .../machine/TileEntityLockableBase.java | 4 +- .../machine/TileEntityMachineAutosaw.java | 2 +- .../machine/TileEntityMachineDrain.java | 44 +- .../machine/TileEntityMachineHephaestus.java | 101 +-- .../machine/TileEntityMachinePumpBase.java | 52 +- .../machine/TileEntityMachineRadarNT.java | 118 +-- .../machine/TileEntityMachineRadarScreen.java | 18 +- .../TileEntityMachineStrandCaster.java | 5 +- .../machine/TileEntityMachineTeleporter.java | 54 +- .../machine/TileEntityMachineTurbine.java | 58 +- .../machine/TileEntityRadioRec.java | 31 +- .../tileentity/machine/TileEntitySawmill.java | 104 ++- .../machine/TileEntitySolarBoiler.java | 24 +- .../machine/TileEntitySteamEngine.java | 11 +- .../machine/TileEntityStirling.java | 78 +- .../machine/TileEntityStorageDrum.java | 102 +-- .../TileEntityMachineCatalyticCracker.java | 2 +- .../oil/TileEntityMachineFractionTower.java | 66 +- .../tileentity/machine/rbmk/RBMKDials.java | 32 +- .../machine/rbmk/TileEntityCraneConsole.java | 7 +- .../machine/rbmk/TileEntityRBMKBase.java | 197 ++--- .../machine/storage/TileEntityBarrel.java | 74 +- .../storage/TileEntityFileCabinet.java | 52 +- .../storage/TileEntityMassStorage.java | 2 +- .../network/TileEntityCableBaseNT.java | 20 +- .../network/TileEntityDroneRequester.java | 21 +- .../network/TileEntityDroneWaypoint.java | 21 +- .../network/TileEntityPipeBaseNT.java | 49 +- .../network/TileEntityRadioTelex.java | 61 +- .../network/TileEntityRadioTorchBase.java | 13 +- .../network/TileEntityRadioTorchLogic.java | 39 +- .../network/TileEntityRequestNetwork.java | 63 +- .../java/com/hbm/util/AchievementHandler.java | 9 +- src/main/java/com/hbm/util/ArmorRegistry.java | 71 +- src/main/java/com/hbm/util/ArmorUtil.java | 257 +++--- src/main/java/com/hbm/util/BobMathUtil.java | 79 +- src/main/java/com/hbm/util/BufferUtil.java | 8 +- src/main/java/com/hbm/util/ChatBuilder.java | 33 +- src/main/java/com/hbm/util/ColorUtil.java | 68 +- src/main/java/com/hbm/util/Compat.java | 79 +- .../com/hbm/util/CompatEnergyControl.java | 63 +- .../java/com/hbm/util/CompatExternal.java | 73 +- src/main/java/com/hbm/util/CompatNER.java | 39 +- .../java/com/hbm/util/ContaminationUtil.java | 121 ++- src/main/java/com/hbm/util/CrashHelper.java | 9 +- src/main/java/com/hbm/util/CrucibleUtil.java | 77 +- .../java/com/hbm/util/EntityDamageUtil.java | 42 +- src/main/java/com/hbm/util/HashedSet.java | 26 +- src/main/java/com/hbm/util/I18nUtil.java | 24 +- src/main/java/com/hbm/util/InventoryUtil.java | 237 +++--- src/main/java/com/hbm/util/ItemStackUtil.java | 64 +- src/main/java/com/hbm/util/LootGenerator.java | 89 +- src/main/java/com/hbm/util/ParticleUtil.java | 5 +- src/main/java/com/hbm/util/RTGUtil.java | 25 +- src/main/java/com/hbm/util/ShadyUtil.java | 33 +- src/main/java/com/hbm/util/StatHelper.java | 25 +- src/main/java/com/hbm/util/TimeAnalyzer.java | 20 +- src/main/java/com/hbm/util/TrackerUtil.java | 11 +- .../hbm/util/fauxpointtwelve/Rotation.java | 3 +- .../java/com/hbm/util/function/Function.java | 29 +- .../com/hbm/wiaj/actors/ActorVillager.java | 14 +- 209 files changed, 4926 insertions(+), 5039 deletions(-) delete mode 100644 src/main/java/com/hbm/handler/threading/BufPacketThreading.java create mode 100644 src/main/java/com/hbm/handler/threading/PacketThreading.java create mode 100644 src/main/java/com/hbm/packet/PrecompiledPacket.java diff --git a/src/main/java/com/hbm/blocks/BlockBase.java b/src/main/java/com/hbm/blocks/BlockBase.java index d2e1b01ed..9fc497d64 100644 --- a/src/main/java/com/hbm/blocks/BlockBase.java +++ b/src/main/java/com/hbm/blocks/BlockBase.java @@ -1,7 +1,6 @@ package com.hbm.blocks; import com.hbm.lib.RefStrings; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.EnumCreatureType; @@ -11,7 +10,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockBase extends Block { - + private boolean beaconable = false; private boolean canSpawn = true; @@ -22,14 +21,14 @@ public class BlockBase extends Block { public BlockBase(Material material) { super(material); } - + @Override public Block setBlockName(String name) { super.setBlockName(name); this.setBlockTextureName(RefStrings.MODID + ":" + name); return this; } - + /** * Daisychainable setter for making the block a beacon base block * @return @@ -38,7 +37,7 @@ public class BlockBase extends Block { this.beaconable = true; return this; } - + public BlockBase noMobSpawn() { this.canSpawn = false; return this; @@ -53,7 +52,7 @@ public class BlockBase extends Block { public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) { return this.beaconable; } - + /** * Sets the block to air and drops it * @param world @@ -62,7 +61,7 @@ public class BlockBase extends Block { * @param z */ public void dismantle(World world, int x, int y, int z) { - + world.setBlockToAir(x, y, z); ItemStack itemstack = new ItemStack(this, 1); diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index e0463a1b0..cfedf6246 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -1,15 +1,10 @@ package com.hbm.blocks; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import com.hbm.handler.MultiblockHandlerXR; import com.hbm.handler.ThreeInts; import com.hbm.interfaces.ICopiable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -33,6 +28,10 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable { public BlockDummyable(Material mat) { @@ -50,7 +49,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl public static final int offset = 10; // meta offset from dummy to extra rotation public static final int extra = 6; - + /* * An extra integer that can be set before block set operations (such as makeExtra) and intercepted in createNewTileEntity. * This way we can inelegantly add variation to the tiles created even if the metadata would be the same. @@ -60,11 +59,11 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl public static int overrideTileMeta = 0; public static boolean safeRem = false; - + public static void setOverride(int i) { overrideTileMeta = i; } - + public static void resetOverride() { overrideTileMeta = 0; } @@ -179,7 +178,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl if(i == 3) { dir = ForgeDirection.getOrientation(4); } - + dir = getDirModified(dir); if(!checkRequirement(world, x, y, z, dir, o)) { @@ -221,7 +220,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl public void onBlockAdded(World world, int x, int y, int z) { lastBlockSet = new BlockPos(x, y, z); }*/ - + /** * A bit more advanced than the dir modifier, but it is important that the resulting direction meta is in the core range. * Using the "extra" metas is technically possible but requires a bit of tinkering, e.g. preventing a recursive loop @@ -237,7 +236,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl protected int getMetaForCore(World world, int x, int y, int z, EntityPlayer player, int original) { return original; } - + /** * Allows to modify the general placement direction as if the player had another rotation. * Quite basic due to only having 1 param but it's more meant to fix/limit the amount of directions @@ -272,7 +271,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl world.setBlock(x, y, z, this, meta + extra, 3); this.safeRem = false; } - + public void removeExtra(World world, int x, int y, int z) { if(world.getBlock(x, y, z) != this) @@ -310,7 +309,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl // if(pos != null) { ForgeDirection d = ForgeDirection.getOrientation(i); - + if(world.getBlock(x - d.offsetX, y - d.offsetY, z - d.offsetZ) == this) world.setBlockToAir(x - d.offsetX, y - d.offsetY, z - d.offsetZ); // } @@ -385,7 +384,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl } protected boolean standardOpenBehavior(World world, int x, int y, int z, EntityPlayer player, int id) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { @@ -403,14 +402,14 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl @Override public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { - + if(!player.capabilities.isCreativeMode) { harvesters.set(player); this.dropBlockAsItem(world, x, y, z, meta, 0); harvesters.set(null); } } - + /* * Called after the block and TE are already gone, so this method is of no use to us. */ @@ -419,53 +418,53 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } - + public boolean useDetailedHitbox() { return !bounding.isEmpty(); } - + public List bounding = new ArrayList(); @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { - + if(!this.useDetailedHitbox()) { super.addCollisionBoxesToList(world, x, y, z, entityBounding, list, entity); return; } - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return; - + x = pos[0]; y = pos[1]; z = pos[2]; - + for(AxisAlignedBB aabb :this.bounding) { AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x + 0.5, y, z + 0.5, ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - this.offset).getRotation(ForgeDirection.UP)); - + if(entityBounding.intersectsWith(boxlet)) { list.add(boxlet); } } } - + public static AxisAlignedBB getAABBRotationOffset(AxisAlignedBB aabb, double x, double y, double z, ForgeDirection dir) { - + AxisAlignedBB newBox = null; if(dir == ForgeDirection.NORTH) newBox = AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ); if(dir == ForgeDirection.EAST) newBox = AxisAlignedBB.getBoundingBox(-aabb.maxZ, aabb.minY, aabb.minX, -aabb.minZ, aabb.maxY, aabb.maxX); if(dir == ForgeDirection.SOUTH) newBox = AxisAlignedBB.getBoundingBox(-aabb.maxX, aabb.minY, -aabb.maxZ, -aabb.minX, aabb.maxY, -aabb.minZ); if(dir == ForgeDirection.WEST) newBox = AxisAlignedBB.getBoundingBox(aabb.minZ, aabb.minY, -aabb.maxX, aabb.maxZ, aabb.maxY, -aabb.minX); - + if(newBox != null) { newBox.offset(x, y, z); return newBox; } - + return AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ).offset(x + 0.5, y + 0.5, z + 0.5); } @@ -477,31 +476,31 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.999F, 1.0F); //for some fucking reason setting maxY to something that isn't 1 magically fixes item collisions } } - + @Override @SideOnly(Side.CLIENT) public boolean shouldDrawHighlight(World world, int x, int y, int z) { return !this.bounding.isEmpty(); } - + @Override @SideOnly(Side.CLIENT) public void drawHighlight(DrawBlockHighlightEvent event, World world, int x, int y, int z) { - + int[] pos = this.findCore(world, x, y, z); if(pos == null) return; - + x = pos[0]; y = pos[1]; z = pos[2]; - + EntityPlayer player = event.player; float interp = event.partialTicks; double dX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) interp; double dY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) interp; double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp; float exp = 0.002F; - + int meta = world.getBlockMetadata(x, y, z); ICustomBlockHighlight.setup(); diff --git a/src/main/java/com/hbm/blocks/BlockEnumMulti.java b/src/main/java/com/hbm/blocks/BlockEnumMulti.java index 0dd222f82..a79493e26 100644 --- a/src/main/java/com/hbm/blocks/BlockEnumMulti.java +++ b/src/main/java/com/hbm/blocks/BlockEnumMulti.java @@ -1,9 +1,6 @@ package com.hbm.blocks; -import java.util.Locale; - import com.hbm.util.EnumUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; @@ -11,6 +8,8 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import java.util.Locale; + public class BlockEnumMulti extends BlockMulti { public Class theEnum; @@ -23,17 +22,17 @@ public class BlockEnumMulti extends BlockMulti { this.multiName = multiName; this.multiTexture = multiTexture; } - + protected IIcon[] icons; @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { - + if(multiTexture) { Enum[] enums = theEnum.getEnumConstants(); this.icons = new IIcon[enums.length]; - + for(int i = 0; i < icons.length; i++) { Enum num = enums[i]; this.icons[i] = reg.registerIcon(this.getTextureMultiName(num)); @@ -42,25 +41,25 @@ public class BlockEnumMulti extends BlockMulti { this.blockIcon = reg.registerIcon(this.getTextureName()); } } - + public String getUnlocalizedName(ItemStack stack) { - + if(this.multiName) { Enum num = EnumUtil.grabEnumSafely(this.theEnum, stack.getItemDamage()); return getUnlocalizedMultiName(num); } - + return this.getUnlocalizedName(); } - + public String getTextureMultiName(Enum num) { return this.getTextureName() + "." + num.name().toLowerCase(Locale.US); } - + public String getUnlocalizedMultiName(Enum num) { return super.getUnlocalizedName() + "." + num.name().toLowerCase(Locale.US); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { diff --git a/src/main/java/com/hbm/blocks/BlockFallingNT.java b/src/main/java/com/hbm/blocks/BlockFallingNT.java index f880d7268..8e23cc57c 100644 --- a/src/main/java/com/hbm/blocks/BlockFallingNT.java +++ b/src/main/java/com/hbm/blocks/BlockFallingNT.java @@ -1,9 +1,6 @@ package com.hbm.blocks; -import java.util.Random; - import com.hbm.entity.item.EntityFallingBlockNT; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -14,6 +11,8 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Blocks; import net.minecraft.world.World; +import java.util.Random; + public class BlockFallingNT extends Block { public static boolean fallInstantly; @@ -45,7 +44,7 @@ public class BlockFallingNT extends Block { } protected void fall(World world, int x, int y, int z) { - + if(canFallThrough(world, x, y - 1, z) && y >= 0) { byte range = 32; diff --git a/src/main/java/com/hbm/blocks/BlockMulti.java b/src/main/java/com/hbm/blocks/BlockMulti.java index 21930f6ff..e676c0b71 100644 --- a/src/main/java/com/hbm/blocks/BlockMulti.java +++ b/src/main/java/com/hbm/blocks/BlockMulti.java @@ -1,7 +1,5 @@ package com.hbm.blocks; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; @@ -9,6 +7,8 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import java.util.List; + public abstract class BlockMulti extends BlockBase implements IBlockMulti { public BlockMulti() { diff --git a/src/main/java/com/hbm/blocks/BlockRemap.java b/src/main/java/com/hbm/blocks/BlockRemap.java index 1939b2830..97c21a6a1 100644 --- a/src/main/java/com/hbm/blocks/BlockRemap.java +++ b/src/main/java/com/hbm/blocks/BlockRemap.java @@ -1,8 +1,5 @@ package com.hbm.blocks; -import java.util.ArrayList; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -12,8 +9,11 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.Random; + public class BlockRemap extends Block implements ILookOverlay { - + public Block remapBlock; public int remapMeta; @@ -29,7 +29,7 @@ public class BlockRemap extends Block implements ILookOverlay { public IIcon getIcon(int meta, int side) { return this.remapBlock.getIcon(meta, side); } - + @Override public Item getItemDropped(int meta, Random rand, int fortune) { return this.remapBlock.getItemDropped(meta, rand, fortune); diff --git a/src/main/java/com/hbm/blocks/IAnalyzable.java b/src/main/java/com/hbm/blocks/IAnalyzable.java index e4e76a5ee..7648183c7 100644 --- a/src/main/java/com/hbm/blocks/IAnalyzable.java +++ b/src/main/java/com/hbm/blocks/IAnalyzable.java @@ -1,9 +1,9 @@ package com.hbm.blocks; -import java.util.List; - import net.minecraft.world.World; +import java.util.List; + public interface IAnalyzable { public List getDebugInfo(World world, int x, int y, int z); diff --git a/src/main/java/com/hbm/blocks/ICustomBlockHighlight.java b/src/main/java/com/hbm/blocks/ICustomBlockHighlight.java index 509ddab95..507fe8ff5 100644 --- a/src/main/java/com/hbm/blocks/ICustomBlockHighlight.java +++ b/src/main/java/com/hbm/blocks/ICustomBlockHighlight.java @@ -1,18 +1,17 @@ package com.hbm.blocks; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.world.World; import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import org.lwjgl.opengl.GL11; public interface ICustomBlockHighlight { @SideOnly(Side.CLIENT) public boolean shouldDrawHighlight(World world, int x, int y, int z); @SideOnly(Side.CLIENT) public void drawHighlight(DrawBlockHighlightEvent event, World world, int x, int y, int z); - + @SideOnly(Side.CLIENT) public static void setup() { GL11.glEnable(GL11.GL_BLEND); @@ -22,7 +21,7 @@ public interface ICustomBlockHighlight { GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glDepthMask(false); } - + @SideOnly(Side.CLIENT) public static void cleanup() { GL11.glDepthMask(true); diff --git a/src/main/java/com/hbm/blocks/ILookOverlay.java b/src/main/java/com/hbm/blocks/ILookOverlay.java index d100ed767..c58c3827b 100644 --- a/src/main/java/com/hbm/blocks/ILookOverlay.java +++ b/src/main/java/com/hbm/blocks/ILookOverlay.java @@ -1,9 +1,5 @@ package com.hbm.blocks; -import java.util.List; - -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; @@ -11,6 +7,9 @@ import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent; +import org.lwjgl.opengl.GL11; + +import java.util.List; public interface ILookOverlay { @@ -33,14 +32,14 @@ public interface ILookOverlay { try { for(String line : text) { - + int color = 0xFFFFFF; if(line.startsWith("&[")) { int end = line.lastIndexOf("&]"); color = Integer.parseInt(line.substring(2, end)); line = line.substring(end + 2); } - + mc.fontRenderer.drawStringWithShadow(line, pX, pZ, color); pZ += 10; } diff --git a/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java b/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java index ce033b3cb..4cfb07ad5 100644 --- a/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java +++ b/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java @@ -1,11 +1,11 @@ package com.hbm.blocks; -import java.util.List; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import java.util.List; + public interface IPersistentInfoProvider { public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext); diff --git a/src/main/java/com/hbm/blocks/ITooltipProvider.java b/src/main/java/com/hbm/blocks/ITooltipProvider.java index e959db070..5008b1834 100644 --- a/src/main/java/com/hbm/blocks/ITooltipProvider.java +++ b/src/main/java/com/hbm/blocks/ITooltipProvider.java @@ -1,23 +1,21 @@ package com.hbm.blocks; -import java.util.List; - -import org.lwjgl.input.Keyboard; - import com.hbm.util.I18nUtil; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; +import org.lwjgl.input.Keyboard; + +import java.util.List; public interface ITooltipProvider { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext); public default void addStandardInfo(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { for(String s : I18nUtil.resolveKeyArray(((Block)this).getUnlocalizedName() + ".desc")) list.add(EnumChatFormatting.YELLOW + s); } else { @@ -26,7 +24,7 @@ public interface ITooltipProvider { EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "> to display more info"); } } - + public default EnumRarity getRarity(ItemStack stack) { return EnumRarity.common; } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 56474db0e..c0720383e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1,7 +1,5 @@ package com.hbm.blocks; -import java.util.ArrayList; - import com.hbm.blocks.BlockEnums.*; import com.hbm.blocks.bomb.*; import com.hbm.blocks.fluid.*; @@ -13,7 +11,10 @@ import com.hbm.blocks.machine.pile.*; import com.hbm.blocks.machine.rbmk.*; import com.hbm.blocks.network.*; import com.hbm.blocks.rail.*; -import com.hbm.blocks.test.*; +import com.hbm.blocks.test.TestCharge; +import com.hbm.blocks.test.TestCore; +import com.hbm.blocks.test.TestEventTester; +import com.hbm.blocks.test.TestObjTester; import com.hbm.blocks.turret.*; import com.hbm.items.block.*; import com.hbm.items.bomb.ItemPrototypeBlock; @@ -37,14 +38,16 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import java.util.ArrayList; + public class ModBlocks { - + public static void mainRegistry() { initializeBlock(); registerBlock(); } - + public static Block event_tester; public static Block obj_tester; public static Block test_core; @@ -73,7 +76,7 @@ public class ModBlocks { public static Block ore_bedrock; public static Block ore_volcano; - + public static Block ore_nether_coal; public static Block ore_nether_smoldering; public static Block ore_nether_uranium; @@ -86,7 +89,7 @@ public class ModBlocks { public static Block ore_nether_schrabidium; public static Block ore_meteor; - + public static Block stone_gneiss; public static Block ore_gneiss_iron; public static Block ore_gneiss_gold; @@ -102,7 +105,7 @@ public class ModBlocks { public static Block gneiss_brick; public static Block gneiss_tile; public static Block gneiss_chiseled; - + public static Block stone_depth; public static Block ore_depth_cinnebar; public static Block ore_depth_zirconium; @@ -112,7 +115,7 @@ public class ModBlocks { public static Block cluster_depth_tungsten; public static Block stone_keyhole; - + public static Block stone_depth_nether; public static Block ore_depth_nether_neodymium; @@ -358,9 +361,9 @@ public class ModBlocks { public static Block cmb_brick; public static Block cmb_brick_reinforced; - + public static Block vinyl_tile; - + public static Block tile_lab; public static Block tile_lab_cracked; public static Block tile_lab_broken; @@ -378,7 +381,7 @@ public class ModBlocks { public static Block meteor_pillar; public static Block meteor_spawner; public static Block meteor_battery; - + public static Block moon_turf; public static Block brick_jungle; @@ -396,9 +399,9 @@ public class ModBlocks { public static Block deco_computer; public static Block deco_crt; public static Block deco_toaster; - + public static Block filing_cabinet; - + public static Block tape_recorder; public static Block steel_poles; public static Block pole_top; @@ -455,7 +458,7 @@ public class ModBlocks { public static Block glass_polonium; public static Block glass_ash; public static Block glass_quartz; - + public static Block mush; public static Block mush_block; public static Block mush_block_stem; @@ -488,7 +491,7 @@ public class ModBlocks { public static Block tektite; public static Block ore_tektite_osmiridium; public static Block impact_dirt; - + public static Block fallout; public static Block foam_layer; public static Block sand_boron_layer; @@ -536,12 +539,12 @@ public class ModBlocks { public static Block charge_miner; public static Block charge_c4; public static Block charge_semtex; - + public static Block mine_ap; public static Block mine_he; public static Block mine_shrap; public static Block mine_fat; - + public static Block crate; public static Block crate_weapon; public static Block crate_lead; @@ -589,7 +592,7 @@ public class ModBlocks { public static Block spikes; public static Block charger; - + public static Block tesla; public static Block sat_mapper; @@ -600,7 +603,7 @@ public class ModBlocks { public static Block sat_resonator; public static Block sat_dock; - + public static Block soyuz_capsule; public static Block crate_iron; @@ -610,7 +613,7 @@ public class ModBlocks { public static Block crate_template; public static Block safe; public static Block mass_storage; - + public static Block nuke_gadget; public static Block nuke_boy; public static Block nuke_man; @@ -626,7 +629,7 @@ public class ModBlocks { public static Block pump_steam; public static Block pump_electric; - + public static Block heater_firebox; public static Block heater_oven; public static Block heater_oilburner; @@ -653,23 +656,23 @@ public class ModBlocks { public static Block machine_strand_caster; public static Block foundry_slagtap; public static Block slag; - + public static Block machine_difurnace_off; public static Block machine_difurnace_on; public static Block machine_difurnace_extension; public static Block machine_difurnace_rtg_off; public static Block machine_difurnace_rtg_on; //public static final int guiID_test_difurnace = 1; historical - + public static Block machine_centrifuge; public static Block machine_gascent; - + public static Block machine_fel; public static Block machine_silex; public static Block machine_rotary_furnace; public static Block machine_crystallizer; - + public static Block machine_uf6_tank; public static Block machine_puf6_tank; @@ -681,12 +684,12 @@ public class ModBlocks { public static Block machine_nuke_furnace_on; public static Block machine_rtg_furnace_off; public static Block machine_rtg_furnace_on; - + public static Block machine_industrial_generator; public static Block machine_cyclotron; public static Block machine_exposure_chamber; - + public static Block hadron_plating; public static Block hadron_plating_blue; public static Block hadron_plating_black; @@ -714,17 +717,17 @@ public class ModBlocks { public static Block hadron_access; public static Block hadron_core; public static Block hadron_cooler; - + public static Block machine_electric_furnace_off; public static Block machine_electric_furnace_on; - + public static Block machine_microwave; - + public static Block machine_arc_furnace_off; public static Block machine_arc_furnace_on; - + //public static Block machine_deuterium; - + public static Block machine_battery_potato; public static Block machine_battery; public static Block machine_lithium_battery; @@ -739,9 +742,9 @@ public class ModBlocks { public static Block capacitor_niobium; public static Block capacitor_tantalium; public static Block capacitor_schrabidate; - + public static Block machine_wood_burner; - + public static Block red_wire_coated; public static Block red_cable; public static Block red_cable_classic; @@ -795,9 +798,9 @@ public class ModBlocks { public static Block drone_dock; public static Block drone_crate_provider; public static Block drone_crate_requester; - + public static Block fan; - + public static Block piston_inserter; public static Block chain; @@ -819,7 +822,7 @@ public class ModBlocks { public static Block barrel_steel; public static Block barrel_tcalloy; public static Block barrel_antimatter; - + public static Block machine_transformer; public static Block machine_transformer_20; public static Block machine_transformer_dnt; @@ -841,7 +844,7 @@ public class ModBlocks { public static Block struct_plasma_core; public static Block struct_watz_core; public static Block struct_icf_core; - + public static Block factory_titanium_hull; public static Block factory_advanced_hull; @@ -855,7 +858,7 @@ public class ModBlocks { public static Block cm_heat; public static Block custom_machine; public static Block cm_anchor; - + public static Block pwr_fuel; public static Block pwr_control; public static Block pwr_channel; @@ -867,7 +870,7 @@ public class ModBlocks { public static Block pwr_port; public static Block pwr_controller; public static Block pwr_block; - + public static Block fusion_conductor; public static Block fusion_center; public static Block fusion_motor; @@ -895,18 +898,18 @@ public class ModBlocks { public static Block balefire; public static Block fire_digamma; public static Block digamma_matter; - + public static Block dfc_emitter; public static Block dfc_injector; public static Block dfc_receiver; public static Block dfc_stabilizer; public static Block dfc_core; - + public static Block machine_converter_he_rf; public static Block machine_converter_rf_he; public static Block machine_schrabidium_transmutator; - + public static Block machine_diesel; public static Block machine_combustion_engine; @@ -923,7 +926,7 @@ public class ModBlocks { public static Block machine_powerrtg; public static Block machine_radiolysis; public static Block machine_hephaestus; - + public static Block machine_well; public static Block oil_pipe; public static Block machine_pumpjack; @@ -932,7 +935,7 @@ public class ModBlocks { public static Block machine_flare; public static Block chimney_brick; public static Block chimney_industrial; - + public static Block machine_refinery; public static Block machine_vacuum_distill; public static Block machine_fraction_tower; @@ -944,11 +947,11 @@ public class ModBlocks { public static Block machine_pyrooven; public static Block machine_boiler_off; - + public static Block machine_steam_engine; public static Block machine_turbine; public static Block machine_large_turbine; - + public static Block machine_deuterium_extractor; public static Block machine_deuterium_tower; @@ -961,7 +964,7 @@ public class ModBlocks { public static Block machine_tower_small; public static Block machine_tower_large; public static Block machine_condenser_powered; - + public static Block machine_electrolyser; public static Block machine_excavator; @@ -970,7 +973,7 @@ public class ModBlocks { public static Block machine_mining_laser; public static Block barricade; // a sand bag that drops nothing, for automated walling purposes - + public static Block machine_assembler; public static Block machine_assemfac; public static Block machine_arc_welder; @@ -988,18 +991,18 @@ public class ModBlocks { public static Block launch_pad; public static Block launch_pad_rusted; public static Block launch_pad_large; - + public static Block machine_missile_assembly; - + public static Block compact_launcher; public static Block launch_table; - + public static Block soyuz_launcher; public static Block machine_radar; public static Block machine_radar_large; public static Block radar_screen; - + public static Block machine_turbofan; public static Block machine_turbinegas; public static Block machine_lpw2; @@ -1009,22 +1012,22 @@ public class ModBlocks { public static Block machine_epress; public static Block machine_conveyor_press; public static Block machine_ammo_press; - + public static Block machine_siren; - + public static Block machine_radgen; - + public static Block machine_satlinker; public static Block machine_keyforge; - + public static Block machine_armor_table; - + public static Block reactor_research; public static Block reactor_zirnox; public static Block zirnox_destroyed; public static Block machine_controller; - + public static Block machine_spp_bottom; public static Block machine_spp_top; @@ -1032,13 +1035,13 @@ public class ModBlocks { public static Block radiorec; public static Block machine_forcefield; - + public static Block machine_waste_drum; public static Block machine_storage_drum; public static Block machine_autocrafter; public static Block machine_funnel; - + public static Block anvil_iron; public static Block anvil_lead; public static Block anvil_steel; @@ -1051,7 +1054,7 @@ public class ModBlocks { public static Block anvil_dnt; public static Block anvil_osmiridium; public static Block anvil_murky; - + public static Block turret_chekhov; public static Block turret_friendly; public static Block turret_jeremy; @@ -1110,7 +1113,7 @@ public class ModBlocks { public static Block rail_large_buffer; public static Block rail_large_switch; public static Block rail_large_switch_flipped; - + public static Block statue_elb; public static Block statue_elb_g; public static Block statue_elb_w; @@ -1166,17 +1169,17 @@ public class ModBlocks { public static Block corium_block; public static Fluid corium_fluid; public static final Material fluidcorium = (new MaterialLiquid(MapColor.brownColor) { - + @Override public boolean blocksMovement() { return true; } - + @Override public Material setImmovableMobility() { //override access modifier return super.setImmovableMobility(); } - + }.setImmovableMobility()); public static Block volcanic_lava_block; @@ -1207,23 +1210,23 @@ public class ModBlocks { public static Block pink_slab; public static Block pink_double_slab; public static Block pink_stairs; - + public static Material materialGas = new MaterialGas(); - + private static void initializeBlock() { - + event_tester = new TestEventTester(Material.iron).setBlockName("event_tester").setCreativeTab(null).setHardness(2.5F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":event_tester"); obj_tester = new TestObjTester(Material.iron).setBlockName("obj_tester").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); test_core = new TestCore(Material.iron).setBlockName("test_core").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_core"); test_charge = new TestCharge(Material.iron).setBlockName("test_charge").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); structure_anchor = new BlockGeneric(Material.iron).setBlockName("structure_anchor").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":structure_anchor"); - + ore_uranium = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_uranium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_uranium"); ore_uranium_scorched = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_uranium_scorched").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_uranium_scorched"); ore_titanium = new BlockGeneric(Material.rock).setBlockName("ore_titanium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_titanium"); ore_sulfur = new BlockOre(Material.rock).setBlockName("ore_sulfur").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_sulfur"); ore_thorium = new BlockGeneric(Material.rock).setBlockName("ore_thorium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_thorium"); - + ore_niter = new BlockOre(Material.rock).setBlockName("ore_niter").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_niter"); ore_copper = new BlockGeneric(Material.rock).setBlockName("ore_copper").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_copper"); ore_tungsten = new BlockGeneric(Material.rock).setBlockName("ore_tungsten").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_tungsten"); @@ -1236,12 +1239,12 @@ public class ModBlocks { ore_asbestos = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":ore_asbestos"); ore_coal_oil = new BlockCoalOil(Material.rock).setBlockName("ore_coal_oil").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":ore_coal_oil"); ore_coal_oil_burning = new BlockCoalBurning(Material.rock).setBlockName("ore_coal_oil_burning").setCreativeTab(MainRegistry.blockTab).setLightLevel(10F/15F).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":ore_coal_oil_burning"); - + cluster_iron = new BlockCluster(Material.rock).setBlockName("cluster_iron").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":cluster_iron"); cluster_titanium = new BlockCluster(Material.rock).setBlockName("cluster_titanium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":cluster_titanium"); cluster_aluminium = new BlockCluster(Material.rock).setBlockName("cluster_aluminium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":cluster_aluminium"); cluster_copper = new BlockCluster(Material.rock).setBlockName("cluster_copper").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":cluster_copper"); - + ore_nether_coal = new BlockNetherCoal(Material.rock, false, 5, true).setBlockName("ore_nether_coal").setCreativeTab(MainRegistry.blockTab).setLightLevel(10F/15F).setHardness(0.4F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_nether_coal"); ore_nether_smoldering = new BlockSmolder(Material.rock).setBlockName("ore_nether_smoldering").setCreativeTab(MainRegistry.blockTab).setLightLevel(1F).setHardness(0.4F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_nether_smoldering"); ore_nether_uranium = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_nether_uranium").setCreativeTab(MainRegistry.blockTab).setHardness(0.4F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_nether_uranium"); @@ -1270,7 +1273,7 @@ public class ModBlocks { gneiss_brick = new BlockGeneric(Material.rock).setBlockName("gneiss_brick").setCreativeTab(MainRegistry.blockTab).setHardness(1.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":gneiss_brick"); gneiss_tile = new BlockGeneric(Material.rock).setBlockName("gneiss_tile").setCreativeTab(MainRegistry.blockTab).setHardness(1.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":gneiss_tile"); gneiss_chiseled = new BlockPillar(Material.rock, RefStrings.MODID + ":gneiss_tile").setBlockName("gneiss_chiseled").setCreativeTab(MainRegistry.blockTab).setHardness(1.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":gneiss_chiseled"); - + stone_depth = new BlockDepth().setBlockName("stone_depth").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":stone_depth"); ore_depth_cinnebar = new BlockDepthOre().setBlockName("ore_depth_cinnebar").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ore_depth_cinnebar"); ore_depth_zirconium = new BlockDepthOre().setBlockName("ore_depth_zirconium").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ore_depth_zirconium"); @@ -1279,9 +1282,9 @@ public class ModBlocks { cluster_depth_titanium = new BlockDepthOre().setBlockName("cluster_depth_titanium").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":cluster_depth_titanium"); cluster_depth_tungsten = new BlockDepthOre().setBlockName("cluster_depth_tungsten").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":cluster_depth_tungsten"); ore_alexandrite = new BlockDepthOre().setBlockName("ore_alexandrite").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ore_alexandrite"); - + stone_keyhole = new BlockKeyhole().setBlockName("stone_keyhole").setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":stone_keyhole"); - + ore_bedrock = new BlockBedrockOreTE().setBlockName("ore_bedrock").setCreativeTab(null); ore_volcano = new BlockFissure().setBlockName("ore_volcano").setLightLevel(1F).setCreativeTab(MainRegistry.blockTab); @@ -1290,10 +1293,10 @@ public class ModBlocks { depth_nether_brick = new BlockDepth().setBlockName("depth_nether_brick").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":depth_nether_brick"); depth_nether_tiles = new BlockDepth().setBlockName("depth_nether_tiles").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":depth_nether_tiles"); depth_dnt = new BlockDepth().setBlockName("depth_dnt").setCreativeTab(MainRegistry.blockTab).setResistance(60000.0F).setBlockTextureName(RefStrings.MODID + ":depth_dnt"); - + stone_depth_nether = new BlockDepth().setBlockName("stone_depth_nether").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":stone_depth_nether"); ore_depth_nether_neodymium = new BlockDepthOre().setBlockName("ore_depth_nether_neodymium").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ore_depth_nether_neodymium"); - + stone_porous = new BlockPorous().setBlockName("stone_porous").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":stone_porous"); stone_resource = new BlockResourceStone().setBlockName("stone_resource").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F); stalagmite = new BlockStalagmite().setBlockName("stalagmite").setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.0F); @@ -1306,20 +1309,20 @@ public class ModBlocks { basalt_brick = new BlockGeneric(Material.rock).setBlockName("basalt_brick").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":basalt_brick"); basalt_polished = new BlockGeneric(Material.rock).setBlockName("basalt_polished").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":basalt_polished"); basalt_tiles = new BlockGeneric(Material.rock).setBlockName("basalt_tiles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":basalt_tiles"); - + ore_australium = new BlockGeneric(Material.rock).setBlockName("ore_australium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_australium"); ore_rare = new BlockOre(Material.rock).setBlockName("ore_rare").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_rare"); ore_cobalt = new BlockOre(Material.rock).setBlockName("ore_cobalt").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_cobalt"); ore_cinnebar = new BlockOre(Material.rock).setBlockName("ore_cinnebar").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_cinnebar"); ore_coltan = new BlockOre(Material.rock).setBlockName("ore_coltan").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_coltan"); - + ore_oil = new BlockOre(Material.rock).setBlockName("ore_oil").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_oil"); ore_oil_empty = new BlockGeneric(Material.rock).setBlockName("ore_oil_empty").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_oil_empty"); ore_oil_sand = new BlockFalling(Material.sand).setBlockName("ore_oil_sand").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeSand).setHardness(0.5F).setResistance(1.0F).setBlockTextureName(RefStrings.MODID + ":ore_oil_sand_alt"); ore_bedrock_oil = new BlockGeneric(Material.rock).noMobSpawn().setBlockName("ore_bedrock_oil").setCreativeTab(MainRegistry.blockTab).setBlockUnbreakable().setResistance(1_000_000).setBlockTextureName(RefStrings.MODID + ":ore_bedrock_oil"); - + ore_tikite = new BlockDragonProof(Material.rock).setBlockName("ore_tikite").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_tikite_alt"); - + block_uranium = new BlockHazard().makeBeaconable().setBlockName("block_uranium").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(50.0F).setBlockTextureName(RefStrings.MODID + ":block_uranium"); block_u233 = new BlockHazard().makeBeaconable().setDisplayEffect(ExtDisplayEffect.RADFOG).setBlockName("block_u233").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(50.0F).setBlockTextureName(RefStrings.MODID + ":block_u233"); block_u235 = new BlockHazard().makeBeaconable().setDisplayEffect(ExtDisplayEffect.RADFOG).setBlockName("block_u235").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(50.0F).setBlockTextureName(RefStrings.MODID + ":block_u235"); @@ -1411,16 +1414,16 @@ public class ModBlocks { block_c4 = new BlockPlasticExplosive(Material.tnt).setBlockName("block_c4").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(2.0F).setBlockTextureName(RefStrings.MODID + ":block_c4"); block_smore = new BlockPillar(Material.rock, RefStrings.MODID + ":block_smore_top").setBlockName("block_smore").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":block_smore_side"); block_slag = new BlockSlag(Material.rock).setBlockName("block_slag").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeStone).setHardness(2.0F).setBlockTextureName(RefStrings.MODID + ":block_slag"); - + block_australium = new BlockBeaconable(Material.iron).setBlockName("block_australium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_australium"); block_weidanium = new BlockBeaconable(Material.iron).setBlockName("block_weidanium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_deprecated"); block_reiium = new BlockBeaconable(Material.iron).setBlockName("block_reiium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_deprecated"); block_unobtainium = new BlockBeaconable(Material.iron).setBlockName("block_unobtainium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_deprecated"); block_daffergon = new BlockBeaconable(Material.iron).setBlockName("block_daffergon").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_deprecated"); block_verticium = new BlockBeaconable(Material.iron).setBlockName("block_verticium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_deprecated"); - + block_cap = new BlockCap().setBlockName("block_cap").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F); - + deco_titanium = new BlockOre(Material.iron).noFortune().setBlockName("deco_titanium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_titanium"); deco_red_copper = new BlockDecoCT(Material.iron).noFortune().setBlockName("deco_red_copper").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_red_copper"); deco_tungsten = new BlockDecoCT(Material.iron).noFortune().setBlockName("deco_tungsten").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_tungsten"); @@ -1431,7 +1434,7 @@ public class ModBlocks { deco_asbestos = new BlockOutgas(Material.cloth, true, 5, true).noFortune().setBlockName("deco_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_asbestos"); deco_rbmk = new BlockGeneric(Material.iron).setBlockName("deco_rbmk").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_side"); deco_rbmk_smooth = new BlockGeneric(Material.iron).setBlockName("deco_rbmk_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_top"); - + deco_emitter = new BlockEmitter().setBlockName("deco_emitter").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":emitter"); part_emitter = new PartEmitter().setBlockName("part_emitter").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":part_top"); deco_loot = new BlockLoot().setBlockName("deco_loot").setCreativeTab(null).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -1439,7 +1442,7 @@ public class ModBlocks { bobblehead = new BlockBobble().setBlockName("bobblehead").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); snowglobe = new BlockSnowglobe().setBlockName("snowglobe").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":glass_boron"); plushie = new BlockPlushie().setBlockName("plushie").setStepSound(Block.soundTypeCloth).setResistance(50_0000.0F).setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_fiberglass_side"); - + gravel_obsidian = new BlockFalling(Material.iron).setBlockName("gravel_obsidian").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGravel).setHardness(5.0F).setResistance(240.0F).setBlockTextureName(RefStrings.MODID + ":gravel_obsidian"); gravel_diamond = new BlockFalling(Material.sand).setBlockName("gravel_diamond").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGravel).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":gravel_diamond"); asphalt = new BlockSpeedy(Material.rock, 1.5).setBlockName("asphalt").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(120.0F).setBlockTextureName(RefStrings.MODID + ":asphalt"); @@ -1454,7 +1457,7 @@ public class ModBlocks { reinforced_lamp_on = new ReinforcedLamp(Material.rock, true).setBlockName("reinforced_lamp_on").setHardness(15.0F).setResistance(80.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_lamp_on"); reinforced_laminate = new BlockNTMGlassCT(1, RefStrings.MODID + ":reinforced_laminate", Material.rock, true).setBlockName("reinforced_laminate").setCreativeTab(MainRegistry.blockTab).setLightOpacity(0).setHardness(15.0F).setResistance(300.0F); reinforced_laminate_pane = new BlockNTMGlassPane(1, RefStrings.MODID + ":reinforced_laminate_pane", RefStrings.MODID + ":reinforced_laminate_pane_edge", Material.rock, true).setBlockName("reinforced_laminate_pane").setCreativeTab(MainRegistry.blockTab).setLightOpacity(1).setHardness(15.0F).setResistance(300.0F); - + lamp_tritium_green_off = new TritiumLamp(Material.redstoneLight, false).setBlockName("lamp_tritium_green_off").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(3.0F).setBlockTextureName(RefStrings.MODID + ":lamp_tritium_green_off"); lamp_tritium_green_on = new TritiumLamp(Material.redstoneLight, true).setBlockName("lamp_tritium_green_on").setStepSound(Block.soundTypeGlass).setHardness(3.0F).setBlockTextureName(RefStrings.MODID + ":lamp_tritium_green_on"); lamp_tritium_blue_off = new TritiumLamp(Material.redstoneLight, false).setBlockName("lamp_tritium_blue_off").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(3.0F).setBlockTextureName(RefStrings.MODID + ":lamp_tritium_blue_off"); @@ -1473,7 +1476,7 @@ public class ModBlocks { spotlight_beam = new SpotlightBeam().setBlockName("spotlight_beam"); floodlight = new Floodlight(Material.iron).setBlockName("floodlight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); floodlight_beam = new FloodlightBeam().setBlockName("floodlight_beam"); - + reinforced_stone = new BlockGeneric(Material.rock).setBlockName("reinforced_stone").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_stone"); concrete_smooth = new BlockRadResistant(Material.rock).setBlockName("concrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); concrete_colored = new BlockConcreteColored(Material.rock).setBlockName("concrete_colored").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); @@ -1495,7 +1498,7 @@ public class ModBlocks { cmb_brick_reinforced = new BlockGeneric(Material.rock).setBlockName("cmb_brick_reinforced").setCreativeTab(MainRegistry.blockTab).setHardness(25.0F).setResistance(50000.0F).setBlockTextureName(RefStrings.MODID + ":cmb_brick_reinforced"); brick_asbestos = new BlockOutgas(Material.rock, true, 5, true).setBlockName("brick_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(1000.0F).setBlockTextureName(RefStrings.MODID + ":brick_asbestos"); brick_fire = new BlockGeneric(Material.rock).setBlockName("brick_fire").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(35.0F).setBlockTextureName(RefStrings.MODID + ":brick_fire"); - + ducrete_smooth = new BlockGeneric(Material.rock).setBlockName("ducrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(500.0F).setBlockTextureName(RefStrings.MODID + ":ducrete"); ducrete = new BlockGeneric(Material.rock).setBlockName("ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(500.0F).setBlockTextureName(RefStrings.MODID + ":ducrete_tile"); brick_ducrete = new BlockGeneric(Material.rock).setBlockName("brick_ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(750.0F).setBlockTextureName(RefStrings.MODID + ":brick_ducrete"); @@ -1507,7 +1510,7 @@ public class ModBlocks { concrete_brick_double_slab = new BlockMultiSlab(concrete_brick_slab, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_double_slab").setCreativeTab(MainRegistry.blockTab); brick_slab = new BlockMultiSlab(null, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_slab").setCreativeTab(MainRegistry.blockTab); brick_double_slab = new BlockMultiSlab(brick_slab, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_double_slab").setCreativeTab(MainRegistry.blockTab); - + concrete_smooth_stairs = new BlockGenericStairs(concrete_smooth, 0).setBlockName("concrete_smooth_stairs").setCreativeTab(MainRegistry.blockTab); concrete_stairs = new BlockGenericStairs(concrete, 0).setBlockName("concrete_stairs").setCreativeTab(MainRegistry.blockTab); concrete_asbestos_stairs = new BlockGenericStairs(concrete_asbestos, 0).setBlockName("concrete_asbestos_stairs").setCreativeTab(MainRegistry.blockTab); @@ -1547,7 +1550,7 @@ public class ModBlocks { meteor_spawner = new BlockCybercrab(Material.rock).setBlockName("meteor_spawner").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F); meteor_battery = new BlockPillar(Material.rock, RefStrings.MODID + ":meteor_power").setBlockName("meteor_battery").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F).setBlockTextureName(RefStrings.MODID + ":meteor_spawner_side"); moon_turf = new BlockFalling(Material.sand).setBlockName("moon_turf").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":moon_turf"); - + brick_jungle = new BlockGeneric(Material.rock).setBlockName("brick_jungle").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F).setBlockTextureName(RefStrings.MODID + ":brick_jungle"); brick_jungle_cracked = new BlockGeneric(Material.rock).setBlockName("brick_jungle_cracked").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F).setBlockTextureName(RefStrings.MODID + ":brick_jungle_cracked"); brick_jungle_fragile = new FragileBrick(Material.rock).setBlockName("brick_jungle_fragile").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F).setBlockTextureName(RefStrings.MODID + ":brick_jungle_fragile"); @@ -1557,14 +1560,14 @@ public class ModBlocks { brick_jungle_trap = new TrappedBrick(Material.rock).setBlockName("brick_jungle_trap").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F).setBlockTextureName(RefStrings.MODID + ":brick_jungle_trap"); brick_jungle_glyph = new BlockGlyph(Material.rock).setBlockName("brick_jungle_glyph").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F); brick_jungle_circle = new BlockBallsSpawner(Material.rock).setBlockName("brick_jungle_circle").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(360.0F).setBlockTextureName(RefStrings.MODID + ":brick_jungle_circle"); - + brick_red = new BlockRedBrick(Material.rock).setBlockName("brick_red").setResistance(10_000); - + deco_computer = new BlockDecoModel(Material.iron, DecoComputerEnum.class, true, false).setBlockBoundsTo(.160749F, 0F, 0F, .839251F, .867849F, .622184F).setBlockName("deco_computer").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_computer"); deco_crt = new BlockDecoCRT(Material.iron).setBlockName("deco_crt").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); deco_toaster = new BlockDecoToaster(Material.iron).setBlockName("deco_toaster").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); filing_cabinet = new BlockDecoContainer(Material.iron, DecoCabinetEnum.class, true, false, TileEntityFileCabinet.class).setBlockBoundsTo(.1875F, 0F, 0F, .8125F, 1F, .75F).setBlockName("filing_cabinet").setCreativeTab(MainRegistry.blockTab).setHardness(10.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + tape_recorder = new DecoTapeRecorder(Material.iron).setBlockName("tape_recorder").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_tape_recorder"); steel_poles = new DecoSteelPoles(Material.iron).setBlockName("steel_poles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam"); pole_top = new DecoPoleTop(Material.iron).setBlockName("pole_top").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_pole_top"); @@ -1576,7 +1579,7 @@ public class ModBlocks { steel_scaffold = new BlockScaffold().setBlockName("steel_scaffold").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_steel_orig"); steel_grate = new BlockGrate(Material.iron).setBlockName("steel_grate").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F); steel_grate_wide = new BlockGrate(Material.iron).setBlockName("steel_grate_wide").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F); - + deco_pipe = new BlockPipe(Material.iron, RefStrings.MODID + ":pipe_side", 0).setBlockName("deco_pipe").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":pipe_top"); deco_pipe_rusted = new BlockPipe(Material.iron, RefStrings.MODID + ":pipe_side_rusty", 0).setBlockName("deco_pipe_rusted").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":pipe_top_rusty"); deco_pipe_green = new BlockPipe(Material.iron, RefStrings.MODID + ":pipe_side_green", 0).setBlockName("deco_pipe_green").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":pipe_top_green"); @@ -1601,13 +1604,13 @@ public class ModBlocks { deco_pipe_quad_green_rusted = new BlockPipe(Material.iron, RefStrings.MODID + ":pipe_side_green_rusty", 2).setBlockName("deco_pipe_quad_green_rusted").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":pipe_top_green_rusty"); deco_pipe_quad_red = new BlockPipe(Material.iron, RefStrings.MODID + ":pipe_side_red", 2).setBlockName("deco_pipe_quad_red").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":pipe_top_red"); deco_pipe_quad_marked = new BlockPipe(Material.iron, RefStrings.MODID + ":pipe_side_marked", 2).setBlockName("deco_pipe_quad_marked").setStepSound(ModSoundTypes.grate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":pipe_top_marked"); - + broadcaster_pc = new PinkCloudBroadcaster(Material.iron).setBlockName("broadcaster_pc").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":broadcaster_pc"); geiger = new GeigerCounter(Material.iron).setBlockName("geiger").setCreativeTab(MainRegistry.machineTab).setHardness(15.0F).setResistance(0.25F).setBlockTextureName(RefStrings.MODID + ":geiger"); hev_battery = new HEVBattery(Material.iron).setBlockName("hev_battery").setCreativeTab(MainRegistry.machineTab).setLightLevel(10F/15F).setHardness(0.5F).setResistance(0.25F).setBlockTextureName(RefStrings.MODID + ":hev_battery"); - + fence_metal = new BlockMetalFence(Material.iron).setBlockName("fence_metal").setCreativeTab(MainRegistry.machineTab).setHardness(15.0F).setResistance(0.25F).setBlockTextureName(RefStrings.MODID + ":fence_metal"); - + ash_digamma = new BlockAshes(Material.sand).setBlockName("ash_digamma").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.machineTab).setHardness(0.5F).setResistance(150.0F).setBlockTextureName(RefStrings.MODID + ":ash_digamma"); sand_boron = new BlockFalling(Material.sand).setBlockName("sand_boron").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.machineTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":sand_boron"); sand_lead = new BlockFalling(Material.sand).setBlockName("sand_lead").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.machineTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":sand_lead"); @@ -1621,13 +1624,13 @@ public class ModBlocks { glass_polonium = new BlockNTMGlassCT(1, RefStrings.MODID + ":glass_polonium", Material.glass).setBlockName("glass_polonium").setLightLevel(5F/15F).setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.machineTab).setHardness(0.3F); glass_ash = new BlockNTMGlassCT(1, RefStrings.MODID + ":glass_ash", Material.glass).setBlockName("glass_ash").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.machineTab).setHardness(3F); glass_quartz = new BlockNTMGlassCT(0, RefStrings.MODID + ":glass_quartz", Material.packedIce, true).setBlockName("glass_quartz").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGlass).setHardness(1.0F).setResistance(40.0F).setBlockTextureName(RefStrings.MODID + "glass_quartz"); - + mush = new BlockMush(Material.plants).setBlockName("mush").setCreativeTab(MainRegistry.blockTab).setLightLevel(0.5F).setStepSound(Block.soundTypeGrass).setBlockTextureName(RefStrings.MODID + ":mush"); mush_block = new BlockMushHuge(Material.plants).setBlockName("mush_block").setLightLevel(1.0F).setStepSound(Block.soundTypeGrass).setHardness(0.2F).setBlockTextureName(RefStrings.MODID + ":mush_block_skin"); mush_block_stem = new BlockMushHuge(Material.plants).setBlockName("mush_block_stem").setLightLevel(1.0F).setStepSound(Block.soundTypeGrass).setHardness(0.2F).setBlockTextureName(RefStrings.MODID + ":mush_block_stem"); glyphid_base = new BlockGlyphid(Material.coral).setBlockName("glyphid_base").setStepSound(Block.soundTypeCloth).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":glyphid_base"); glyphid_spawner = new BlockGlyphidSpawner(Material.coral).setBlockName("glyphid_spawner").setStepSound(Block.soundTypeCloth).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":glyphid_eggs_alt"); - + plant_flower = new BlockNTMFlower().setBlockName("plant_flower").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); plant_tall = new BlockTallPlant().setBlockName("plant_tall").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); plant_dead = new BlockDeadPlant().setBlockName("plant_dead").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); @@ -1649,17 +1652,17 @@ public class ModBlocks { sand_boron_layer = new BlockLayering(Material.sand).setBlockName("sand_boron_layer").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setLightOpacity(0).setBlockTextureName(RefStrings.MODID + ":sand_boron"); leaves_layer = new BlockLayering(Material.leaves).setBlockName("leaves_layer").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setLightOpacity(0).setBlockTextureName(RefStrings.MODID + ":waste_leaves"); oil_spill = new BlockLayering(Material.ground).setBlockName("oil_spill").setStepSound(Block.soundTypeSnow).setCreativeTab(MainRegistry.blockTab).setHardness(0.1F).setLightOpacity(0).setBlockTextureName(RefStrings.MODID + ":oil_spill"); - + burning_earth = new WasteEarth(Material.ground, true).setBlockName("burning_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":burning_earth"); tektite = new BlockGeneric(Material.sand).setBlockName("tektite").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":tektite"); ore_tektite_osmiridium = new BlockGeneric(Material.sand).setBlockName("ore_tektite_osmiridium").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":ore_tektite_osmiridium"); - impact_dirt = new BlockDirt(Material.ground, true).setBlockName("impact_dirt").setStepSound(Block.soundTypeGravel).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":waste_earth_bottom"); + impact_dirt = new BlockDirt(Material.ground, true).setBlockName("impact_dirt").setStepSound(Block.soundTypeGravel).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":waste_earth_bottom"); dirt_dead = new BlockFalling(Material.ground).setBlockName("dirt_dead").setStepSound(Block.soundTypeGravel).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":dirt_dead"); dirt_oily = new BlockFalling(Material.ground).setBlockName("dirt_oily").setStepSound(Block.soundTypeGravel).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":dirt_oily"); sand_dirty = new BlockFalling(Material.sand).setBlockName("sand_dirty").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":sand_dirty"); sand_dirty_red = new BlockFalling(Material.sand).setBlockName("sand_dirty_red").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":sand_dirty_red"); stone_cracked = new BlockFalling(Material.rock).setBlockName("stone_cracked").setStepSound(Block.soundTypeStone).setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setBlockTextureName(RefStrings.MODID + ":stone_cracked"); - + sellafield_slaked = new BlockSellafieldSlaked(Material.rock).setBlockName("sellafield_slaked").setStepSound(Block.soundTypeStone).setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setBlockTextureName(RefStrings.MODID + ":sellafield_slaked"); sellafield_bedrock = new BlockSellafieldSlaked(Material.rock).setBlockName("sellafield_bedrock").setBlockUnbreakable().setResistance(6000000.0F).setStepSound(Block.soundTypeStone).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sellafield_slaked"); sellafield = new BlockSellafield(Material.rock).setBlockName("sellafield").setStepSound(Block.soundTypeStone).setHardness(5.0F).setBlockTextureName(RefStrings.MODID + ":sellafield_0"); @@ -1668,12 +1671,12 @@ public class ModBlocks { ore_sellafield_uranium_scorched = new BlockSellafieldOre(Material.rock).setBlockName("ore_sellafield_uranium_scorched").setStepSound(Block.soundTypeStone).setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setBlockTextureName(RefStrings.MODID + ":ore_overlay_uranium_scorched"); ore_sellafield_schrabidium = new BlockSellafieldOre(Material.rock).setBlockName("ore_sellafield_schrabidium").setStepSound(Block.soundTypeStone).setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setBlockTextureName(RefStrings.MODID + ":ore_overlay_schrabidium"); ore_sellafield_radgem = new BlockSellafieldOre(Material.rock).setBlockName("ore_sellafield_radgem").setStepSound(Block.soundTypeStone).setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setBlockTextureName(RefStrings.MODID + ":ore_overlay_radgem"); - + geysir_water = new BlockGeysir(Material.rock).setBlockName("geysir_water").setStepSound(Block.soundTypeStone).setHardness(5.0F); geysir_chlorine = new BlockGeysir(Material.rock).setBlockName("geysir_chlorine").setStepSound(Block.soundTypeStone).setHardness(5.0F); geysir_vapor = new BlockGeysir(Material.rock).setBlockName("geysir_vapor").setStepSound(Block.soundTypeStone).setHardness(5.0F); geysir_nether = new BlockGeysir(Material.rock).setBlockName("geysir_nether").setLightLevel(1.0F).setStepSound(Block.soundTypeStone).setHardness(2.0F); - + nuke_gadget = new NukeGadget(Material.iron).setBlockName("nuke_gadget").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":theGadget"); nuke_boy = new NukeBoy(Material.iron).setBlockName("nuke_boy").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":lilBoy"); nuke_man = new NukeMan(Material.iron).setBlockName("nuke_man").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":fatMan"); @@ -1685,9 +1688,9 @@ public class ModBlocks { nuke_solinium = new NukeSolinium(Material.iron).setBlockName("nuke_solinium").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":nuke_solinium"); nuke_n2 = new NukeN2(Material.iron).setBlockName("nuke_n2").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":nuke_n2"); nuke_fstbmb = new NukeBalefire(Material.iron).setBlockName("nuke_fstbmb").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":nuke_fstbmb"); - + bomb_multi = new BombMulti(Material.iron).setBlockName("bomb_multi").setCreativeTab(MainRegistry.nukeTab).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":bomb_multi1"); - + flame_war = new BombFlameWar(Material.iron).setBlockName("flame_war").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F).setBlockTextureName(RefStrings.MODID + ":flame_war"); float_bomb = new BombFloat(Material.iron).setBlockName("float_bomb").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F); therm_endo = new BombThermo(Material.iron).setBlockName("therm_endo").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(200.0F); @@ -1721,14 +1724,14 @@ public class ModBlocks { pump_steam = new MachinePump().setBlockName("pump_steam").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_copper"); pump_electric = new MachinePump().setBlockName("pump_electric").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + heater_firebox = new HeaterFirebox().setBlockName("heater_firebox").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); heater_oven = new HeaterOven().setBlockName("heater_oven").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); heater_oilburner = new HeaterOilburner().setBlockName("heater_oilburner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); heater_electric = new HeaterElectric().setBlockName("heater_electric").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); heater_heatex = new HeaterHeatex().setBlockName("heater_heatex").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_ashpit = new MachineAshpit().setBlockName("machine_ashpit").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName("stonebrick"); - + furnace_iron = new FurnaceIron().setBlockName("furnace_iron").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); furnace_steel = new FurnaceSteel().setBlockName("furnace_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); furnace_combination = new FurnaceCombination().setBlockName("furnace_combination").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_light_alt"); @@ -1740,7 +1743,7 @@ public class ModBlocks { machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_boiler = new MachineHeatBoiler().setBlockName("machine_boiler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_copper"); machine_industrial_boiler = new MachineHeatBoilerIndustrial().setBlockName("machine_industrial_boiler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_channel = new FoundryChannel().setBlockName("foundry_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); @@ -1748,24 +1751,24 @@ public class ModBlocks { foundry_outlet = new FoundryOutlet().setBlockName("foundry_outlet").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_slagtap = new FoundrySlagtap().setBlockName("foundry_slagtap").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); slag = new BlockDynamicSlag().setBlockName("slag").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":slag"); - + machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); machine_difurnace_extension = new MachineDiFurnaceExtension().setBlockName("machine_difurnace_extension").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_rtg_off = new MachineDiFurnaceRTG(false).setBlockName("machine_difurnace_rtg_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_rtg_on = new MachineDiFurnaceRTG(true).setBlockName("machine_difurnace_rtg_on").setHardness(5.0F).setResistance(10.0F).setLightLevel(2.0F).setCreativeTab(null); - + machine_centrifuge = new MachineCentrifuge(Material.iron).setBlockName("machine_centrifuge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_gascent = new MachineGasCent(Material.iron).setBlockName("machine_gascent").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_fel = new MachineFEL(Material.iron).setBlockName("machine_fel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_silex = new MachineSILEX(Material.iron).setBlockName("machine_silex").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_rotary_furnace = new MachineRotaryFurnace(Material.iron).setBlockName("machine_rotary_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_crystallizer = new MachineCrystallizer(Material.iron).setBlockName("machine_crystallizer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crystallizer"); - + machine_uf6_tank = new MachineUF6Tank(Material.iron).setBlockName("machine_uf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - + machine_puf6_tank = new MachinePuF6Tank(Material.iron).setBlockName("machine_puf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - + machine_reactor_breeding = new MachineReactorBreeding(Material.iron).setBlockName("machine_reactor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_reactor"); machine_furnace_brick_off = new MachineBrickFurnace(false).setBlockName("machine_furnace_brick_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -1807,7 +1810,7 @@ public class ModBlocks { hadron_access = new BlockHadronAccess(Material.iron).setStepSound(Block.soundTypeMetal).setBlockName("hadron_access").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":hadron_access"); hadron_core = new BlockHadronCore(Material.iron).setStepSound(Block.soundTypeMetal).setBlockName("hadron_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":hadron_core"); hadron_cooler = new BlockHadronCooler(Material.iron).setBlockName("hadron_cooler").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F); - + machine_electric_furnace_off = new MachineElectricFurnace(false).setBlockName("machine_electric_furnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_electric_furnace_on = new MachineElectricFurnace(true).setBlockName("machine_electric_furnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); machine_arc_furnace_off = new MachineArcFurnace(false).setBlockName("machine_arc_furnace_off").setHardness(5.0F).setResistance(10.0F); @@ -1821,14 +1824,14 @@ public class ModBlocks { machine_schrabidium_battery = new MachineBattery(Material.iron, 25_000_000_000L).setBlockName("machine_schrabidium_battery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_dineutronium_battery = new MachineBattery(Material.iron, 1_000_000_000_000L).setBlockName("machine_dineutronium_battery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_fensu = new MachineFENSU(Material.iron).setBlockName("machine_fensu").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_fensu"); - + capacitor_bus = new MachineCapacitorBus(Material.iron).setBlockName("capacitor_bus").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); capacitor_copper = new MachineCapacitor(Material.iron, 1_000_000L, "copper").setBlockName("capacitor_copper").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_copper"); capacitor_gold = new MachineCapacitor(Material.iron, 5_000_000L, "gold").setBlockName("capacitor_gold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName("gold_block"); capacitor_niobium = new MachineCapacitor(Material.iron, 25_000_000L, "niobium").setBlockName("capacitor_niobium").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_niobium"); capacitor_tantalium = new MachineCapacitor(Material.iron, 150_000_000L, "tantalium").setBlockName("capacitor_tantalium").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_tantalium"); capacitor_schrabidate = new MachineCapacitor(Material.iron, 50_000_000_000L, "schrabidate").setBlockName("capacitor_schrabidate").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_schrabidate"); - + machine_wood_burner = new MachineWoodBurner(Material.iron).setBlockName("machine_wood_burner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_diesel = new MachineDiesel().setBlockName("machine_diesel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_combustion_engine = new MachineCombustionEngine().setBlockName("machine_combustion_engine").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -1877,7 +1880,7 @@ public class ModBlocks { radio_torch_counter = new RadioTorchCounter().setBlockName("radio_torch_counter").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rtty_counter"); radio_torch_logic = new RadioTorchLogic().setBlockName("radio_torch_logic").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); radio_telex = new RadioTelex().setBlockName("radio_telex").setHardness(3F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":radio_telex"); - + conveyor = new BlockConveyor().setBlockName("conveyor").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); conveyor_express = new BlockConveyorExpress().setBlockName("conveyor_express").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor_express"); //conveyor_classic = new BlockConveyorClassic().setBlockName("conveyor_classic").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); @@ -1895,14 +1898,14 @@ public class ModBlocks { crane_partitioner = new CranePartitioner().setBlockName("crane_partitioner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":crane_partitioner_side"); fan = new MachineFan().setBlockName("fan").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); piston_inserter = new PistonInserter().setBlockName("piston_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + drone_waypoint = new DroneWaypoint().setBlockName("drone_waypoint").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_waypoint"); drone_crate = new DroneCrate().setBlockName("drone_crate").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); drone_waypoint_request = new DroneWaypointRequest().setBlockName("drone_waypoint_request").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_waypoint_request"); drone_dock = new DroneDock().setBlockName("drone_dock").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_dock"); drone_crate_provider = new DroneDock().setBlockName("drone_crate_provider").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_provider"); drone_crate_requester = new DroneDock().setBlockName("drone_crate_requester").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_requester"); - + chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); ladder_sturdy = new BlockNTMLadder().setBlockName("ladder_sturdy").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_sturdy"); @@ -1915,7 +1918,7 @@ public class ModBlocks { ladder_cobalt = new BlockNTMLadder().setBlockName("ladder_cobalt").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_cobalt"); ladder_steel = new BlockNTMLadder().setBlockName("ladder_steel").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_steel"); ladder_tungsten = new BlockNTMLadder().setBlockName("ladder_tungsten").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_tungsten"); - + barrel_plastic = new BlockFluidBarrel(Material.iron, 12000).setBlockName("barrel_plastic").setStepSound(Block.soundTypeStone).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_plastic"); barrel_corroded = new BlockFluidBarrel(Material.iron, 6000).setBlockName("barrel_corroded").setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_corroded"); barrel_iron = new BlockFluidBarrel(Material.iron, 8000).setBlockName("barrel_iron").setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_iron"); @@ -1927,14 +1930,14 @@ public class ModBlocks { machine_transformer_dnt = new MachineTransformer(Material.iron, 1000000000000000L, 1).setBlockName("machine_transformer_dnt").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_transformer"); machine_transformer_20 = new MachineTransformer(Material.iron, 10000L, 20).setBlockName("machine_transformer_20").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_transformer_iron"); machine_transformer_dnt_20 = new MachineTransformer(Material.iron, 1000000000000000L, 20).setBlockName("machine_transformer_dnt_20").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_transformer"); - + machine_satlinker = new MachineSatLinker(Material.iron).setBlockName("machine_satlinker").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":machine_satlinker_side"); machine_keyforge = new MachineKeyForge(Material.iron).setBlockName("machine_keyforge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab).setBlockTextureName(RefStrings.MODID + ":machine_keyforge_side"); machine_armor_table = new BlockArmorTable(Material.iron).setBlockName("machine_armor_table").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab); machine_solar_boiler = new MachineSolarBoiler(Material.iron).setBlockName("machine_solar_boiler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_solar_boiler"); solar_mirror = new SolarMirror(Material.iron).setBlockName("solar_mirror").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":solar_mirror"); - + struct_launcher = new BlockGeneric(Material.iron).setBlockName("struct_launcher").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":struct_launcher"); struct_scaffold = new BlockGeneric(Material.iron).setBlockName("struct_scaffold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":struct_scaffold"); struct_launcher_core = new BlockStruct(Material.iron).setBlockName("struct_launcher_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":struct_launcher_core"); @@ -1944,7 +1947,7 @@ public class ModBlocks { struct_plasma_core = new BlockPlasmaStruct(Material.iron).setBlockName("struct_plasma_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_plasma_core"); struct_watz_core = new BlockWatzStruct(Material.iron).setBlockName("struct_watz_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_watz_core"); struct_icf_core = new BlockICFStruct(Material.iron).setBlockName("struct_icf_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_icf_core"); - + factory_titanium_hull = new BlockGeneric(Material.iron).setBlockName("factory_titanium_hull").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_hull"); factory_advanced_hull = new BlockGeneric(Material.iron).setBlockName("factory_advanced_hull").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_hull"); @@ -1979,7 +1982,7 @@ public class ModBlocks { plasma = new BlockPlasma(Material.iron).setBlockName("plasma").setHardness(5.0F).setResistance(6000.0F).setLightLevel(1.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":plasma"); iter = new MachineITER().setBlockName("iter").setHardness(5.0F).setResistance(60.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":iter"); plasma_heater = new MachinePlasmaHeater().setBlockName("plasma_heater").setHardness(5.0F).setResistance(60.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":plasma_heater"); - + machine_icf_press = new MachineICFPress().setBlockName("machine_icf_press").setHardness(5.0F).setResistance(60.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); icf = new MachineICF().setBlockName("icf").setHardness(5.0F).setResistance(60.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); icf_component = new BlockICFComponent().setBlockName("icf_component").setHardness(5.0F).setResistance(60.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":icf_component"); @@ -1992,7 +1995,7 @@ public class ModBlocks { watz_end = new BlockToolConversion(Material.iron).addVariant("_bolted").setBlockName("watz_end").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":watz_casing"); watz = new Watz().setBlockName("watz").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); watz_pump = new WatzPump().setBlockName("watz_pump").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + balefire = new Balefire().setBlockName("balefire").setHardness(0.0F).setLightLevel(1.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":balefire"); fire_digamma = new DigammaFlame().setBlockName("fire_digamma").setHardness(0.0F).setResistance(150F).setLightLevel(1.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":fire_digamma"); digamma_matter = new DigammaMatter().setBlockName("digamma_matter").setBlockUnbreakable().setResistance(18000000).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":digamma_matter"); @@ -2009,7 +2012,7 @@ public class ModBlocks { seal_frame = new BlockGeneric(Material.iron).setBlockName("seal_frame").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":seal_frame"); seal_controller = new BlockSeal(Material.iron).setBlockName("seal_controller").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab); seal_hatch = new BlockHatch(Material.iron).setBlockName("seal_hatch").setHardness(Float.POSITIVE_INFINITY).setResistance(Float.POSITIVE_INFINITY).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":seal_hatch_3"); - + vault_door = new VaultDoor(Material.iron).setBlockName("vault_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vault_door"); blast_door = new BlastDoor(Material.iron).setBlockName("blast_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":blast_door"); @@ -2038,9 +2041,9 @@ public class ModBlocks { barbed_wire_wither = new BarbedWire(Material.iron).setBlockName("barbed_wire_wither").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":barbed_wire_wither_model"); barbed_wire_ultradeath = new BarbedWire(Material.iron).setBlockName("barbed_wire_ultradeath").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":barbed_wire_ultradeath_model"); spikes = new Spikes(Material.iron).setBlockName("spikes").setHardness(2.5F).setResistance(5.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":spikes"); - + charger = new Charger(Material.iron).setBlockName("charger").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + tesla = new MachineTesla(Material.iron).setBlockName("tesla").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":tesla"); launch_pad = new LaunchPad(Material.iron).setBlockName("launch_pad").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":launch_pad"); @@ -2054,17 +2057,17 @@ public class ModBlocks { compact_launcher = new CompactLauncher(Material.iron).setBlockName("compact_launcher").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":compact_launcher"); launch_table = new LaunchTable(Material.iron).setBlockName("launch_table").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":launch_table"); soyuz_launcher = new SoyuzLauncher(Material.iron).setBlockName("soyuz_launcher").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":soyuz_launcher"); - + sat_mapper = new DecoBlock(Material.iron).setBlockName("sat_mapper").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_mapper"); sat_radar = new DecoBlock(Material.iron).setBlockName("sat_radar").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_radar"); sat_scanner = new DecoBlock(Material.iron).setBlockName("sat_scanner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_scanner"); sat_laser = new DecoBlock(Material.iron).setBlockName("sat_laser").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_laser"); sat_foeq = new DecoBlock(Material.iron).setBlockName("sat_foeq").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_foeq"); sat_resonator = new DecoBlock(Material.iron).setBlockName("sat_resonator").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":sat_resonator"); - + sat_dock = new MachineSatDock(Material.iron).setBlockName("sat_dock").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":sat_dock"); soyuz_capsule = new SoyuzCapsule(Material.iron).setBlockName("soyuz_capsule").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":soyuz_capsule"); - + turret_chekhov = new TurretChekhov(Material.iron).setBlockName("turret_chekhov").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); turret_friendly = new TurretFriendly(Material.iron).setBlockName("turret_friendly").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); turret_jeremy = new TurretJeremy(Material.iron).setBlockName("turret_jeremy").setHardness(5.0F).setResistance(600.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -2104,9 +2107,9 @@ public class ModBlocks { pribris_burning = new RBMKDebrisBurning().setBlockName("pribris_burning").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris_burning"); pribris_radiating = new RBMKDebrisRadiating().setBlockName("pribris_radiating").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris_radiating"); pribris_digamma = new RBMKDebrisDigamma().setBlockName("pribris_digamma").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris_digamma"); - + book_guide = new Guide(Material.iron).setBlockName("book_guide").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.nukeTab); - + rail_wood = new RailGeneric().setMaxSpeed(0.2F).setBlockName("rail_wood").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_wood"); rail_narrow = new RailGeneric().setBlockName("rail_narrow").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_narrow"); rail_highspeed = new RailGeneric().setMaxSpeed(1F).setFlexible(false).setBlockName("rail_highspeed").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_highspeed"); @@ -2138,7 +2141,7 @@ public class ModBlocks { crate_template = new BlockStorageCrate(Material.iron).setBlockName("crate_template").setStepSound(Block.soundTypeMetal).setHardness(7.5F).setResistance(300.0F).setCreativeTab(MainRegistry.machineTab); safe = new BlockStorageCrate(Material.iron).setBlockName("safe").setStepSound(Block.soundTypeMetal).setHardness(7.5F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab); mass_storage = new BlockMassStorage().setBlockName("mass_storage").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - + boxcar = new DecoBlock(Material.iron).setBlockName("boxcar").setStepSound(Block.soundTypeMetal).setHardness(10.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":boxcar"); boat = new DecoBlock(Material.iron).setBlockName("boat").setStepSound(Block.soundTypeMetal).setHardness(10.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":boat"); @@ -2187,7 +2190,7 @@ public class ModBlocks { machine_controller = new MachineReactorControl(Material.iron).setBlockName("machine_controller").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); machine_boiler_off = new MachineBoiler(false).setBlockName("machine_boiler_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":machine_boiler_off"); - + machine_steam_engine = new MachineSteamEngine().setBlockName("machine_steam_engine").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_turbine = new MachineTurbine(Material.iron).setBlockName("machine_turbine").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_turbine"); machine_large_turbine = new MachineLargeTurbine(Material.iron).setBlockName("machine_large_turbine").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_large_turbine"); @@ -2196,19 +2199,19 @@ public class ModBlocks { machine_tower_small = new MachineTowerSmall(Material.iron).setBlockName("machine_tower_small").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_concrete"); machine_tower_large = new MachineTowerLarge(Material.iron).setBlockName("machine_tower_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":concrete"); machine_condenser_powered = new MachineCondenserPowered(Material.iron).setBlockName("machine_condenser_powered").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); - + machine_deuterium_extractor = new MachineDeuteriumExtractor(Material.iron).setBlockName("machine_deuterium_extractor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_deuterium_extractor_side"); machine_deuterium_tower = new DeuteriumTower(Material.iron).setBlockName("machine_deuterium_tower").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":concrete"); - + machine_liquefactor = new MachineLiquefactor().setBlockName("machine_liquefactor").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); machine_solidifier = new MachineSolidifier().setBlockName("machine_solidifier").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); machine_compressor = new MachineCompressor().setBlockName("machine_compressor").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); - + machine_electrolyser = new MachineElectrolyser().setBlockName("machine_electrolyser").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); - + machine_autocrafter = new MachineAutocrafter().setBlockName("machine_autocrafter").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab); machine_funnel = new MachineFunnel().setBlockName("machine_funnel").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab); - + anvil_iron = new NTMAnvil(Material.iron, NTMAnvil.TIER_IRON).setBlockName("anvil_iron").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_iron"); anvil_lead = new NTMAnvil(Material.iron, NTMAnvil.TIER_IRON).setBlockName("anvil_lead").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_lead"); anvil_steel = new NTMAnvil(Material.iron, NTMAnvil.TIER_STEEL).setBlockName("anvil_steel").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_steel"); @@ -2221,20 +2224,20 @@ public class ModBlocks { anvil_dnt = new NTMAnvil(Material.iron, NTMAnvil.TIER_PARTICLE).setBlockName("anvil_dnt").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_dnt"); anvil_osmiridium = new NTMAnvil(Material.iron, NTMAnvil.TIER_GERALD).setBlockName("anvil_osmiridium").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_osmiridium"); anvil_murky = new NTMAnvil(Material.iron, 1916169).setBlockName("anvil_murky").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_steel"); - + machine_waste_drum = new WasteDrum(Material.iron).setBlockName("machine_waste_drum").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":waste_drum"); machine_storage_drum = new StorageDrum(Material.iron).setBlockName("machine_storage_drum").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_storage_drum"); machine_schrabidium_transmutator = new MachineSchrabidiumTransmutator(Material.iron).setBlockName("machine_schrabidium_transmutator").setHardness(5.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab); machine_siren = new MachineSiren(Material.iron).setBlockName("machine_siren").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_siren"); - + machine_spp_bottom = new SPPBottom(Material.iron).setBlockName("machine_spp_bottom").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_spp_top = new SPPTop(Material.iron).setBlockName("machine_spp_top").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - + radiobox = new Radiobox(Material.iron).setBlockName("radiobox").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":radiobox"); radiorec = new RadioRec(Material.iron).setBlockName("radiorec").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":radiorec"); - + machine_forcefield = new MachineForceField(Material.iron).setBlockName("machine_forcefield").setHardness(5.0F).setResistance(100.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":machine_forcefield"); cheater_virus = new CheaterVirus(Material.iron).setBlockName("cheater_virus").setHardness(Float.POSITIVE_INFINITY).setResistance(Float.POSITIVE_INFINITY).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":cheater_virus"); @@ -2249,7 +2252,7 @@ public class ModBlocks { vent_pink_cloud = new BlockVent(Material.iron).setBlockName("vent_pink_cloud").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vent_pink_cloud"); vent_chlorine_seal = new BlockClorineSeal(Material.iron).setBlockName("vent_chlorine_seal").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); chlorine_gas = new BlockGasClorine().setBlockName("chlorine_gas").setHardness(0.0F).setResistance(0.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":chlorine_gas"); - + gas_radon = new BlockGasRadon().setBlockName("gas_radon").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":gas_radon"); gas_radon_dense = new BlockGasRadonDense().setBlockName("gas_radon_dense").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":gas_radon_dense"); gas_radon_tomb = new BlockGasRadonTomb().setBlockName("gas_radon_tomb").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":gas_radon_tomb"); @@ -2267,7 +2270,7 @@ public class ModBlocks { absorber_pink = new BlockAbsorber(Material.iron, 10000F).setBlockName("absorber_pink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber_pink"); decon = new BlockDecon(Material.iron).setBlockName("decon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":decon_side"); transission_hatch = new BlockTransission(Material.iron).setBlockName("transission_hatch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":transission_hatch"); - + volcano_core = new BlockVolcano().setBlockName("volcano_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_core"); volcano_rad_core = new BlockVolcano().setBlockName("volcano_rad_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_rad_core"); @@ -2307,7 +2310,7 @@ public class ModBlocks { sulfuric_acid_fluid = new GenericFluid("sulfuric_acid_fluid").setDensity(1840).setViscosity(1000).setTemperature(273); FluidRegistry.registerFluid(sulfuric_acid_fluid); sulfuric_acid_block = new GenericFluidBlock(sulfuric_acid_fluid, Material.water, "sulfuric_acid_still", "sulfuric_acid_flowing").setDamage(ModDamageSource.acid, 5F).setBlockName("sulfuric_acid_block").setResistance(500F); - + Fluid liquidConcrete = new GenericFluid("concrete_liquid").setViscosity(2000); concrete_liquid = new GenericFiniteFluid(liquidConcrete, Material.rock, "concrete_liquid", "concrete_liquid_flowing").setQuantaPerBlock(4).setBlockName("concrete_liquid").setResistance(500F); @@ -2318,7 +2321,7 @@ public class ModBlocks { dummy_plate_launch_table = new DummyBlockMachine(Material.iron, launch_table, false).setBounds(0, 16, 0, 16, 16, 16).setBlockName("dummy_plate_launch_table").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_port_launch_table = new DummyBlockMachine(Material.iron, launch_table, true).setBlockName("dummy_port_launch_table").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_plate_cargo = new DummyBlockMachine(Material.iron, sat_dock, false).setBounds(0, 0, 0, 16, 8, 16).setBlockName("dummy_plate_cargo").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + ntm_dirt = new BlockNTMDirt().setBlockName("ntm_dirt").setHardness(0.5F).setStepSound(Block.soundTypeGravel).setCreativeTab(null).setBlockTextureName("dirt"); pink_log = new BlockPinkLog().setBlockName("pink_log").setHardness(0.5F).setStepSound(Block.soundTypeWood).setCreativeTab(null); @@ -2355,27 +2358,27 @@ public class ModBlocks { GameRegistry.registerBlock(ore_lignite, ore_lignite.getUnlocalizedName()); GameRegistry.registerBlock(ore_asbestos, ore_asbestos.getUnlocalizedName()); GameRegistry.registerBlock(ore_schrabidium, ItemBlockLore.class, ore_schrabidium.getUnlocalizedName()); - + //Rare Minerals GameRegistry.registerBlock(ore_australium, ItemOreBlock.class, ore_australium.getUnlocalizedName()); GameRegistry.registerBlock(ore_rare, ItemOreBlock.class, ore_rare.getUnlocalizedName()); GameRegistry.registerBlock(ore_cobalt, ore_cobalt.getUnlocalizedName()); GameRegistry.registerBlock(ore_cinnebar, ore_cinnebar.getUnlocalizedName()); GameRegistry.registerBlock(ore_coltan, ore_coltan.getUnlocalizedName()); - + //Stone clusters GameRegistry.registerBlock(cluster_iron, ItemBlockBase.class, cluster_iron.getUnlocalizedName()); GameRegistry.registerBlock(cluster_titanium, ItemBlockBase.class, cluster_titanium.getUnlocalizedName()); GameRegistry.registerBlock(cluster_aluminium, ItemBlockBase.class, cluster_aluminium.getUnlocalizedName()); GameRegistry.registerBlock(cluster_copper, ItemBlockBase.class, cluster_copper.getUnlocalizedName()); - + //Bedrock ores GameRegistry.registerBlock(ore_bedrock_oil, ore_bedrock_oil.getUnlocalizedName()); - + //Nice Meme GameRegistry.registerBlock(ore_coal_oil, ore_coal_oil.getUnlocalizedName()); GameRegistry.registerBlock(ore_coal_oil_burning, ore_coal_oil_burning.getUnlocalizedName()); - + //Nether Ores GameRegistry.registerBlock(ore_nether_coal, ore_nether_coal.getUnlocalizedName()); GameRegistry.registerBlock(ore_nether_smoldering, ore_nether_smoldering.getUnlocalizedName()); @@ -2387,10 +2390,10 @@ public class ModBlocks { GameRegistry.registerBlock(ore_nether_fire, ore_nether_fire.getUnlocalizedName()); GameRegistry.registerBlock(ore_nether_cobalt, ore_nether_cobalt.getUnlocalizedName()); GameRegistry.registerBlock(ore_nether_schrabidium, ItemBlockLore.class, ore_nether_schrabidium.getUnlocalizedName()); - + //Meteor Ores register(ore_meteor); - + //Gneiss Ores GameRegistry.registerBlock(ore_gneiss_iron, ore_gneiss_iron.getUnlocalizedName()); GameRegistry.registerBlock(ore_gneiss_gold, ore_gneiss_gold.getUnlocalizedName()); @@ -2402,7 +2405,7 @@ public class ModBlocks { GameRegistry.registerBlock(ore_gneiss_schrabidium, ItemBlockLore.class, ore_gneiss_schrabidium.getUnlocalizedName()); GameRegistry.registerBlock(ore_gneiss_rare, ItemOreBlock.class, ore_gneiss_rare.getUnlocalizedName()); GameRegistry.registerBlock(ore_gneiss_gas, ore_gneiss_gas.getUnlocalizedName()); - + //Depth ores GameRegistry.registerBlock(ore_depth_cinnebar, ItemBlockBase.class, ore_depth_cinnebar.getUnlocalizedName()); GameRegistry.registerBlock(ore_depth_zirconium, ItemBlockBase.class, ore_depth_zirconium.getUnlocalizedName()); @@ -2411,29 +2414,29 @@ public class ModBlocks { GameRegistry.registerBlock(cluster_depth_titanium, ItemBlockBase.class, cluster_depth_titanium.getUnlocalizedName()); GameRegistry.registerBlock(cluster_depth_tungsten, ItemBlockBase.class, cluster_depth_tungsten.getUnlocalizedName()); GameRegistry.registerBlock(ore_alexandrite, ItemBlockBase.class, ore_alexandrite.getUnlocalizedName()); - + //Nether depth ores GameRegistry.registerBlock(ore_depth_nether_neodymium, ItemBlockBase.class, ore_depth_nether_neodymium.getUnlocalizedName()); - + //Basalt ores register(ore_basalt); - + //End Ores GameRegistry.registerBlock(ore_tikite, ore_tikite.getUnlocalizedName()); - + //Bedrock ore register(ore_bedrock); register(ore_volcano); - + //Secret register(stone_keyhole); - + //Resource-bearing Stones register(stone_resource); register(stalagmite); register(stalactite); register(stone_biome); - + //Stone Variants GameRegistry.registerBlock(stone_porous, stone_porous.getUnlocalizedName()); GameRegistry.registerBlock(stone_gneiss, stone_gneiss.getUnlocalizedName()); @@ -2453,7 +2456,7 @@ public class ModBlocks { GameRegistry.registerBlock(basalt_polished, basalt_polished.getUnlocalizedName()); GameRegistry.registerBlock(basalt_tiles, basalt_tiles.getUnlocalizedName()); //GameRegistry.registerBlock(stone_deep_cobble, ItemBlockBase.class, stone_deep_cobble.getUnlocalizedName()); - + //Blocks GameRegistry.registerBlock(block_uranium, block_uranium.getUnlocalizedName()); GameRegistry.registerBlock(block_u233, block_u233.getUnlocalizedName()); @@ -2553,7 +2556,7 @@ public class ModBlocks { GameRegistry.registerBlock(block_c4, block_c4.getUnlocalizedName()); GameRegistry.registerBlock(block_smore, block_smore.getUnlocalizedName()); GameRegistry.registerBlock(block_slag, block_slag.getUnlocalizedName()); - + //Deco Blocks GameRegistry.registerBlock(deco_titanium, deco_titanium.getUnlocalizedName()); GameRegistry.registerBlock(deco_red_copper, deco_red_copper.getUnlocalizedName()); @@ -2572,11 +2575,11 @@ public class ModBlocks { GameRegistry.registerBlock(plushie, ItemBlockBase.class, plushie.getUnlocalizedName()); GameRegistry.registerBlock(deco_rbmk, deco_rbmk.getUnlocalizedName()); GameRegistry.registerBlock(deco_rbmk_smooth, deco_rbmk_smooth.getUnlocalizedName()); - + //Gravel GameRegistry.registerBlock(gravel_obsidian, ItemBlockBlastInfo.class, gravel_obsidian.getUnlocalizedName()); GameRegistry.registerBlock(gravel_diamond, ItemBlockLore.class, gravel_diamond.getUnlocalizedName()); - + //Lamps GameRegistry.registerBlock(lamp_tritium_green_off, lamp_tritium_green_off.getUnlocalizedName()); GameRegistry.registerBlock(lamp_tritium_green_on, lamp_tritium_green_on.getUnlocalizedName()); @@ -2658,18 +2661,18 @@ public class ModBlocks { GameRegistry.registerBlock(brick_fire_stairs, brick_fire_stairs.getUnlocalizedName()); GameRegistry.registerBlock(ducrete_stairs, ducrete_stairs.getUnlocalizedName()); GameRegistry.registerBlock(asphalt_stairs, asphalt_stairs.getUnlocalizedName()); - + //CMB Building Elements GameRegistry.registerBlock(cmb_brick, ItemBlockBlastInfo.class, cmb_brick.getUnlocalizedName()); GameRegistry.registerBlock(cmb_brick_reinforced, ItemBlockBlastInfo.class, cmb_brick_reinforced.getUnlocalizedName()); - + //Tiles GameRegistry.registerBlock(vinyl_tile, ItemBlockBlastInfo.class, vinyl_tile.getUnlocalizedName()); //i would rather die than dip into fucking blocks with subtypes again - + GameRegistry.registerBlock(tile_lab, tile_lab.getUnlocalizedName()); GameRegistry.registerBlock(tile_lab_cracked, tile_lab_cracked.getUnlocalizedName()); GameRegistry.registerBlock(tile_lab_broken, tile_lab_broken.getUnlocalizedName()); - + //Other defensive stuff GameRegistry.registerBlock(barbed_wire, barbed_wire.getUnlocalizedName()); GameRegistry.registerBlock(barbed_wire_fire, barbed_wire_fire.getUnlocalizedName()); @@ -2679,11 +2682,11 @@ public class ModBlocks { GameRegistry.registerBlock(barbed_wire_ultradeath, barbed_wire_ultradeath.getUnlocalizedName()); GameRegistry.registerBlock(spikes, spikes.getUnlocalizedName()); GameRegistry.registerBlock(tesla, tesla.getUnlocalizedName()); - + //Charger GameRegistry.registerBlock(charger, charger.getUnlocalizedName()); //GameRegistry.registerBlock(floodlight, floodlight.getUnlocalizedName()); - + //Decoration Blocks GameRegistry.registerBlock(block_meteor, block_meteor.getUnlocalizedName()); GameRegistry.registerBlock(block_meteor_cobble, block_meteor_cobble.getUnlocalizedName()); @@ -2758,7 +2761,7 @@ public class ModBlocks { register(glyphid_base); register(glyphid_spawner); GameRegistry.registerBlock(moon_turf, moon_turf.getUnlocalizedName()); - + //Waste GameRegistry.registerBlock(waste_earth, waste_earth.getUnlocalizedName()); GameRegistry.registerBlock(waste_mycelium, waste_mycelium.getUnlocalizedName()); @@ -2785,7 +2788,7 @@ public class ModBlocks { GameRegistry.registerBlock(tektite, tektite.getUnlocalizedName()); GameRegistry.registerBlock(ore_tektite_osmiridium, ore_tektite_osmiridium.getUnlocalizedName()); GameRegistry.registerBlock(impact_dirt, impact_dirt.getUnlocalizedName()); - + //RAD register(sellafield_slaked); register(sellafield_bedrock); @@ -2814,7 +2817,7 @@ public class ModBlocks { GameRegistry.registerBlock(nuke_n2, nuke_n2.getUnlocalizedName()); GameRegistry.registerBlock(nuke_fstbmb, nuke_fstbmb.getUnlocalizedName()); GameRegistry.registerBlock(nuke_custom, nuke_custom.getUnlocalizedName()); - + //Generic Bombs GameRegistry.registerBlock(bomb_multi, bomb_multi.getUnlocalizedName()); GameRegistry.registerBlock(crashed_balefire, crashed_balefire.getUnlocalizedName()); @@ -2824,7 +2827,7 @@ public class ModBlocks { GameRegistry.registerBlock(semtex, semtex.getUnlocalizedName()); GameRegistry.registerBlock(c4, c4.getUnlocalizedName()); register(fissure_bomb); - + //Turrets GameRegistry.registerBlock(turret_chekhov, turret_chekhov.getUnlocalizedName()); GameRegistry.registerBlock(turret_friendly, turret_friendly.getUnlocalizedName()); @@ -2840,19 +2843,19 @@ public class ModBlocks { GameRegistry.registerBlock(turret_himars, turret_himars.getUnlocalizedName()); GameRegistry.registerBlock(turret_sentry, turret_sentry.getUnlocalizedName()); GameRegistry.registerBlock(turret_sentry_damaged, turret_sentry_damaged.getUnlocalizedName()); - + //Wall-mounted Explosives GameRegistry.registerBlock(charge_dynamite, ItemBlockBase.class, charge_dynamite.getUnlocalizedName()); GameRegistry.registerBlock(charge_miner, ItemBlockBase.class, charge_miner.getUnlocalizedName()); GameRegistry.registerBlock(charge_c4, ItemBlockBase.class, charge_c4.getUnlocalizedName()); GameRegistry.registerBlock(charge_semtex, ItemBlockBase.class, charge_semtex.getUnlocalizedName()); - + //Mines GameRegistry.registerBlock(mine_ap, mine_ap.getUnlocalizedName()); GameRegistry.registerBlock(mine_he, mine_he.getUnlocalizedName()); GameRegistry.registerBlock(mine_shrap, mine_shrap.getUnlocalizedName()); GameRegistry.registerBlock(mine_fat, mine_fat.getUnlocalizedName()); - + //Block Bombs GameRegistry.registerBlock(flame_war, flame_war.getUnlocalizedName()); GameRegistry.registerBlock(float_bomb, float_bomb.getUnlocalizedName()); @@ -2869,22 +2872,22 @@ public class ModBlocks { GameRegistry.registerBlock(taint_barrel, taint_barrel.getUnlocalizedName()); GameRegistry.registerBlock(yellow_barrel, yellow_barrel.getUnlocalizedName()); GameRegistry.registerBlock(vitrified_barrel, vitrified_barrel.getUnlocalizedName()); - + //Siren GameRegistry.registerBlock(machine_siren, machine_siren.getUnlocalizedName()); - + //This Thing GameRegistry.registerBlock(broadcaster_pc, broadcaster_pc.getUnlocalizedName()); - + //Geiger Counter GameRegistry.registerBlock(geiger, geiger.getUnlocalizedName()); - + //HEV Battery GameRegistry.registerBlock(hev_battery, hev_battery.getUnlocalizedName()); - + //Chainlink Fence GameRegistry.registerBlock(fence_metal, ItemBlockBase.class, fence_metal.getUnlocalizedName()); - + //Sands, Glass GameRegistry.registerBlock(ash_digamma, ash_digamma.getUnlocalizedName()); GameRegistry.registerBlock(sand_boron, sand_boron.getUnlocalizedName()); @@ -2899,12 +2902,12 @@ public class ModBlocks { GameRegistry.registerBlock(glass_polonium, glass_polonium.getUnlocalizedName()); GameRegistry.registerBlock(glass_ash, glass_ash.getUnlocalizedName()); GameRegistry.registerBlock(glass_quartz, glass_quartz.getUnlocalizedName()); - + //Silo Hatch GameRegistry.registerBlock(seal_frame, seal_frame.getUnlocalizedName()); GameRegistry.registerBlock(seal_controller, seal_controller.getUnlocalizedName()); GameRegistry.registerBlock(seal_hatch, seal_hatch.getUnlocalizedName()); - + //Vault Door GameRegistry.registerBlock(vault_door, vault_door.getUnlocalizedName()); GameRegistry.registerBlock(blast_door, blast_door.getUnlocalizedName()); @@ -2926,7 +2929,7 @@ public class ModBlocks { GameRegistry.registerBlock(round_airlock_door, round_airlock_door.getUnlocalizedName()); GameRegistry.registerBlock(sliding_seal_door, sliding_seal_door.getUnlocalizedName()); GameRegistry.registerBlock(water_door, water_door.getUnlocalizedName()); - + //Crates register(crate_iron); register(crate_steel); @@ -2935,15 +2938,15 @@ public class ModBlocks { register(crate_template); register(safe); register(mass_storage); - + //Junk GameRegistry.registerBlock(boxcar, boxcar.getUnlocalizedName()); GameRegistry.registerBlock(boat, boat.getUnlocalizedName()); - + //Machines register(machine_autocrafter); register(machine_funnel); - + register(anvil_iron); register(anvil_lead); register(anvil_steel); @@ -2956,7 +2959,7 @@ public class ModBlocks { register(anvil_dnt); register(anvil_osmiridium); register(anvil_murky); - + GameRegistry.registerBlock(press_preheater, press_preheater.getUnlocalizedName()); GameRegistry.registerBlock(machine_press, machine_press.getUnlocalizedName()); GameRegistry.registerBlock(machine_epress, machine_epress.getUnlocalizedName()); @@ -3056,7 +3059,7 @@ public class ModBlocks { GameRegistry.registerBlock(hadron_access, hadron_access.getUnlocalizedName()); GameRegistry.registerBlock(hadron_core, hadron_core.getUnlocalizedName()); register(hadron_cooler); - + GameRegistry.registerBlock(rbmk_rod, rbmk_rod.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_rod_mod, rbmk_rod_mod.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_rod_reasim, rbmk_rod_reasim.getUnlocalizedName()); @@ -3082,7 +3085,7 @@ public class ModBlocks { GameRegistry.registerBlock(pribris_burning, pribris_burning.getUnlocalizedName()); GameRegistry.registerBlock(pribris_radiating, pribris_radiating.getUnlocalizedName()); GameRegistry.registerBlock(pribris_digamma, pribris_digamma.getUnlocalizedName()); - + GameRegistry.registerBlock(red_cable, red_cable.getUnlocalizedName()); GameRegistry.registerBlock(red_cable_classic, red_cable_classic.getUnlocalizedName()); GameRegistry.registerBlock(red_cable_paintable, red_cable_paintable.getUnlocalizedName()); @@ -3136,7 +3139,7 @@ public class ModBlocks { register(drone_crate_requester); register(fan); register(piston_inserter); - + GameRegistry.registerBlock(chain, chain.getUnlocalizedName()); GameRegistry.registerBlock(ladder_sturdy, ladder_sturdy.getUnlocalizedName()); GameRegistry.registerBlock(ladder_iron, ladder_iron.getUnlocalizedName()); @@ -3148,7 +3151,7 @@ public class ModBlocks { GameRegistry.registerBlock(ladder_steel, ladder_steel.getUnlocalizedName()); GameRegistry.registerBlock(ladder_lead, ladder_lead.getUnlocalizedName()); GameRegistry.registerBlock(ladder_cobalt, ladder_cobalt.getUnlocalizedName()); - + register(barrel_plastic); register(barrel_corroded); register(barrel_iron); @@ -3240,7 +3243,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_forcefield, machine_forcefield.getUnlocalizedName()); GameRegistry.registerBlock(radiorec, radiorec.getUnlocalizedName()); GameRegistry.registerBlock(radiobox, radiobox.getUnlocalizedName()); - + //Multiblock Parts GameRegistry.registerBlock(struct_launcher, struct_launcher.getUnlocalizedName()); GameRegistry.registerBlock(struct_scaffold, struct_scaffold.getUnlocalizedName()); @@ -3251,7 +3254,7 @@ public class ModBlocks { GameRegistry.registerBlock(struct_plasma_core, struct_plasma_core.getUnlocalizedName()); GameRegistry.registerBlock(struct_watz_core, struct_watz_core.getUnlocalizedName()); GameRegistry.registerBlock(struct_icf_core, struct_icf_core.getUnlocalizedName()); - + //Absorbers GameRegistry.registerBlock(absorber, absorber.getUnlocalizedName()); GameRegistry.registerBlock(absorber_red, absorber_red.getUnlocalizedName()); @@ -3259,15 +3262,15 @@ public class ModBlocks { GameRegistry.registerBlock(absorber_pink, absorber_pink.getUnlocalizedName()); GameRegistry.registerBlock(decon, decon.getUnlocalizedName()); GameRegistry.registerBlock(transission_hatch, transission_hatch.getUnlocalizedName()); - + //Solar Tower Blocks GameRegistry.registerBlock(machine_solar_boiler, machine_solar_boiler.getUnlocalizedName()); GameRegistry.registerBlock(solar_mirror, solar_mirror.getUnlocalizedName()); - + //Literal fucking garbage GameRegistry.registerBlock(factory_titanium_hull, factory_titanium_hull.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_hull, factory_advanced_hull.getUnlocalizedName()); - + //CM stuff register(custom_machine, ItemCustomMachine.class); register(cm_block); @@ -3279,7 +3282,7 @@ public class ModBlocks { register(cm_flux); register(cm_heat); register(cm_anchor); - + //PWR register(pwr_fuel); register(pwr_control); @@ -3292,7 +3295,7 @@ public class ModBlocks { register(pwr_port); register(pwr_controller); register(pwr_block); - + //Multiblock Generators register(fusion_conductor); GameRegistry.registerBlock(fusion_center, fusion_center.getUnlocalizedName()); @@ -3308,28 +3311,28 @@ public class ModBlocks { register(watz_end); register(watz); register(watz_pump); - + register(machine_icf_press); register(icf_laser_component); register(icf_controller); register(icf_block); register(icf_component); register(icf); - + //E GameRegistry.registerBlock(balefire, balefire.getUnlocalizedName()); GameRegistry.registerBlock(fire_digamma, fire_digamma.getUnlocalizedName()); GameRegistry.registerBlock(digamma_matter, digamma_matter.getUnlocalizedName()); register(volcano_core); register(volcano_rad_core); - + //Dark Fusion Core GameRegistry.registerBlock(dfc_emitter, dfc_emitter.getUnlocalizedName()); GameRegistry.registerBlock(dfc_injector, dfc_injector.getUnlocalizedName()); GameRegistry.registerBlock(dfc_receiver, dfc_receiver.getUnlocalizedName()); GameRegistry.registerBlock(dfc_stabilizer, dfc_stabilizer.getUnlocalizedName()); GameRegistry.registerBlock(dfc_core, dfc_core.getUnlocalizedName()); - + //Missile Blocks GameRegistry.registerBlock(machine_missile_assembly, machine_missile_assembly.getUnlocalizedName()); GameRegistry.registerBlock(launch_pad, launch_pad.getUnlocalizedName()); @@ -3343,10 +3346,10 @@ public class ModBlocks { GameRegistry.registerBlock(machine_radar, machine_radar.getUnlocalizedName()); GameRegistry.registerBlock(machine_radar_large, machine_radar_large.getUnlocalizedName()); GameRegistry.registerBlock(radar_screen, radar_screen.getUnlocalizedName()); - + //Guide GameRegistry.registerBlock(book_guide, book_guide.getUnlocalizedName()); - + //Sat Blocks GameRegistry.registerBlock(sat_mapper, sat_mapper.getUnlocalizedName()); GameRegistry.registerBlock(sat_scanner, sat_scanner.getUnlocalizedName()); @@ -3354,7 +3357,7 @@ public class ModBlocks { GameRegistry.registerBlock(sat_laser, sat_laser.getUnlocalizedName()); GameRegistry.registerBlock(sat_foeq, sat_foeq.getUnlocalizedName()); GameRegistry.registerBlock(sat_resonator, sat_resonator.getUnlocalizedName()); - + //Rails GameRegistry.registerBlock(rail_wood, ItemBlockBase.class, rail_wood.getUnlocalizedName()); GameRegistry.registerBlock(rail_narrow, ItemBlockBase.class, rail_narrow.getUnlocalizedName()); @@ -3371,7 +3374,7 @@ public class ModBlocks { register(rail_large_buffer); register(rail_large_switch); register(rail_large_switch_flipped); - + //Crate GameRegistry.registerBlock(crate, crate.getUnlocalizedName()); GameRegistry.registerBlock(crate_weapon, crate_weapon.getUnlocalizedName()); @@ -3381,13 +3384,13 @@ public class ModBlocks { GameRegistry.registerBlock(crate_can, crate_can.getUnlocalizedName()); GameRegistry.registerBlock(crate_ammo, crate_ammo.getUnlocalizedName()); GameRegistry.registerBlock(crate_jungle, crate_jungle.getUnlocalizedName()); - + //ElB GameRegistry.registerBlock(statue_elb, statue_elb.getUnlocalizedName()); GameRegistry.registerBlock(statue_elb_g, statue_elb_g.getUnlocalizedName()); GameRegistry.registerBlock(statue_elb_w, statue_elb_w.getUnlocalizedName()); GameRegistry.registerBlock(statue_elb_f, statue_elb_f.getUnlocalizedName()); - + //Fluids GameRegistry.registerBlock(mud_block, mud_block.getUnlocalizedName()); GameRegistry.registerBlock(acid_block, acid_block.getUnlocalizedName()); @@ -3398,7 +3401,7 @@ public class ModBlocks { GameRegistry.registerBlock(rad_lava_block, rad_lava_block.getUnlocalizedName()); GameRegistry.registerBlock(sulfuric_acid_block, sulfuric_acid_block.getUnlocalizedName()); //GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); - + //Multiblock Dummy Blocks GameRegistry.registerBlock(dummy_block_vault, dummy_block_vault.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_blast, dummy_block_blast.getUnlocalizedName()); @@ -3407,7 +3410,7 @@ public class ModBlocks { GameRegistry.registerBlock(dummy_plate_launch_table, dummy_plate_launch_table.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_launch_table, dummy_port_launch_table.getUnlocalizedName()); GameRegistry.registerBlock(dummy_plate_cargo, dummy_plate_cargo.getUnlocalizedName()); - + //Other Technical Blocks GameRegistry.registerBlock(oil_pipe, oil_pipe.getUnlocalizedName()); GameRegistry.registerBlock(vent_chlorine, vent_chlorine.getUnlocalizedName()); @@ -3425,7 +3428,7 @@ public class ModBlocks { GameRegistry.registerBlock(gas_flammable, gas_flammable.getUnlocalizedName()); GameRegistry.registerBlock(gas_explosive, gas_explosive.getUnlocalizedName()); GameRegistry.registerBlock(vacuum, vacuum.getUnlocalizedName()); - + //??? GameRegistry.registerBlock(crystal_virus, crystal_virus.getUnlocalizedName()); GameRegistry.registerBlock(crystal_hardened, crystal_hardened.getUnlocalizedName()); @@ -3440,15 +3443,15 @@ public class ModBlocks { GameRegistry.registerBlock(pink_double_slab, pink_double_slab.getUnlocalizedName()); GameRegistry.registerBlock(pink_stairs, pink_stairs.getUnlocalizedName()); } - + private static void register(Block b) { GameRegistry.registerBlock(b, ItemBlockBase.class, b.getUnlocalizedName()); } - + private static void register(Block b, Class clazz) { GameRegistry.registerBlock(b, clazz, b.getUnlocalizedName()); } - + public static void addRemap(String unloc, Block block, int meta) { Block remap = new BlockRemap(block, meta).setBlockName(unloc); register(remap, ItemBlockRemap.class); diff --git a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java index 365343e26..af2b35e7f 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java @@ -5,7 +5,6 @@ import java.util.List; import com.hbm.blocks.ITooltipProvider; import com.hbm.packet.PacketDispatcher; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IToolable; @@ -104,7 +103,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP return false; } - public static class TileEntityEmitter extends TileEntityLoadedBase implements IBufPacketReceiver { + public static class TileEntityEmitter extends TileEntityLoadedBase { public static final int range = 100; public int color; @@ -177,7 +176,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP } } - sendStandard(150); + networkPackNT(150); } } diff --git a/src/main/java/com/hbm/blocks/machine/BlockICFLaserComponent.java b/src/main/java/com/hbm/blocks/machine/BlockICFLaserComponent.java index 5685fee9a..28161bb09 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockICFLaserComponent.java +++ b/src/main/java/com/hbm/blocks/machine/BlockICFLaserComponent.java @@ -2,7 +2,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockEnumMulti; import com.hbm.lib.RefStrings; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; @@ -10,7 +9,7 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; public class BlockICFLaserComponent extends BlockEnumMulti { - + protected IIcon[] iconsTop; public BlockICFLaserComponent() { @@ -20,7 +19,7 @@ public class BlockICFLaserComponent extends BlockEnumMulti { @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { - + Enum[] enums = theEnum.getEnumConstants(); this.icons = new IIcon[enums.length]; this.iconsTop = new IIcon[enums.length]; @@ -33,7 +32,7 @@ public class BlockICFLaserComponent extends BlockEnumMulti { this.icons[5] = reg.registerIcon(RefStrings.MODID + ":icf_turbocharger"); this.iconsTop[4] = this.iconsTop[5] = reg.registerIcon(RefStrings.MODID + ":icf_capacitor_top"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { @@ -44,7 +43,7 @@ public class BlockICFLaserComponent extends BlockEnumMulti { public int getSubCount() { return EnumICFPart.values().length; } - + public static enum EnumICFPart { CASING, PORT, diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java b/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java index 18ae7e8d8..005858260 100644 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java +++ b/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java @@ -4,7 +4,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.TileEntityMachineAssembler; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,7 +25,7 @@ public class DummyBlockAssembler extends DummyOldBase { { return Item.getItemFromBlock(ModBlocks.machine_assembler); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -39,7 +38,7 @@ public class DummyBlockAssembler extends DummyOldBase { int a = ((TileEntityDummy)te).targetX; int b = ((TileEntityDummy)te).targetY; int c = ((TileEntityDummy)te).targetZ; - + TileEntityMachineAssembler entity = (TileEntityMachineAssembler) world.getTileEntity(a, b, c); if(entity != null) { diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockRefinery.java b/src/main/java/com/hbm/blocks/machine/DummyBlockRefinery.java index fbd2c14d1..1230880dd 100644 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockRefinery.java +++ b/src/main/java/com/hbm/blocks/machine/DummyBlockRefinery.java @@ -4,7 +4,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.oil.TileEntityMachineRefinery; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,7 +25,7 @@ public class DummyBlockRefinery extends DummyOldBase { { return Item.getItemFromBlock(ModBlocks.machine_refinery); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -39,7 +38,7 @@ public class DummyBlockRefinery extends DummyOldBase { int a = ((TileEntityDummy)te).targetX; int b = ((TileEntityDummy)te).targetY; int c = ((TileEntityDummy)te).targetZ; - + TileEntityMachineRefinery entity = (TileEntityMachineRefinery) world.getTileEntity(a, b, c); if(entity != null) { diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockTurbofan.java b/src/main/java/com/hbm/blocks/machine/DummyBlockTurbofan.java index ecbdf99e1..071b7a529 100644 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockTurbofan.java +++ b/src/main/java/com/hbm/blocks/machine/DummyBlockTurbofan.java @@ -4,7 +4,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.TileEntityMachineTurbofan; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,7 +25,7 @@ public class DummyBlockTurbofan extends DummyOldBase { { return Item.getItemFromBlock(ModBlocks.machine_turbofan); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -39,7 +38,7 @@ public class DummyBlockTurbofan extends DummyOldBase { int a = ((TileEntityDummy)te).targetX; int b = ((TileEntityDummy)te).targetY; int c = ((TileEntityDummy)te).targetZ; - + TileEntityMachineTurbofan entity = (TileEntityMachineTurbofan) world.getTileEntity(a, b, c); if(entity != null) { diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index 661bab7cd..380d4f4bf 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -1,9 +1,7 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - +import api.hbm.block.ICrucibleAcceptor; +import api.hbm.block.IToolable; import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ModItems; @@ -12,9 +10,6 @@ import com.hbm.items.machine.ItemMold.Mold; import com.hbm.items.machine.ItemScraps; import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.util.I18nUtil; - -import api.hbm.block.ICrucibleAcceptor; -import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -30,6 +25,10 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public abstract class FoundryCastingBase extends BlockContainer implements ICrucibleAcceptor, IToolable, ILookOverlay { protected FoundryCastingBase() { @@ -55,30 +54,30 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); } - + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { return true; } - + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); - + //remove casted item if(cast.slots[1] != null) { if(!player.inventory.addItemStackToInventory(cast.slots[1].copy())) { @@ -87,17 +86,17 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc } else { player.inventoryContainer.detectAndSendChanges(); } - + cast.slots[1] = null; cast.markDirty(); world.markBlockForUpdate(x, y, z); return true; } - + //insert mold if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.mold && cast.slots[0] == null) { Mold mold = ((ItemMold) player.getHeldItem().getItem()).getMold(player.getHeldItem()); - + if(mold.size == cast.getMoldSize()) { cast.slots[0] = player.getHeldItem().copy(); cast.slots[0].stackSize = 1; @@ -108,7 +107,7 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc return true; } } - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { if(cast.amount > 0) { ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); @@ -125,13 +124,13 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc } return true; } - + return false; } @Override public void breakBlock(World world, int x, int y, int z, Block b, int i) { - + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); if(cast.amount > 0) { ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); @@ -139,14 +138,14 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc world.spawnEntityInWorld(item); cast.amount = 0; //just for safety } - + for(ItemStack stack : cast.slots) { if(stack != null) { EntityItem drop = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, stack.copy()); world.spawnEntityInWorld(drop); } } - + super.breakBlock(world, x, y, z, b, i); } @@ -154,7 +153,7 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random rand) { super.randomDisplayTick(world, x, y, z, rand); - + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); if(cast.amount > 0 && cast.amount >= cast.getCapacity()) { @@ -164,28 +163,28 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - + if(tool != ToolType.SCREWDRIVER) return false; - + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); - + if(cast.slots[0] == null) return false; if(cast.amount > 0) return false; - + if(!player.inventory.addItemStackToInventory(cast.slots[0].copy())) { EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[0].copy()); world.spawnEntityInWorld(item); } else { player.inventoryContainer.detectAndSendChanges(); } - + cast.markDirty(); world.markBlockForUpdate(x, y, z); - + cast.slots[0] = null; cast.markDirty(); - + return true; } @@ -193,18 +192,18 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc public void printHook(Pre event, World world, int x, int y, int z) { TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); List text = new ArrayList(); - + if(cast.slots[0] == null) { text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); } else if(cast.slots[0].getItem() == ModItems.mold){ Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); text.add(EnumChatFormatting.BLUE + mold.getTitle()); } - + if(cast.type != null && cast.amount > 0) { text.add(EnumChatFormatting.YELLOW + cast.type.names[0] + ": " + cast.amount + " / " + cast.getCapacity()); } - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); } } diff --git a/src/main/java/com/hbm/blocks/machine/FurnaceCombination.java b/src/main/java/com/hbm/blocks/machine/FurnaceCombination.java index 83e4b5ce9..4ce96d14d 100644 --- a/src/main/java/com/hbm/blocks/machine/FurnaceCombination.java +++ b/src/main/java/com/hbm/blocks/machine/FurnaceCombination.java @@ -1,18 +1,17 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityFurnaceCombination; - 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 java.util.List; + public class FurnaceCombination extends BlockDummyable implements ITooltipProvider { public FurnaceCombination() { @@ -25,7 +24,7 @@ public class FurnaceCombination extends BlockDummyable implements ITooltipProvid return new TileEntityFurnaceCombination(); return new TileEntityProxyCombo().inventory().fluid(); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); diff --git a/src/main/java/com/hbm/blocks/machine/MachineArcFurnaceLarge.java b/src/main/java/com/hbm/blocks/machine/MachineArcFurnaceLarge.java index 1acdd1a10..43a767a9b 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/blocks/machine/MachineArcFurnaceLarge.java @@ -7,7 +7,6 @@ import com.hbm.items.machine.ItemScraps; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; @@ -52,11 +51,11 @@ public class MachineArcFurnaceLarge extends BlockDummyable { public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y, z + dir.offsetZ * o, new int[] {4, 0, 3, -2, 1, 1}, this, dir); - + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); x += dir.offsetX * o; z += dir.offsetZ * o; - + this.makeExtra(world, x + dir.offsetX * 2 + rot.offsetX, y, z + dir.offsetZ * 2 + rot.offsetZ); this.makeExtra(world, x + dir.offsetX * 2 - rot.offsetX, y, z + dir.offsetZ * 2 - rot.offsetZ); this.makeExtra(world, x + rot.offsetX * 2 + dir.offsetX, y, z + rot.offsetZ * 2 + dir.offsetZ); @@ -64,10 +63,10 @@ public class MachineArcFurnaceLarge extends BlockDummyable { this.makeExtra(world, x - rot.offsetX * 2 + dir.offsetX, y, z - rot.offsetZ * 2 + dir.offsetZ); this.makeExtra(world, x - rot.offsetX * 2 - dir.offsetX, y, z - rot.offsetZ * 2 - dir.offsetZ); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { @@ -77,7 +76,7 @@ public class MachineArcFurnaceLarge extends BlockDummyable { return false; if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { TileEntityMachineArcFurnaceLarge crucible = (TileEntityMachineArcFurnaceLarge) world.getTileEntity(pos[0], pos[1], pos[2]); - + for(MaterialStack stack : crucible.liquids) { ItemStack scrap = ItemScraps.create(new MaterialStack(stack.material, stack.amount)); if(!player.inventory.addItemStackToInventory(scrap)) { @@ -85,11 +84,11 @@ public class MachineArcFurnaceLarge extends BlockDummyable { world.spawnEntityInWorld(item); } } - + player.inventoryContainer.detectAndSendChanges(); crucible.liquids.clear(); crucible.markDirty(); - + } else { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); } diff --git a/src/main/java/com/hbm/blocks/machine/MachineAutocrafter.java b/src/main/java/com/hbm/blocks/machine/MachineAutocrafter.java index 1c922fab5..7cfde7611 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineAutocrafter.java +++ b/src/main/java/com/hbm/blocks/machine/MachineAutocrafter.java @@ -1,11 +1,8 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,6 +19,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.Random; + public class MachineAutocrafter extends BlockContainer { @SideOnly(Side.CLIENT) private IIcon iconTop; @@ -72,7 +71,7 @@ public class MachineAutocrafter extends BlockContainer { ISidedInventory tile = (ISidedInventory) world.getTileEntity(x, y, z); if(tile != null) { - + for(int i1 = 10; i1 < tile.getSizeInventory(); ++i1) { ItemStack itemstack = tile.getStackInSlot(i1); diff --git a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java index 32ba803a3..bb8759c0d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java @@ -1,8 +1,5 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.handler.MultiblockHandlerXR; @@ -14,7 +11,6 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.storage.TileEntityMachineBAT9000; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -28,6 +24,9 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class MachineBigAssTank9000 extends BlockDummyable implements IPersistentInfoProvider { public MachineBigAssTank9000(Material mat) { @@ -36,7 +35,7 @@ public class MachineBigAssTank9000 extends BlockDummyable implements IPersistent @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineBAT9000(); if(meta >= 6) return new TileEntityProxyCombo(false, false, true); return null; @@ -74,22 +73,22 @@ public class MachineBigAssTank9000 extends BlockDummyable implements IPersistent if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, getDimensions(), x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {4, 0, 1, 1, 2, -2}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {4, 0, 1, 1, -2, 2}, x, y, z, dir)) return false; - + return true; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); //we can do this because nobody is stopping me from doing this return true; } else if(player.isSneaking()){ @@ -97,9 +96,9 @@ public class MachineBigAssTank9000 extends BlockDummyable implements IPersistent if(pos == null) return false; - + TileEntityMachineBAT9000 trialEntity = (TileEntityMachineBAT9000) world.getTileEntity(pos[0], pos[1], pos[2]); - + if(trialEntity != null) { if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, pos[0], pos[1], pos[2], player.getHeldItem()); @@ -115,7 +114,7 @@ public class MachineBigAssTank9000 extends BlockDummyable implements IPersistent return true; } } - + @Override public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { return IPersistentNBT.getDrops(world, x, y, z, this); @@ -130,19 +129,19 @@ public class MachineBigAssTank9000 extends BlockDummyable implements IPersistent public int getComparatorInputOverride(World world, int x, int y, int z, int side) { int meta = world.getBlockMetadata(x, y, z); - + if(meta >= 6) { int[] pos = this.findCore(world, x, y, z); if(pos == null) return 0; TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityMachineBAT9000)) return 0; - + TileEntityMachineBAT9000 tank = (TileEntityMachineBAT9000) te; return tank.getComparatorPower(); } - + return 0; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineBrickFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineBrickFurnace.java index 48054e36e..f4164f964 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBrickFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBrickFurnace.java @@ -1,13 +1,10 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityFurnaceBrick; import com.hbm.util.ItemStackUtil; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,6 +21,8 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class MachineBrickFurnace extends BlockContainer { private final Random rand = new Random(); @@ -38,7 +37,7 @@ public class MachineBrickFurnace extends BlockContainer { super(Material.iron); isActive = blockState; } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -47,7 +46,7 @@ public class MachineBrickFurnace extends BlockContainer { this.iconFront = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_furnace_brick_front_on" : ":machine_furnace_brick_front_off")); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_furnace_brick_side"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -64,31 +63,31 @@ public class MachineBrickFurnace extends BlockContainer { public Item getItem(World world, int x, int y, int z) { return Item.getItemFromBlock(ModBlocks.machine_furnace_brick_off); } - + @Override public void onBlockAdded(World world, int x, int y, int z) { super.onBlockAdded(world, x, y, z); this.setDefaultDirection(world, x, y, z); } - + private void setDefaultDirection(World world, int x, int y, int z) { if(!world.isRemote) { Block nZ = world.getBlock(x, y, z - 1); Block pZ = world.getBlock(x, y, z + 1); Block nX = world.getBlock(x - 1, y, z); Block pX = world.getBlock(x + 1, y, z); - + byte meta = 3; - + if(nZ.func_149730_j() && !pZ.func_149730_j()) meta = 3; if(pZ.func_149730_j() && !nZ.func_149730_j()) meta = 2; if(nX.func_149730_j() && !pX.func_149730_j()) meta = 5; if(pX.func_149730_j() && !nX.func_149730_j()) meta = 4; - + world.setBlockMetadataWithNotify(x, y, z, meta, 2); } } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; @@ -96,10 +95,10 @@ public class MachineBrickFurnace extends BlockContainer { if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); - + if(itemStack.hasDisplayName()) ((TileEntityFurnaceBrick)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { @@ -119,22 +118,22 @@ public class MachineBrickFurnace extends BlockContainer { int i = world.getBlockMetadata(x, y, z); TileEntity entity = world.getTileEntity(x, y, z); keepInventory = true; - + if(isProcessing) { world.setBlock(x, y, z, ModBlocks.machine_furnace_brick_on); } else { world.setBlock(x, y, z, ModBlocks.machine_furnace_brick_off); } - + keepInventory = false; world.setBlockMetadataWithNotify(x, y, z, i, 2); - + if(entity != null) { entity.validate(); world.setTileEntity(x, y, z, entity); } } - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { if(!keepInventory) ItemStackUtil.spillItems(world, x, y, z, block, rand); diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index fd525f9f6..85bbf4b60 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -10,7 +10,6 @@ import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; @@ -45,7 +44,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP @SideOnly(Side.CLIENT) public IIcon iconBottom; @SideOnly(Side.CLIENT) public IIcon iconInnerTop; @SideOnly(Side.CLIENT) public IIcon iconInnerSide; - + protected long power; String name; @@ -54,7 +53,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP this.power = power; this.name = name; } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -84,23 +83,23 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityCapacitor)) return; - + TileEntityCapacitor battery = (TileEntityCapacitor) te; List text = new ArrayList(); text.add(BobMathUtil.getShortNumber(battery.getPower()) + " / " + BobMathUtil.getShortNumber(battery.getMaxPower()) + "HE"); - + double percent = (double) battery.getPower() / (double) battery.getMaxPower(); int charge = (int) Math.floor(percent * 10_000D); int color = ((int) (0xFF - 0xFF * percent)) << 16 | ((int)(0xFF * percent) << 8); text.add("&[" + color + "&]" + (charge / 100D) + "%"); text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + "+" + BobMathUtil.getShortNumber(battery.powerReceived) + "HE/t"); text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + "-" + BobMathUtil.getShortNumber(battery.powerSent) + "HE/t"); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -114,7 +113,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { for(String s : I18nUtil.resolveKeyArray("tile.capacitor.desc")) list.add(EnumChatFormatting.YELLOW + s); } else { @@ -123,7 +122,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "> to display more info"); } } - + @Override public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { return IPersistentNBT.getDrops(world, x, y, z, this); @@ -136,67 +135,67 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP @Override public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { - + if(!player.capabilities.isCreativeMode) { harvesters.set(player); this.dropBlockAsItem(world, x, y, z, meta, 0); harvesters.set(null); } } - + @Override public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } - public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IBufPacketReceiver, IPersistentNBT { - + public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT { + public long power; protected long maxPower; public long powerReceived; public long powerSent; - + public TileEntityCapacitor() { } - + public TileEntityCapacitor(long maxPower) { this.maxPower = maxPower; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + ForgeDirection opp = ForgeDirection.getOrientation(this.getBlockMetadata()); ForgeDirection dir = opp.getOpposite(); - + BlockPos pos = new BlockPos(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - + boolean didStep = false; ForgeDirection last = null; - + while(worldObj.getBlock(pos.getX(), pos.getY(), pos.getZ()) == ModBlocks.capacitor_bus) { ForgeDirection current = ForgeDirection.getOrientation(worldObj.getBlockMetadata(pos.getX(), pos.getY(), pos.getZ())); if(!didStep) last = current; didStep = true; - + if(last != current) { pos = null; break; } - + pos = pos.offset(current); } - + if(pos != null && last != null) { this.tryUnsubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ()); this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), last); } - + this.trySubscribe(worldObj, xCoord + opp.offsetX, yCoord + opp.offsetY, zCoord + opp.offsetZ, opp); - sendStandard(15); + networkPackNT(15); this.powerSent = 0; this.powerReceived = 0; @@ -210,7 +209,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP buf.writeLong(powerReceived); buf.writeLong(powerSent); } - + @Override public void deserialize(ByteBuf buf) { power = buf.readLong(); @@ -232,7 +231,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP this.setPower(this.getMaxPower()); return overshoot; } - + @Override public void usePower(long power) { this.powerSent += Math.min(this.getPower(), power); @@ -252,7 +251,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP @Override public long getProviderSpeed() { return this.getMaxPower() / 300; } - + @Override public long getReceiverSpeed() { return this.getMaxPower() / 100; } @@ -266,7 +265,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP public void setPower(long power) { this.power = power; } - + @Override public boolean canConnect(ForgeDirection dir) { return dir == ForgeDirection.getOrientation(this.getBlockMetadata()); @@ -286,14 +285,14 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP this.power = data.getLong("power"); this.maxPower = data.getLong("maxPower"); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.power = nbt.getLong("power"); this.maxPower = nbt.getLong("maxPower"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java index dade916fa..1dcac8474 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java @@ -1,11 +1,8 @@ package com.hbm.blocks.machine; -import java.util.List; - +import api.hbm.energymk2.IEnergyConnectorBlock; import com.hbm.blocks.ITooltipProvider; import com.hbm.lib.RefStrings; - -import api.hbm.energymk2.IEnergyConnectorBlock; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -20,8 +17,10 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineCapacitorBus extends Block implements IEnergyConnectorBlock, ITooltipProvider { - + @SideOnly(Side.CLIENT) private IIcon topIcon; public MachineCapacitorBus(Material mat) { @@ -38,7 +37,7 @@ public class MachineCapacitorBus extends Block implements IEnergyConnectorBlock, public IIcon getIcon(int side, int meta) { return side == meta ? topIcon : blockIcon; } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int l = BlockPistonBase.determineOrientation(world, x, y, z, player); diff --git a/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java b/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java index c8d9bd49d..dd10cb3d1 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java @@ -1,8 +1,5 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.handler.MultiblockHandlerXR; @@ -11,7 +8,6 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.oil.TileEntityMachineCatalyticCracker; import com.hbm.util.I18nUtil; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -23,6 +19,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class MachineCatalyticCracker extends BlockDummyable implements ILookOverlay { public MachineCatalyticCracker(Material mat) { @@ -31,12 +30,12 @@ public class MachineCatalyticCracker extends BlockDummyable implements ILookOver @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineCatalyticCracker(); if(meta >= extra) return new TileEntityProxyCombo(false, false, true); - + return null; } @@ -49,33 +48,33 @@ public class MachineCatalyticCracker extends BlockDummyable implements ILookOver public int getOffset() { return 3; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(!world.isRemote && !player.isSneaking()) { - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityMachineCatalyticCracker)) return false; - + TileEntityMachineCatalyticCracker cracker = (TileEntityMachineCatalyticCracker) te; FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, pos[0], pos[1], pos[2], player.getHeldItem()); cracker.tanks[0].setTankType(type); cracker.markDirty(); player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation(type.getConditionalName())).appendSibling(new ChatComponentText("!"))); - + return true; } return false; - + } else { return true; } @@ -98,7 +97,7 @@ public class MachineCatalyticCracker extends BlockDummyable implements ILookOver MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{13, 0, 0, 3, 2, 1}, this, dir); MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{14, -13, -1, 2, 1, 0}, this, dir); MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{3, -1, 2, 3, -1, 3}, this, dir); - + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); this.makeExtra(world, x + dir.offsetX * o + dir.offsetX * 3 + rot.offsetX, y + dir.offsetY * o, z + dir.offsetZ * o + dir.offsetZ * 3 + rot.offsetZ); @@ -115,22 +114,22 @@ public class MachineCatalyticCracker extends BlockDummyable implements ILookOver @Override public void printHook(Pre event, World world, int x, int y, int z) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityMachineCatalyticCracker)) return; - + TileEntityMachineCatalyticCracker cracker = (TileEntityMachineCatalyticCracker) te; - + List text = new ArrayList(); for(int i = 0; i < cracker.tanks.length; i++) text.add((i < 2 ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + cracker.tanks[i].getTankType().getLocalizedName() + ": " + cracker.tanks[i].getFill() + "/" + cracker.tanks[i].getMaxFill() + "mB"); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java b/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java index 80c9f2aef..b8401426a 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java @@ -1,7 +1,5 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.handler.MultiblockHandlerXR; @@ -9,7 +7,6 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.oil.TileEntityMachineCatalyticReformer; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -19,6 +16,8 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineCatalyticReformer extends BlockDummyable implements IPersistentInfoProvider { public MachineCatalyticReformer(Material mat) { @@ -31,7 +30,7 @@ public class MachineCatalyticReformer extends BlockDummyable implements IPersist if(meta >= 6) return new TileEntityProxyCombo().fluid().power(); 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); @@ -49,7 +48,7 @@ public class MachineCatalyticReformer extends BlockDummyable implements IPersist super.fillSpace(world, x, y, z, dir, o); MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {3, -3, 1, 0, -1, 2}, this, dir); MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {6, -3, 1, 1, 2, 0}, this, dir); - + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); this.makeExtra(world, x - dir.offsetX + 1, y, z - dir.offsetZ + 1); @@ -72,7 +71,7 @@ public class MachineCatalyticReformer extends BlockDummyable implements IPersist @Override public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { - + for(int i = 0; i < 4; i++) { FluidTank tank = new FluidTank(Fluids.NONE, 0); tank.readFromNBT(persistentTag, "" + i); diff --git a/src/main/java/com/hbm/blocks/machine/MachineChimneyBrick.java b/src/main/java/com/hbm/blocks/machine/MachineChimneyBrick.java index 7c8f40bc2..f227488c4 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineChimneyBrick.java +++ b/src/main/java/com/hbm/blocks/machine/MachineChimneyBrick.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityChimneyBrick; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -14,6 +11,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineChimneyBrick extends BlockDummyable implements ITooltipProvider { public MachineChimneyBrick(Material mat) { @@ -22,7 +21,7 @@ public class MachineChimneyBrick extends BlockDummyable implements ITooltipProvi @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityChimneyBrick(); if(meta >= 6) return new TileEntityProxyCombo().fluid(); return null; diff --git a/src/main/java/com/hbm/blocks/machine/MachineChimneyIndustrial.java b/src/main/java/com/hbm/blocks/machine/MachineChimneyIndustrial.java index 036273535..f32078e16 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineChimneyIndustrial.java +++ b/src/main/java/com/hbm/blocks/machine/MachineChimneyIndustrial.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityChimneyIndustrial; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -14,6 +11,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineChimneyIndustrial extends BlockDummyable implements ITooltipProvider { public MachineChimneyIndustrial(Material mat) { @@ -22,7 +21,7 @@ public class MachineChimneyIndustrial extends BlockDummyable implements ITooltip @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityChimneyIndustrial(); if(meta >= 6) return new TileEntityProxyCombo().fluid(); return null; diff --git a/src/main/java/com/hbm/blocks/machine/MachineCombustionEngine.java b/src/main/java/com/hbm/blocks/machine/MachineCombustionEngine.java index 162841266..47a7f1f27 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCombustionEngine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCombustionEngine.java @@ -3,7 +3,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineCombustionEngine; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -34,15 +33,15 @@ public class MachineCombustionEngine extends BlockDummyable { public int getOffset() { return 0; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 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 + rot.offsetX, y, z + rot.offsetZ); diff --git a/src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java b/src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java index 842c084b7..e4918fc42 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java @@ -1,15 +1,11 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityCondenserPowered; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; - import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; @@ -17,6 +13,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class MachineCondenserPowered extends BlockDummyable implements ILookOverlay { public MachineCondenserPowered(Material mat) { @@ -43,7 +42,7 @@ public class MachineCondenserPowered extends BlockDummyable implements ILookOver @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - + x = x + dir.offsetX * o; z = z + dir.offsetZ * o; @@ -70,7 +69,7 @@ public class MachineCondenserPowered extends BlockDummyable implements ILookOver TileEntityCondenserPowered tower = (TileEntityCondenserPowered) te; List text = new ArrayList(); - + text.add(BobMathUtil.getShortNumber(tower.power) + "HE / " + BobMathUtil.getShortNumber(tower.maxPower) + "HE"); for(int i = 0; i < tower.tanks.length; i++) diff --git a/src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java b/src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java index 1bddf1a9d..396ee0702 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java @@ -1,8 +1,7 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - +import api.hbm.block.IToolable; +import api.hbm.conveyor.IConveyorBelt; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; @@ -10,9 +9,6 @@ import com.hbm.items.machine.ItemStamp; import com.hbm.tileentity.machine.TileEntityConveyorPress; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; - -import api.hbm.block.IToolable; -import api.hbm.conveyor.IConveyorBelt; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -25,6 +21,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class MachineConveyorPress extends BlockDummyable implements IConveyorBelt, ILookOverlay, IToolable, ITooltipProvider { public MachineConveyorPress(Material mat) { @@ -46,25 +45,25 @@ public class MachineConveyorPress extends BlockDummyable implements IConveyorBel public int getOffset() { return 0; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { return true; } else { - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityConveyorPress)) return false; - + TileEntityConveyorPress press = (TileEntityConveyorPress) te; - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemStamp && press.slots[0] == null) { press.slots[0] = player.getHeldItem().copy(); press.slots[0].stackSize = 1; @@ -75,39 +74,39 @@ public class MachineConveyorPress extends BlockDummyable implements IConveyorBel return true; } } - + return false; } @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - + if(tool != ToolType.SCREWDRIVER) return false; - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityConveyorPress)) return false; - + TileEntityConveyorPress press = (TileEntityConveyorPress) te; - + if(press.slots[0] == null) return false; - + if(!player.inventory.addItemStackToInventory(press.slots[0].copy())) { EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, press.slots[0].copy()); world.spawnEntityInWorld(item); } else { player.inventoryContainer.detectAndSendChanges(); } - + press.slots[0] = null; press.markChanged(); - + return true; } @@ -121,7 +120,7 @@ public class MachineConveyorPress extends BlockDummyable implements IConveyorBel Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); return ret; } - + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { int meta = world.getBlockMetadata(x, y - 1, z) - offset; return ForgeDirection.getOrientation(meta).getRotation(ForgeDirection.UP); @@ -148,21 +147,21 @@ public class MachineConveyorPress extends BlockDummyable implements IConveyorBel @Override public void printHook(Pre event, World world, int x, int y, int z) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityConveyorPress)) return; - + TileEntityConveyorPress press = (TileEntityConveyorPress) te; List text = new ArrayList(); text.add(BobMathUtil.getShortNumber(press.power) + "HE / " + BobMathUtil.getShortNumber(press.maxPower) + "HE"); text.add("Installed stamp: " + ((press.syncStack == null || press.syncStack.getItem() == null) ? (EnumChatFormatting.RED + "NONE") : press.syncStack.getDisplayName())); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrystallizer.java b/src/main/java/com/hbm/blocks/machine/MachineCrystallizer.java index 25012acf8..29ed20388 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrystallizer.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrystallizer.java @@ -4,7 +4,6 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineCrystallizer; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -16,7 +15,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class MachineCrystallizer extends BlockDummyable { - + @SideOnly(Side.CLIENT) private IIcon iconTop; @@ -30,7 +29,7 @@ public class MachineCrystallizer extends BlockDummyable { if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { @@ -60,7 +59,7 @@ public class MachineCrystallizer extends BlockDummyable { public int getOffset() { return 1; } - + protected void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/MachineDeuteriumExtractor.java b/src/main/java/com/hbm/blocks/machine/MachineDeuteriumExtractor.java index 08c921a35..ba472e1d2 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDeuteriumExtractor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDeuteriumExtractor.java @@ -1,14 +1,10 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityDeuteriumExtractor; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; @@ -20,6 +16,9 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; + public class MachineDeuteriumExtractor extends BlockContainer implements ILookOverlay { public MachineDeuteriumExtractor(Material mat) { @@ -54,20 +53,20 @@ public class MachineDeuteriumExtractor extends BlockContainer implements ILookOv @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityDeuteriumExtractor)) return; - + TileEntityDeuteriumExtractor extractor = (TileEntityDeuteriumExtractor) te; - + List text = new ArrayList(); text.add((extractor.power < extractor.getMaxPower() / 20 ? EnumChatFormatting.RED : EnumChatFormatting.GREEN) + "Power: " + BobMathUtil.getShortNumber(extractor.power) + "HE"); for(int i = 0; i < extractor.tanks.length; i++) text.add((i < 1 ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + extractor.tanks[i].getTankType().getLocalizedName() + ": " + extractor.tanks[i].getFill() + "/" + extractor.tanks[i].getMaxFill() + "mB"); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceExtension.java b/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceExtension.java index 7d67a92b5..74dd3595e 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceExtension.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceExtension.java @@ -6,7 +6,6 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityDiFurnace; import com.hbm.util.Compat; - import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -20,7 +19,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; public class MachineDiFurnaceExtension extends BlockContainer implements IProxyController { - + @SideOnly(Side.CLIENT) private IIcon iconTop; @SideOnly(Side.CLIENT) private IIcon iconBottom; @@ -32,7 +31,7 @@ public class MachineDiFurnaceExtension extends BlockContainer implements IProxyC public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityProxyCombo().inventory().fluid(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -40,7 +39,7 @@ public class MachineDiFurnaceExtension extends BlockContainer implements IProxyC this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":difurnace_extension"); this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":brick_fire"); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(!player.isSneaking()) { @@ -52,7 +51,7 @@ public class MachineDiFurnaceExtension extends BlockContainer implements IProxyC } return false; } - + @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { return side == 0 ? this.iconBottom : side == 1 ? this.iconTop : this.blockIcon; diff --git a/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceRTG.java b/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceRTG.java index a90699da4..a8f929c81 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceRTG.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDiFurnaceRTG.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDiFurnaceRTG; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,8 +22,10 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class MachineDiFurnaceRTG extends BlockContainer { - + private final Random rand = new Random(); private final boolean isActive; private static boolean keepInventory; @@ -116,7 +115,7 @@ public class MachineDiFurnaceRTG extends BlockContainer { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { @@ -145,7 +144,7 @@ public class MachineDiFurnaceRTG extends BlockContainer { } else { world.setBlock(x, y, z, ModBlocks.machine_difurnace_rtg_off); } - + keepInventory = false; world.setBlockMetadataWithNotify(x, y, z, i, 2); diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectricFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineElectricFurnace.java index ecdd8c59e..b0a987f27 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectricFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectricFurnace.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineElectricFurnace; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,12 +22,14 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class MachineElectricFurnace extends BlockContainer { private final Random field_149933_a = new Random(); private final boolean isActive; private static boolean keepInventory; - + @SideOnly(Side.CLIENT) private IIcon iconFront; private IIcon iconTop; @@ -40,7 +39,7 @@ public class MachineElectricFurnace extends BlockContainer { super(Material.iron); isActive = blockState; } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -49,7 +48,7 @@ public class MachineElectricFurnace extends BlockContainer { this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":machine_electric_furnace_top"); this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":machine_electric_furnace_bottom"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -57,19 +56,19 @@ public class MachineElectricFurnace extends BlockContainer { //return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.iconTop); return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : side == 0 ? this.iconBottom : side == 1 ? this.iconTop : this.blockIcon); } - + @Override public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { return Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off); } - + @Override public void onBlockAdded(World world, int x, int y, int z) { super.onBlockAdded(world, x, y, z); this.setDefaultDirection(world, x, y, z); } - + private void setDefaultDirection(World world, int x, int y, int z) { if(!world.isRemote) { @@ -77,9 +76,9 @@ public class MachineElectricFurnace extends BlockContainer { Block block2 = world.getBlock(x, y, z + 1); Block block3 = world.getBlock(x - 1, y, z); Block block4 = world.getBlock(x + 1, y, z); - + byte b0 = 3; - + if(block1.func_149730_j() && !block2.func_149730_j()) { b0 = 3; @@ -96,15 +95,15 @@ public class MachineElectricFurnace extends BlockContainer { { b0 = 4; } - + world.setBlockMetadataWithNotify(x, y, z, b0, 2); } } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); @@ -121,13 +120,13 @@ public class MachineElectricFurnace extends BlockContainer { { world.setBlockMetadataWithNotify(x, y, z, 4, 2); } - + if(itemStack.hasDisplayName()) { ((TileEntityMachineElectricFurnace)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); } } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -155,23 +154,23 @@ public class MachineElectricFurnace extends BlockContainer { int i = world.getBlockMetadata(x, y, z); TileEntity entity = world.getTileEntity(x, y, z); keepInventory = true; - + if(isProcessing) { world.setBlock(x, y, z, ModBlocks.machine_electric_furnace_on); }else{ world.setBlock(x, y, z, ModBlocks.machine_electric_furnace_off); } - + keepInventory = false; world.setBlockMetadataWithNotify(x, y, z, i, 2); - + if(entity != null) { entity.validate(); world.setTileEntity(x, y, z, entity); } } - + @Override public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { @@ -223,7 +222,7 @@ public class MachineElectricFurnace extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } - + @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(World p_149734_1_, int x, int y, int z, Random rand) @@ -265,4 +264,4 @@ public class MachineElectricFurnace extends BlockContainer { public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) { return Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off);} - } \ No newline at end of file + } diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java index 3c6b7beac..ab91cbb43 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java @@ -4,7 +4,6 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityElectrolyser; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -33,19 +32,19 @@ public class MachineElectrolyser extends BlockDummyable { public int getOffset() { return 5; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); } - + @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); x += dir.offsetX * o; z += dir.offsetZ * o; - + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {2, -1, 5, 5, 1, 1}, this, dir); MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -3, 5, 5, 0, 0}, this, dir); MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, -1, 4, -4, -3, 3}, this, dir); @@ -58,7 +57,7 @@ public class MachineElectrolyser extends BlockDummyable { MultiblockHandlerXR.fillSpace(world, x, y + 3, z, new int[] {0, 0, 0, 0, -1, 2}, this, dir); MultiblockHandlerXR.fillSpace(world, x - dir.offsetX * 2, y + 3, z - dir.offsetZ * 2, new int[] {0, 0, 0, 0, -1, 2}, this, dir); MultiblockHandlerXR.fillSpace(world, x - dir.offsetX * 4, y + 3, z - dir.offsetZ * 4, new int[] {0, 0, 0, 0, -1, 2}, this, dir); - + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); this.makeExtra(world, x - dir.offsetX * 5, y, z - dir.offsetZ * 5); @@ -84,13 +83,13 @@ public class MachineElectrolyser extends BlockDummyable { if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, 0, 0, -3, 3}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, -2, 2, -3, 3}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {3, -1, -4, 4, -3, 3}, x, y, z, dir)) return false; - + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * 4, y + 3, z + dir.offsetZ * 4, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * 2, y + 3, z + dir.offsetZ * 2, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x, y + 3, z, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x - dir.offsetX * 2, y + 3, z - dir.offsetZ * 2, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x - dir.offsetX * 4, y + 3, z - dir.offsetZ * 4, new int[] {0, 0, 0, 0, -1, 2}, x, y, z, dir)) return false; - + return true; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java b/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java index 8efe19ae1..e0d906181 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java +++ b/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java @@ -4,7 +4,6 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineExposureChamber; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -37,10 +36,10 @@ public class MachineExposureChamber extends BlockDummyable { @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - + x += dir.offsetX * o; z += dir.offsetZ * o; - + ForgeDirection rot = dir.getRotation(ForgeDirection.UP).getOpposite(); MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {3, 0, 0, 0, -3, 8}, this, dir); @@ -58,10 +57,10 @@ public class MachineExposureChamber extends BlockDummyable { @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { - + x += dir.offsetX * o; z += dir.offsetZ * o; - + ForgeDirection rot = dir.getRotation(ForgeDirection.UP).getOpposite(); if(!MultiblockHandlerXR.checkSpace(world, x, y, z, getDimensions(), x, y, z, dir)) return false; @@ -70,10 +69,10 @@ public class MachineExposureChamber extends BlockDummyable { if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {0, 0, -1, 1, -3, 6}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x + rot.offsetX * 7, y, z + rot.offsetZ * 7, new int[] {3, 0, 1, -1, 0, 1}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x + rot.offsetX * 7, y, z + rot.offsetZ * 7, new int[] {3, 0, -1, 1, 0, 1}, x, y, z, dir)) return false; - + return true; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return super.standardOpenBehavior(world, x, y, z, player, 0); diff --git a/src/main/java/com/hbm/blocks/machine/MachineFieldDisturber.java b/src/main/java/com/hbm/blocks/machine/MachineFieldDisturber.java index 4ad885409..751cff978 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFieldDisturber.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFieldDisturber.java @@ -1,20 +1,19 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.entity.logic.EntityNukeExplosionMK3; import com.hbm.entity.logic.EntityNukeExplosionMK3.ATEntry; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; +import java.util.Random; + public class MachineFieldDisturber extends Block { public MachineFieldDisturber() { super(Material.iron); } - + @Override public int tickRate(World world) { return 10; diff --git a/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java b/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java index 7c6281110..761aa10ed 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java @@ -1,8 +1,5 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.handler.MultiblockHandlerXR; @@ -13,7 +10,6 @@ import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.oil.TileEntityMachineFrackingTower; import com.hbm.util.BobMathUtil; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -24,6 +20,9 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class MachineFrackingTower extends BlockDummyable implements IPersistentInfoProvider { public MachineFrackingTower() { @@ -32,7 +31,7 @@ public class MachineFrackingTower extends BlockDummyable implements IPersistentI @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineFrackingTower(); if(meta >= 6) return new TileEntityProxyCombo(false, true, true); return null; @@ -50,9 +49,9 @@ public class MachineFrackingTower extends BlockDummyable implements IPersistentI @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { - + if(!MultiblockHandlerXR.checkSpace(world, x, y + 2, z, new int[] {1, 0, 3, 3, 3, 3}, x, y, z, dir)) return false; - + if(!MultiblockHandlerXR.checkSpace(world, x - 2, y + 2, z - 2, new int[] {-1, 2, 0, 1, 0, 1}, x, y, z, ForgeDirection.NORTH)) return false; if(!MultiblockHandlerXR.checkSpace(world, x - 2, y + 2, z + 3, new int[] {-1, 2, 0, 1, 0, 1}, x, y, z, ForgeDirection.NORTH)) return false; if(!MultiblockHandlerXR.checkSpace(world, x + 3, y + 2, z - 2, new int[] {-1, 2, 0, 1, 0, 1}, x, y, z, ForgeDirection.NORTH)) return false; @@ -62,7 +61,7 @@ public class MachineFrackingTower extends BlockDummyable implements IPersistentI if(!MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] {24, -9, 1, 1, 1, 1}, x, y, z, dir)) return false; if(!MultiblockHandlerXR.checkSpace(world, x, y + 15, z, new int[] {1, 0, 1, 1, -2, 3}, x, y, z, dir)) return false; - + return super.checkRequirement(world, x, y, z, dir, o); } @@ -78,29 +77,29 @@ public class MachineFrackingTower extends BlockDummyable implements IPersistentI MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {10, -4, 2, 2, 2, 2}, this, dir); MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {24, -9, 1, 1, 1, 1}, this, dir); - + MultiblockHandlerXR.fillSpace(world, x, y + 15, z, new int[] {1, 0, 1, 1, -2, 3}, this, ForgeDirection.WEST); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); return true; } else { return true; } } - + @Override public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { return IPersistentNBT.getDrops(world, x, y, z, this); diff --git a/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java b/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java index 5c60f53df..1e1fc1e33 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java @@ -1,8 +1,5 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.fluid.FluidType; @@ -10,7 +7,6 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.oil.TileEntityMachineFractionTower; import com.hbm.util.I18nUtil; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -22,6 +18,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class MachineFractionTower extends BlockDummyable implements ILookOverlay { public MachineFractionTower(Material mat) { @@ -30,12 +29,12 @@ public class MachineFractionTower extends BlockDummyable implements ILookOverlay @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineFractionTower(); if(meta >= extra) return new TileEntityProxyCombo(false, false, true); - + return null; } @@ -48,25 +47,25 @@ public class MachineFractionTower extends BlockDummyable implements ILookOverlay public int getOffset() { return 1; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(!world.isRemote && !player.isSneaking()) { - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityMachineFractionTower)) return false; - + TileEntityMachineFractionTower frac = (TileEntityMachineFractionTower) te; - + if(world.getTileEntity(pos[0], pos[1] - 3, pos[2]) instanceof TileEntityMachineFractionTower) { player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "You can only change the type in the bottom segment!")); } else { @@ -75,11 +74,11 @@ public class MachineFractionTower extends BlockDummyable implements ILookOverlay frac.markDirty(); player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation(type.getConditionalName())).appendSibling(new ChatComponentText("!"))); } - + return true; } return false; - + } else { return true; } @@ -88,7 +87,7 @@ public class MachineFractionTower extends BlockDummyable implements ILookOverlay @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - + x = x + dir.offsetX * o; z = z + dir.offsetZ * o; @@ -101,22 +100,22 @@ public class MachineFractionTower extends BlockDummyable implements ILookOverlay @Override public void printHook(Pre event, World world, int x, int y, int z) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityMachineFractionTower)) return; - + TileEntityMachineFractionTower cracker = (TileEntityMachineFractionTower) te; - + List text = new ArrayList(); for(int i = 0; i < cracker.tanks.length; i++) text.add((i == 0 ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + cracker.tanks[i].getTankType().getLocalizedName() + ": " + cracker.tanks[i].getFill() + "/" + cracker.tanks[i].getMaxFill() + "mB"); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineHeatBoilerIndustrial.java b/src/main/java/com/hbm/blocks/machine/MachineHeatBoilerIndustrial.java index 7869a74bd..a2c411072 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineHeatBoilerIndustrial.java +++ b/src/main/java/com/hbm/blocks/machine/MachineHeatBoilerIndustrial.java @@ -1,9 +1,5 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; @@ -14,7 +10,6 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityHeatBoilerIndustrial; import com.hbm.util.I18nUtil; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -27,6 +22,10 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + public class MachineHeatBoilerIndustrial extends BlockDummyable implements ILookOverlay, ITooltipProvider { public MachineHeatBoilerIndustrial() { @@ -35,32 +34,32 @@ public class MachineHeatBoilerIndustrial extends BlockDummyable implements ILook @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityHeatBoilerIndustrial(); if(meta >= extra) return new TileEntityProxyCombo().fluid(); return null; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(!world.isRemote && !player.isSneaking()) { - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityHeatBoilerIndustrial)) return false; - + TileEntityHeatBoilerIndustrial boiler = (TileEntityHeatBoilerIndustrial) te; - + FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, pos[0], pos[1], pos[2], player.getHeldItem()); - + if(type.hasTrait(FT_Heatable.class) && type.getTrait(FT_Heatable.class).getEfficiency(HeatingType.BOILER) > 0) { boiler.tanks[0].setTankType(type); boiler.markDirty(); @@ -69,7 +68,7 @@ public class MachineHeatBoilerIndustrial extends BlockDummyable implements ILook return true; } return false; - + } else { return true; } @@ -98,24 +97,24 @@ public class MachineHeatBoilerIndustrial extends BlockDummyable implements ILook @Override public void printHook(Pre event, World world, int x, int y, int z) { - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntityHeatBoilerIndustrial)) return; - + TileEntityHeatBoilerIndustrial boiler = (TileEntityHeatBoilerIndustrial) te; - + List text = new ArrayList(); text.add(String.format(Locale.US, "%,d", boiler.heat) + "TU"); text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + boiler.tanks[0].getTankType().getLocalizedName() + ": " + String.format(Locale.US, "%,d", boiler.tanks[0].getFill()) + " / " + String.format(Locale.US, "%,d", boiler.tanks[0].getMaxFill()) + "mB"); text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + boiler.tanks[1].getTankType().getLocalizedName() + ": " + String.format(Locale.US, "%,d", boiler.tanks[1].getFill()) + " / " + String.format(Locale.US, "%,d", boiler.tanks[1].getMaxFill()) + "mB"); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } diff --git a/src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java b/src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java index c1ed1c005..a0b223a91 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java +++ b/src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java @@ -1,14 +1,11 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.oil.TileEntityMachineHydrotreater; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -18,6 +15,8 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineHydrotreater extends BlockDummyable implements IPersistentInfoProvider { public MachineHydrotreater(Material mat) { @@ -30,7 +29,7 @@ public class MachineHydrotreater extends BlockDummyable implements IPersistentIn if(meta >= 6) return new TileEntityProxyCombo().fluid().power(); 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); @@ -51,7 +50,7 @@ public class MachineHydrotreater extends BlockDummyable implements IPersistentIn @Override public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { - + for(int i = 0; i < 4; i++) { FluidTank tank = new FluidTank(Fluids.NONE, 0); tank.readFromNBT(persistentTag, "" + i); diff --git a/src/main/java/com/hbm/blocks/machine/MachineICFController.java b/src/main/java/com/hbm/blocks/machine/MachineICFController.java index 10d851109..83267cec4 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineICFController.java +++ b/src/main/java/com/hbm/blocks/machine/MachineICFController.java @@ -1,11 +1,5 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map.Entry; - import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; @@ -17,7 +11,6 @@ import com.hbm.tileentity.machine.TileEntityICFController; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -36,8 +29,14 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map.Entry; + public class MachineICFController extends BlockContainer implements ILookOverlay { - + @SideOnly(Side.CLIENT) private IIcon iconFront; @@ -49,43 +48,43 @@ public class MachineICFController extends BlockContainer implements ILookOverlay public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityICFController(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":icf_controller"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { TileEntityICFController controller = (TileEntityICFController) world.getTileEntity(x, y, z); - + if(!controller.assembled) { assemble(world, x, y, z, player); } - + return true; } else { return false; @@ -101,7 +100,7 @@ public class MachineICFController extends BlockContainer implements ILookOverlay private static HashSet turbochargers = new HashSet(); private static boolean errored; private static final int maxSize = 1024; - + public void assemble(World world, int x, int y, int z, EntityPlayer player) { assembly.clear(); casings.clear(); @@ -111,27 +110,27 @@ public class MachineICFController extends BlockContainer implements ILookOverlay capacitors.clear(); turbochargers.clear(); assembly.put(new BlockPos(x, y, z), 0); - + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)).getOpposite(); - + errored = false; floodFill(world, x + dir.offsetX, y, z + dir.offsetZ, player); assembly.remove(new BlockPos(x, y, z)); - + TileEntityICFController controller = (TileEntityICFController) world.getTileEntity(x, y, z); - + if(!errored) { - + for(Entry entry : assembly.entrySet()) { - + BlockPos pos = entry.getKey(); - + if(ports.contains(pos)) { world.setBlock(pos.getX(), pos.getY(), pos.getZ(), ModBlocks.icf_block, 1, 3); } else { world.setBlock(pos.getX(), pos.getY(), pos.getZ(), ModBlocks.icf_block, 0, 3); } - + TileEntityBlockICF icf = (TileEntityBlockICF) world.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); icf.block = ModBlocks.icf_laser_component; icf.meta = entry.getValue(); @@ -140,12 +139,12 @@ public class MachineICFController extends BlockContainer implements ILookOverlay icf.coreZ = z; icf.markDirty(); } - + controller.setup(ports, cells, emitters, capacitors, turbochargers); controller.markDirty(); } controller.assembled = !errored; - + assembly.clear(); casings.clear(); ports.clear(); @@ -154,24 +153,24 @@ public class MachineICFController extends BlockContainer implements ILookOverlay capacitors.clear(); turbochargers.clear(); } - + private void floodFill(World world, int x, int y, int z, EntityPlayer player) { - + BlockPos pos = new BlockPos(x, y, z); - + if(assembly.containsKey(pos)) return; if(assembly.size() >= maxSize) { errored = true; sendError(world, x, y, z, "Max size exceeded", player); return; } - + Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); boolean validCasing = false; boolean validCore = false; - + if(block == ModBlocks.icf_laser_component) { if(meta == EnumICFPart.CASING.ordinal()) { casings.add(pos); validCasing = true; } if(meta == EnumICFPart.PORT.ordinal()) { ports.add(pos); validCasing = true; } @@ -180,12 +179,12 @@ public class MachineICFController extends BlockContainer implements ILookOverlay if(meta == EnumICFPart.CAPACITOR.ordinal()) { capacitors.add(pos); validCore = true; } if(meta == EnumICFPart.TURBO.ordinal()) { turbochargers.add(pos); validCore = true; } } - + if(validCasing) { assembly.put(pos, meta); return; } - + if(validCore) { assembly.put(pos, meta); floodFill(world, x + 1, y, z, player); @@ -200,7 +199,7 @@ public class MachineICFController extends BlockContainer implements ILookOverlay sendError(world, x, y, z, "Non-laser block", player); errored = true; } - + private void sendError(World world, int x, int y, int z, String message, EntityPlayer player) { if(player instanceof EntityPlayerMP) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java b/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java index 8150f91e6..cc8328dd3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java @@ -1,13 +1,10 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineLargeTurbine; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; @@ -18,6 +15,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvider { public MachineLargeTurbine(Material mat) { @@ -26,13 +25,13 @@ public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvi @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineLargeTurbine(); - + if(meta >= 6) return new TileEntityProxyCombo(false, true, true); - + return null; } @@ -45,7 +44,7 @@ public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvi public int getOffset() { return 1; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -54,20 +53,20 @@ public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvi } else if(!player.isSneaking()) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); return true; } else { return true; } } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - + super.onBlockPlacedBy(world, x, y, z, player, itemStack); if(world.isRemote) @@ -75,7 +74,7 @@ public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvi int k = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; ForgeDirection dir = ForgeDirection.NORTH; - + if(k == 0) dir = ForgeDirection.getOrientation(2); if(k == 1) @@ -84,9 +83,9 @@ public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvi dir = ForgeDirection.getOrientation(3); if(k == 3) dir = ForgeDirection.getOrientation(4); - + ForgeDirection dir2 = dir.getRotation(ForgeDirection.UP); - + //back connector this.makeExtra(world, x + dir.offsetX * -4, y, z + dir.offsetZ * -4); //front connector @@ -94,7 +93,7 @@ public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvi int xc = x - dir.offsetX; int zc = z - dir.offsetZ; - + //side connectors this.makeExtra(world, xc + dir2.offsetX, y, zc + dir2.offsetZ); this.makeExtra(world, xc - dir2.offsetX, y, zc - dir2.offsetZ); diff --git a/src/main/java/com/hbm/blocks/machine/MachineLiquefactor.java b/src/main/java/com/hbm/blocks/machine/MachineLiquefactor.java index 48165752b..6348106d6 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineLiquefactor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineLiquefactor.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.oil.TileEntityMachineLiquefactor; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -14,6 +11,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineLiquefactor extends BlockDummyable implements ITooltipProvider { public MachineLiquefactor() { @@ -22,13 +21,13 @@ public class MachineLiquefactor extends BlockDummyable implements ITooltipProvid @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineLiquefactor(); - + if(meta >= extra) return new TileEntityProxyCombo(true, true, true); - + return null; } @@ -36,7 +35,7 @@ public class MachineLiquefactor extends BlockDummyable implements ITooltipProvid public int[] getDimensions() { return new int[] {3, 0, 1, 1, 1, 1}; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); @@ -50,12 +49,12 @@ public class MachineLiquefactor extends BlockDummyable implements ITooltipProvid @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - + x = x + dir.offsetX * o; z = z + dir.offsetZ * o; this.makeExtra(world, x, y + 3, z); - + this.makeExtra(world, x + 1, y + 1, z); this.makeExtra(world, x - 1, y + 1, z); this.makeExtra(world, x, y + 1, z + 1); diff --git a/src/main/java/com/hbm/blocks/machine/MachineMiningLaser.java b/src/main/java/com/hbm/blocks/machine/MachineMiningLaser.java index ada5bff34..b8fd117ec 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineMiningLaser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineMiningLaser.java @@ -1,14 +1,11 @@ package com.hbm.blocks.machine; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.TileEntityProxyEnergy; import com.hbm.tileentity.machine.TileEntityMachineMiningLaser; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -17,6 +14,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class MachineMiningLaser extends BlockDummyable implements ITooltipProvider { public MachineMiningLaser(Material mat) { @@ -29,7 +28,7 @@ public class MachineMiningLaser extends BlockDummyable implements ITooltipProvid if(meta >= 12) return new TileEntityMachineMiningLaser(); if(meta == 7) return new TileEntityProxyEnergy(); if(meta >= 6) return new TileEntityProxyCombo().inventory().fluid(); - + return null; } @@ -47,26 +46,26 @@ public class MachineMiningLaser extends BlockDummyable implements ITooltipProvid public int getHeightOffset() { return -1; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); return true; } else { return true; } } - + protected void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); @@ -78,7 +77,7 @@ public class MachineMiningLaser extends BlockDummyable implements ITooltipProvid this.makeExtra(world, x - 1, y, z); this.makeExtra(world, x, y, z + 1); this.makeExtra(world, x, y, z - 1); - + this.makeExtra(world, x, y + 1, z); } diff --git a/src/main/java/com/hbm/blocks/machine/MachineMissileAssembly.java b/src/main/java/com/hbm/blocks/machine/MachineMissileAssembly.java index ef271e773..87f345b66 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineMissileAssembly.java +++ b/src/main/java/com/hbm/blocks/machine/MachineMissileAssembly.java @@ -1,11 +1,8 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.handler.BossSpawnHandler; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineMissileAssembly; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; @@ -20,6 +17,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class MachineMissileAssembly extends BlockContainer { public MachineMissileAssembly(Material p_i45386_1_) { @@ -45,7 +44,7 @@ public class MachineMissileAssembly extends BlockContainer { public boolean renderAsNormalBlock() { return false; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { @@ -65,7 +64,7 @@ public class MachineMissileAssembly extends BlockContainer { } private final Random field_149933_a = new Random(); - + @Override public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { @@ -111,11 +110,11 @@ public class MachineMissileAssembly extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); @@ -132,7 +131,7 @@ public class MachineMissileAssembly extends BlockContainer { { world.setBlockMetadataWithNotify(x, y, z, 4, 2); } - + if(itemStack.hasDisplayName()) { ((TileEntityMachineMissileAssembly)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); diff --git a/src/main/java/com/hbm/blocks/machine/MachineNukeFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineNukeFurnace.java index de87c78ae..94492e91f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineNukeFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineNukeFurnace.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityNukeFurnace; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,12 +22,14 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class MachineNukeFurnace extends BlockContainer { private final Random field_149933_a = new Random(); private final boolean isActive; private static boolean keepInventory; - + @SideOnly(Side.CLIENT) private IIcon iconTop; @SideOnly(Side.CLIENT) @@ -40,7 +39,7 @@ public class MachineNukeFurnace extends BlockContainer { super(Material.iron); isActive = blockState; } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -48,25 +47,25 @@ public class MachineNukeFurnace extends BlockContainer { this.iconFront = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_nuke_furnace_front_on_alt" : ":machine_nuke_furnace_front_off_alt")); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_nuke_furnace_side_alt"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : (side == 1 ? this.iconTop : (side == 0 ? this.iconTop : this.blockIcon))); } - + @Override public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { return Item.getItemFromBlock(ModBlocks.machine_nuke_furnace_off); } - + @Override public void onBlockAdded(World world, int x, int y, int z) { super.onBlockAdded(world, x, y, z); this.setDefaultDirection(world, x, y, z); } - + private void setDefaultDirection(World world, int x, int y, int z) { if(!world.isRemote) { @@ -74,9 +73,9 @@ public class MachineNukeFurnace extends BlockContainer { Block block2 = world.getBlock(x, y, z + 1); Block block3 = world.getBlock(x - 1, y, z); Block block4 = world.getBlock(x + 1, y, z); - + byte b0 = 3; - + if(block1.func_149730_j() && !block2.func_149730_j()) { b0 = 3; @@ -93,15 +92,15 @@ public class MachineNukeFurnace extends BlockContainer { { b0 = 4; } - + world.setBlockMetadataWithNotify(x, y, z, b0, 2); } } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); @@ -118,13 +117,13 @@ public class MachineNukeFurnace extends BlockContainer { { world.setBlockMetadataWithNotify(x, y, z, 4, 2); } - + if(itemStack.hasDisplayName()) { ((TileEntityNukeFurnace)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); } } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -152,23 +151,23 @@ public class MachineNukeFurnace extends BlockContainer { int i = world.getBlockMetadata(x, y, z); TileEntity entity = world.getTileEntity(x, y, z); keepInventory = true; - + if(isProcessing) { world.setBlock(x, y, z, ModBlocks.machine_nuke_furnace_on); }else{ world.setBlock(x, y, z, ModBlocks.machine_nuke_furnace_off); } - + keepInventory = false; world.setBlockMetadataWithNotify(x, y, z, i, 2); - + if(entity != null) { entity.validate(); world.setTileEntity(x, y, z, entity); } } - + @Override public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { @@ -220,7 +219,7 @@ public class MachineNukeFurnace extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } - + @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(World p_149734_1_, int x, int y, int z, Random rand) diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 0fcbc6117..584877d3f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -1,9 +1,5 @@ package com.hbm.blocks.machine; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; @@ -13,7 +9,6 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.machine.TileEntityPWRController; import com.hbm.util.fauxpointtwelve.BlockPos; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -32,8 +27,12 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + public class MachinePWRController extends BlockContainer implements ITooltipProvider { - + @SideOnly(Side.CLIENT) private IIcon iconFront; @@ -45,45 +44,45 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPWRController(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":pwr_controller"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); - + if(!controller.assembled) { assemble(world, x, y, z, player); } else { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); } - + return true; } else { return false; @@ -95,44 +94,44 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv private static HashMap sources = new HashMap(); private static boolean errored; private static final int maxSize = 4096; - + public void assemble(World world, int x, int y, int z, EntityPlayer player) { assembly.clear(); fuelRods.clear(); sources.clear(); assembly.put(new BlockPos(x, y, z), this); - + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)).getOpposite(); - + errored = false; floodFill(world, x + dir.offsetX, y, z + dir.offsetZ, player); - + if(fuelRods.size() == 0){ sendError(world, x, y, z, "Fuel rods required", player); errored = true; } - + if(sources.size() == 0) { sendError(world, x, y, z, "Neutron sources required", player); errored = true; } - + TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); - + if(!errored) { for(Entry entry : assembly.entrySet()) { - + BlockPos pos = entry.getKey(); Block block = entry.getValue(); - + if(block != ModBlocks.pwr_controller) { - + if(block == ModBlocks.pwr_port) { world.setBlock(pos.getX(), pos.getY(), pos.getZ(), ModBlocks.pwr_block, 1, 3); } else { world.setBlock(pos.getX(), pos.getY(), pos.getZ(), ModBlocks.pwr_block, 0, 3); } - + TileEntityBlockPWR pwr = (TileEntityBlockPWR) world.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); pwr.block = block; pwr.coreX = x; @@ -141,34 +140,34 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv pwr.markDirty(); } } - + controller.setup(assembly, fuelRods); } controller.assembled = !errored; - + assembly.clear(); fuelRods.clear(); sources.clear(); } - + private void floodFill(World world, int x, int y, int z, EntityPlayer player) { - + BlockPos pos = new BlockPos(x, y, z); - + if(assembly.containsKey(pos)) return; if(assembly.size() >= maxSize) { errored = true; sendError(world, x, y, z, "Max size exceeded", player); return; } - + Block block = world.getBlock(x, y, z); - + if(isValidCasing(block)) { assembly.put(pos, block); return; } - + if(isValidCore(block)) { assembly.put(pos, block); if(block == ModBlocks.pwr_fuel) fuelRods.put(pos, block); @@ -185,7 +184,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv sendError(world, x, y, z, "Non-reactor block", player); errored = true; } - + private void sendError(World world, int x, int y, int z, String message, EntityPlayer player) { if(player instanceof EntityPlayerMP) { @@ -198,7 +197,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(data, x, y, z), (EntityPlayerMP) player); } } - + private boolean isValidCore(Block block) { if(block == ModBlocks.pwr_fuel || block == ModBlocks.pwr_control || @@ -209,7 +208,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv return true; return false; } - + private boolean isValidCasing(Block block) { if(block == ModBlocks.pwr_casing || block == ModBlocks.pwr_reflector || block == ModBlocks.pwr_port) return true; return false; diff --git a/src/main/java/com/hbm/blocks/machine/MachinePlasmaHeater.java b/src/main/java/com/hbm/blocks/machine/MachinePlasmaHeater.java index 08c7f164f..1c138339a 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePlasmaHeater.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePlasmaHeater.java @@ -1,14 +1,11 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachinePlasmaHeater; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -22,6 +19,8 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class MachinePlasmaHeater extends BlockDummyable { public MachinePlasmaHeater() { @@ -36,7 +35,7 @@ public class MachinePlasmaHeater extends BlockDummyable { if(meta >= 6) return new TileEntityProxyCombo(false, true, true); - + return null; } @@ -44,7 +43,7 @@ public class MachinePlasmaHeater extends BlockDummyable { public Item getItemDropped(int i, Random rand, int j) { return null; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -53,10 +52,10 @@ public class MachinePlasmaHeater extends BlockDummyable { } else if(!player.isSneaking()) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + TileEntityMachinePlasmaHeater entity = (TileEntityMachinePlasmaHeater) world.getTileEntity(pos[0], pos[1], pos[2]); if(entity != null) { @@ -74,21 +73,21 @@ public class MachinePlasmaHeater extends BlockDummyable { MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {4, -3, 2, 1, 1, 1}, this, dir); MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + 2, z + dir.offsetZ * o, new int[] {0, 1, 10, -8, 0, 0}, this, dir); - + ForgeDirection side = dir.getRotation(ForgeDirection.UP); - + for(int i = 1; i < 4; i++) { for(int j = -1; j < 2; j++) { - + this.makeExtra(world, x + side.offsetX * j, y + i, z + side.offsetZ * j); } } } - + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - + float f = 0.0625F; - + if(world.getBlockMetadata(x, y, z) == ForgeDirection.UP.ordinal() && world.getBlock(x, y + 1, z) != this) { return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + f * 8F, z + 1); } else if(world.getBlockMetadata(x, y, z) == ForgeDirection.DOWN.ordinal() && world.getBlock(x, y - 1, z) != this) { @@ -97,11 +96,11 @@ public class MachinePlasmaHeater extends BlockDummyable { return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); } } - + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { float f = 0.0625F; - + if(world.getBlockMetadata(x, y, z) == ForgeDirection.UP.ordinal() && world.getBlock(x, y + 1, z) != this) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f * 8F, 1.0F); } else if(world.getBlockMetadata(x, y, z) == ForgeDirection.DOWN.ordinal() && world.getBlock(x, y - 1, z) != this) { @@ -110,18 +109,18 @@ public class MachinePlasmaHeater extends BlockDummyable { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } } - + protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, getDimensions(), x, y, z, dir)) return false; - + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {4, -3, 1, 1, 1, 1}, x, y, z, dir)) return false; - + if(!MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o , y + 2, z + dir.offsetZ * o, new int[] {0, 1, 10, -8, 0, 0}, x, y, z, dir)) return false; - + return true; } @@ -134,12 +133,12 @@ public class MachinePlasmaHeater extends BlockDummyable { public int getOffset() { return 1; } - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int i) { - + if(i >= 12) { - + for(int l = 0; l < 2; l++) world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModBlocks.fusion_heater, 64))); diff --git a/src/main/java/com/hbm/blocks/machine/MachineRadarScreen.java b/src/main/java/com/hbm/blocks/machine/MachineRadarScreen.java index 6f1df1a14..0f6e63d8e 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRadarScreen.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRadarScreen.java @@ -4,7 +4,6 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import com.hbm.tileentity.machine.TileEntityMachineRadarScreen; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -34,18 +33,18 @@ public class MachineRadarScreen extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote && !player.isSneaking()) { int[] pos = this.findCore(world, x, y, z); if(pos == null) return false; - + TileEntityMachineRadarScreen screen = (TileEntityMachineRadarScreen) world.getTileEntity(pos[0], pos[1], pos[2]); if(screen.linked && world.getTileEntity(screen.refX, screen.refY, screen.refZ) instanceof TileEntityMachineRadarNT) { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, screen.refX, screen.refY, screen.refZ); } - + return false; } else if(!player.isSneaking()) { return true; diff --git a/src/main/java/com/hbm/blocks/machine/MachineReactorBreeding.java b/src/main/java/com/hbm/blocks/machine/MachineReactorBreeding.java index bde522787..29f5fa213 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineReactorBreeding.java +++ b/src/main/java/com/hbm/blocks/machine/MachineReactorBreeding.java @@ -4,7 +4,6 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyInventory; import com.hbm.tileentity.machine.TileEntityMachineReactorBreeding; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -12,20 +11,20 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class MachineReactorBreeding extends BlockDummyable { - + public MachineReactorBreeding(Material mat) { super(mat); } @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineReactorBreeding(); - + return new TileEntityProxyInventory(); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -34,10 +33,10 @@ public class MachineReactorBreeding extends BlockDummyable { } else if(!player.isSneaking()) { int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return false; - + TileEntityMachineReactorBreeding entity = (TileEntityMachineReactorBreeding) world.getTileEntity(pos[0], pos[1], pos[2]); if(entity != null) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineReactorControl.java b/src/main/java/com/hbm/blocks/machine/MachineReactorControl.java index 9b7cde970..4f3fc61bf 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineReactorControl.java +++ b/src/main/java/com/hbm/blocks/machine/MachineReactorControl.java @@ -1,11 +1,8 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityReactorControl; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,8 +22,10 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class MachineReactorControl extends BlockContainer { - + @SideOnly(Side.CLIENT) private IIcon iconTop; @SideOnly(Side.CLIENT) @@ -40,7 +39,7 @@ public class MachineReactorControl extends BlockContainer { public MachineReactorControl(Material p_i45386_1_) { super(p_i45386_1_); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -49,33 +48,33 @@ public class MachineReactorControl extends BlockContainer { this.iconBack = iconRegister.registerIcon(RefStrings.MODID + ":machine_controller_back"); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_controller_side"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { - + if(metadata == 0) metadata = 3; - + if(metadata == side) return iconFront; - + if(side == 0 || side == 1) return iconTop; - + if(metadata == 2 && side == 3 || metadata == 3 && side == 2 || metadata == 4 && side == 5 || metadata == 5 && side == 4) return iconBack; - + return blockIcon; } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); @@ -92,7 +91,7 @@ public class MachineReactorControl extends BlockContainer { { world.setBlockMetadataWithNotify(x, y, z, 4, 2); } - + if(itemStack.hasDisplayName()) { ((TileEntityReactorControl)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); @@ -103,13 +102,13 @@ public class MachineReactorControl extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityReactorControl(); } - + @Override public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { return Item.getItemFromBlock(this); } - + @Override public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { @@ -161,7 +160,7 @@ public class MachineReactorControl extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -190,12 +189,12 @@ public class MachineReactorControl extends BlockContainer { public int getComparatorInputOverride(World world, int x, int y, int z, int p_149736_5_) { TileEntityReactorControl entity = (TileEntityReactorControl) world.getTileEntity(x, y, z); - + if(entity != null) { return (int)Math.ceil((double)entity.heat * 15D / 50000D); } - + return 0; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java index 523bc10b7..a438ef38e 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java @@ -3,7 +3,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineRotaryFurnace; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -22,7 +21,7 @@ public class MachineRotaryFurnace extends BlockDummyable { if(meta >= 6) return new TileEntityProxyCombo().inventory().fluid(); 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 this.standardOpenBehavior(world, x, y, z, player, 0); @@ -43,7 +42,7 @@ public class MachineRotaryFurnace extends BlockDummyable { super.fillSpace(world, x, y, z, dir, o); x += dir.offsetX * o; z += dir.offsetZ * o; - + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); //back diff --git a/src/main/java/com/hbm/blocks/machine/MachineSchrabidiumTransmutator.java b/src/main/java/com/hbm/blocks/machine/MachineSchrabidiumTransmutator.java index d89764265..04bc79818 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSchrabidiumTransmutator.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSchrabidiumTransmutator.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineSchrabidiumTransmutator; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -23,16 +20,18 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.Random; + public class MachineSchrabidiumTransmutator extends BlockContainer { private final Random field_149933_a = new Random(); private static boolean keepInventory; - + @SideOnly(Side.CLIENT) //private IIcon iconFront; private IIcon iconTop; private IIcon iconBottom; - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -40,7 +39,7 @@ public class MachineSchrabidiumTransmutator extends BlockContainer { this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + (":transmutator_bottom")); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":transmutator_side"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -50,13 +49,13 @@ public class MachineSchrabidiumTransmutator extends BlockContainer { public MachineSchrabidiumTransmutator(Material p_i45386_1_) { super(p_i45386_1_); } - + @Override public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { return Item.getItemFromBlock(ModBlocks.machine_schrabidium_transmutator); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -79,7 +78,7 @@ public class MachineSchrabidiumTransmutator extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityMachineSchrabidiumTransmutator(); } - + @Override public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineSolarBoiler.java b/src/main/java/com/hbm/blocks/machine/MachineSolarBoiler.java index b4a9479ce..6c4a3e29c 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSolarBoiler.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSolarBoiler.java @@ -1,15 +1,11 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntitySolarBoiler; import com.hbm.util.I18nUtil; - import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; @@ -17,6 +13,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class MachineSolarBoiler extends BlockDummyable implements ILookOverlay { public MachineSolarBoiler(Material mat) { @@ -25,12 +24,12 @@ public class MachineSolarBoiler extends BlockDummyable implements ILookOverlay { @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntitySolarBoiler(); if(meta >= extra) return new TileEntityProxyCombo(false, false, true); - + return null; } @@ -47,10 +46,10 @@ public class MachineSolarBoiler extends BlockDummyable implements ILookOverlay { @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - + x = x + dir.offsetX * o; z = z + dir.offsetZ * o; - + this.makeExtra(world, x, y + 2, z); } @@ -62,19 +61,19 @@ public class MachineSolarBoiler extends BlockDummyable implements ILookOverlay { return; TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntitySolarBoiler)) return; - + TileEntitySolarBoiler boiler = (TileEntitySolarBoiler) te; - + List text = new ArrayList<>(); FluidTank[] tanks = boiler.getAllTanks(); for(int i = 0; i < tanks.length; i++) text.add((i < 1 ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + tanks[i].getTankType().getLocalizedName() + ": " + tanks[i].getFill() + "/" + tanks[i].getMaxFill() + "mB"); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineSolderingStation.java b/src/main/java/com/hbm/blocks/machine/MachineSolderingStation.java index 2d1ee34d1..a3d210b79 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSolderingStation.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSolderingStation.java @@ -3,7 +3,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineSolderingStation; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -20,7 +19,7 @@ public class MachineSolderingStation extends BlockDummyable { if(meta >= 12) return new TileEntityMachineSolderingStation(); return new TileEntityProxyCombo().inventory().power().fluid(); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); diff --git a/src/main/java/com/hbm/blocks/machine/MachineSteamEngine.java b/src/main/java/com/hbm/blocks/machine/MachineSteamEngine.java index b3e1c8cd2..dc7f13426 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSteamEngine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSteamEngine.java @@ -1,16 +1,11 @@ package com.hbm.blocks.machine; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntitySteamEngine; import com.hbm.util.I18nUtil; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -20,6 +15,10 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + public class MachineSteamEngine extends BlockDummyable implements ILookOverlay, ITooltipProvider { public MachineSteamEngine() { @@ -46,10 +45,10 @@ public class MachineSteamEngine extends BlockDummyable implements ILookOverlay, @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - + x = x + dir.offsetX * o; z = z + dir.offsetZ * o; - + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); this.makeExtra(world, x + rot.offsetX, y + 1, z + rot.offsetZ); @@ -59,23 +58,23 @@ public class MachineSteamEngine extends BlockDummyable implements ILookOverlay, @Override public void printHook(Pre event, World world, int x, int y, int z) { - + int[] pos = this.findCore(world, x, y, z); - + if(pos == null) return; - + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(!(te instanceof TileEntitySteamEngine)) return; - + TileEntitySteamEngine engine = (TileEntitySteamEngine) te; List text = new ArrayList(); text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + engine.tanks[0].getTankType().getLocalizedName() + ": " + String.format(Locale.US, "%,d", engine.tanks[0].getFill()) + " / " + String.format(Locale.US, "%,d", engine.tanks[0].getMaxFill()) + "mB"); text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + engine.tanks[1].getTankType().getLocalizedName() + ": " + String.format(Locale.US, "%,d", engine.tanks[1].getFill()) + " / " + String.format(Locale.US, "%,d", engine.tanks[1].getMaxFill()) + "mB"); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } diff --git a/src/main/java/com/hbm/blocks/machine/MachineTransformer.java b/src/main/java/com/hbm/blocks/machine/MachineTransformer.java index 5f1980782..1369765fb 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTransformer.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTransformer.java @@ -3,7 +3,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineTransformer; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; @@ -17,7 +16,7 @@ public class MachineTransformer extends BlockContainer { long buffer; int delay; - + @SideOnly(Side.CLIENT) private IIcon iconTop; @@ -26,11 +25,11 @@ public class MachineTransformer extends BlockContainer { buffer = b; delay = d; } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { - + if(this == ModBlocks.machine_transformer || this == ModBlocks.machine_transformer_20) { this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":machine_transformer_top_iron"); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_transformer_iron"); diff --git a/src/main/java/com/hbm/blocks/machine/MachineVacuumDistill.java b/src/main/java/com/hbm/blocks/machine/MachineVacuumDistill.java index 6382054c7..ad06c6e1d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineVacuumDistill.java +++ b/src/main/java/com/hbm/blocks/machine/MachineVacuumDistill.java @@ -3,7 +3,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.oil.TileEntityMachineVacuumDistill; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -22,7 +21,7 @@ public class MachineVacuumDistill extends BlockDummyable { if(meta >= 6) return new TileEntityProxyCombo().fluid().power(); 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); diff --git a/src/main/java/com/hbm/blocks/machine/PinkCloudBroadcaster.java b/src/main/java/com/hbm/blocks/machine/PinkCloudBroadcaster.java index c975e5ae1..eef9a80be 100644 --- a/src/main/java/com/hbm/blocks/machine/PinkCloudBroadcaster.java +++ b/src/main/java/com/hbm/blocks/machine/PinkCloudBroadcaster.java @@ -1,7 +1,6 @@ package com.hbm.blocks.machine; import com.hbm.tileentity.machine.TileEntityBroadcaster; - import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; @@ -22,26 +21,26 @@ public class PinkCloudBroadcaster extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityBroadcaster(); } - + @Override public int getRenderType(){ return -1; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 3, 2); @@ -59,13 +58,13 @@ public class PinkCloudBroadcaster extends BlockContainer { world.setBlockMetadataWithNotify(x, y, z, 5, 2); } } - + @Override public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, int p_149719_4_) { int te = p_149719_1_.getBlockMetadata(p_149719_2_, p_149719_3_, p_149719_4_); float f = 0.0625F; - + this.setBlockBounds(0.0F, 0.0F, 2*f, 1.0F, 1.0F, 14*f); switch(te) { @@ -83,13 +82,13 @@ public class PinkCloudBroadcaster extends BlockContainer { break; } } - + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { int te = world.getBlockMetadata(x, y, z); float f = 0.0625F; - + this.setBlockBounds(0.0F, 0.0F, 2*f, 1.0F, 1.0F, 14*f); switch(te) { @@ -106,7 +105,7 @@ public class PinkCloudBroadcaster extends BlockContainer { this.setBlockBounds(1*f, 0.0F, 4*f, 15*f, 10*f, 12*f); break; } - + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); } diff --git a/src/main/java/com/hbm/blocks/machine/PistonInserter.java b/src/main/java/com/hbm/blocks/machine/PistonInserter.java index 7539e685e..bb33d205d 100644 --- a/src/main/java/com/hbm/blocks/machine/PistonInserter.java +++ b/src/main/java/com/hbm/blocks/machine/PistonInserter.java @@ -6,7 +6,6 @@ import com.hbm.blocks.BlockContainerBase; import com.hbm.blocks.ITooltipProvider; import api.hbm.block.IInsertable; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import cpw.mods.fml.relauncher.Side; @@ -37,112 +36,112 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPistonInserter(); } - + @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { this.updateState(world, x, y, z); } - + protected void updateState(World world, int x, int y, int z) { if(!world.isRemote) { ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); - + if(world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).isNormalCube()) return; //no obstructions allowed! - + boolean flag = checkRedstone(world, x, y, z); TileEntityPistonInserter piston = (TileEntityPistonInserter)world.getTileEntity(x, y, z); - + if(flag && !piston.lastState && piston.extend <= 0) piston.isRetracting = false; - + piston.lastState = flag; } } - + protected boolean checkRedstone(World world, int x, int y, int z) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { if(world.getIndirectPowerOutput(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir.ordinal())) return true; } - + return false; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(side != world.getBlockMetadata(x, y, z)) return false; - + if(player.isSneaking()) { if(!world.isRemote) { TileEntityPistonInserter piston = (TileEntityPistonInserter)world.getTileEntity(x, y, z); - + if(piston.slot != null && piston.isRetracting) { ForgeDirection dir = ForgeDirection.getOrientation(piston.getBlockMetadata()); - + EntityItem dust = new EntityItem(world, x + 0.5D + dir.offsetX * 0.75D, y + 0.5D + dir.offsetY * 0.75D, z + 0.5D + dir.offsetZ * 0.75D, piston.slot); piston.slot = null; - + dust.motionX = dir.offsetX * 0.25; dust.motionY = dir.offsetY * 0.25; dust.motionZ = dir.offsetZ * 0.25; world.spawnEntityInWorld(dust); } } - + return true; } else if(player.getHeldItem() != null) { if(!world.isRemote) { TileEntityPistonInserter piston = (TileEntityPistonInserter)world.getTileEntity(x, y, z); - + if(piston.slot == null) { piston.slot = player.inventory.decrStackSize(player.inventory.currentItem, 1); player.inventoryContainer.detectAndSendChanges(); } } - + return true; } - + return false; } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int l = BlockPistonBase.determineOrientation(world, x, y, z, player); world.setBlockMetadataWithNotify(x, y, z, l, 2); } - + @Override public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { int meta = world.getBlockMetadata(x, y, z); return meta != side.ordinal() && meta != side.getOpposite().ordinal(); } - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { IInventory tileentityfurnace = (IInventory) world.getTileEntity(x, y, z); if(tileentityfurnace != null) { - + ItemStack itemstack = tileentityfurnace.getStackInSlot(0); if(itemstack != null) { float f = world.rand.nextFloat() * 0.8F + 0.1F; float f1 = world.rand.nextFloat() * 0.8F + 0.1F; float f2 = world.rand.nextFloat() * 0.8F + 0.1F; - + while(itemstack.stackSize > 0) { int j1 = world.rand.nextInt(21) + 10; - + if(j1 > itemstack.stackSize) { j1 = itemstack.stackSize; } - + itemstack.stackSize -= j1; EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - + if(itemstack.hasTagCompound()) { entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); } @@ -160,22 +159,22 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid super.breakBlock(world, x, y, z, block, meta); } - + @Override public int getRenderType(){ return -1; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + // $%&#$& // %$&&@$%%#% //______ $%@--$@@%&$%$ @@ -206,65 +205,65 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid // |--' / /| |/ .^ ,^\ \ ) // | |_|| || |(_( ) | | // | \_/`-``-`----'___/_____ | - // |___..---' _|____`-----..-----'\ + // |___..---' _|____`-----..-----'\ // |_____________________| @ | ) // average coding session involving tile entities - public static class TileEntityPistonInserter extends TileEntityLoadedBase implements IInventory, IBufPacketReceiver { - + public static class TileEntityPistonInserter extends TileEntityLoadedBase implements IInventory { + public ItemStack slot; - + public int extend; //why don't we just make all these ones serverside? we're never using them on the client anyway public static final int maxExtend = 25; public boolean isRetracting = true; public int delay; - + //prevents funkies from happening with block updates or loading into a server private boolean lastState; - - //when a fake animatorcel gives you something so 20fps you gotta hit him with the true interpolation stare + + //when a fake animatorcel gives you something so 20fps you gotta hit him with the true interpolation stare @SideOnly(Side.CLIENT) public double renderExtend; @SideOnly(Side.CLIENT) public double lastExtend; @SideOnly(Side.CLIENT) private int syncExtend; //what are these for? @SideOnly(Side.CLIENT) private int turnProgress; - + public TileEntityPistonInserter() { } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(delay <= 0) { - + if(this.isRetracting && this.extend > 0) { this.extend--; } else if(!this.isRetracting) { this.extend++; - + if(this.extend >= this.maxExtend) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.pressOperate", 1.0F, 1.5F); - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); Block b = worldObj.getBlock(xCoord + dir.offsetX * 2, yCoord + dir.offsetY * 2, zCoord + dir.offsetZ * 2); - + if(b instanceof IInsertable && ((IInsertable) b).insertItem(worldObj, xCoord + dir.offsetX * 2, yCoord + dir.offsetY * 2, zCoord + dir.offsetZ * 2, dir, slot)) { this.decrStackSize(0, 1); } - + this.isRetracting = true; this.delay = 5; } } - + } else { delay--; } - - sendStandard(25); - + + networkPackNT(25); + } else { this.lastExtend = this.renderExtend; - + if(this.turnProgress > 0) { this.renderExtend += (this.syncExtend - this.renderExtend) / (double) this.turnProgress; this.turnProgress--; @@ -272,7 +271,7 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid this.renderExtend = this.syncExtend; } } - + } @Override @@ -312,7 +311,7 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid nbt.setTag("stack", stack); } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -326,27 +325,27 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid this.slot = null; } } - + @SideOnly(Side.CLIENT) private AxisAlignedBB aabb; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(aabb != null) return aabb; - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); aabb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1).addCoord(dir.offsetX, dir.offsetY, dir.offsetZ); return aabb; } - + /* BS inventory stuff */ - + @Override public int getSizeInventory() { return 1; } - + @Override public ItemStack getStackInSlot(int slot) { return this.slot; } - + @Override public ItemStack decrStackSize(int slot, int amount) { if(this.slot != null) { @@ -355,41 +354,41 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid this.slot = null; return stack; } - + ItemStack stack = this.slot.splitStack(amount); if(this.slot.stackSize == 0) this.slot = null; - + return stack; } - + return null; } - + @Override public ItemStack getStackInSlotOnClosing(int slot) { return null; } - + @Override public void setInventorySlotContents(int slot, ItemStack stack) { this.slot = stack; if(stack != null && stack.stackSize > this.getInventoryStackLimit()) stack.stackSize = this.getInventoryStackLimit(); } - + @Override public String getInventoryName() { return null; } - + @Override public boolean hasCustomInventoryName() { return false; } - + @Override public int getInventoryStackLimit() { return 1; } - + @Override public boolean isUseableByPlayer(EntityPlayer player) { return false; } - + @Override public void openInventory() {} - + @Override public void closeInventory() {} - + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return true; } - + } @Override diff --git a/src/main/java/com/hbm/blocks/network/BlockCable.java b/src/main/java/com/hbm/blocks/network/BlockCable.java index 60906e5fd..e0b8418a8 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCable.java +++ b/src/main/java/com/hbm/blocks/network/BlockCable.java @@ -3,7 +3,6 @@ package com.hbm.blocks.network; import com.hbm.blocks.ModBlocks; import com.hbm.lib.Library; import com.hbm.tileentity.network.TileEntityCableBaseNT; - import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -28,26 +27,26 @@ public class BlockCable extends BlockContainer { @Override public int getRenderType() { - + if(this == ModBlocks.red_cable_classic) return renderIDClassic; - + return renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - + boolean posX = Library.canConnect(world, x + 1, y, z, Library.POS_X); boolean negX = Library.canConnect(world, x - 1, y, z, Library.NEG_X); boolean posY = Library.canConnect(world, x, y + 1, z, Library.POS_Y); @@ -56,29 +55,29 @@ public class BlockCable extends BlockContainer { boolean negZ = Library.canConnect(world, x, y, z - 1, Library.NEG_Z); setBlockBounds(posX, negX, posY, negY, posZ, negZ); - + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); } - + @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - + boolean posX = Library.canConnect(world, x + 1, y, z, Library.POS_X); boolean negX = Library.canConnect(world, x - 1, y, z, Library.NEG_X); boolean posY = Library.canConnect(world, x, y + 1, z, Library.POS_Y); boolean negY = Library.canConnect(world, x, y - 1, z, Library.NEG_Y); boolean posZ = Library.canConnect(world, x, y, z + 1, Library.POS_Z); boolean negZ = Library.canConnect(world, x, y, z - 1, Library.NEG_Z); - + setBlockBounds(posX, negX, posY, negY, posZ, negZ); } - + private void setBlockBounds(boolean posX, boolean negX, boolean posY, boolean negY, boolean posZ, boolean negZ) { - + float pixel = 0.0625F; float min = pixel * 5.5F; float max = pixel * 10.5F; - + float minX = negX ? 0F : min; float maxX = posX ? 1F : max; float minY = negY ? 0F : min; diff --git a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java index 292686f37..e87094830 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java +++ b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java @@ -1,20 +1,15 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - +import api.hbm.energymk2.PowerNetMK2; import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityCableBaseNT; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; - -import api.hbm.energymk2.PowerNetMK2; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -36,8 +31,11 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; + public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, ILookOverlay, ITooltipProvider { - + @SideOnly(Side.CLIENT) protected IIcon overlayGauge; public BlockCableGauge() { @@ -48,7 +46,7 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCableGauge(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { @@ -59,11 +57,11 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, @Override @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - + if(RenderBlockMultipass.currentPass == 0) { return blockIcon; } - + return side == world.getBlockMetadata(x, y, z) ? this.overlayGauge : this.blockIcon; } @@ -85,42 +83,42 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityCableGauge)) return; - + TileEntityCableGauge duct = (TileEntityCableGauge) te; - + List text = new ArrayList(); text.add(BobMathUtil.getShortNumber(duct.deltaTick) + "HE/t"); text.add(BobMathUtil.getShortNumber(duct.deltaLastSecond) + "HE/s"); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } - + @Override public int getRenderType(){ return IBlockMultiPass.getRenderType(); } @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) - public static class TileEntityCableGauge extends TileEntityCableBaseNT implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { + public static class TileEntityCableGauge extends TileEntityCableBaseNT implements SimpleComponent, CompatHandler.OCComponent { private long deltaTick = 0; private long deltaSecond = 0; private long deltaLastSecond = 0; - + @Override public void updateEntity() { super.updateEntity(); if(!worldObj.isRemote) { - + if(this.node != null && this.node.net != null) { - + PowerNetMK2 net = this.node.net; - + this.deltaTick = net.energyTracker; if(worldObj.getTotalWorldTime() % 20 == 0) { this.deltaLastSecond = this.deltaSecond; @@ -129,7 +127,7 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, this.deltaSecond += deltaTick; } - sendStandard(25); + networkPackNT(25); } } diff --git a/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java index 334654a4d..68a0232ee 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java @@ -1,11 +1,10 @@ package com.hbm.blocks.network; +import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.network.TileEntityCableBaseNT; - -import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -36,7 +35,7 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCablePaintable(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { @@ -48,10 +47,10 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityCablePaintable) { TileEntityCablePaintable pipe = (TileEntityCablePaintable) tile; - + if(pipe.block != null) { if(RenderBlockMultipass.currentPass == 1) { return this.overlay; @@ -60,26 +59,26 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB } } } - + return RenderBlockMultipass.currentPass == 1 ? this.overlay : this.blockIcon; } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { - + ItemStack stack = player.getHeldItem(); - + if(stack != null && stack.getItem() instanceof ItemBlock) { ItemBlock ib = (ItemBlock) stack.getItem(); Block block = ib.field_150939_a; - + if(block.renderAsNormalBlock() && block != this) { - + TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityCablePaintable) { TileEntityCablePaintable pipe = (TileEntityCablePaintable) tile; - + if(pipe.block == null) { pipe.block = block; pipe.meta = stack.getItemDamage() & 15; @@ -90,20 +89,20 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB } } } - + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); } @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - + if(tool != ToolType.SCREWDRIVER) return false; - + TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityCablePaintable) { TileEntityCablePaintable pipe = (TileEntityCablePaintable) tile; - + if(pipe.block != null) { pipe.block = null; world.markBlockForUpdate(x, y, z); @@ -111,7 +110,7 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB return true; } } - + return false; } @@ -119,7 +118,7 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB public int getPasses() { return 2; } - + @Override public int getRenderType(){ return IBlockMultiPass.getRenderType(); @@ -149,7 +148,7 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java b/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java index 44ce47839..bf816eef1 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java @@ -1,12 +1,9 @@ package com.hbm.blocks.network; -import java.util.List; - +import api.hbm.conveyor.IConveyorBelt; import com.hbm.blocks.ITooltipProvider; import com.hbm.entity.item.EntityMovingItem; import com.hbm.lib.RefStrings; - -import api.hbm.conveyor.IConveyorBelt; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,6 +23,8 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public abstract class BlockConveyorBase extends Block implements IConveyorBelt, ITooltipProvider { @SideOnly(Side.CLIENT) @@ -34,14 +33,14 @@ public abstract class BlockConveyorBase extends Block implements IConveyorBelt, public BlockConveyorBase() { super(Material.iron); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -50,7 +49,7 @@ public abstract class BlockConveyorBase extends Block implements IConveyorBelt, return this.sideIcon; if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) return this.sideIcon; - + return super.getIcon(side, metadata); } @@ -61,7 +60,7 @@ public abstract class BlockConveyorBase extends Block implements IConveyorBelt, @Override public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { - + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); //snapping point Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); @@ -74,7 +73,7 @@ public abstract class BlockConveyorBase extends Block implements IConveyorBelt, Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); return ret; } - + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); } @@ -83,10 +82,10 @@ public abstract class BlockConveyorBase extends Block implements IConveyorBelt, public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); - + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); - + double posX = x + 0.5; double posZ = z + 0.5; @@ -96,7 +95,7 @@ public abstract class BlockConveyorBase extends Block implements IConveyorBelt, if(dir.offsetZ != 0) { posZ = itemPos.zCoord; } - + return Vec3.createVectorHelper(posX, y + 0.25, posZ); } diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java b/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java index 095615595..7a479c699 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java @@ -1,9 +1,8 @@ package com.hbm.blocks.network; +import api.hbm.conveyor.IConveyorBelt; import com.hbm.entity.item.EntityMovingItem; import com.hbm.lib.RefStrings; - -import api.hbm.conveyor.IConveyorBelt; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -29,14 +28,14 @@ public class BlockConveyorClassic extends Block implements IConveyorBelt { public BlockConveyorClassic() { super(Material.iron); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -45,7 +44,7 @@ public class BlockConveyorClassic extends Block implements IConveyorBelt { return this.sideIcon; if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) return this.sideIcon; - + return super.getIcon(side, metadata); } @@ -56,7 +55,7 @@ public class BlockConveyorClassic extends Block implements IConveyorBelt { @Override public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { - + ForgeDirection dir = getTravelDirection(world, x, y, z, itemPos, speed); //snapping point Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); @@ -69,7 +68,7 @@ public class BlockConveyorClassic extends Block implements IConveyorBelt { Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); return ret; } - + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); } @@ -78,10 +77,10 @@ public class BlockConveyorClassic extends Block implements IConveyorBelt { public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); - + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); - + double posX = x + 0.5; double posZ = z + 0.5; @@ -91,7 +90,7 @@ public class BlockConveyorClassic extends Block implements IConveyorBelt { if(dir.offsetZ != 0) { posZ = itemPos.zCoord; } - + return Vec3.createVectorHelper(posX, y + 0.25, posZ); } diff --git a/src/main/java/com/hbm/blocks/network/CableDetector.java b/src/main/java/com/hbm/blocks/network/CableDetector.java index 7776212ac..18e80c570 100644 --- a/src/main/java/com/hbm/blocks/network/CableDetector.java +++ b/src/main/java/com/hbm/blocks/network/CableDetector.java @@ -2,7 +2,6 @@ package com.hbm.blocks.network; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityCableSwitch; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -21,14 +20,14 @@ public class CableDetector extends BlockContainer { public CableDetector(Material p_i45386_1_) { super(p_i45386_1_); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { this.iconOn = iconRegister.registerIcon(RefStrings.MODID + ":cable_detector_on"); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":cable_detector_off"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -42,18 +41,18 @@ public class CableDetector extends BlockContainer { @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - + boolean on = world.isBlockIndirectlyGettingPowered(x, y, z); int meta = world.getBlockMetadata(x, y, z); - + boolean update = false; - + if(on && meta == 0) { world.setBlockMetadataWithNotify(x, y, z, 1, 2); world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 1.0F); update = true; } - + if(!on && meta == 1) { world.setBlockMetadataWithNotify(x, y, z, 0, 2); world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 0.85F); diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 246094666..d0f17735b 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -1,22 +1,18 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - +import api.hbm.block.IToolable; +import api.hbm.energymk2.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; import com.hbm.util.Compat; import com.hbm.util.I18nUtil; - -import api.hbm.block.IToolable; -import api.hbm.energymk2.IEnergyConnectorBlock; -import api.hbm.energymk2.IEnergyConnectorMK2; -import api.hbm.energymk2.IEnergyReceiverMK2; -import api.hbm.energymk2.Nodespace; -import api.hbm.energymk2.Nodespace.PowerNode; -import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,8 +33,11 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, ILookOverlay, IToolable, ITooltipProvider { - + public CableDiode(Material mat) { super(mat); } @@ -49,23 +48,23 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, public int getRenderType() { return renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess p_149646_1_, int p_149646_2_, int p_149646_3_, int p_149646_4_, int p_149646_5_) { return true; } - + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int l = BlockPistonBase.determineOrientation(world, x, y, z, player); world.setBlockMetadataWithNotify(x, y, z, l, 2); @@ -80,10 +79,10 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntityDiode te = (TileEntityDiode)world.getTileEntity(x, y, z); - + if(world.isRemote) return true; - + if(tool == ToolType.SCREWDRIVER) { if(te.level < 11) te.level++; @@ -91,7 +90,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, world.markBlockForUpdate(x, y, z); return true; } - + if(tool == ToolType.HAND_DRILL) { if(te.level > 1) te.level--; @@ -99,7 +98,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, world.markBlockForUpdate(x, y, z); return true; } - + if(tool == ToolType.DEFUSER) { int p = te.priority.ordinal() + 1; if(p > 4) p = 0; @@ -108,7 +107,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, world.markBlockForUpdate(x, y, z); return true; } - + return false; } @@ -122,18 +121,18 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityDiode)) return; - + TileEntityDiode diode = (TileEntityDiode) te; - + List text = new ArrayList(); text.add("Max.: " + BobMathUtil.getShortNumber(diode.getMaxPower()) + "HE/t"); text.add("Priority: " + diode.priority.name()); - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -141,16 +140,16 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDiode(); } - + public static class TileEntityDiode extends TileEntityLoadedBase implements IEnergyReceiverMK2 { - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); level = nbt.getInteger("level"); priority = ConnectionPriority.values()[nbt.getByte("p")]; } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -164,30 +163,30 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); } - + int level = 1; - + private ForgeDirection getDir() { return ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); } @Override public void updateEntity() { - + if(!worldObj.isRemote) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - + if(dir == getDir()) continue; - + this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - + pulses = 0; this.setPower(0); //tick is over, reset our allowed transfe } @@ -197,7 +196,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, public boolean canConnect(ForgeDirection dir) { return dir != getDir(); } - + /** Used as an intra-tick tracker for how much energy has been transmitted, resets to 0 each tick and maxes out based on transfer */ private long power; private boolean recursionBrake = false; @@ -209,23 +208,23 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, if(recursionBrake) return power; - + pulses++; if(this.getPower() >= this.getMaxPower() || pulses > 10) return power; //if we have already maxed out transfer or max pulses, abort - + recursionBrake = true; - + ForgeDirection dir = getDir(); PowerNode node = Nodespace.getNode(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); TileEntity te = Compat.getTileStandard(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - + if(node != null && !node.expired && node.hasValidNet() && te instanceof IEnergyConnectorMK2 && ((IEnergyConnectorMK2) te).canConnect(dir.getOpposite())) { long toTransfer = Math.min(power, this.getReceiverSpeed()); long remainder = node.net.sendPowerDiode(toTransfer); long transferred = (toTransfer - remainder); this.power += transferred; power -= transferred; - + } else if(te instanceof IEnergyReceiverMK2 && te != this) { IEnergyReceiverMK2 rec = (IEnergyReceiverMK2) te; if(rec.canConnect(dir.getOpposite())) { @@ -236,7 +235,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, return power; } } - + recursionBrake = false; return power; } @@ -255,7 +254,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, public long getPower() { return Math.min(power, this.getMaxPower()); } - + @Override public void setPower(long power) { this.power = power; diff --git a/src/main/java/com/hbm/blocks/network/CableSwitch.java b/src/main/java/com/hbm/blocks/network/CableSwitch.java index b419ec28a..f62af26b0 100644 --- a/src/main/java/com/hbm/blocks/network/CableSwitch.java +++ b/src/main/java/com/hbm/blocks/network/CableSwitch.java @@ -2,7 +2,6 @@ package com.hbm.blocks.network; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityCableSwitch; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; @@ -21,14 +20,14 @@ public class CableSwitch extends BlockContainer { public CableSwitch(Material p_i45386_1_) { super(p_i45386_1_); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { this.iconOn = iconRegister.registerIcon(RefStrings.MODID + ":cable_switch_on"); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":cable_switch_off"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -39,7 +38,7 @@ public class CableSwitch extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityCableSwitch(); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) @@ -55,10 +54,10 @@ public class CableSwitch extends BlockContainer { world.setBlockMetadataWithNotify(x, y, z, 0, 2); world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 0.85F); } - + TileEntityCableSwitch te = (TileEntityCableSwitch) world.getTileEntity(x, y, z); te.updateState(); - + return true; } else { return false; diff --git a/src/main/java/com/hbm/blocks/network/ConnectorRedWire.java b/src/main/java/com/hbm/blocks/network/ConnectorRedWire.java index c60d9e7a8..c97e067b2 100644 --- a/src/main/java/com/hbm/blocks/network/ConnectorRedWire.java +++ b/src/main/java/com/hbm/blocks/network/ConnectorRedWire.java @@ -1,10 +1,7 @@ package com.hbm.blocks.network; -import java.util.List; - import com.hbm.lib.Library; import com.hbm.tileentity.network.TileEntityConnector; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -15,6 +12,8 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class ConnectorRedWire extends PylonBase { public ConnectorRedWire(Material mat) { @@ -30,26 +29,26 @@ public class ConnectorRedWire extends PylonBase { public int onBlockPlaced(World world, int x, int y, int z, int side, float fX, float fY, float fZ, int meta) { return side; } - + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { setBlockBounds(world.getBlockMetadata(x, y, z)); return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); } - + @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { setBlockBounds(world.getBlockMetadata(x, y, z)); } - + private void setBlockBounds(int meta) { - + float pixel = 0.0625F; float min = pixel * 5F; float max = pixel * 11F; - + ForgeDirection dir = ForgeDirection.getOrientation(meta).getOpposite(); - + float minX = dir == Library.NEG_X ? 0F : min; float maxX = dir == Library.POS_X ? 1F : max; float minY = dir == Library.NEG_Y ? 0F : min; diff --git a/src/main/java/com/hbm/blocks/network/CraneInserter.java b/src/main/java/com/hbm/blocks/network/CraneInserter.java index b21009505..b83da5278 100644 --- a/src/main/java/com/hbm/blocks/network/CraneInserter.java +++ b/src/main/java/com/hbm/blocks/network/CraneInserter.java @@ -7,7 +7,6 @@ import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityCraneBase; import com.hbm.tileentity.network.TileEntityCraneInserter; import com.hbm.util.InventoryUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -32,7 +31,7 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { public TileEntityCraneBase createNewTileEntity(World world, int meta) { return new TileEntityCraneInserter(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -62,28 +61,28 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { public void onItemEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { ForgeDirection outputDirection = getOutputSide(world, x, y, z); TileEntity te = world.getTileEntity(x + outputDirection.offsetX, y + outputDirection.offsetY, z + outputDirection.offsetZ); - + if(entity == null || entity.getItemStack() == null || entity.getItemStack().stackSize <= 0) { return; } - + ItemStack toAdd = entity.getItemStack().copy(); - + int[] access = null; - + if(te instanceof ISidedInventory) { ISidedInventory sided = (ISidedInventory) te; access = InventoryUtil.masquerade(sided, outputDirection.getOpposite().ordinal()); } - + if(te instanceof IInventory) { IInventory inv = (IInventory) te; - + addToInventory(inv, access, toAdd, outputDirection.getOpposite().ordinal()); } - + TileEntityCraneInserter inserter = null; - + if(toAdd.stackSize > 0) { inserter = (TileEntityCraneInserter) world.getTileEntity(x, y, z); addToInventory(inserter, null, toAdd, outputDirection.getOpposite().ordinal()); @@ -93,54 +92,54 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { world.spawnEntityInWorld(drop); } } - + public static ItemStack addToInventory(IInventory inv, int[] access, ItemStack toAdd, int side) { - + ISidedInventory sided = inv instanceof ISidedInventory ? (ISidedInventory) inv : null; int limit = inv.getInventoryStackLimit(); - + int size = access == null ? inv.getSizeInventory() : access.length; - + for(int i = 0; i < size; i++) { int index = access == null ? i : access[i]; ItemStack stack = inv.getStackInSlot(index); - + if(stack != null && toAdd.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(toAdd, stack) && stack.stackSize < Math.min(stack.getMaxStackSize(), limit) && ((sided == null || sided.canInsertItem(index, toAdd, side)) && inv.isItemValidForSlot(index, toAdd))) { - + int stackLimit = Math.min(stack.getMaxStackSize(), limit); int amount = Math.min(toAdd.stackSize, stackLimit - stack.stackSize); - + stack.stackSize += amount; toAdd.stackSize -= amount; inv.markDirty(); - + if(toAdd.stackSize == 0) { return null; } } } - + for(int i = 0; i < size; i++) { int index = access == null ? i : access[i]; ItemStack stack = inv.getStackInSlot(index); - + if(stack == null && ((sided == null || sided.canInsertItem(index, toAdd, side)) && inv.isItemValidForSlot(index, toAdd))) { - + int amount = Math.min(toAdd.stackSize, limit); - + ItemStack newStack = toAdd.copy(); newStack.stackSize = amount; inv.setInventorySlotContents(index, newStack); toAdd.stackSize -= amount; inv.markDirty(); - + if(toAdd.stackSize == 0) { return null; } } } - + return toAdd; } @@ -156,7 +155,7 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { public boolean hasComparatorInputOverride() { return true; } - + @Override public int getComparatorInputOverride(World world, int x, int y, int z, int side) { return Container.calcRedstoneFromInventory((TileEntityCraneInserter)world.getTileEntity(x, y, z)); diff --git a/src/main/java/com/hbm/blocks/network/CranePartitioner.java b/src/main/java/com/hbm/blocks/network/CranePartitioner.java index 415ed34aa..f2d0b7cee 100644 --- a/src/main/java/com/hbm/blocks/network/CranePartitioner.java +++ b/src/main/java/com/hbm/blocks/network/CranePartitioner.java @@ -1,21 +1,15 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Random; - +import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IConveyorItem; +import api.hbm.conveyor.IConveyorPackage; +import api.hbm.conveyor.IEnterableBlock; import com.hbm.blocks.ITooltipProvider; import com.hbm.entity.item.EntityMovingItem; import com.hbm.inventory.recipes.CrystallizerRecipes; import com.hbm.lib.RefStrings; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.InventoryUtil; - -import api.hbm.conveyor.IConveyorBelt; -import api.hbm.conveyor.IConveyorItem; -import api.hbm.conveyor.IConveyorPackage; -import api.hbm.conveyor.IEnterableBlock; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,6 +31,11 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Random; + public class CranePartitioner extends BlockContainer implements IConveyorBelt, IEnterableBlock, ITooltipProvider { @SideOnly(Side.CLIENT) public IIcon iconTop; @@ -48,7 +47,7 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I public CranePartitioner() { super(Material.iron); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -116,7 +115,7 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I if(dir.offsetZ != 0) posZ = itemPos.zCoord; return Vec3.createVectorHelper(posX, y + 0.25, posZ); } - + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { int meta = world.getBlockMetadata(x, y, z); return ForgeDirection.getOrientation(meta); @@ -137,7 +136,7 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I world.spawnEntityInWorld(item); } } - + public static class TileEntityCranePartitioner extends TileEntityMachineBase { public TileEntityCranePartitioner() { @@ -148,14 +147,14 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + List stacks = new ArrayList(); for(int i = 0; i < 9; i++) if(slots[i] != null) stacks.add(slots[i]); stacks.sort(stackSizeComparator); boolean markDirty = false; - + for(ItemStack stack : stacks) { int amount = CrystallizerRecipes.getAmount(stack); while(stack.stackSize >= amount) { @@ -168,12 +167,12 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I worldObj.spawnEntityInWorld(item); } } - + for(int i = 0; i < 9; i++) if(slots[i] != null && slots[i].stackSize <= 0) slots[i] = null; if(markDirty) this.markDirty(); } } - + public static Comparator stackSizeComparator = new Comparator() { @Override @@ -204,7 +203,7 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I } private final Random dropRandom = new Random(); - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntity tile = world.getTileEntity(x, y, z); diff --git a/src/main/java/com/hbm/blocks/network/CraneRouter.java b/src/main/java/com/hbm/blocks/network/CraneRouter.java index a89d2a695..d6f663817 100644 --- a/src/main/java/com/hbm/blocks/network/CraneRouter.java +++ b/src/main/java/com/hbm/blocks/network/CraneRouter.java @@ -1,8 +1,9 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - +import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IConveyorItem; +import api.hbm.conveyor.IConveyorPackage; +import api.hbm.conveyor.IEnterableBlock; import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ITooltipProvider; import com.hbm.entity.item.EntityMovingItem; @@ -11,11 +12,6 @@ import com.hbm.main.MainRegistry; import com.hbm.module.ModulePatternMatcher; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.network.TileEntityCraneRouter; - -import api.hbm.conveyor.IConveyorBelt; -import api.hbm.conveyor.IConveyorItem; -import api.hbm.conveyor.IConveyorPackage; -import api.hbm.conveyor.IEnterableBlock; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -33,6 +29,9 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnterableBlock, ITooltipProvider { @SideOnly(Side.CLIENT) protected IIcon iconOverlay; @@ -46,7 +45,7 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCraneRouter(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -59,7 +58,7 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt public IIcon getIcon(int side, int metadata) { return RenderBlockMultipass.currentPass == 0 ? this.blockIcon : this.iconOverlay; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { @@ -75,10 +74,10 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt @Override @SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess world, int x, int y, int z) { - + if(RenderBlockMultipass.currentPass == 0) return 0xffffff; - + switch(RenderBlockMultipass.currentPass - 1) { case 0: return 0xff0000; case 1: return 0xff8000; @@ -89,7 +88,7 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt default: return 0xffffff; } } - + @Override public int getRenderType(){ return IBlockMultiPass.getRenderType(); @@ -101,10 +100,10 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - + if(RenderBlockMultipass.currentPass == 0) return true; - + return side == RenderBlockMultipass.currentPass - 1; } @@ -122,40 +121,40 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt public void onItemEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { TileEntityCraneRouter router = (TileEntityCraneRouter) world.getTileEntity(x, y, z); ItemStack stack = entity.getItemStack(); - + List validDirs = new ArrayList(); - + //check filters for all sides for(int side = 0; side < 6; side++) { - + ModulePatternMatcher matcher = router.patterns[side]; int mode = router.modes[side]; - + //if the side is disabled or wildcard, skip if(mode == router.MODE_NONE || mode == router.MODE_WILDCARD) continue; - + boolean matchesFilter = false; - + for(int slot = 0; slot < 5; slot++) { ItemStack filter = router.slots[side * 5 + slot]; - + if(filter == null) continue; - + //the filter kicks in so long as one entry matches if(matcher.isValidForFilter(filter, slot, stack)) { matchesFilter = true; break; } } - + //add dir if matches with whitelist on or doesn't match with blacklist on if((mode == router.MODE_WHITELIST && matchesFilter) || (mode == router.MODE_BLACKLIST && !matchesFilter)) { validDirs.add(ForgeDirection.getOrientation(side)); } } - + //if no valid dirs have yet been found, use wildcard if(validDirs.isEmpty()) { for(int side = 0; side < 6; side++) { @@ -164,25 +163,25 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt } } } - + if(validDirs.isEmpty()) { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); return; } - + int i = world.rand.nextInt(validDirs.size()); sendOnRoute(world, x, y, z, entity, validDirs.get(i)); } - + protected void sendOnRoute(World world, int x, int y, int z, IConveyorItem item, ForgeDirection dir) { - + IConveyorBelt belt = null; Block block = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - + if(block instanceof IConveyorBelt) { belt = (IConveyorBelt) block; } - + if(belt != null) { EntityMovingItem moving = new EntityMovingItem(world); Vec3 pos = Vec3.createVectorHelper(x + 0.5 + dir.offsetX * 0.55, y + 0.5 + dir.offsetY * 0.55, z + 0.5 + dir.offsetZ * 0.55); diff --git a/src/main/java/com/hbm/blocks/network/CraneSplitter.java b/src/main/java/com/hbm/blocks/network/CraneSplitter.java index a39396fb0..562c495a2 100644 --- a/src/main/java/com/hbm/blocks/network/CraneSplitter.java +++ b/src/main/java/com/hbm/blocks/network/CraneSplitter.java @@ -1,17 +1,14 @@ package com.hbm.blocks.network; -import java.util.List; - -import com.hbm.blocks.BlockDummyable; -import com.hbm.blocks.ITooltipProvider; -import com.hbm.entity.item.EntityMovingItem; -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.network.TileEntityCraneSplitter; - import api.hbm.conveyor.IConveyorBelt; import api.hbm.conveyor.IConveyorItem; import api.hbm.conveyor.IConveyorPackage; import api.hbm.conveyor.IEnterableBlock; +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.TileEntityCraneSplitter; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,6 +23,8 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class CraneSplitter extends BlockDummyable implements IConveyorBelt, IEnterableBlock, ITooltipProvider { @SideOnly(Side.CLIENT) public IIcon iconTopLeft; @@ -39,7 +38,7 @@ public class CraneSplitter extends BlockDummyable implements IConveyorBelt, IEnt @SideOnly(Side.CLIENT) public IIcon iconBelt; @SideOnly(Side.CLIENT) public IIcon iconInner; @SideOnly(Side.CLIENT) public IIcon iconInnerSide; - + public CraneSplitter() { super(Material.iron); } @@ -58,7 +57,7 @@ public class CraneSplitter extends BlockDummyable implements IConveyorBelt, IEnt public int getOffset() { return 0; } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -100,7 +99,7 @@ public class CraneSplitter extends BlockDummyable implements IConveyorBelt, IEnt boolean pos = splitter.getPosition(); ItemStack stack = entity.getItemStack(); ForgeDirection rot = ForgeDirection.getOrientation(splitter.getBlockMetadata() - offset).getRotation(ForgeDirection.DOWN); - + if(stack.stackSize % 2 == 0) { stack.stackSize /= 2; spawnMovingItem(world, x, y, z, stack.copy()); @@ -114,7 +113,7 @@ public class CraneSplitter extends BlockDummyable implements IConveyorBelt, IEnt splitter.setPosition(!pos); } } - + private void spawnMovingItem(World world, int x, int y, int z, ItemStack stack) { if(stack.stackSize <= 0) return; EntityMovingItem moving = new EntityMovingItem(world); @@ -152,7 +151,7 @@ public class CraneSplitter extends BlockDummyable implements IConveyorBelt, IEnt if(dir.offsetZ != 0) posZ = itemPos.zCoord; return Vec3.createVectorHelper(posX, y + 0.25, posZ); } - + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { int meta = world.getBlockMetadata(x, y, z); if(meta >= 12) return ForgeDirection.getOrientation(meta - offset); diff --git a/src/main/java/com/hbm/blocks/network/DroneCrate.java b/src/main/java/com/hbm/blocks/network/DroneCrate.java index 94641ed8f..78a64be21 100644 --- a/src/main/java/com/hbm/blocks/network/DroneCrate.java +++ b/src/main/java/com/hbm/blocks/network/DroneCrate.java @@ -1,9 +1,5 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.items.ModItems; @@ -11,7 +7,6 @@ import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.network.TileEntityDroneCrate; import com.hbm.util.I18nUtil; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,8 +23,12 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class DroneCrate extends BlockContainer implements ILookOverlay, ITooltipProvider { - + private static Random rand = new Random(); @SideOnly(Side.CLIENT) private IIcon iconTop; @@ -60,9 +59,9 @@ public class DroneCrate extends BlockContainer implements ILookOverlay, ITooltip @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.drone_linker) return false; - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { @@ -72,7 +71,7 @@ public class DroneCrate extends BlockContainer implements ILookOverlay, ITooltip return false; } } - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityDroneCrate tileentityfurnace = (TileEntityDroneCrate) world.getTileEntity(x, y, z); @@ -124,7 +123,7 @@ public class DroneCrate extends BlockContainer implements ILookOverlay, ITooltip public void printHook(Pre event, World world, int x, int y, int z) { TileEntityDroneCrate tile = (TileEntityDroneCrate) world.getTileEntity(x, y, z); List text = new ArrayList(); - + if(tile.nextY != -1) { text.add("Next waypoint: " + tile.nextX + " / " + tile.nextY + " / " + tile.nextZ); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); diff --git a/src/main/java/com/hbm/blocks/network/DroneDock.java b/src/main/java/com/hbm/blocks/network/DroneDock.java index df16956fc..226d3c3f0 100644 --- a/src/main/java/com/hbm/blocks/network/DroneDock.java +++ b/src/main/java/com/hbm/blocks/network/DroneDock.java @@ -1,14 +1,11 @@ package com.hbm.blocks.network; -import java.util.List; - import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.tileentity.network.TileEntityDroneDock; import com.hbm.tileentity.network.TileEntityDroneProvider; import com.hbm.tileentity.network.TileEntityDroneRequester; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,6 +18,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class DroneDock extends BlockContainer implements ITooltipProvider { @SideOnly(Side.CLIENT) private IIcon iconTop; @@ -36,7 +35,7 @@ public class DroneDock extends BlockContainer implements ITooltipProvider { if(this == ModBlocks.drone_dock) return new TileEntityDroneDock(); if(this == ModBlocks.drone_crate_provider) return new TileEntityDroneProvider(); if(this == ModBlocks.drone_crate_requester) return new TileEntityDroneRequester(); - + return null; } @@ -53,7 +52,7 @@ public class DroneDock extends BlockContainer implements ITooltipProvider { public IIcon getIcon(int side, int metadata) { return side == 1 ? this.iconTop : (side == 0 ? this.iconBottom : this.blockIcon); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { diff --git a/src/main/java/com/hbm/blocks/network/DroneWaypoint.java b/src/main/java/com/hbm/blocks/network/DroneWaypoint.java index 28e9e338b..16f5c60eb 100644 --- a/src/main/java/com/hbm/blocks/network/DroneWaypoint.java +++ b/src/main/java/com/hbm/blocks/network/DroneWaypoint.java @@ -1,14 +1,10 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.items.ModItems; import com.hbm.tileentity.network.TileEntityDroneWaypoint; import com.hbm.util.I18nUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -25,6 +21,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class DroneWaypoint extends BlockContainer implements ILookOverlay, ITooltipProvider { public DroneWaypoint() { @@ -40,34 +39,34 @@ public class DroneWaypoint extends BlockContainer implements ILookOverlay, ITool public int getRenderType() { return RadioTorchBase.renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { return true; } - + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return null; } - + @Override public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 vec0, Vec3 vec1) { - + int meta = world.getBlockMetadata(x, y, z) & 7; ForgeDirection dir = ForgeDirection.getOrientation(meta); - + this.setBlockBounds( dir.offsetX == 1 ? 0F : 0.375F, dir.offsetY == 1 ? 0F : 0.375F, @@ -87,34 +86,34 @@ public class DroneWaypoint extends BlockContainer implements ILookOverlay, ITool @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - + int meta = world.getBlockMetadata(x, y, z); ForgeDirection dir = ForgeDirection.getOrientation(meta); Block b = world.getBlock(x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ); - + if(!b.isSideSolid(world, x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ, dir) && (!b.renderAsNormalBlock() || b.isAir(world, x, y, z))) { this.dropBlockAsItem(world, x, y, z, meta, 0); world.setBlockToAir(x, y, z); } } - + @Override public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side) { if(!super.canPlaceBlockOnSide(world, x, y, z, side)) return false; - + ForgeDirection dir = ForgeDirection.getOrientation(side); Block b = world.getBlock(x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ); - + return b.isSideSolid(world, x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ, dir) || (b.renderAsNormalBlock() && !b.isAir(world, x, y, z)); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.drone_linker) return false; - + if(world.isRemote) return true; - + TileEntityDroneWaypoint tile = (TileEntityDroneWaypoint) world.getTileEntity(x, y, z); tile.addHeight(player.isSneaking() ? - 1 : 1); return true; @@ -129,13 +128,13 @@ public class DroneWaypoint extends BlockContainer implements ILookOverlay, ITool public void printHook(Pre event, World world, int x, int y, int z) { TileEntityDroneWaypoint tile = (TileEntityDroneWaypoint) world.getTileEntity(x, y, z); List text = new ArrayList(); - + text.add("Waypoint distance: " + tile.height); - + if(tile.nextY != -1) { text.add("Next waypoint: " + tile.nextX + " / " + tile.nextY + " / " + tile.nextZ); } - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } } diff --git a/src/main/java/com/hbm/blocks/network/DroneWaypointRequest.java b/src/main/java/com/hbm/blocks/network/DroneWaypointRequest.java index a02b63a3c..82318b0a8 100644 --- a/src/main/java/com/hbm/blocks/network/DroneWaypointRequest.java +++ b/src/main/java/com/hbm/blocks/network/DroneWaypointRequest.java @@ -1,7 +1,6 @@ package com.hbm.blocks.network; import com.hbm.tileentity.network.TileEntityDroneWaypointRequest; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -30,34 +29,34 @@ public class DroneWaypointRequest extends BlockContainer { public int getRenderType() { return RadioTorchBase.renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { return true; } - + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return null; } - + @Override public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 vec0, Vec3 vec1) { - + int meta = world.getBlockMetadata(x, y, z) & 7; ForgeDirection dir = ForgeDirection.getOrientation(meta); - + this.setBlockBounds( dir.offsetX == 1 ? 0F : 0.375F, dir.offsetY == 1 ? 0F : 0.375F, @@ -77,24 +76,24 @@ public class DroneWaypointRequest extends BlockContainer { @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - + int meta = world.getBlockMetadata(x, y, z); ForgeDirection dir = ForgeDirection.getOrientation(meta); Block b = world.getBlock(x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ); - + if(!b.isSideSolid(world, x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ, dir) && (!b.renderAsNormalBlock() || b.isAir(world, x, y, z))) { this.dropBlockAsItem(world, x, y, z, meta, 0); world.setBlockToAir(x, y, z); } } - + @Override public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side) { if(!super.canPlaceBlockOnSide(world, x, y, z, side)) return false; - + ForgeDirection dir = ForgeDirection.getOrientation(side); Block b = world.getBlock(x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ); - + return b.isSideSolid(world, x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ, dir) || (b.renderAsNormalBlock() && !b.isAir(world, x, y, z)); } } diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctBase.java b/src/main/java/com/hbm/blocks/network/FluidDuctBase.java index 65af59af5..3016bc287 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctBase.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctBase.java @@ -1,8 +1,7 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - +import api.hbm.fluid.IPipeNet; +import api.hbm.fluid.PipeNet; import com.hbm.blocks.IAnalyzable; import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.HbmKeybinds; @@ -10,9 +9,6 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemFluidIDMulti; import com.hbm.tileentity.network.TileEntityPipeBaseNT; - -import api.hbm.fluid.IPipeNet; -import api.hbm.fluid.PipeNet; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -22,6 +18,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class FluidDuctBase extends BlockContainer implements IBlockFluidDuct, IAnalyzable { public FluidDuctBase(Material mat) { @@ -35,15 +34,15 @@ public class FluidDuctBase extends BlockContainer implements IBlockFluidDuct, IA @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { IItemFluidIdentifier id = (IItemFluidIdentifier) player.getHeldItem().getItem(); FluidType type = id.getType(world, x, y, z, player.getHeldItem()); - + if(!HbmPlayerProps.getData(player).getKeyPressed(HbmKeybinds.EnumKeybind.TOOL_CTRL) && !player.isSneaking()) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityPipeBaseNT) { TileEntityPipeBaseNT pipe = (TileEntityPipeBaseNT) te; @@ -64,7 +63,7 @@ public class FluidDuctBase extends BlockContainer implements IBlockFluidDuct, IA } } } else { - + TileEntity te = world.getTileEntity(x, y, z); if(te instanceof TileEntityPipeBaseNT) { @@ -86,25 +85,25 @@ public class FluidDuctBase extends BlockContainer implements IBlockFluidDuct, IA } } } - + return false; } @Override public void changeTypeRecursively(World world, int x, int y, int z, FluidType prevType, FluidType type, int loopsRemaining) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityPipeBaseNT) { TileEntityPipeBaseNT pipe = (TileEntityPipeBaseNT) te; - + if(pipe.getType() == prevType && pipe.getType() != type) { pipe.setType(type); - + if(loopsRemaining > 0) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { Block b = world.getBlock(x, y, z); - + if(b instanceof IBlockFluidDuct) { ((IBlockFluidDuct) b).changeTypeRecursively(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, prevType, type, loopsRemaining - 1); } @@ -116,20 +115,20 @@ public class FluidDuctBase extends BlockContainer implements IBlockFluidDuct, IA @Override public List getDebugInfo(World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityPipeBaseNT) { TileEntityPipeBaseNT pipe = (TileEntityPipeBaseNT) te; FluidType type = pipe.getType(); - + if(type != null) { - + IPipeNet net = pipe.getPipeNet(type); - + if(net instanceof PipeNet) { PipeNet pipeNet = (PipeNet) net; - + List debug = new ArrayList(); debug.add("=== DEBUG START ==="); debug.addAll(pipeNet.debug); @@ -141,7 +140,7 @@ public class FluidDuctBase extends BlockContainer implements IBlockFluidDuct, IA } } } - + return null; } } diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctBox.java b/src/main/java/com/hbm/blocks/network/FluidDuctBox.java index fb759fb93..6d091e422 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctBox.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctBox.java @@ -1,15 +1,11 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ILookOverlay; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.I18nUtil; - import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -27,6 +23,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOverlay { @SideOnly(Side.CLIENT) public IIcon[] iconStraight; @@ -36,13 +35,13 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve @SideOnly(Side.CLIENT) public IIcon[] iconCurveBL; @SideOnly(Side.CLIENT) public IIcon[] iconCurveBR; @SideOnly(Side.CLIENT) public IIcon[][] iconJunction; - + private static final String[] materials = new String[] { "silver", "copper", "white" }; public FluidDuctBox(Material mat) { super(mat); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -79,13 +78,13 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve boolean pY = canConnectTo(world, x, y, z, Library.POS_Y, te); boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, te); boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); - + int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); - + int meta = world.getBlockMetadata(x, y, z); int m = rectify(meta); - + if((mask & 0b001111) == 0 && mask > 0) { return (side == 4 || side == 5) ? iconEnd[m] : iconStraight[m]; } else if((mask & 0b111100) == 0 && mask > 0) { @@ -112,41 +111,41 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve if(pX && pZ) return side == 0 ? iconCurveBR[m] : iconCurveBR[m]; if(nX && nZ) return side == 0 ? iconCurveTL[m] : iconCurveTL[m]; if(nX && pZ) return side == 0 ? iconCurveBL[m] : iconCurveBL[m]; - + return iconJunction[m][meta / 3]; } - + return iconJunction[m][meta / 3]; } - + @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List list) { for(int i = 0; i < 15; ++i) { list.add(new ItemStack(item, 1, i)); } } - + public int damageDropped(int meta) { return meta % 15; } - + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); @Override public int getRenderType() { return renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess p_149646_1_, int p_149646_2_, int p_149646_3_, int p_149646_4_, int p_149646_5_) { @@ -160,7 +159,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { - + List bbs = new ArrayList(); TileEntity te = world.getTileEntity(x, y, z); @@ -170,9 +169,9 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve double jLower = 0.0625D; double jUpper = 0.9375D; int meta = world.getBlockMetadata(x, y, z); - + for(int i = 2; i < 13; i += 3) { - + if(meta > i) { lower += 0.0625D; upper -= 0.0625D; @@ -180,7 +179,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve jUpper -= 0.0625D; } } - + boolean nX = canConnectTo(world, x, y, z, Library.NEG_X, te); boolean pX = canConnectTo(world, x, y, z, Library.POS_X, te); boolean nY = canConnectTo(world, x, y, z, Library.NEG_Y, te); @@ -189,7 +188,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); - + if(mask == 0) { bbs.add(AxisAlignedBB.getBoundingBox(x + jLower, y + jLower, z + jLower, x + jUpper, y + jUpper, z + jUpper)); } else if(mask == 0b100000 || mask == 0b010000 || mask == 0b110000) { @@ -199,13 +198,13 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve } else if(mask == 0b000010 || mask == 0b000001 || mask == 0b000011) { bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + 0.0D, x + upper, y + upper, z + 1.0D)); } else { - + if(count != 2) { bbs.add(AxisAlignedBB.getBoundingBox(x + jLower, y + jLower, z + jLower, x + jUpper, y + jUpper, z + jUpper)); } else { bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + lower, x + upper, y + upper, z + upper)); } - + if(pX) bbs.add(AxisAlignedBB.getBoundingBox(x + upper, y + lower, z + lower, x + 1.0D, y + upper, z + upper)); if(nX) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.0D, y + lower, z + lower, x + lower, y + upper, z + upper)); if(pY) bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + upper, z + lower, x + upper, y + 1.0D, z + upper)); @@ -213,7 +212,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve if(pZ) bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + upper, x + upper, y + upper, z + 1.0D)); if(nZ) bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + 0.0D, x + upper, y + upper, z + lower)); } - + for(AxisAlignedBB bb : bbs) { if(entityBounding.intersectsWith(bb)) { list.add(bb); @@ -244,9 +243,9 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve float jLower = 0.0625F; float jUpper = 0.9375F; int meta = world.getBlockMetadata(x, y, z); - + for(int i = 2; i < 13; i += 3) { - + if(meta > i) { lower += 0.0625F; upper -= 0.0625F; @@ -254,7 +253,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve jUpper -= 0.0625F; } } - + boolean nX = canConnectTo(world, x, y, z, Library.NEG_X, te); boolean pX = canConnectTo(world, x, y, z, Library.POS_X, te); boolean nY = canConnectTo(world, x, y, z, Library.NEG_Y, te); @@ -263,7 +262,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); - + if(mask == 0) { this.setBlockBounds(jLower, jLower, jLower, jUpper, jUpper, jUpper); } else if(mask == 0b100000 || mask == 0b010000 || mask == 0b110000) { @@ -273,7 +272,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve } else if(mask == 0b000010 || mask == 0b000001 || mask == 0b000011) { this.setBlockBounds(lower, lower, 0F, upper, upper, 1F); } else { - + if(count != 2) { this.setBlockBounds( nX ? 0F : jLower, @@ -293,7 +292,7 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve } } } - + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir, TileEntity tile) { if(tile instanceof TileEntityPipeBaseNT) { return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, ((TileEntityPipeBaseNT) tile).getType()); @@ -303,21 +302,21 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityPipeBaseNT)) return; - + TileEntityPipeBaseNT duct = (TileEntityPipeBaseNT) te; - + List text = new ArrayList(); text.add("&[" + duct.getType().getColor() + "&]" + duct.getType().getLocalizedName()); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } - + public static int cachedColor = 0xffffff; - + @Override @SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess world, int x, int y, int z) { diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctBoxExhaust.java b/src/main/java/com/hbm/blocks/network/FluidDuctBoxExhaust.java index 41a081993..4384b908b 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctBoxExhaust.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctBoxExhaust.java @@ -1,15 +1,11 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityPipeExhaust; import com.hbm.util.I18nUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; @@ -24,6 +20,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class FluidDuctBoxExhaust extends FluidDuctBox { public FluidDuctBoxExhaust(Material mat) { @@ -34,7 +33,7 @@ public class FluidDuctBoxExhaust extends FluidDuctBox { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPipeExhaust(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -56,7 +55,7 @@ public class FluidDuctBoxExhaust extends FluidDuctBox { iconCurveBR[0] = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_exhaust_curve_br"); for(int i = 0; i < 5; i++) iconJunction[0][i] = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_exhaust_junction_" + i); } - + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir, TileEntity tile) { return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE) || Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE_LEADED) || @@ -67,7 +66,7 @@ public class FluidDuctBoxExhaust extends FluidDuctBox { public int getSubCount() { return 1; } - + @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List list) { for(int i = 0; i < 15; i += 3) { diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java index 77a347b17..44d66e8f8 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctGauge.java @@ -1,10 +1,6 @@ package com.hbm.blocks.network; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - +import api.hbm.fluid.IPipeNet; import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; @@ -12,11 +8,8 @@ import com.hbm.handler.CompatHandler; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.I18nUtil; - -import api.hbm.fluid.IPipeNet; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,6 +30,11 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, ILookOverlay, ITooltipProvider { @SideOnly(Side.CLIENT) protected IIcon overlay; @@ -50,7 +48,7 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPipeGauge(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { @@ -62,11 +60,11 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL @Override @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - + if(RenderBlockMultipass.currentPass == 0) { return blockIcon; } - + return side == world.getBlockMetadata(x, y, z) ? this.overlayGauge : this.overlay; } @@ -88,34 +86,34 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityPipeBaseNT)) return; - + TileEntityPipeGauge duct = (TileEntityPipeGauge) te; - + List text = new ArrayList(); text.add("&[" + duct.getType().getColor() + "&]" + duct.getType().getLocalizedName()); text.add(String.format(Locale.US, "%,d", duct.deltaTick) + " mB/t"); text.add(String.format(Locale.US, "%,d", duct.deltaLastSecond) + " mB/s"); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } - + @Override public int getRenderType(){ return IBlockMultiPass.getRenderType(); } @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) - public static class TileEntityPipeGauge extends TileEntityPipeBaseNT implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { + public static class TileEntityPipeGauge extends TileEntityPipeBaseNT implements SimpleComponent, CompatHandler.OCComponent { private BigInteger lastMeasurement = BigInteger.valueOf(10); private long deltaTick = 0; private long deltaSecond = 0; private long deltaLastSecond = 0; - + @Override public void updateEntity() { super.updateEntity(); @@ -123,12 +121,12 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL if(!worldObj.isRemote) { IPipeNet net = this.getPipeNet(this.getType()); - + if(net != null && this.getType() != Fluids.NONE) { BigInteger total = net.getTotalTransfer(); BigInteger delta = total.subtract(this.lastMeasurement); this.lastMeasurement = total; - + try { this.deltaTick = delta.longValueExact(); if(worldObj.getTotalWorldTime() % 20 == 0) { @@ -136,11 +134,11 @@ public class FluidDuctGauge extends FluidDuctBase implements IBlockMultiPass, IL this.deltaSecond = 0; } this.deltaSecond += deltaTick; - + } catch(Exception ex) { } } - sendStandard(25); + networkPackNT(25); } } diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java index 6777195d8..37599923b 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java @@ -1,16 +1,12 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - +import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ILookOverlay; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.I18nUtil; - -import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -26,6 +22,9 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; + public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlockMultiPass, ILookOverlay { @SideOnly(Side.CLIENT) protected IIcon overlay; @@ -39,7 +38,7 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPipePaintable(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { @@ -52,10 +51,10 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityPipePaintable) { TileEntityPipePaintable pipe = (TileEntityPipePaintable) tile; - + if(pipe.block != null) { if(RenderBlockMultipass.currentPass == 1) { return this.overlay; @@ -64,46 +63,46 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo } } } - + return RenderBlockMultipass.currentPass == 1 ? this.overlayColor : this.blockIcon; } @Override @SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess world, int x, int y, int z) { - + if(RenderBlockMultipass.currentPass == 0) return 0xffffff; - + TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityPipePaintable) { TileEntityPipePaintable pipe = (TileEntityPipePaintable) tile; - + if(pipe.block == null) { return pipe.getType().getColor(); } } - + return 0xffffff; } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { - + ItemStack stack = player.getHeldItem(); - + if(stack != null && stack.getItem() instanceof ItemBlock) { ItemBlock ib = (ItemBlock) stack.getItem(); Block block = ib.field_150939_a; - + if(block.renderAsNormalBlock() && block != this) { - + TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityPipePaintable) { TileEntityPipePaintable pipe = (TileEntityPipePaintable) tile; - + if(pipe.block == null) { pipe.block = block; pipe.meta = stack.getItemDamage() & 15; @@ -114,20 +113,20 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo } } } - + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); } @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - + if(tool != ToolType.SCREWDRIVER) return false; - + TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityPipePaintable) { TileEntityPipePaintable pipe = (TileEntityPipePaintable) tile; - + if(pipe.block != null) { pipe.block = null; world.markBlockForUpdate(x, y, z); @@ -135,7 +134,7 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo return true; } } - + return false; } @@ -143,7 +142,7 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo public int getPasses() { return 2; } - + @Override public int getRenderType(){ return IBlockMultiPass.getRenderType(); @@ -151,19 +150,19 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityPipeBaseNT)) return; - + TileEntityPipeBaseNT duct = (TileEntityPipeBaseNT) te; - + List text = new ArrayList(); text.add("&[" + duct.getType().getColor() + "&]" + duct.getType().getLocalizedName()); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } - + public static class TileEntityPipePaintable extends TileEntityPipeBaseNT { private Block block; diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java b/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java index e482398c9..d1b46bc94 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java @@ -1,8 +1,5 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.fluid.FluidType; @@ -11,7 +8,6 @@ import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.I18nUtil; - import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,6 +27,9 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILookOverlay { @SideOnly(Side.CLIENT) @@ -41,7 +40,7 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo public FluidDuctStandard(Material mat) { super(mat); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -56,20 +55,20 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo this.overlay[1] = iconRegister.registerIcon(RefStrings.MODID + ":pipe_silver_overlay"); this.overlay[2] = iconRegister.registerIcon(RefStrings.MODID + ":pipe_colored_overlay"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { return side == 0 ? this.icon[rectify(metadata)] : this.overlay[rectify(metadata)]; } - + @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List list) { for(int i = 0; i < 3; ++i) { list.add(new ItemStack(item, 1, i)); } } - + public int damageDropped(int meta) { return rectify(meta); } @@ -95,7 +94,7 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo return new ItemStack(ModItems.fluid_duct, 1, metadata).getItem(); } */ - + @Override @SideOnly(Side.CLIENT) public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { @@ -109,19 +108,19 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo } return super.getPickBlock(target, world, x, y, z, player); } - + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - + @Override public int getRenderType() { return renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; @@ -134,7 +133,7 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { - + List bbs = new ArrayList(); TileEntity te = world.getTileEntity(x, y, z); @@ -149,7 +148,7 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, type); boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, type); int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); - + if(mask == 0) { bbs.add(AxisAlignedBB.getBoundingBox(x + 0.6875D, y + 0.3125D, z + 0.3125D, x + 1.0D, y + 0.6875D, z + 0.6875D)); bbs.add(AxisAlignedBB.getBoundingBox(x + 0.0D, y + 0.3125D, z + 0.3125D, x + 0.3125D, y + 0.6875D, z + 0.6875D)); @@ -164,9 +163,9 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo } else if(mask == 0b000010 || mask == 0b000001 || mask == 0b000011) { bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y + 0.3125D, z + 0.0D, x + 0.6875D, y + 0.6875D, z + 1.0D)); } else { - + bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y + 0.3125D, z + 0.3125D, x + 0.6875D, y + 0.6875D, z + 0.6875D)); - + if(pX) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.6875D, y + 0.3125D, z + 0.3125D, x + 1.0D, y + 0.6875D, z + 0.6875D)); if(nX) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.0D, y + 0.3125D, z + 0.3125D, x + 0.3125D, y + 0.6875D, z + 0.6875D)); if(pY) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y + 0.6875D, z + 0.3125D, x + 0.6875D, y + 1.0D, z + 0.6875D)); @@ -175,7 +174,7 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo if(nZ) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y + 0.3125D, z + 0.0D, x + 0.6875D, y + 0.6875D, z + 0.3125D)); } } - + for(AxisAlignedBB bb : bbs) { if(entityBounding.intersectsWith(bb)) { list.add(bb); @@ -211,7 +210,7 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, type); boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, type); int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); - + if(mask == 0) { this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F); } else if(mask == 0b100000 || mask == 0b010000 || mask == 0b110000) { @@ -221,7 +220,7 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo } else if(mask == 0b000010 || mask == 0b000001 || mask == 0b000011) { this.setBlockBounds(0.3125F, 0.3125F, 0F, 0.6875F, 0.6875F, 1F); } else { - + this.setBlockBounds( nX ? 0F : 0.3125F, nY ? 0F : 0.3125F, @@ -232,21 +231,21 @@ public class FluidDuctStandard extends FluidDuctBase implements IBlockMulti, ILo } } } - + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir, FluidType type) { return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, type); } @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityPipeBaseNT)) return; - + TileEntityPipeBaseNT duct = (TileEntityPipeBaseNT) te; - + List text = new ArrayList(); text.add("&[" + duct.getType().getColor() + "&]" + duct.getType().getLocalizedName()); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); diff --git a/src/main/java/com/hbm/blocks/network/FluidSwitch.java b/src/main/java/com/hbm/blocks/network/FluidSwitch.java index f4fc8c82d..77ed6519d 100644 --- a/src/main/java/com/hbm/blocks/network/FluidSwitch.java +++ b/src/main/java/com/hbm/blocks/network/FluidSwitch.java @@ -1,13 +1,9 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityFluidValve; import com.hbm.util.I18nUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -18,6 +14,9 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; + public class FluidSwitch extends FluidDuctBase implements ILookOverlay { @SideOnly(Side.CLIENT) @@ -26,14 +25,14 @@ public class FluidSwitch extends FluidDuctBase implements ILookOverlay { public FluidSwitch(Material mat) { super(mat); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { this.iconOn = iconRegister.registerIcon(RefStrings.MODID + ":fluid_switch_on"); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":fluid_switch_off"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -47,18 +46,18 @@ public class FluidSwitch extends FluidDuctBase implements ILookOverlay { @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - + boolean on = world.isBlockIndirectlyGettingPowered(x, y, z); int meta = world.getBlockMetadata(x, y, z); - + boolean update = false; - + if(on && meta == 0) { world.setBlockMetadataWithNotify(x, y, z, 1, 2); world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 1.0F); update = true; } - + if(!on && meta == 1) { world.setBlockMetadataWithNotify(x, y, z, 0, 2); world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 0.85F); @@ -73,14 +72,14 @@ public class FluidSwitch extends FluidDuctBase implements ILookOverlay { @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityFluidValve)) return; - + TileEntityFluidValve duct = (TileEntityFluidValve) te; - + List text = new ArrayList(); text.add("&[" + duct.getType().getColor() + "&]" + duct.getType().getLocalizedName()); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); diff --git a/src/main/java/com/hbm/blocks/network/FluidValve.java b/src/main/java/com/hbm/blocks/network/FluidValve.java index bfea2582e..7c05600e8 100644 --- a/src/main/java/com/hbm/blocks/network/FluidValve.java +++ b/src/main/java/com/hbm/blocks/network/FluidValve.java @@ -1,13 +1,9 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityFluidValve; import com.hbm.util.I18nUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; @@ -18,6 +14,9 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; + public class FluidValve extends FluidDuctBase implements ILookOverlay { @SideOnly(Side.CLIENT) @@ -26,14 +25,14 @@ public class FluidValve extends FluidDuctBase implements ILookOverlay { public FluidValve(Material mat) { super(mat); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { this.iconOn = iconRegister.registerIcon(RefStrings.MODID + ":fluid_valve_on"); this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":fluid_valve_off"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -44,14 +43,14 @@ public class FluidValve extends FluidDuctBase implements ILookOverlay { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityFluidValve(); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) return true; - + if(super.onBlockActivated(world, x, y, z, player, side, hitX, hitY, hitZ)) return true; - + if(!player.isSneaking()) { int meta = world.getBlockMetadata(x, y, z); TileEntityFluidValve te = (TileEntityFluidValve) world.getTileEntity(x, y, z); @@ -62,9 +61,9 @@ public class FluidValve extends FluidDuctBase implements ILookOverlay { world.setBlockMetadataWithNotify(x, y, z, 0, 2); world.playSoundEffect(x, y, z, "hbm:block.reactorStart", 1.0F, 0.85F); } - + te.updateState(); - + return true; } else { return false; @@ -73,14 +72,14 @@ public class FluidValve extends FluidDuctBase implements ILookOverlay { @Override public void printHook(Pre event, World world, int x, int y, int z) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(!(te instanceof TileEntityFluidValve)) return; - + TileEntityFluidValve duct = (TileEntityFluidValve) te; - + List text = new ArrayList(); text.add("&[" + duct.getType().getColor() + "&]" + duct.getType().getLocalizedName()); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); diff --git a/src/main/java/com/hbm/blocks/network/IBlockFluidDuct.java b/src/main/java/com/hbm/blocks/network/IBlockFluidDuct.java index c222b595c..c537a374d 100644 --- a/src/main/java/com/hbm/blocks/network/IBlockFluidDuct.java +++ b/src/main/java/com/hbm/blocks/network/IBlockFluidDuct.java @@ -1,7 +1,6 @@ package com.hbm.blocks.network; import com.hbm.inventory.fluid.FluidType; - import net.minecraft.world.World; public interface IBlockFluidDuct { diff --git a/src/main/java/com/hbm/blocks/network/PylonBase.java b/src/main/java/com/hbm/blocks/network/PylonBase.java index bf35c9fbe..95a2476f7 100644 --- a/src/main/java/com/hbm/blocks/network/PylonBase.java +++ b/src/main/java/com/hbm/blocks/network/PylonBase.java @@ -2,7 +2,6 @@ package com.hbm.blocks.network; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.network.TileEntityPylonBase; - import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -18,31 +17,31 @@ public abstract class PylonBase extends BlockContainer implements ITooltipProvid @Override public void breakBlock(World world, int x, int y, int z, Block b, int m) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityPylonBase) { ((TileEntityPylonBase)te).disconnectAll(); } - + super.breakBlock(world, x, y, z, b, m); } - + @Override public int getRenderType(){ return -1; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { diff --git a/src/main/java/com/hbm/blocks/network/PylonLarge.java b/src/main/java/com/hbm/blocks/network/PylonLarge.java index 6333a6e28..a81a1af5f 100644 --- a/src/main/java/com/hbm/blocks/network/PylonLarge.java +++ b/src/main/java/com/hbm/blocks/network/PylonLarge.java @@ -1,12 +1,9 @@ package com.hbm.blocks.network; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.network.TileEntityPylonBase; import com.hbm.tileentity.network.TileEntityPylonLarge; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -17,6 +14,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class PylonLarge extends BlockDummyable implements ITooltipProvider { public PylonLarge(Material mat) { @@ -25,7 +24,7 @@ public class PylonLarge extends BlockDummyable implements ITooltipProvider { @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityPylonLarge(); return null; @@ -50,19 +49,19 @@ public class PylonLarge extends BlockDummyable implements ITooltipProvider { @Override public void breakBlock(World world, int x, int y, int z, Block b, int m) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityPylonBase) { ((TileEntityPylonBase)te).disconnectAll(); } - + super.breakBlock(world, x, y, z, b, m); } @Override protected int getMetaForCore(World world, int x, int y, int z, EntityPlayer player, int original) { - + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 180.0F + 0.5D) & 3; ForgeDirection dir = ForgeDirection.NORTH; @@ -79,10 +78,10 @@ public class PylonLarge extends BlockDummyable implements ITooltipProvider { if(i == 3) { dir = ForgeDirection.getOrientation(4); } - + return dir.ordinal() + offset; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { diff --git a/src/main/java/com/hbm/blocks/network/PylonMedium.java b/src/main/java/com/hbm/blocks/network/PylonMedium.java index 7a29f4614..5f4e0957d 100644 --- a/src/main/java/com/hbm/blocks/network/PylonMedium.java +++ b/src/main/java/com/hbm/blocks/network/PylonMedium.java @@ -1,12 +1,9 @@ package com.hbm.blocks.network; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.network.TileEntityPylonBase; import com.hbm.tileentity.network.TileEntityPylonMedium; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -15,6 +12,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import java.util.List; + public class PylonMedium extends BlockDummyable implements ITooltipProvider { public PylonMedium(Material mat) { @@ -23,7 +22,7 @@ public class PylonMedium extends BlockDummyable implements ITooltipProvider { @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityPylonMedium(); return null; } @@ -50,7 +49,7 @@ public class PylonMedium extends BlockDummyable implements ITooltipProvider { if(te instanceof TileEntityPylonBase) ((TileEntityPylonBase)te).disconnectAll(); super.breakBlock(world, x, y, z, b, m); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { diff --git a/src/main/java/com/hbm/blocks/network/PylonRedWire.java b/src/main/java/com/hbm/blocks/network/PylonRedWire.java index 79a44f541..8594cbb72 100644 --- a/src/main/java/com/hbm/blocks/network/PylonRedWire.java +++ b/src/main/java/com/hbm/blocks/network/PylonRedWire.java @@ -1,9 +1,6 @@ package com.hbm.blocks.network; -import java.util.List; - import com.hbm.tileentity.network.TileEntityPylon; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -11,6 +8,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import java.util.List; + public class PylonRedWire extends PylonBase { public PylonRedWire(Material material) { diff --git a/src/main/java/com/hbm/blocks/network/RadioTelex.java b/src/main/java/com/hbm/blocks/network/RadioTelex.java index 8b7614b51..5d042ff63 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTelex.java +++ b/src/main/java/com/hbm/blocks/network/RadioTelex.java @@ -3,7 +3,6 @@ package com.hbm.blocks.network; import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.network.TileEntityRadioTelex; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -31,7 +30,7 @@ public class RadioTelex extends BlockDummyable { public int getOffset() { return 0; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote && !player.isSneaking()) { diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchBase.java b/src/main/java/com/hbm/blocks/network/RadioTorchBase.java index 4ebd140fd..35e69429c 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchBase.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchBase.java @@ -1,12 +1,9 @@ package com.hbm.blocks.network; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; - import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -23,6 +20,8 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + /** * Base class for all torch-like RTTY blocks * @author hbm @@ -39,34 +38,34 @@ public abstract class RadioTorchBase extends BlockContainer implements IGUIProvi public int getRenderType() { return renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { return true; } - + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return null; } - + @Override public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 vec0, Vec3 vec1) { - + int meta = world.getBlockMetadata(x, y, z) & 7; ForgeDirection dir = ForgeDirection.getOrientation(meta); - + this.setBlockBounds( dir.offsetX == 1 ? 0F : 0.375F, dir.offsetY == 1 ? 0F : 0.375F, @@ -86,31 +85,31 @@ public abstract class RadioTorchBase extends BlockContainer implements IGUIProvi @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - + int meta = world.getBlockMetadata(x, y, z); ForgeDirection dir = ForgeDirection.getOrientation(meta); Block b = world.getBlock(x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ); - + if(!canBlockStay(world, x, y, z, dir, b)) { this.dropBlockAsItem(world, x, y, z, meta, 0); world.setBlockToAir(x, y, z); } } - + @Override public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side) { if(!super.canPlaceBlockOnSide(world, x, y, z, side)) return false; - + ForgeDirection dir = ForgeDirection.getOrientation(side); Block b = world.getBlock(x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ); - + return canBlockStay(world, x, y, z, dir, b); } - + public boolean canBlockStay(World world, int x, int y, int z, ForgeDirection dir, Block b) { return b.isSideSolid(world, x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ, dir) || b.hasComparatorInputOverride() || b.canProvidePower() || (b.renderAsNormalBlock() && !b.isAir(world, x, y, z)); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote && !player.isSneaking()) { diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchCounter.java b/src/main/java/com/hbm/blocks/network/RadioTorchCounter.java index 76365ca81..80bacd8c4 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchCounter.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchCounter.java @@ -1,8 +1,5 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.container.ContainerCounterTorch; import com.hbm.inventory.gui.GUICounterTorch; @@ -10,7 +7,6 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.network.TileEntityRadioTorchCounter; import com.hbm.util.Compat; import com.hbm.util.I18nUtil; - import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,8 +20,11 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; + public class RadioTorchCounter extends RadioTorchBase { - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(!world.isRemote && !player.isSneaking()) { @@ -62,18 +61,18 @@ public class RadioTorchCounter extends RadioTorchBase { @Override public void printHook(Pre event, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityRadioTorchCounter) { TileEntityRadioTorchCounter radio = (TileEntityRadioTorchCounter) te; List text = new ArrayList(); - + for(int i = 0; i < 3; i++) { if(!radio.channel[i].isEmpty()) { text.add(EnumChatFormatting.AQUA + "Freq " + (i + 1) + ": " + radio.channel[i]); text.add(EnumChatFormatting.RED + "Signal " + (i + 1) + ": " + radio.lastCount[i]); } } - + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } } diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchLogic.java b/src/main/java/com/hbm/blocks/network/RadioTorchLogic.java index 4d4e679a3..65d144ef9 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchLogic.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchLogic.java @@ -1,14 +1,10 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.gui.GUIScreenRadioTorchLogic; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityRadioTorchLogic; import com.hbm.util.I18nUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; @@ -19,12 +15,15 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; + public class RadioTorchLogic extends RadioTorchRWBase { - + public RadioTorchLogic() { super(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -38,30 +37,30 @@ public class RadioTorchLogic extends RadioTorchRWBase { tile.lastUpdate = world.getTotalWorldTime(); return tile; } - + @Override public boolean canProvidePower() { return true; } - + @Override public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { - + TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityRadioTorchLogic) { int state = ((TileEntityRadioTorchLogic) tile).lastState; return state; } - + return 0; } - + @Override @SideOnly(Side.CLIENT) public void printHook(Pre event, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityRadioTorchLogic) { TileEntityRadioTorchLogic radio = (TileEntityRadioTorchLogic) te; List text = new ArrayList(); @@ -70,15 +69,15 @@ public class RadioTorchLogic extends RadioTorchRWBase { ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } } - + @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityRadioTorchLogic) return new GUIScreenRadioTorchLogic((TileEntityRadioTorchLogic) te); - + return null; } } diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java b/src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java index 07e00c29b..c73f7ea5c 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java @@ -1,13 +1,9 @@ package com.hbm.blocks.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.gui.GUIScreenRadioTorch; import com.hbm.tileentity.network.TileEntityRadioTorchBase; import com.hbm.util.I18nUtil; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; @@ -18,6 +14,9 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import java.util.ArrayList; +import java.util.List; + /** * Base class for the basic sender and receiver RTTY torch * @author hbm @@ -31,12 +30,12 @@ public abstract class RadioTorchRWBase extends RadioTorchBase { public IIcon getIcon(int side, int metadata) { return side == 0 ? this.blockIcon : this.iconOn; } - + @Override @SideOnly(Side.CLIENT) public void printHook(Pre event, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityRadioTorchBase) { TileEntityRadioTorchBase radio = (TileEntityRadioTorchBase) te; List text = new ArrayList(); @@ -52,10 +51,10 @@ public abstract class RadioTorchRWBase extends RadioTorchBase { @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityRadioTorchBase) return new GUIScreenRadioTorch((TileEntityRadioTorchBase) te); - + return null; } } diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchReceiver.java b/src/main/java/com/hbm/blocks/network/RadioTorchReceiver.java index 4d7f28c83..cc3c58986 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchReceiver.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchReceiver.java @@ -2,7 +2,6 @@ package com.hbm.blocks.network; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityRadioTorchReceiver; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; @@ -15,7 +14,7 @@ public class RadioTorchReceiver extends RadioTorchRWBase { public RadioTorchReceiver() { super(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -29,22 +28,22 @@ public class RadioTorchReceiver extends RadioTorchRWBase { tile.lastUpdate = world.getTotalWorldTime(); return tile; } - + @Override public boolean canProvidePower() { return true; } - + @Override public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { - + TileEntity tile = world.getTileEntity(x, y, z); - + if(tile instanceof TileEntityRadioTorchReceiver) { int state = ((TileEntityRadioTorchReceiver) tile).lastState; return state; } - + return 0; } } diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchSender.java b/src/main/java/com/hbm/blocks/network/RadioTorchSender.java index 2045be8a3..1a11b9b0e 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchSender.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchSender.java @@ -2,7 +2,6 @@ package com.hbm.blocks.network; import com.hbm.lib.RefStrings; import com.hbm.tileentity.network.TileEntityRadioTorchSender; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; @@ -14,7 +13,7 @@ public class RadioTorchSender extends RadioTorchRWBase { public RadioTorchSender() { super(); } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { diff --git a/src/main/java/com/hbm/blocks/network/Substation.java b/src/main/java/com/hbm/blocks/network/Substation.java index 6c8e3cb34..6affdeb4e 100644 --- a/src/main/java/com/hbm/blocks/network/Substation.java +++ b/src/main/java/com/hbm/blocks/network/Substation.java @@ -1,13 +1,10 @@ package com.hbm.blocks.network; -import java.util.List; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityProxyConductor; import com.hbm.tileentity.network.TileEntityPylonBase; import com.hbm.tileentity.network.TileEntitySubstation; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -17,6 +14,8 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class Substation extends BlockDummyable implements ITooltipProvider { public Substation(Material mat) { @@ -25,13 +24,13 @@ public class Substation extends BlockDummyable implements ITooltipProvider { @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntitySubstation(); - + if(meta >= 6) return new TileEntityProxyConductor(); - + return null; } @@ -43,13 +42,13 @@ public class Substation extends BlockDummyable implements ITooltipProvider { @Override public void breakBlock(World world, int x, int y, int z, Block b, int m) { - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof TileEntityPylonBase) { ((TileEntityPylonBase)te).disconnectAll(); } - + super.breakBlock(world, x, y, z, b, m); } @@ -72,7 +71,7 @@ public class Substation extends BlockDummyable implements ITooltipProvider { this.makeExtra(world, x + dir.offsetX * o - 1, y, z + dir.offsetZ * o + 1); this.makeExtra(world, x + dir.offsetX * o - 1, y, z + dir.offsetZ * o - 1); } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote) { diff --git a/src/main/java/com/hbm/blocks/network/WireCoated.java b/src/main/java/com/hbm/blocks/network/WireCoated.java index 3e939327c..c96c68ad5 100644 --- a/src/main/java/com/hbm/blocks/network/WireCoated.java +++ b/src/main/java/com/hbm/blocks/network/WireCoated.java @@ -4,7 +4,6 @@ import com.hbm.render.block.ct.CT; import com.hbm.render.block.ct.CTStitchReceiver; import com.hbm.render.block.ct.IBlockCT; import com.hbm.tileentity.network.TileEntityCableBaseNT; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; diff --git a/src/main/java/com/hbm/config/ClientConfig.java b/src/main/java/com/hbm/config/ClientConfig.java index ffe66aeb4..a0ef56201 100644 --- a/src/main/java/com/hbm/config/ClientConfig.java +++ b/src/main/java/com/hbm/config/ClientConfig.java @@ -1,5 +1,12 @@ package com.hbm.config; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; +import com.hbm.main.MainRegistry; +import com.hbm.util.Compat; + import java.io.File; import java.io.FileReader; import java.io.FileWriter; @@ -10,13 +17,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map.Entry; -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.stream.JsonWriter; -import com.hbm.main.MainRegistry; -import com.hbm.util.Compat; - // https://youtube.com/shorts/XTHZWqZt_AI public class ClientConfig { @@ -38,7 +38,7 @@ public class ClientConfig { public static ConfigWrapper NUKE_HUD_FLASH = new ConfigWrapper(true); public static ConfigWrapper NUKE_HUD_SHAKE = new ConfigWrapper(true); public static ConfigWrapper RENDER_REEDS = new ConfigWrapper(!Compat.isModLoaded(Compat.MOD_ANG)); - + private static void initDefaults() { configMap.put("GEIGER_OFFSET_HORIZONTAL", GEIGER_OFFSET_HORIZONTAL); configMap.put("GEIGER_OFFSET_VERTICAL", GEIGER_OFFSET_VERTICAL); @@ -55,7 +55,7 @@ public class ClientConfig { configMap.put("NUKE_HUD_SHAKE", NUKE_HUD_SHAKE); configMap.put("RENDER_REEDS", RENDER_REEDS); } - + /** Initializes defaults, then reads the config file if it exists, then writes the config file. */ public static void initConfig() { initDefaults(); @@ -64,31 +64,31 @@ public class ClientConfig { if(config.exists()) readConfig(config); refresh(); } - + /** Writes over the config file using the running config. */ public static void refresh() { File folder = MainRegistry.configHbmDir; File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmClient.json"); writeConfig(config); } - + /** Writes over the running config using the config file. */ public static void reload() { File folder = MainRegistry.configHbmDir; File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmClient.json"); if(config.exists()) readConfig(config); } - + private static void readConfig(File config) { - + try { JsonObject json = gson.fromJson(new FileReader(config), JsonObject.class); - + for(Entry line : configMap.entrySet()) { - + if(json.has(line.getKey())) { JsonElement value = json.get(line.getKey()); - + try { //world's shittiest dynamic type parser @@ -99,38 +99,38 @@ public class ClientConfig { if(line.getValue().value instanceof Integer) configMap.get(line.getKey()).set(value.getAsInt()); if(line.getValue().value instanceof Boolean) configMap.get(line.getKey()).set(value.getAsBoolean()); } - + //gson doesn't give me the option to read the raw value of a JsonPrimitive so we have to this shit effectively twice //once to make sure that the parsed data matches with what's determined by the default, //and a second time in the ConfigWrapper to add ease of reading the data without needing manual casts - + } catch(Exception ex) { ex.printStackTrace(); } } } - + } catch(Exception ex) { ex.printStackTrace(); } } - + private static void writeConfig(File config) { try { JsonWriter writer = new JsonWriter(new FileWriter(config)); writer.setIndent(" "); writer.beginObject(); - + writer.name("info").value("This file can be edited ingame using the /ntmclient command."); - + List keys = new ArrayList(); keys.addAll(configMap.keySet()); Collections.sort(keys); //readability is cool - + for(String key : keys) { - - ConfigWrapper wrapper = configMap.get(key); + + ConfigWrapper wrapper = configMap.get(key); Object value = wrapper.value; //this sucks and i am too stupid to come up with something better if(value instanceof String) writer.name(key).value((String) value); @@ -139,24 +139,24 @@ public class ClientConfig { if(value instanceof Integer) writer.name(key).value((Integer) value); if(value instanceof Boolean) writer.name(key).value((Boolean) value); } - + writer.endObject(); writer.close(); } catch(IOException e) { e.printStackTrace(); } } - + public static class ConfigWrapper { public T value; - + public ConfigWrapper(T o) { this.value = o; } public T get() { return value; } public void set(T value) { this.value = value; } - + public void update(String param) { Object stupidBufferObject = null; // wahh wahh can't cast Float to T wahh wahh shut the fuck up if(value instanceof String) stupidBufferObject = param; diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index 437fd28c3..8e8c5a466 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -372,9 +372,6 @@ public class RBMKNeutronHandler { RBMKType lastNodeType = (RBMKType) lastNode.data.get("type"); - if (lastNodeType != RBMKType.REFLECTOR && lastNodeType != RBMKType.ABSORBER && lastNodeType != RBMKType.CONTROL_ROD) - irradiateFromFlux(new BlockPos(lastNode.tile.xCoord + this.vector.xCoord, lastNode.tile.yCoord, lastNode.tile.zCoord + this.vector.zCoord)); - if (lastNodeType == RBMKType.CONTROL_ROD) { TileEntityRBMKControl rod = (TileEntityRBMKControl) lastNode.tile; if (rod.getMult() > 0.0D) { diff --git a/src/main/java/com/hbm/handler/threading/BufPacketThreading.java b/src/main/java/com/hbm/handler/threading/BufPacketThreading.java deleted file mode 100644 index 86400ae3c..000000000 --- a/src/main/java/com/hbm/handler/threading/BufPacketThreading.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.hbm.handler.threading; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.BufPacket; -import com.hbm.tileentity.IBufPacketReceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import net.minecraft.tileentity.TileEntity; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.*; - -public class BufPacketThreading { - - private static final ThreadFactory packetThreadFactory = new ThreadFactoryBuilder().setNameFormat("NTM-Packet-Thread").build(); - - private static final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(1, packetThreadFactory); - - private static int total = 0; - - private static final List> futureList = new ArrayList<>(); - - public static void createBufPacket(IMessage message, TargetPoint target) { - Runnable task = () -> PacketDispatcher.wrapper.sendToAllAround(message, target); - total++; - futureList.add(threadPool.submit(task)); - } - - public static void createBufPacket(IBufPacketReceiver that, int range) { - Runnable task = () -> { - TileEntity te = (TileEntity) that; - TargetPoint target = new TargetPoint(te.getWorldObj().provider.dimensionId, te.xCoord, te.yCoord, te.zCoord, range); - BufPacket message = new BufPacket(te.xCoord, te.yCoord, te.zCoord, that); - PacketDispatcher.wrapper.sendToAllAround(message, target); - }; - total++; - futureList.add(threadPool.submit(task)); - } - - public static void waitUntilThreadFinished() { - try { - for(Future future : futureList) { - future.get(200, TimeUnit.MILLISECONDS); // I HATE EVERYTHING - } - } catch (ExecutionException ignored) { - // impossible - } catch (TimeoutException e) { - MainRegistry.logger.warn("A packet has taken >200ms to process, discarding {}/{} ({}%) packets to prevent pausing of main thread.", threadPool.getQueue().size(), total, (double) (threadPool.getQueue().size() / total * 100)); - threadPool.getQueue().clear(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); // maybe not the best thing but it's gotta be here - } - } -} diff --git a/src/main/java/com/hbm/handler/threading/PacketThreading.java b/src/main/java/com/hbm/handler/threading/PacketThreading.java new file mode 100644 index 000000000..cb6cbb877 --- /dev/null +++ b/src/main/java/com/hbm/handler/threading/PacketThreading.java @@ -0,0 +1,67 @@ +package com.hbm.handler.threading; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.PrecompiledPacket; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.common.network.simpleimpl.IMessage; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; + +public class PacketThreading { + + private static final ThreadFactory packetThreadFactory = new ThreadFactoryBuilder().setNameFormat("NTM-Packet-Thread-%d").build(); + + private static final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(1, packetThreadFactory); + + private static int totalCnt = 0; + + private static int processedCnt = 0; + + private static final List> futureList = new ArrayList<>(); + + /** + * Adds a packet to the thread pool to be processed in the future. This is only compatible with the `sendToAllAround` dispatch operation. + * @param message Message to process. + * @param target TargetPoint to send to. + */ + public static void createThreadedPacket(IMessage message, TargetPoint target) { + + // `message` can be precompiled or not. + if(message instanceof PrecompiledPacket) + ((PrecompiledPacket) message).getPreBuf(); // Gets the precompiled buffer, doing nothing if it already exists. + + totalCnt++; + futureList.add(threadPool.submit(() -> { + PacketDispatcher.wrapper.sendToAllAround(message, target); + if(message instanceof PrecompiledPacket) + ((PrecompiledPacket) message).getPreBuf().release(); + processedCnt++; + })); + } + + /** + * Wait until the packet thread is finished processing. + */ + public static void waitUntilThreadFinished() { + try { + for(Future future : futureList) { + future.get(50, TimeUnit.MILLISECONDS); // I HATE EVERYTHING + } + futureList.clear(); + } catch (ExecutionException ignored) { + // impossible + } catch (TimeoutException e) { + MainRegistry.logger.warn("A packet has taken >50ms to process, discarding {}/{} packets to prevent pausing of main thread.", totalCnt-processedCnt, totalCnt); + threadPool.getQueue().clear(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); // maybe not the best thing but it's gotta be here + } finally { + processedCnt = 0; + totalCnt = 0; + } + } +} diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index 7c3c1f9f6..157ff80ea 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -1,20 +1,19 @@ package com.hbm.lib; -import java.util.Random; - import com.hbm.items.special.ItemBookLore; - import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.WeightedRandomChestContent; +import java.util.Random; + public class HbmChestContents { public static WeightedRandomChestContent weighted(Item item, int meta, int min, int max, int weight) { return new WeightedRandomChestContent(item, meta, Math.min(min, max), Math.max(min, max), weight); } public static WeightedRandomChestContent weighted(Block block, int meta, int min, int max, int weight) { return new WeightedRandomChestContent(Item.getItemFromBlock(block), meta, Math.min(min, max), Math.max(min, max), weight); } public static WeightedRandomChestContent weighted(ItemStack item, int min, int max, int weight) { return new WeightedRandomChestContent(item, Math.min(min, max), Math.max(min, max), weight); } - + /** ITEMBOOKLORE SHIT */ //one downside of all this huge flexibility, make a wrapper if it's too annoying public static ItemStack generateOfficeBook(Random rand) { //TODO rework this lore in general @@ -28,14 +27,14 @@ public class HbmChestContents { case 4: key = "memo_schrab_nuke"; pages = 3; break; default: return null; } - + return ItemBookLore.createBook(key, pages, 0x6BC8FF, 0x0A0A0A); } - + public static ItemStack generateLabBook(Random rand) { String key; int pages; - + switch(rand.nextInt(5)) { case 0: key = "bf_bomb_1"; pages = 4; break; case 1: key = "bf_bomb_2"; pages = 6; break; @@ -44,7 +43,7 @@ public class HbmChestContents { case 4: key = "bf_bomb_5"; pages = 9; break; default: return null; } - + return ItemBookLore.createBook(key, pages, 0x1E1E1E, 0x46EA44); } } diff --git a/src/main/java/com/hbm/lib/HbmCollection.java b/src/main/java/com/hbm/lib/HbmCollection.java index 6c2e7df23..196bd566c 100644 --- a/src/main/java/com/hbm/lib/HbmCollection.java +++ b/src/main/java/com/hbm/lib/HbmCollection.java @@ -1,15 +1,15 @@ package com.hbm.lib; -import java.util.List; -import java.util.Set; - import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.items.weapon.ItemAmmo.AmmoItemTrait; +import java.util.List; +import java.util.Set; + public class HbmCollection { - + public static final Set APType = ImmutableSet.of(AmmoItemTrait.PRO_DAMAGE, AmmoItemTrait.CON_WEAR); public static final Set FlechetteType = ImmutableSet.of(AmmoItemTrait.PRO_DAMAGE, AmmoItemTrait.NEU_LESS_BOUNCY, AmmoItemTrait.CON_WEAR); public static final Set IncendiaryType = ImmutableSet.of(AmmoItemTrait.PRO_INCENDIARY, AmmoItemTrait.CON_WEAR); @@ -19,7 +19,7 @@ public class HbmCollection { public static final Set DUType = ImmutableSet.of(AmmoItemTrait.PRO_HEAVY_DAMAGE, AmmoItemTrait.NEU_HEAVY_METAL, AmmoItemTrait.CON_HEAVY_WEAR); public static final Set StarmetalType = ImmutableSet.of(AmmoItemTrait.PRO_HEAVY_DAMAGE, AmmoItemTrait.NEU_STARMETAL, AmmoItemTrait.CON_HEAVY_WEAR); public static final Set ChlorophyteType = ImmutableSet.of(AmmoItemTrait.PRO_DAMAGE, AmmoItemTrait.PRO_WEAR, AmmoItemTrait.PRO_PENETRATION, AmmoItemTrait.NEU_CHLOROPHYTE, AmmoItemTrait.NEU_HOMING, AmmoItemTrait.CON_SPEED); - + /// BULLET COLLECTIONS // SHOTGUNS /** 12 GAUGE **/ @@ -73,7 +73,7 @@ public class HbmCollection { public static final List grenade = ImmutableList.of(BulletConfigSyncingUtil.GRENADE_NORMAL, BulletConfigSyncingUtil.GRENADE_HE, BulletConfigSyncingUtil.GRENADE_INCENDIARY, BulletConfigSyncingUtil.GRENADE_PHOSPHORUS, BulletConfigSyncingUtil.GRENADE_CHEMICAL, BulletConfigSyncingUtil.GRENADE_CONCUSSION, BulletConfigSyncingUtil.GRENADE_FINNED, BulletConfigSyncingUtil.GRENADE_SLEEK, BulletConfigSyncingUtil.GRENADE_NUCLEAR, BulletConfigSyncingUtil.GRENADE_TRACER, BulletConfigSyncingUtil.GRENADE_KAMPF, BulletConfigSyncingUtil.GRENADE_LEADBURSTER); /** 84MM ROCKET **/ public static final List rocket = ImmutableList.of(BulletConfigSyncingUtil.ROCKET_NORMAL, BulletConfigSyncingUtil.ROCKET_HE, BulletConfigSyncingUtil.ROCKET_INCENDIARY, BulletConfigSyncingUtil.ROCKET_PHOSPHORUS, BulletConfigSyncingUtil.ROCKET_SHRAPNEL, BulletConfigSyncingUtil.ROCKET_EMP, BulletConfigSyncingUtil.ROCKET_GLARE, BulletConfigSyncingUtil.ROCKET_TOXIC, BulletConfigSyncingUtil.ROCKET_CANISTER, BulletConfigSyncingUtil.ROCKET_SLEEK, BulletConfigSyncingUtil.ROCKET_NUKE, BulletConfigSyncingUtil.ROCKET_CHAINSAW); - + /// FREQUENTLY USED TRANSLATION KEYS // GUN MANUFACTURERS public static enum EnumGunManufacturer { @@ -171,12 +171,12 @@ public class HbmCollection { WINCHESTER, /**Winchester Repeating Arms Company / Big MT**/ WINCHESTER_BIGMT; - + public String getKey() { return "gun.make." + toString(); } } - + // GUN DETAILS public static final String ammo = "desc.item.gun.ammo"; public static final String ammoMag = "desc.item.gun.ammoMag"; diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index 3c6b89701..3cd40d0ba 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -2,26 +2,21 @@ package com.hbm.lib; import com.hbm.world.gen.MapGenNTMFeatures; import com.hbm.world.gen.NTMWorldGenerator; -import com.hbm.world.gen.component.BunkerComponents; +import com.hbm.world.gen.component.*; import com.hbm.world.gen.component.BunkerComponents.BunkerStart; -import com.hbm.world.gen.component.CivilianFeatures; -import com.hbm.world.gen.component.OfficeFeatures; -import com.hbm.world.gen.component.RuinFeatures; -import com.hbm.world.gen.component.SiloComponent; - import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraftforge.common.MinecraftForge; public class HbmWorld { - + public static void mainRegistry() { initWorldGen(); } - + public static NTMWorldGenerator worldGenerator; - + public static void initWorldGen() { //MapGenStructureIO.registerStructure(StructureStartTest.class, "HFR_STRUCTURE"); @@ -29,19 +24,19 @@ public class HbmWorld { MapGenStructureIO.registerStructure(MapGenNTMFeatures.Start.class, "NTMFeatures"); MapGenStructureIO.registerStructure(BunkerStart.class, "NTMBunker"); registerNTMFeatures(); - + registerWorldGen(new HbmWorldGen(), 1); - + worldGenerator = new NTMWorldGenerator(); registerWorldGen(worldGenerator, 1); //Ideally, move everything over from HbmWorldGen to NTMWorldGenerator MinecraftForge.EVENT_BUS.register(worldGenerator); //registerWorldGen(new WorldGenTest(), 1); } - + public static void registerWorldGen(IWorldGenerator nukerWorldGen, int weightedProbability) { GameRegistry.registerWorldGenerator(nukerWorldGen, weightedProbability); } - + /** Register structures in MapGenStructureIO */ public static void registerNTMFeatures() { CivilianFeatures.registerComponents(); diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 3aa200c39..863b2876e 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -1,7 +1,5 @@ package com.hbm.lib; -import java.util.Random; - import com.hbm.blocks.BlockEnums.EnumStoneType; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockNTMFlower.EnumFlowerType; @@ -21,21 +19,11 @@ import com.hbm.tileentity.machine.storage.TileEntitySoyuzCapsule; import com.hbm.util.LootGenerator; import com.hbm.util.WeightedRandomGeneric; import com.hbm.world.dungeon.*; -import com.hbm.world.feature.BedrockOre; +import com.hbm.world.feature.*; import com.hbm.world.feature.BedrockOre.BedrockOreDefinition; -import com.hbm.world.feature.DepthDeposit; -import com.hbm.world.feature.Dud; -import com.hbm.world.feature.Geyser; -import com.hbm.world.feature.GeyserLarge; -import com.hbm.world.feature.GlyphidHive; -import com.hbm.world.feature.Meteorite; -import com.hbm.world.feature.OilBubble; -import com.hbm.world.feature.OilSandBubble; -import com.hbm.world.feature.OilSpot; -import com.hbm.world.feature.Sellafield; import com.hbm.world.generator.CellularDungeonFactory; import com.hbm.world.generator.DungeonToolbox; - +import cpw.mods.fml.common.IWorldGenerator; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; @@ -44,15 +32,12 @@ import net.minecraft.tileentity.TileEntitySkull; import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.biome.BiomeGenBeach; -import net.minecraft.world.biome.BiomeGenForest; -import net.minecraft.world.biome.BiomeGenJungle; -import net.minecraft.world.biome.BiomeGenRiver; +import net.minecraft.world.biome.*; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.IWorldGenerator; + +import java.util.Random; public class HbmWorldGen implements IWorldGenerator { @@ -70,13 +55,13 @@ public class HbmWorldGen implements IWorldGenerator { generateSurface(world, rand, chunkX * 16, chunkZ * 16); break; } } - + private void generateSurface(World world, Random rand, int i, int j) { BiomeGenBase biome = world.getWorldChunkManager().getBiomeGenAt(i, j); if(!TomSaveData.forWorld(world).impact) { - + if(biome instanceof BiomeGenForest && rand.nextInt(16) == 0) { DungeonToolbox.generateFlowers(world, rand, i, j, ModBlocks.plant_flower, EnumFlowerType.FOXGLOVE.ordinal()); } @@ -114,7 +99,7 @@ public class HbmWorldGen implements IWorldGenerator { DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_cinnebar, rand, 16); DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_zirconium, rand, 16); DepthDeposit.generateConditionOverworld(world, i, 0, 3, j, 5, 0.8D, ModBlocks.ore_depth_borax, rand, 16); - + DungeonToolbox.generateOre(world, rand, i, j, 25, 6, 30, 10, ModBlocks.ore_gneiss_iron, ModBlocks.stone_gneiss); DungeonToolbox.generateOre(world, rand, i, j, 10, 6, 30, 10, ModBlocks.ore_gneiss_gold, ModBlocks.stone_gneiss); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.uraniumSpawn * 3, 6, 30, 10, ModBlocks.ore_gneiss_uranium, ModBlocks.stone_gneiss); @@ -123,7 +108,7 @@ public class HbmWorldGen implements IWorldGenerator { DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.lithiumSpawn, 6, 30, 10, ModBlocks.ore_gneiss_lithium, ModBlocks.stone_gneiss); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.rareSpawn, 6, 30, 10, ModBlocks.ore_gneiss_rare, ModBlocks.stone_gneiss); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.gassshaleSpawn * 3, 10, 30, 10, ModBlocks.ore_gneiss_gas, ModBlocks.stone_gneiss); - + DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.uraniumSpawn, 5, 5, 20, ModBlocks.ore_uranium); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.thoriumSpawn, 5, 5, 25, ModBlocks.ore_thorium); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.titaniumSpawn, 6, 5, 30, ModBlocks.ore_titanium); @@ -140,7 +125,7 @@ public class HbmWorldGen implements IWorldGenerator { DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.asbestosSpawn, 4, 16, 16, ModBlocks.ore_asbestos); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.cinnebarSpawn, 4, 8, 16, ModBlocks.ore_cinnebar); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.cobaltSpawn, 4, 4, 8, ModBlocks.ore_cobalt); - + DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.ironClusterSpawn, 6, 15, 45, ModBlocks.cluster_iron); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.titaniumClusterSpawn, 6, 15, 30, ModBlocks.cluster_titanium); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.aluminiumClusterSpawn, 6, 15, 35, ModBlocks.cluster_aluminium); @@ -154,7 +139,7 @@ public class HbmWorldGen implements IWorldGenerator { if(rand.nextInt(10) == 0) { int randPosX = i + rand.nextInt(2) + 8; int randPosZ = j + rand.nextInt(2) + 8; - + BedrockOre.generate(world, randPosX, randPosZ, new ItemStack(ModItems.bedrock_ore_base), null, 0xD78A16, 1); } @@ -175,7 +160,7 @@ public class HbmWorldGen implements IWorldGenerator { BedrockOre.generate(world, randPosX, randPosZ, def.stack, def.acid, def.color, def.tier); } } - + if(GeneralConfig.enable528ColtanSpawn) { DungeonToolbox.generateOre(world, rand, i, j, GeneralConfig.coltanRate, 4, 15, 40, ModBlocks.ore_coltan); } @@ -184,16 +169,16 @@ public class HbmWorldGen implements IWorldGenerator { int colX = (int) (colRand.nextGaussian() * 1500); int colZ = (int) (colRand.nextGaussian() * 1500); int colRange = 750; - + if((GeneralConfig.enable528BedrockSpawn || GeneralConfig.enable528BedrockDeposit) && rand.nextInt(GeneralConfig.bedrockRate) != 0) { int x = i + rand.nextInt(16) + 8; int z = j + rand.nextInt(16) + 8; - + if(GeneralConfig.enable528BedrockSpawn || (GeneralConfig.enable528BedrockDeposit && x <= colX + colRange && x >= colX - colRange && z <= colZ + colRange && z >= colZ - colRange)) { BedrockOre.generate(world, x, z, new ItemStack(ModItems.fragment_coltan), null, 0xA78D7A, 1); } } - + if(GeneralConfig.enable528ColtanDeposit) { for(int k = 0; k < 2; k++) { @@ -220,18 +205,18 @@ public class HbmWorldGen implements IWorldGenerator { (new WorldGenMinable(ModBlocks.ore_australium, 50)).generate(world, rand, randPosX, randPosY, randPosZ); } } - + boolean enableDungeons = world.getWorldInfo().isMapFeaturesEnabled(); if(GeneralConfig.enableDungeons == 1) enableDungeons = true; if(GeneralConfig.enableDungeons == 0) enableDungeons = false; - + if(enableDungeons && world.provider.dimensionId == 0) { - + if(MobConfig.enableHives && rand.nextInt(MobConfig.hiveSpawn) == 0) { int x = i + rand.nextInt(16) + 8; int z = j + rand.nextInt(16) + 8; int y = world.getHeightValue(x, z); - + for(int k = 3; k >= -1; k--) { if(world.getBlock(x, y - 1 + k, z).isNormalCube()) { GlyphidHive.generateSmall(world, x, y + k, z, rand, rand.nextInt(10) == 0, true); @@ -383,7 +368,7 @@ public class HbmWorldGen implements IWorldGenerator { if(world.getBlock(x, y - 1, z).canPlaceTorchOnTop(world, x, y - 1, z)) { world.setBlock(x, y, z, ModBlocks.broadcaster_pc, rand.nextInt(4) + 2, 2); - + if(GeneralConfig.enableDebugMode) MainRegistry.logger.info("[Debug] Successfully spawned corrupted broadcaster at " + x + " " + (y) +" " + z); } @@ -393,9 +378,9 @@ public class HbmWorldGen implements IWorldGenerator { int x = i + rand.nextInt(16) + 8; int z = j + rand.nextInt(16) + 8; int y = world.getHeightValue(x, z); - + for(int g = y + 2; g >= y; g--) { - + if(world.getBlock(x, g - 1, z).canPlaceTorchOnTop(world, x, g - 1, z)) { world.setBlock(x, g, z, ModBlocks.mine_ap); TileEntityLandmine landmine = (TileEntityLandmine) world.getTileEntity(x, g, z); @@ -412,13 +397,13 @@ public class HbmWorldGen implements IWorldGenerator { int y = world.getHeightValue(x, z); if(world.getBlock(x, y - 1, z).canPlaceTorchOnTop(world, x, y - 1, z) && world.getBlock(x, y, z).isReplaceable(world, x, y, z)) { - + world.setBlock(x, y, z, ModBlocks.lantern_behemoth, 12, 3); MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {4, 0, 0, 0, 0, 0}, ModBlocks.lantern_behemoth, ForgeDirection.NORTH); - + TileEntityLanternBehemoth lantern = (TileEntityLanternBehemoth) world.getTileEntity(x, y, z); lantern.isBroken = true; - + if(rand.nextInt(2) == 0) { LootGenerator.setBlock(world, x, y, z - 2); LootGenerator.lootBooklet(world, x, y, z - 2); @@ -441,13 +426,13 @@ public class HbmWorldGen implements IWorldGenerator { } if(WorldConfig.radfreq > 0 && GeneralConfig.enableRad && rand.nextInt(WorldConfig.radfreq) == 0 && biome == BiomeGenBase.desert) { - + for (int a = 0; a < 1; a++) { int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); - + double r = rand.nextInt(15) + 10; - + if(rand.nextInt(50) == 0) r = 50; @@ -462,7 +447,7 @@ public class HbmWorldGen implements IWorldGenerator { int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); int y = world.getHeightValue(x, z); - + if(world.getBlock(x, y - 1, z) == Blocks.grass) new Geyser().generate(world, rand, x, y, z); } @@ -480,17 +465,17 @@ public class HbmWorldGen implements IWorldGenerator { int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); int y = world.getHeightValue(x, z) - 4; - + if(world.getBlock(x, y + 1, z).canPlaceTorchOnTop(world, x, y + 1, z)) { - + world.setBlock(x, y, z, ModBlocks.soyuz_capsule, 3, 2); - + TileEntitySoyuzCapsule cap = (TileEntitySoyuzCapsule)world.getTileEntity(x, y, z); - + if(cap != null) { cap.setInventorySlotContents(rand.nextInt(cap.getSizeInventory()), new ItemStack(ModItems.record_glass)); } - + if(GeneralConfig.enableDebugMode) MainRegistry.logger.info("[Debug] Successfully spawned capsule at " + x + " " + z); } @@ -510,9 +495,9 @@ public class HbmWorldGen implements IWorldGenerator { if (rand.nextInt(1000) == 0) { int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); - + boolean done = false; - + for(int k = 0; k < 256; k++) { if(world.getBlock(x, k, z) == Blocks.log && world.getBlockMetadata(x, k, z) == 0) { world.setBlock(x, k, z, ModBlocks.pink_log); @@ -532,7 +517,7 @@ public class HbmWorldGen implements IWorldGenerator { if(world.getBlock(x, y - 1, z).canPlaceTorchOnTop(world, x, y - 1, z)) { world.setBlock(x, y, z, ModBlocks.safe, rand.nextInt(4) + 2, 2); TileEntitySafe safe = (TileEntitySafe) world.getTileEntity(x, y, z); - + switch(rand.nextInt(10)) { case 0: case 1: case 2: case 3: safe.setMod(1); @@ -554,38 +539,38 @@ public class HbmWorldGen implements IWorldGenerator { safe.setPins(rand.nextInt(999) + 1); safe.lock(); - + if(GeneralConfig.enableDebugMode) MainRegistry.logger.info("[Debug] Successfully spawned safe at " + x + " " + (y + 1) +" " + z); } - + } if (WorldConfig.meteorStructure > 0 && rand.nextInt(WorldConfig.meteorStructure) == 0 && biome != BiomeGenBase.ocean && biome != BiomeGenBase.deepOcean) { int x = i + rand.nextInt(16) + 8; int z = j + rand.nextInt(16) + 8; - + CellularDungeonFactory.meteor.generate(world, x, 10, z, rand); - + if(GeneralConfig.enableDebugMode) MainRegistry.logger.info("[Debug] Successfully spawned meteor dungeon at " + x + " 10 " + z); - + int y = world.getHeightValue(x, z); - + for(int f = 0; f < 3; f++) world.setBlock(x, y + f, z, ModBlocks.meteor_pillar); world.setBlock(x, y + 3, z, ModBlocks.meteor_brick_chiseled); - + for(int f = 0; f < 10; f++) { x = i + rand.nextInt(65) - 32; z = j + rand.nextInt(65) - 32; y = world.getHeightValue(x, z); - + if(world.getBlock(x, y - 1, z).canPlaceTorchOnTop(world, x, y - 1, z)) { world.setBlock(x, y, z, Blocks.skull, 1, 2); TileEntitySkull skull = (TileEntitySkull)world.getTileEntity(x, y, z); - + if(skull != null) skull.func_145903_a(rand.nextInt(16)); } @@ -596,16 +581,16 @@ public class HbmWorldGen implements IWorldGenerator { WorldConfig.jungleStructure > 0 && rand.nextInt(WorldConfig.jungleStructure) == 0) { int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); - + CellularDungeonFactory.jungle.generate(world, x, 20, z, world.rand); CellularDungeonFactory.jungle.generate(world, x, 24, z, world.rand); CellularDungeonFactory.jungle.generate(world, x, 28, z, world.rand); - + if(GeneralConfig.enableDebugMode) MainRegistry.logger.info("[Debug] Successfully spawned jungle dungeon at " + x + " 10 " + z); - + int y = world.getHeightValue(x, z); - + for(int f = 0; f < 3; f++) world.setBlock(x, y + f, z, ModBlocks.deco_titanium); world.setBlock(x, y + 3, z, Blocks.redstone_block); @@ -617,12 +602,12 @@ public class HbmWorldGen implements IWorldGenerator { int y = 16 + rand.nextInt(32); new ArcticVault().trySpawn(world, x, y, z); } - + if (WorldConfig.pyramidStructure > 0 && biome.temperature >= 2.0F && !biome.canSpawnLightningBolt() && rand.nextInt(WorldConfig.pyramidStructure) == 0) { int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); int y = world.getHeightValue(x, z); - + new AncientTomb().build(world, rand, x, y, z); } } @@ -638,11 +623,11 @@ public class HbmWorldGen implements IWorldGenerator { if(WorldConfig.bedrockOilSpawn > 0 && rand.nextInt(WorldConfig.bedrockOilSpawn) == 0) { int randPosX = i + rand.nextInt(16); int randPosZ = j + rand.nextInt(16); - + for(int x = -4; x <= 4; x++) { for(int y = 0; y <= 4; y++) { for(int z = -4; z <= 4; z++) { - + if(Math.abs(x) + Math.abs(y) + Math.abs(z) <= 6) { Block b = world.getBlock(randPosX + x, y, randPosZ + z); if(b.isReplaceableOreGen(world, randPosX + x, y, randPosZ + z, Blocks.stone) || b.isReplaceableOreGen(world, randPosX + x, y, randPosZ + z, Blocks.bedrock)) { @@ -652,7 +637,7 @@ public class HbmWorldGen implements IWorldGenerator { } } } - + DungeonToolbox.generateOre(world, rand, i, j, 16, 8, 10, 50, ModBlocks.stone_porous); OilSpot.generateOilSpot(world, randPosX, randPosZ, 5, 50, true); } @@ -731,12 +716,12 @@ public class HbmWorldGen implements IWorldGenerator { } } } - + if(rand.nextInt(4) == 0) { int x = i + rand.nextInt(16) + 8; int y = 6 + rand.nextInt(13); int z = j + rand.nextInt(16) + 8; - + if(world.getBlock(x, y, z).isReplaceableOreGen(world, x, y, z, Blocks.stone)) { world.setBlock(x, y, z, ModBlocks.stone_keyhole); } @@ -753,10 +738,10 @@ public class HbmWorldGen implements IWorldGenerator { DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.netherPhosphorusSpawn, 6, 0, 127, ModBlocks.ore_nether_fire, Blocks.netherrack); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.netherCoalSpawn, 32, 16, 96, ModBlocks.ore_nether_coal, Blocks.netherrack); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.netherCobaltSpawn, 6, 100, 26, ModBlocks.ore_nether_cobalt, Blocks.netherrack); - + if(GeneralConfig.enablePlutoniumOre) DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.netherPlutoniumSpawn, 4, 0, 127, ModBlocks.ore_nether_plutonium, Blocks.netherrack); - + if(rand.nextInt(10) == 0) { @SuppressWarnings("unchecked") WeightedRandomGeneric item = (WeightedRandomGeneric) WeightedRandom.getRandomItem(rand, BedrockOre.weightedOresNether); @@ -792,15 +777,15 @@ public class HbmWorldGen implements IWorldGenerator { } private void generateEnd(World world, Random rand, int i, int j) { - + if(WorldConfig.endOre) { DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.endTikiteSpawn, 6, 0, 127, ModBlocks.ore_tikite, Blocks.end_stone); - + /*for(int k = 0; k < 50; k++){ int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); int d = 5 + rand.nextInt(60); - + for(int y = d - 5; y <= d; y++) if(world.getBlock(x, y, z) == Blocks.air && world.getBlock(x, y + 1, z).isSideSolid(world, x, y, z, ForgeDirection.DOWN)) world.setBlock(x, y, z, ModBlocks.crystal_trixite); diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index 828433470..96a019726 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -1,21 +1,16 @@ package com.hbm.lib; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.entity.mob.EntityHunterChopper; -import com.hbm.entity.projectile.EntityChopperMine; -import com.hbm.interfaces.Spaghetti; -import com.hbm.inventory.fluid.FluidType; -import com.hbm.items.ModItems; - import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IEnergyConnectorBlock; import api.hbm.energymk2.IEnergyConnectorMK2; import api.hbm.fluid.IFluidConnector; import api.hbm.fluid.IFluidConnectorBlock; +import com.hbm.blocks.ModBlocks; +import com.hbm.entity.mob.EntityHunterChopper; +import com.hbm.entity.projectile.EntityChopperMine; +import com.hbm.interfaces.Spaghetti; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.ModItems; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -30,11 +25,15 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + @Spaghetti("this whole class") public class Library { - + static Random rand = new Random(); - + public static boolean checkForHeld(EntityPlayer player, Item item) { if(player.getHeldItem() == null) return false; return player.getHeldItem().getItem() == item; @@ -46,60 +45,60 @@ public class Library { public static final ForgeDirection NEG_Y = ForgeDirection.DOWN; public static final ForgeDirection POS_Z = ForgeDirection.SOUTH; public static final ForgeDirection NEG_Z = ForgeDirection.NORTH; - + /* * Is putting this into this trash can a good idea? No. Do I have a better idea? Not currently. */ public static boolean canConnect(IBlockAccess world, int x, int y, int z, ForgeDirection dir /* cable's connecting side */) { - + if(y > 255 || y < 0) return false; - + Block b = world.getBlock(x, y, z); - + if(b instanceof IEnergyConnectorBlock) { IEnergyConnectorBlock con = (IEnergyConnectorBlock) b; - + if(con.canConnect(world, x, y, z, dir.getOpposite() /* machine's connecting side */)) return true; } - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof IEnergyConnectorMK2) { IEnergyConnectorMK2 con = (IEnergyConnectorMK2) te; - + if(con.canConnect(dir.getOpposite() /* machine's connecting side */)) return true; } - + return false; } /** dir is the direction along the fluid duct entering the block */ public static boolean canConnectFluid(IBlockAccess world, int x, int y, int z, ForgeDirection dir /* duct's connecting side */, FluidType type) { - + if(y > 255 || y < 0) return false; - + Block b = world.getBlock(x, y, z); - + if(b instanceof IFluidConnectorBlock) { IFluidConnectorBlock con = (IFluidConnectorBlock) b; - + if(con.canConnect(type, world, x, y, z, dir.getOpposite() /* machine's connecting side */)) return true; } - + TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof IFluidConnector) { IFluidConnector con = (IFluidConnector) te; - + if(con.canConnect(type, dir.getOpposite() /* machine's connecting side */)) return true; } - + return false; } @@ -192,7 +191,7 @@ public class Library { return entity; } - + public static MovingObjectPosition rayTrace(EntityPlayer player, double length, float interpolation) { Vec3 vec3 = getPosition(interpolation, player); vec3.yCoord += player.eyeHeight; @@ -208,7 +207,7 @@ public class Library { Vec3 vec32 = vec3.addVector(vec31.xCoord * length, vec31.yCoord * length, vec31.zCoord * length); return player.worldObj.func_147447_a(vec3, vec32, allowLiquids, disallowNonCollidingBlocks, mopOnMiss); } - + public static Vec3 getPosition(float interpolation, EntityPlayer player) { if(interpolation == 1.0F) { return Vec3.createVectorHelper(player.posX, player.posY + (player.getEyeHeight() - player.getDefaultEyeHeight()), player.posZ); @@ -219,43 +218,43 @@ public class Library { return Vec3.createVectorHelper(d0, d1, d2); } } - + public static List getBlockPosInPath(int x, int y, int z, int length, Vec3 vec0) { List list = new ArrayList(); - + for(int i = 0; i <= length; i++) { list.add(new int[] { (int)(x + (vec0.xCoord * i)), y, (int)(z + (vec0.zCoord * i)), i }); } - + return list; } - + //not great either but certainly better public static long chargeItemsFromTE(ItemStack[] slots, int index, long power, long maxPower) { - + if(power < 0) return 0; - + if(power > maxPower) return maxPower; if(slots[index] != null && slots[index].getItem() instanceof IBatteryItem) { - + IBatteryItem battery = (IBatteryItem) slots[index].getItem(); long batMax = battery.getMaxCharge(slots[index]); long batCharge = battery.getCharge(slots[index]); long batRate = battery.getChargeRate(); long toCharge = Math.min(Math.min(power, batRate), batMax - batCharge); - + power -= toCharge; - + battery.chargeBattery(slots[index], toCharge); } - + return power; } - + public static long chargeTEFromItems(ItemStack[] slots, int index, long power, long maxPower) { if(slots[index] != null && slots[index].getItem() == ModItems.battery_creative) { @@ -280,11 +279,11 @@ public class Library { return power; } - + //Flut-Füll gesteuerter Energieübertragungsalgorithmus //Flood fill controlled energy transmission algorithm public static void ffgeua(int x, int y, int z, boolean newTact, Object that, World worldObj) { - + /* * This here smoldering crater is all that remains from the old energy system. * In loving memory, 2016-2021. @@ -307,12 +306,12 @@ public class Library { MovingObjectPosition pos = world.rayTraceBlocks(Vec3.createVectorHelper(x, y, z), Vec3.createVectorHelper(a, b, c)); return pos != null; } - + public static boolean isObstructedOpaque(World world, double x, double y, double z, double a, double b, double c) { MovingObjectPosition pos = world.func_147447_a(Vec3.createVectorHelper(x, y, z), Vec3.createVectorHelper(a, b, c), false, true, false); return pos != null; } - + public static Block getRandomConcrete() { int i = rand.nextInt(20); if(i <= 1) return ModBlocks.brick_concrete_broken; diff --git a/src/main/java/com/hbm/lib/ModDamageSource.java b/src/main/java/com/hbm/lib/ModDamageSource.java index 287385c20..ad2ddc531 100644 --- a/src/main/java/com/hbm/lib/ModDamageSource.java +++ b/src/main/java/com/hbm/lib/ModDamageSource.java @@ -1,13 +1,15 @@ package com.hbm.lib; -import com.hbm.entity.projectile.*; - +import com.hbm.entity.projectile.EntityBullet; +import com.hbm.entity.projectile.EntityLN2; +import com.hbm.entity.projectile.EntityLaserBeam; +import com.hbm.entity.projectile.EntityMinerBeam; import net.minecraft.entity.Entity; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSourceIndirect; public class ModDamageSource extends DamageSource { - + public static DamageSource nuclearBlast = (new DamageSource("nuclearBlast")).setExplosion(); public static DamageSource mudPoisoning = (new DamageSource("mudPoisoning")).setDamageBypassesArmor(); public static DamageSource acid = (new DamageSource("acid")); //.setDamageBypassesArmor(); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 7fd22abdc..1cb6b6ae9 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -1,148 +1,147 @@ package com.hbm.main; -import com.hbm.handler.imc.IMCHandlerNHNEI; -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.PositionedSoundRecord; -import net.minecraft.client.model.ModelChicken; -import net.minecraft.client.particle.EntityAuraFX; -import net.minecraft.client.particle.EntityBlockDustFX; -import net.minecraft.client.particle.EntityCloudFX; -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.particle.EntityFireworkSparkFX; -import net.minecraft.client.particle.EntityFlameFX; -import net.minecraft.client.particle.EntityReddustFX; -import net.minecraft.client.renderer.entity.RenderMinecart; -import net.minecraft.client.renderer.entity.RenderSnowball; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.client.resources.Language; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Vec3; -import net.minecraft.util.MovingObjectPosition.MovingObjectType; -import net.minecraft.world.World; -import net.minecraftforge.client.MinecraftForgeClient; -import net.minecraftforge.client.model.AdvancedModelLoader; -import net.minecraftforge.common.MinecraftForge; -import paulscode.sound.SoundSystemConfig; + import com.hbm.blocks.ModBlocks; + import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; + import com.hbm.blocks.generic.BlockEmitter.TileEntityEmitter; + import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; + import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; + import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; + import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; + import com.hbm.blocks.machine.Floodlight.TileEntityFloodlight; + import com.hbm.blocks.machine.MachineFan.TileEntityFan; + import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter; + import com.hbm.blocks.machine.WatzPump.TileEntityWatzPump; + import com.hbm.config.GeneralConfig; + import com.hbm.entity.cart.EntityMinecartCrate; + import com.hbm.entity.cart.EntityMinecartNTM; + import com.hbm.entity.effect.*; + import com.hbm.entity.grenade.*; + import com.hbm.entity.item.*; + import com.hbm.entity.logic.EntityBomber; + import com.hbm.entity.logic.EntityDeathBlast; + import com.hbm.entity.logic.EntityEMP; + import com.hbm.entity.logic.EntityWaypoint; + import com.hbm.entity.missile.*; + import com.hbm.entity.missile.EntityMissileTier0.*; + import com.hbm.entity.missile.EntityMissileTier1.*; + import com.hbm.entity.missile.EntityMissileTier2.*; + import com.hbm.entity.missile.EntityMissileTier3.EntityMissileBurst; + import com.hbm.entity.missile.EntityMissileTier3.EntityMissileDrill; + import com.hbm.entity.missile.EntityMissileTier3.EntityMissileInferno; + import com.hbm.entity.missile.EntityMissileTier3.EntityMissileRain; + import com.hbm.entity.missile.EntityMissileTier4.*; + import com.hbm.entity.mob.*; + import com.hbm.entity.mob.botprime.EntityBOTPrimeBody; + import com.hbm.entity.mob.botprime.EntityBOTPrimeHead; + import com.hbm.entity.mob.glyphid.*; + import com.hbm.entity.mob.siege.*; + import com.hbm.entity.particle.*; + import com.hbm.entity.projectile.*; + import com.hbm.entity.train.EntityRailCarBase.BoundingBoxDummyEntity; + import com.hbm.entity.train.EntityRailCarRidable.SeatDummyEntity; + import com.hbm.entity.train.TrainCargoTram; + import com.hbm.entity.train.TrainCargoTramTrailer; + import com.hbm.entity.train.TrainTunnelBore; + import com.hbm.handler.CasingEjector; + import com.hbm.handler.HbmKeybinds; + import com.hbm.handler.HbmKeybinds.EnumKeybind; + import com.hbm.handler.ImpactWorldHandler; + import com.hbm.handler.imc.IMCHandlerNHNEI; + import com.hbm.items.IAnimatedItem; + import com.hbm.items.ModItems; + import com.hbm.items.weapon.sedna.factory.GunFactoryClient; + import com.hbm.lib.RefStrings; + import com.hbm.particle.*; + import com.hbm.particle.helper.ParticleCreators; + import com.hbm.particle.psys.engine.EventHandlerParticleEngine; + import com.hbm.render.anim.BusAnimation; + import com.hbm.render.anim.BusAnimationSequence; + import com.hbm.render.anim.HbmAnimations; + import com.hbm.render.anim.HbmAnimations.Animation; + import com.hbm.render.block.*; + import com.hbm.render.entity.RenderEmpty; + import com.hbm.render.entity.effect.*; + import com.hbm.render.entity.item.*; + import com.hbm.render.entity.mob.*; + import com.hbm.render.entity.projectile.*; + import com.hbm.render.entity.rocket.*; + import com.hbm.render.item.*; + import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType; + import com.hbm.render.item.block.ItemRenderDecoBlock; + import com.hbm.render.item.weapon.*; + import com.hbm.render.loader.HmfModelLoader; + import com.hbm.render.model.ModelPigeon; + import com.hbm.render.tileentity.*; + import com.hbm.render.util.MissilePart; + import com.hbm.render.util.RenderInfoSystem; + import com.hbm.render.util.RenderInfoSystem.InfoEntry; + import com.hbm.render.util.RenderOverhead; + import com.hbm.render.util.RenderOverhead.Marker; + import com.hbm.sound.AudioWrapper; + import com.hbm.sound.AudioWrapperClient; + import com.hbm.tileentity.TileEntityDoorGeneric; + import com.hbm.tileentity.bomb.*; + import com.hbm.tileentity.deco.*; + import com.hbm.tileentity.machine.*; + import com.hbm.tileentity.machine.oil.*; + import com.hbm.tileentity.machine.rbmk.*; + import com.hbm.tileentity.machine.storage.*; + import com.hbm.tileentity.network.*; + import com.hbm.tileentity.turret.*; + import com.hbm.util.BobMathUtil; + import com.hbm.util.ColorUtil; + import com.hbm.util.fauxpointtwelve.BlockPos; + import com.hbm.wiaj.cannery.Jars; + import cpw.mods.fml.client.registry.ClientRegistry; + import cpw.mods.fml.client.registry.RenderingRegistry; + import cpw.mods.fml.common.FMLCommonHandler; + import cpw.mods.fml.relauncher.ReflectionHelper; + import net.minecraft.block.Block; + import net.minecraft.client.Minecraft; + import net.minecraft.client.audio.PositionedSoundRecord; + import net.minecraft.client.model.ModelChicken; + import net.minecraft.client.particle.EntityCloudFX; + import net.minecraft.client.particle.*; + import net.minecraft.client.renderer.entity.RenderMinecart; + import net.minecraft.client.renderer.entity.RenderSnowball; + import net.minecraft.client.renderer.texture.TextureManager; + import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; + import net.minecraft.client.resources.Language; + import net.minecraft.entity.Entity; + import net.minecraft.entity.EntityLivingBase; + import net.minecraft.entity.player.EntityPlayer; + import net.minecraft.init.Blocks; + import net.minecraft.init.Items; + import net.minecraft.item.Item; + import net.minecraft.item.ItemBlock; + import net.minecraft.item.ItemStack; + import net.minecraft.nbt.NBTTagCompound; + import net.minecraft.util.MovingObjectPosition; + import net.minecraft.util.MovingObjectPosition.MovingObjectType; + import net.minecraft.util.ResourceLocation; + import net.minecraft.util.Vec3; + import net.minecraft.world.World; + import net.minecraftforge.client.MinecraftForgeClient; + import net.minecraftforge.client.model.AdvancedModelLoader; + import net.minecraftforge.common.MinecraftForge; + import paulscode.sound.SoundSystemConfig; -import java.awt.Color; -import java.awt.Desktop; -import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; -import com.hbm.blocks.generic.BlockEmitter.TileEntityEmitter; -import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; -import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; -import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; -import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; -import com.hbm.blocks.machine.Floodlight.TileEntityFloodlight; -import com.hbm.blocks.machine.MachineFan.TileEntityFan; -import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter; -import com.hbm.blocks.machine.WatzPump.TileEntityWatzPump; -import com.hbm.config.GeneralConfig; -import com.hbm.entity.cart.*; -import com.hbm.entity.effect.*; -import com.hbm.entity.grenade.*; -import com.hbm.entity.item.*; -import com.hbm.entity.logic.*; -import com.hbm.entity.missile.*; -import com.hbm.entity.missile.EntityMissileTier0.*; -import com.hbm.entity.missile.EntityMissileTier1.*; -import com.hbm.entity.missile.EntityMissileTier2.*; -import com.hbm.entity.missile.EntityMissileTier3.*; -import com.hbm.entity.missile.EntityMissileTier4.*; -import com.hbm.entity.mob.*; -import com.hbm.entity.mob.botprime.*; -import com.hbm.entity.mob.glyphid.*; -import com.hbm.entity.mob.siege.*; -import com.hbm.entity.particle.*; -import com.hbm.entity.projectile.*; -import com.hbm.entity.train.*; -import com.hbm.entity.train.EntityRailCarBase.BoundingBoxDummyEntity; -import com.hbm.entity.train.EntityRailCarRidable.SeatDummyEntity; -import com.hbm.handler.CasingEjector; -import com.hbm.handler.HbmKeybinds; -import com.hbm.handler.ImpactWorldHandler; -import com.hbm.handler.HbmKeybinds.EnumKeybind; -import com.hbm.items.IAnimatedItem; -import com.hbm.items.ModItems; -import com.hbm.items.weapon.sedna.factory.GunFactoryClient; -import com.hbm.lib.RefStrings; -import com.hbm.particle.*; -import com.hbm.particle.helper.*; -import com.hbm.particle.psys.engine.EventHandlerParticleEngine; -import com.hbm.render.anim.*; -import com.hbm.render.anim.HbmAnimations.Animation; -import com.hbm.render.block.*; -import com.hbm.render.entity.*; -import com.hbm.render.entity.effect.*; -import com.hbm.render.entity.item.*; -import com.hbm.render.entity.mob.*; -import com.hbm.render.entity.projectile.*; -import com.hbm.render.entity.rocket.*; -import com.hbm.render.item.*; -import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType; -import com.hbm.render.item.block.*; -import com.hbm.render.item.weapon.*; -import com.hbm.render.loader.HmfModelLoader; -import com.hbm.render.model.ModelPigeon; -import com.hbm.render.tileentity.*; -import com.hbm.render.util.MissilePart; -import com.hbm.render.util.RenderInfoSystem; -import com.hbm.render.util.RenderInfoSystem.InfoEntry; -import com.hbm.render.util.RenderOverhead; -import com.hbm.render.util.RenderOverhead.Marker; -import com.hbm.sound.AudioWrapper; -import com.hbm.sound.AudioWrapperClient; -import com.hbm.tileentity.TileEntityDoorGeneric; -import com.hbm.tileentity.bomb.*; -import com.hbm.tileentity.deco.*; -import com.hbm.tileentity.machine.*; -import com.hbm.tileentity.machine.oil.*; -import com.hbm.tileentity.machine.rbmk.*; -import com.hbm.tileentity.machine.storage.*; -import com.hbm.tileentity.network.*; -import com.hbm.tileentity.turret.*; -import com.hbm.util.BobMathUtil; -import com.hbm.util.ColorUtil; -import com.hbm.util.fauxpointtwelve.BlockPos; -import com.hbm.wiaj.cannery.Jars; - -import cpw.mods.fml.client.registry.ClientRegistry; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.ReflectionHelper; + import java.awt.*; + import java.net.URI; + import java.util.List; + import java.util.*; + import java.util.Map.Entry; public class ClientProxy extends ServerProxy { - + public RenderInfoSystem theInfoSystem = new RenderInfoSystem(); - + /** Runs just before item an block init */ @Override public void registerPreRenderInfo() { AdvancedModelLoader.registerModelHandler(new HmfModelLoader()); } - + /** Runs right after item and block init */ @Override public void registerRenderInfo() { @@ -156,15 +155,15 @@ public class ClientProxy extends ServerProxy { registerItemRenderer(); registerEntityRenderer(); registerBlockRenderer(); - + Jars.initJars(); - + if(GeneralConfig.enableSoundExtension) { SoundSystemConfig.setNumberNormalChannels(GeneralConfig.normalSoundChannels); SoundSystemConfig.setNumberStreamingChannels(50); } } - + private void registerClientEventHandler(Object handler) { MinecraftForge.EVENT_BUS.register(handler); FMLCommonHandler.instance().bus().register(handler); @@ -174,7 +173,7 @@ public class ClientProxy extends ServerProxy { public void handleNHNEICompat(){ IMCHandlerNHNEI.IMCSender(); } - + @Override public void registerGunCfg() { GunFactoryClient.init(); @@ -410,12 +409,12 @@ public class ClientProxy extends ServerProxy { @Override public void registerItemRenderer() { - + ItemRenderLibrary.init(); - + for(Entry entry : ItemRenderLibrary.renderers.entrySet()) MinecraftForgeClient.registerItemRenderer(entry.getKey(), entry.getValue()); - + //this bit registers an item renderer for every existing tile entity renderer that implements IItemRendererProvider Iterator iterator = TileEntityRendererDispatcher.instance.mapSpecialRenderers.values().iterator(); while(iterator.hasNext()) { @@ -427,7 +426,7 @@ public class ClientProxy extends ServerProxy { } } } - + //universal JSON translated items double[] rtp = new double[] {0, 180, -90}; double[] ttp_high = new double[] {0.125, 0.625, 0}; @@ -453,7 +452,7 @@ public class ClientProxy extends ServerProxy { double[] sfp_default = new double[] {1, 1, 1}; double[] tfp_default = new double[] {0, 0, 0}; double[] sir_default = new double[] {1, 1, 1}; - + MinecraftForgeClient.registerItemRenderer(ModItems.bismuth_pickaxe, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp_default, sfp_default, rir, tir, sir_default)); MinecraftForgeClient.registerItemRenderer(ModItems.bismuth_axe, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp_default, sfp_default, rir, tir, sir_default)); MinecraftForgeClient.registerItemRenderer(ModItems.volcanic_pickaxe, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp_default, sfp_default, rir, tir, sir_default)); @@ -462,7 +461,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.chlorophyte_axe, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp_default, sfp_default, rir, tir, sir_default)); MinecraftForgeClient.registerItemRenderer(ModItems.mese_pickaxe, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp_default, sfp_default, rir, tir, sir_default)); MinecraftForgeClient.registerItemRenderer(ModItems.mese_axe, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp_default, sfp_default, rir, tir, sir_default)); - + ItemRenderMissileGeneric.init(); MinecraftForgeClient.registerItemRenderer(ModItems.missile_test, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_taint, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); @@ -493,7 +492,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.missile_doomsday_rusted, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_carrier, new ItemRenderMissileGeneric(RenderMissileType.TYPE_CARRIER)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_shuttle, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ROBIN)); - + //templates MinecraftForgeClient.registerItemRenderer(ModItems.assembly_template, new ItemRenderTemplate()); MinecraftForgeClient.registerItemRenderer(ModItems.chemistry_template, new ItemRenderTemplate()); @@ -822,7 +821,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityFogFX.class, new FogRenderer()); RenderingRegistry.registerEntityRenderingHandler(EntityEMPBlast.class, new RenderEMPBlast()); } - + @Override public void registerBlockRenderer() { @@ -876,7 +875,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderFoundryOutlet()); RenderingRegistry.registerBlockHandler(new RenderRail()); - + RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite)); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4)); @@ -885,20 +884,20 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderRBMKControl()); RenderingRegistry.registerBlockHandler(new RenderPribris()); } - + @Override public void registerMissileItems() { - + MissilePart.registerAllParts(); - + Iterator it = MissilePart.parts.entrySet().iterator(); - + while(it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); MissilePart part = (MissilePart) pair.getValue(); MinecraftForgeClient.registerItemRenderer(part.part, new ItemRenderMissilePart(part)); } - + MinecraftForgeClient.registerItemRenderer(ModItems.missile_custom, new ItemRenderMissile()); } @@ -906,31 +905,31 @@ public class ClientProxy extends ServerProxy { @Override public void particleControl(double x, double y, double z, int type) { - + World world = Minecraft.getMinecraft().theWorld; TextureManager man = Minecraft.getMinecraft().renderEngine; - + switch(type) { case 0: - + for(int i = 0; i < 10; i++) { EntityCloudFX smoke = new EntityCloudFX(world, x + world.rand.nextGaussian(), y + world.rand.nextGaussian(), z + world.rand.nextGaussian(), 0.0, 0.0, 0.0); Minecraft.getMinecraft().effectRenderer.addEffect(smoke); } break; - + case 1: - + EntityCloudFX smoke = new EntityCloudFX(world, x, y, z, 0.0, 0.1, 0.0); Minecraft.getMinecraft().effectRenderer.addEffect(smoke); break; - + case 2: - + ParticleContrail contrail = new ParticleContrail(man, world, x, y, z); Minecraft.getMinecraft().effectRenderer.addEffect(contrail); break; - + case 3: ParticleRadiationFog fog = new ParticleRadiationFog(man, world, x, y, z); @@ -938,15 +937,15 @@ public class ClientProxy extends ServerProxy { break; } } - + //version 2, now with strings! @Deprecated @Override public void spawnParticle(double x, double y, double z, String type, float args[]) { - + World world = Minecraft.getMinecraft().theWorld; TextureManager man = Minecraft.getMinecraft().renderEngine; - + if("launchsmoke".equals(type) && args.length == 3) { ParticleSmokePlume contrail = new ParticleSmokePlume(man, world, x, y, z); contrail.motionX = args[0]; @@ -975,16 +974,16 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().effectRenderer.addEffect(contrail); } } - + //mk3, only use this one @Override public void effectNT(NBTTagCompound data) { - + World world = Minecraft.getMinecraft().theWorld; - + if(world == null) //might i ask why? return; - + TextureManager man = Minecraft.getMinecraft().renderEngine; EntityPlayer player = Minecraft.getMinecraft().thePlayer; int particleSetting = Minecraft.getMinecraft().gameSettings.particleSetting; @@ -993,27 +992,27 @@ public class ClientProxy extends ServerProxy { double x = data.getDouble("posX"); double y = data.getDouble("posY"); double z = data.getDouble("posZ"); - + if(ParticleCreators.particleCreators.containsKey(type)) { ParticleCreators.particleCreators.get(type).makeParticle(world, player, man, rand, x, y, z, data); return; } - + if("missileContrail".equals(type)) { - + if(Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector() > 350) return; - + float scale = data.hasKey("scale") ? data.getFloat("scale") : 1F; double mX = data.getDouble("moX"); double mY = data.getDouble("moY"); double mZ = data.getDouble("moZ"); - + /*ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0, 0, 0, scale); contrail.motionX = mX; contrail.motionY = mY; contrail.motionZ = mZ; Minecraft.getMinecraft().effectRenderer.addEffect(contrail);*/ - + ParticleRocketFlame fx = new ParticleRocketFlame(man, world, x, y, z).setScale(scale); fx.motionX = mX; fx.motionY = mY; @@ -1021,14 +1020,14 @@ public class ClientProxy extends ServerProxy { if(data.hasKey("maxAge")) fx.setMaxAge(data.getInteger("maxAge")); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } - + if("smoke".equals(type)) { - + String mode = data.getString("mode"); int count = Math.max(1, data.getInteger("count")); - + if("cloud".equals(mode)) { - + for(int i = 0; i < count; i++) { ParticleExSmoke fx = new ParticleExSmoke(man, world, x, y, z); fx.motionY = rand.nextGaussian() * (1 + (count / 100)); @@ -1054,25 +1053,25 @@ public class ClientProxy extends ServerProxy { Vec3 vec = Vec3.createVectorHelper(2, 0, 0); vec.rotateAroundY(rand.nextFloat() * (float)Math.PI * 2F); - + for(int i = 0; i < count; i++) { ParticleDigammaSmoke fx = new ParticleDigammaSmoke(man, world, x, y, z); fx.motionY = 0; fx.motionX = vec.xCoord; fx.motionZ = vec.zCoord; Minecraft.getMinecraft().effectRenderer.addEffect(fx); - + vec.rotateAroundY((float)Math.PI * 2F / (float)count); } } - + if("shock".equals(mode)) { - + double strength = data.getDouble("strength"); Vec3 vec = Vec3.createVectorHelper(strength, 0, 0); vec.rotateAroundY(rand.nextInt(360)); - + for(int i = 0; i < count; i++) { ParticleExSmoke fx = new ParticleExSmoke(man, world, x, y, z); fx.motionY = 0; @@ -1083,15 +1082,15 @@ public class ClientProxy extends ServerProxy { vec.rotateAroundY((float)Math.PI * 2F / (float)count); } } - + if("shockRand".equals(mode)) { - + double strength = data.getDouble("strength"); Vec3 vec = Vec3.createVectorHelper(strength, 0, 0); vec.rotateAroundY(rand.nextInt(360)); double r; - + for(int i = 0; i < count; i++) { r = rand.nextDouble(); ParticleExSmoke fx = new ParticleExSmoke(man, world, x, y, z); @@ -1099,76 +1098,76 @@ public class ClientProxy extends ServerProxy { fx.motionX = vec.xCoord * r; fx.motionZ = vec.zCoord * r; Minecraft.getMinecraft().effectRenderer.addEffect(fx); - + vec.rotateAroundY(360 / count); } } - + if("wave".equals(mode)) { - + double strength = data.getDouble("range"); Vec3 vec = Vec3.createVectorHelper(strength, 0, 0); - + for(int i = 0; i < count; i++) { - + vec.rotateAroundY((float) Math.toRadians(rand.nextFloat() * 360F)); - + ParticleExSmoke fx = new ParticleExSmoke(man, world, x + vec.xCoord, y, z + vec.zCoord); fx.maxAge = 50; fx.motionY = 0; fx.motionX = 0; fx.motionZ = 0; Minecraft.getMinecraft().effectRenderer.addEffect(fx); - + vec.rotateAroundY(360 / count); } } } - + if("exhaust".equals(type)) { String mode = data.getString("mode"); - + if("soyuz".equals(mode)) { - + if(Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector() > 350) return; - + int count = Math.max(1, data.getInteger("count")); double width = data.getDouble("width"); - + for(int i = 0; i < count; i++) { - + ParticleRocketFlame fx = new ParticleRocketFlame(man, world, x + rand.nextGaussian() * width, y, z + rand.nextGaussian() * width); fx.motionY = -0.75 + rand.nextDouble() * 0.5; Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } - + if("meteor".equals(mode)) { - + if(Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector() > 350) return; - + int count = Math.max(1, data.getInteger("count")); double width = data.getDouble("width"); - + for(int i = 0; i < count; i++) { - + ParticleRocketFlame fx = new ParticleRocketFlame(man, world, x + rand.nextGaussian() * width, y + rand.nextGaussian() * width, z + rand.nextGaussian() * width); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } } - + if("fireworks".equals(type)) { int color = data.getInteger("color"); char c = (char)data.getInteger("char"); - + ParticleLetter fx = new ParticleLetter(world, x, y, z, color, c); Minecraft.getMinecraft().effectRenderer.addEffect(fx); - + for(int i = 0; i < 50; i++) { EntityFireworkSparkFX blast = new EntityFireworkSparkFX(world, x, y, z, 0.4 * world.rand.nextGaussian(), @@ -1178,17 +1177,17 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().effectRenderer.addEffect(blast); } } - + if("vanillaburst".equals(type)) { - + double motion = data.getDouble("motion"); - + for(int i = 0; i < data.getInteger("count"); i++) { double mX = rand.nextGaussian() * motion; double mY = rand.nextGaussian() * motion; double mZ = rand.nextGaussian() * motion; - + EntityFX fx = null; if("flame".equals(data.getString("mode"))) { @@ -1215,23 +1214,23 @@ public class ClientProxy extends ServerProxy { } if("blockdust".equals(data.getString("mode"))) { - + Block b = Block.getBlockById(data.getInteger("block")); fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 50 + rand.nextInt(50), "particleMaxAge", "field_70547_e"); } - + if(fx != null) Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } - + if("vanillaExt".equals(type)) { double mX = data.getDouble("mX"); double mY = data.getDouble("mY"); double mZ = data.getDouble("mZ"); - + EntityFX fx = null; if("flame".equals(data.getString("mode"))) { @@ -1255,7 +1254,7 @@ public class ClientProxy extends ServerProxy { if("cloud".equals(data.getString("mode"))) { fx = new net.minecraft.client.particle.EntityCloudFX(world, x, y, z, mX, mY, mZ); - + if(data.hasKey("r")) { float rng = rand.nextFloat() * 0.1F; fx.setRBGColorF(data.getFloat("r") + rng, data.getFloat("g") + rng, data.getFloat("b") + rng); @@ -1283,12 +1282,12 @@ public class ClientProxy extends ServerProxy { } if("largeexplode".equals(data.getString("mode"))) { - - + + fx = new net.minecraft.client.particle.EntityLargeExplodeFX(man, world, x, y, z, data.getFloat("size"), 0.0F, 0.0F); float r = 1.0F - rand.nextFloat() * 0.2F; fx.setRBGColorF(1F * r, 0.9F * r, 0.5F * r); - + for(int i = 0; i < data.getByte("count"); i++) { net.minecraft.client.particle.EntityExplodeFX sec = new net.minecraft.client.particle.EntityExplodeFX(world, x, y, z, 0.0F, 0.0F, 0.0F); float r2 = 1.0F - rand.nextFloat() * 0.5F; @@ -1306,34 +1305,34 @@ public class ClientProxy extends ServerProxy { } if("blockdust".equals(data.getString("mode"))) { - + Block b = Block.getBlockById(data.getInteger("block")); fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e"); } if("colordust".equals(data.getString("mode"))) { - + Block b = Blocks.wool; fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); fx.setRBGColorF(data.getFloat("r"), data.getFloat("g"), data.getFloat("b")); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e"); } - + if(fx != null) { - + if(data.getBoolean("noclip")) { fx.noClip = true; } - + if(data.getInteger("overrideAge") > 0) { ReflectionHelper.setPrivateValue(EntityFX.class, fx, data.getInteger("overrideAge"), "particleMaxAge", "field_70547_e"); } - + Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } - + if("vanilla".equals(type)) { double mX = data.getDouble("mX"); @@ -1341,41 +1340,41 @@ public class ClientProxy extends ServerProxy { double mZ = data.getDouble("mZ"); world.spawnParticle(data.getString("mode"), x, y, z, mX, mY, mZ); } - + if("jetpack".equals(type)) { - + if(particleSetting == 2) return; - + Entity ent = world.getEntityByID(data.getInteger("player")); - + if(ent instanceof EntityPlayer) { - + EntityPlayer p = (EntityPlayer)ent; - + Vec3 vec = Vec3.createVectorHelper(0, 0, -0.25); Vec3 offset = Vec3.createVectorHelper(0.125, 0, 0); float angle = (float) -Math.toRadians(p.rotationYawHead - (p.rotationYawHead - p.renderYawOffset)); vec.rotateAroundY(angle); offset.rotateAroundY(angle); - + double ix = p.posX + vec.xCoord; double iy = p.posY + p.eyeHeight - 1; double iz = p.posZ + vec.zCoord; double ox = offset.xCoord; double oz = offset.zCoord; - + double moX = 0; double moY = 0; double moZ = 0; - + int mode = data.getInteger("mode"); - + if(mode == 0) { moY -= 0.2; } - + if(mode == 1) { Vec3 look = p.getLookVec(); @@ -1390,15 +1389,15 @@ public class ClientProxy extends ServerProxy { thrust = thrust.normalize(); Vec3 target = pos.addVector(thrust.xCoord * 10, thrust.yCoord * 10, thrust.zCoord * 10); MovingObjectPosition mop = player.worldObj.func_147447_a(pos, target, false, false, true); - + if(mop != null && mop.typeOfHit == MovingObjectType.BLOCK && mop.sideHit == 1) { - + Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); int meta = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); - + Vec3 delta = Vec3.createVectorHelper(ix - mop.hitVec.xCoord, iy - mop.hitVec.yCoord, iz - mop.hitVec.zCoord); Vec3 vel = Vec3.createVectorHelper(0.75 - delta.lengthVector() * 0.075, 0, 0); - + for(int i = 0; i < (10 - delta.lengthVector()); i++) { vel.rotateAroundY(world.rand.nextFloat() * (float)Math.PI * 2F); Minecraft.getMinecraft().effectRenderer.addEffect(new EntityBlockDustFX(world, mop.hitVec.xCoord, mop.hitVec.yCoord + 0.1, mop.hitVec.zCoord, vel.xCoord, 0.1, vel.zCoord, b, meta)); @@ -1415,50 +1414,50 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().effectRenderer.addEffect(new EntityFlameFX(world, ix + ox, iy, iz + oz, mX2, mY2, mZ2)); Minecraft.getMinecraft().effectRenderer.addEffect(new EntityFlameFX(world, ix - ox, iy, iz - oz, mX2, mY2, mZ2)); - + if(particleSetting == 0) { Minecraft.getMinecraft().effectRenderer.addEffect(new net.minecraft.client.particle.EntitySmokeFX(world, ix + ox, iy, iz + oz, mX3, mY3, mZ3)); Minecraft.getMinecraft().effectRenderer.addEffect(new net.minecraft.client.particle.EntitySmokeFX(world, ix - ox, iy, iz - oz, mX3, mY3, mZ3)); } } } - + if("bnuuy".equals(type)) { - + if(particleSetting == 2) return; - + Entity ent = world.getEntityByID(data.getInteger("player")); - + if(ent instanceof EntityPlayer) { - + EntityPlayer p = (EntityPlayer)ent; - + Vec3 vec = Vec3.createVectorHelper(0, 0, -0.6); Vec3 offset = Vec3.createVectorHelper(0.275, 0, 0); float angle = (float) -Math.toRadians(p.rotationYawHead - (p.rotationYawHead - p.renderYawOffset)); vec.rotateAroundY(angle); offset.rotateAroundY(angle); - + double ix = p.posX + vec.xCoord; double iy = p.posY + p.eyeHeight - 1 + 0.4; double iz = p.posZ + vec.zCoord; double ox = offset.xCoord; double oz = offset.zCoord; - + if(player.isSneaking()) { iy += 0.25; } - + vec = vec.normalize(); double mult = 0.025D; double mX = vec.xCoord * mult; double mZ = vec.zCoord * mult; - + //Minecraft.getMinecraft().effectRenderer.addEffect(new EntityFlameFX(world, ix + ox, iy, iz + oz, 0, 0, 0)); //Minecraft.getMinecraft().effectRenderer.addEffect(new EntityFlameFX(world, ix - ox, iy, iz - oz, 0, 0, 0)); - + for(int i = 0; i < 2; i++) { net.minecraft.client.particle.EntitySmokeFX fx = new net.minecraft.client.particle.EntitySmokeFX(world, ix + ox * (i == 0 ? -1 : 1), iy, iz + oz * (i == 0 ? -1 : 1), mX, 0, mZ); float scale = 0.5F; @@ -1467,25 +1466,25 @@ public class ClientProxy extends ServerProxy { } } } - + if("jetpack_bj".equals(type)) { - + if(particleSetting == 2) return; - + Entity ent = world.getEntityByID(data.getInteger("player")); - + if(ent instanceof EntityPlayer) { - + EntityPlayer p = (EntityPlayer)ent; - + Vec3 vec = Vec3.createVectorHelper(0, 0, -0.3125); Vec3 offset = Vec3.createVectorHelper(0.125, 0, 0); float angle = (float) -Math.toRadians(p.rotationYawHead - (p.rotationYawHead - p.renderYawOffset)); vec.rotateAroundY(angle); offset.rotateAroundY(angle); - + double ix = p.posX + vec.xCoord; double iy = p.posY + p.eyeHeight - 0.9375; double iz = p.posZ + vec.zCoord; @@ -1497,15 +1496,15 @@ public class ClientProxy extends ServerProxy { Vec3 thrust = Vec3.createVectorHelper(0, -1, 0); Vec3 target = pos.addVector(thrust.xCoord * 10, thrust.yCoord * 10, thrust.zCoord * 10); MovingObjectPosition mop = player.worldObj.func_147447_a(pos, target, false, false, true); - + if(mop != null && mop.typeOfHit == MovingObjectType.BLOCK && mop.sideHit == 1) { - + Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); int meta = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); - + Vec3 delta = Vec3.createVectorHelper(ix - mop.hitVec.xCoord, iy - mop.hitVec.yCoord, iz - mop.hitVec.zCoord); Vec3 vel = Vec3.createVectorHelper(0.75 - delta.lengthVector() * 0.075, 0, 0); - + for(int i = 0; i < (10 - delta.lengthVector()); i++) { vel.rotateAroundY(world.rand.nextFloat() * (float)Math.PI * 2F); Minecraft.getMinecraft().effectRenderer.addEffect(new EntityBlockDustFX(world, mop.hitVec.xCoord, mop.hitVec.yCoord + 0.1, mop.hitVec.zCoord, vel.xCoord, 0.1, vel.zCoord, b, meta)); @@ -1521,23 +1520,23 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().effectRenderer.addEffect(dust2); } } - + if("jetpack_dns".equals(type)) { - + if(particleSetting == 2) return; - + Entity ent = world.getEntityByID(data.getInteger("player")); - + if(ent instanceof EntityPlayer) { - + EntityPlayer p = (EntityPlayer)ent; - + Vec3 offset = Vec3.createVectorHelper(0.125, 0, 0); float angle = (float) -Math.toRadians(p.rotationYawHead - (p.rotationYawHead - p.renderYawOffset)); offset.rotateAroundY(angle); - + double ix = p.posX; double iy = p.posY - p.getYOffset() - 0.5D; double iz = p.posZ; @@ -1549,15 +1548,15 @@ public class ClientProxy extends ServerProxy { Vec3 thrust = Vec3.createVectorHelper(0, -1, 0); Vec3 target = pos.addVector(thrust.xCoord * 10, thrust.yCoord * 10, thrust.zCoord * 10); MovingObjectPosition mop = player.worldObj.func_147447_a(pos, target, false, false, true); - + if(mop != null && mop.typeOfHit == MovingObjectType.BLOCK && mop.sideHit == 1) { - + Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); int meta = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); - + Vec3 delta = Vec3.createVectorHelper(ix - mop.hitVec.xCoord, iy - mop.hitVec.yCoord, iz - mop.hitVec.zCoord); Vec3 vel = Vec3.createVectorHelper(0.75 - delta.lengthVector() * 0.075, 0, 0); - + for(int i = 0; i < (10 - delta.lengthVector()); i++) { vel.rotateAroundY(world.rand.nextFloat() * (float)Math.PI * 2F); Minecraft.getMinecraft().effectRenderer.addEffect(new EntityBlockDustFX(world, mop.hitVec.xCoord, mop.hitVec.yCoord + 0.1, mop.hitVec.zCoord, vel.xCoord, 0.1, vel.zCoord, b, meta)); @@ -1573,7 +1572,7 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().effectRenderer.addEffect(dust2); } } - + if("muke".equals(type)) { ParticleMukeWave wave = new ParticleMukeWave(man, world, x, y, z); @@ -1589,12 +1588,12 @@ public class ClientProxy extends ServerProxy { player.maxHurtTime = 15; player.attackedAtYaw = 0F; } - + if("tinytot".equals(type)) { ParticleMukeWave wave = new ParticleMukeWave(man, world, x, y, z); Minecraft.getMinecraft().effectRenderer.addEffect(wave); - + for(double d = 0.0D; d <= 1.6D; d += 0.1) { ParticleMukeCloud cloud = new ParticleMukeCloud(man, world, x, y, z, rand.nextGaussian() * 0.05, d + rand.nextGaussian() * 0.02, rand.nextGaussian() * 0.05); Minecraft.getMinecraft().effectRenderer.addEffect(cloud); @@ -1606,14 +1605,14 @@ public class ClientProxy extends ServerProxy { for(int i = 0; i < 15; i++) { double ix = rand.nextGaussian() * 0.2; double iz = rand.nextGaussian() * 0.2; - + if(ix * ix + iz * iz > 0.75) { ix *= 0.5; iz *= 0.5; } - + double iy = 1.6 + (rand.nextDouble() * 2 - 1) * (0.75 - (ix * ix + iz * iz)) * 0.5; - + ParticleMukeCloud cloud = new ParticleMukeCloud(man, world, x, y, z, ix, iy + rand.nextGaussian() * 0.02, iz); Minecraft.getMinecraft().effectRenderer.addEffect(cloud); } @@ -1621,89 +1620,89 @@ public class ClientProxy extends ServerProxy { player.maxHurtTime = 15; player.attackedAtYaw = 0F; } - + if("ufo".equals(type)) { double motion = data.getDouble("motion"); ParticleMukeCloud cloud = new ParticleMukeCloud(man, world, x, y, z, rand.nextGaussian() * motion, 0, rand.nextGaussian() * motion); Minecraft.getMinecraft().effectRenderer.addEffect(cloud); } - + if("haze".equals(type)) { ParticleHaze fog = new ParticleHaze(man, world, x, y, z); Minecraft.getMinecraft().effectRenderer.addEffect(fog); } - + if("plasmablast".equals(type)) { - + ParticlePlasmaBlast cloud = new ParticlePlasmaBlast(man, world, x, y, z, data.getFloat("r"), data.getFloat("g"), data.getFloat("b"), data.getFloat("pitch"), data.getFloat("yaw")); cloud.setScale(data.getFloat("scale")); Minecraft.getMinecraft().effectRenderer.addEffect(cloud); } - + if("justTilt".equals(type)) { - + player.hurtTime = player.maxHurtTime = data.getInteger("time"); player.attackedAtYaw = 0F; } - + if("properJolt".equals(type)) { - + player.hurtTime = data.getInteger("time"); player.maxHurtTime = data.getInteger("maxTime"); player.attackedAtYaw = 0F; } - + if("sweat".equals(type)) { - + Entity e = world.getEntityByID(data.getInteger("entity")); Block b = Block.getBlockById(data.getInteger("block")); int meta = data.getInteger("meta"); - + if(e instanceof EntityLivingBase) { - + for(int i = 0; i < data.getInteger("count"); i++) { - + double ix = e.boundingBox.minX - 0.2 + (e.boundingBox.maxX - e.boundingBox.minX + 0.4) * rand.nextDouble(); double iy = e.boundingBox.minY + (e.boundingBox.maxY - e.boundingBox.minY + 0.2) * rand.nextDouble(); double iz = e.boundingBox.minZ - 0.2 + (e.boundingBox.maxZ - e.boundingBox.minZ + 0.4) * rand.nextDouble(); - - + + EntityFX fx = new net.minecraft.client.particle.EntityBlockDustFX(world, ix, iy, iz, 0, 0, 0, b, meta); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 150 + rand.nextInt(50), "particleMaxAge", "field_70547_e"); - + Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } } - + if("vomit".equals(type)) { - + Entity e = world.getEntityByID(data.getInteger("entity")); int count = data.getInteger("count") / (particleSetting + 1); - + if(e instanceof EntityLivingBase) { double ix = e.posX; double iy = e.posY - e.getYOffset() + e.getEyeHeight() + (e instanceof EntityPlayer ? 1 : 0); double iz = e.posZ; - + Vec3 vec = e.getLookVec(); - + for(int i = 0; i < count; i++) { - + if("normal".equals(data.getString("mode"))) { EntityFX fx = new net.minecraft.client.particle.EntityBlockDustFX(world, ix, iy, iz, (vec.xCoord + rand.nextGaussian() * 0.2) * 0.2, (vec.yCoord + rand.nextGaussian() * 0.2) * 0.2, (vec.zCoord + rand.nextGaussian() * 0.2) * 0.2, Blocks.stained_hardened_clay, (rand.nextBoolean() ? 5 : 13)); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 150 + rand.nextInt(50), "particleMaxAge", "field_70547_e"); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } - + if("blood".equals(data.getString("mode"))) { EntityFX fx = new net.minecraft.client.particle.EntityBlockDustFX(world, ix, iy, iz, (vec.xCoord + rand.nextGaussian() * 0.2) * 0.2, (vec.yCoord + rand.nextGaussian() * 0.2) * 0.2, (vec.zCoord + rand.nextGaussian() * 0.2) * 0.2, Blocks.redstone_block, 0); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 150 + rand.nextInt(50), "particleMaxAge", "field_70547_e"); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } - + if("smoke".equals(data.getString("mode"))) { EntityFX fx = new net.minecraft.client.particle.EntitySmokeFX(world, ix, iy, iz, (vec.xCoord + rand.nextGaussian() * 0.1) * 0.05, (vec.yCoord + rand.nextGaussian() * 0.1) * 0.05, (vec.zCoord + rand.nextGaussian() * 0.1) * 0.05, 0.2F); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(10), "particleMaxAge", "field_70547_e"); @@ -1712,50 +1711,50 @@ public class ClientProxy extends ServerProxy { } } } - + if("radiation".equals(type)) { - + for(int i = 0; i < data.getInteger("count"); i++) { - + EntityAuraFX flash = new EntityAuraFX(world, player.posX + rand.nextGaussian() * 4, player.posY + rand.nextGaussian() * 2, player.posZ + rand.nextGaussian() * 4, 0, 0, 0); - + flash.setRBGColorF(0F, 0.75F, 1F); flash.setVelocity(rand.nextGaussian(), rand.nextGaussian(), rand.nextGaussian()); Minecraft.getMinecraft().effectRenderer.addEffect(flash); } } - + if("schrabfog".equals(type)) { - + EntityAuraFX flash = new EntityAuraFX(world, x, y, z, 0, 0, 0); flash.setRBGColorF(0F, 1F, 1F); Minecraft.getMinecraft().effectRenderer.addEffect(flash); } - + if("hadron".equals(type)) { - + Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleHadron(man, world, x, y, z)); } - + if("rift".equals(type)) { - + Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleRift(man, world, x, y, z)); } - + if("rbmkflame".equals(type)) { int maxAge = data.getInteger("maxAge"); Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleRBMKFlame(man, world, x, y, z, maxAge)); } - + if("rbmkmush".equals(type)) { float scale = data.getFloat("scale"); Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleRBMKMush(man, world, x, y, z, scale)); } - + if("tower".equals(type)) { if(particleSetting == 0 || (particleSetting == 1 && rand.nextBoolean())) { ParticleCoolingTower fx = new ParticleCoolingTower(man, world, x, y, z); @@ -1766,58 +1765,58 @@ public class ClientProxy extends ServerProxy { if(data.hasKey("noWind")) fx.noWind(); if(data.hasKey("strafe")) fx.setStrafe(data.getFloat("strafe")); if(data.hasKey("alpha")) fx.alphaMod(data.getFloat("alpha")); - + if(data.hasKey("color")) { Color color = new Color(data.getInteger("color")); fx.setRBGColorF(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); } - + Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } - + if("splash".equals(type)) { if(particleSetting == 0 || (particleSetting == 1 && rand.nextBoolean())) { ParticleSplash fx = new ParticleSplash(man, world, x, y, z); - + if(data.hasKey("color")) { Color color = new Color(data.getInteger("color")); float f = 1F - rand.nextFloat() * 0.2F; fx.setRBGColorF(color.getRed() / 255F * f, color.getGreen() / 255F * f, color.getBlue() / 255F * f); } - + Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } - + if("deadleaf".equals(type)) { if(particleSetting == 0 || (particleSetting == 1 && rand.nextBoolean())) Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleDeadLeaf(man, world, x, y, z)); } - + if("anim".equals(type)) { - + String mode = data.getString("mode"); - + /* crucible deploy */ if("crucible".equals(mode) && player.getHeldItem() != null) { - + BusAnimation animation = new BusAnimation() .addBus("GUARD_ROT", new BusAnimationSequence() .addPos(90, 0, 1, 0) .addPos(90, 0, 1, 800) .addPos(0, 0, 1, 50)); - + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); } - + /* crucible swing */ if("cSwing".equals(mode)) { - + if(HbmAnimations.getRelevantTransformation("SWING_ROT")[0] == 0) { - + int offset = rand.nextInt(80) - 20; - + BusAnimation animation = new BusAnimation() .addBus("SWING_ROT", new BusAnimationSequence() .addPos(90 - offset, 90 - offset, 35, 75) @@ -1829,20 +1828,20 @@ public class ClientProxy extends ServerProxy { .addPos(0, 0, 0, 500)); Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:weapon.cSwing"), 0.8F + player.getRNG().nextFloat() * 0.2F)); - + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); } } - + /* chainsaw swing */ if("sSwing".equals(mode) || "lSwing".equals(mode)) { //temp for lance int forward = 150; int sideways = 100; int retire = 200; - + if(HbmAnimations.getRelevantAnim() == null) { - + BusAnimation animation = new BusAnimation() .addBus("SWING_ROT", new BusAnimationSequence() .addPos(0, 0, 90, forward) @@ -1853,16 +1852,16 @@ public class ClientProxy extends ServerProxy { .addPos(2, 0, 2, sideways) .addPos(0, 0, 0, retire)); - + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); - + } else { double[] rot = HbmAnimations.getRelevantTransformation("SWING_ROT"); double[] trans = HbmAnimations.getRelevantTransformation("SWING_TRANS"); - + if(System.currentTimeMillis() - HbmAnimations.getRelevantAnim().startMillis < 50) return; - + BusAnimation animation = new BusAnimation() .addBus("SWING_ROT", new BusAnimationSequence() .addPos(rot[0], rot[1], rot[2], 0) @@ -1874,70 +1873,70 @@ public class ClientProxy extends ServerProxy { .addPos(0, 0, 3, forward) .addPos(2, 0, 2, sideways) .addPos(0, 0, 0, retire)); - + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); } } - + if("generic".equals(mode)) { ItemStack stack = player.getHeldItem(); - + if(stack != null && stack.getItem() instanceof IAnimatedItem) { IAnimatedItem item = (IAnimatedItem) stack.getItem(); BusAnimation anim = item.getAnimation(data, stack); - + if(anim != null) { HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), anim); } } } } - + if("tau".equals(type)) { - + for(int i = 0; i < data.getByte("count"); i++) Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleSpark(world, x, y, z, rand.nextGaussian() * 0.05, 0.05, rand.nextGaussian() * 0.05)); Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleHadron(man, world, x, y, z)); } - + if("vanish".equals(type)) { int ent = data.getInteger("ent"); this.vanish(ent); } - + if("giblets".equals(type)) { int ent = data.getInteger("ent"); this.vanish(ent); Entity e = world.getEntityByID(ent); - + if(e == null) return; - + float width = e.width; float height = e.height; int gW = (int)(width / 0.25F); int gH = (int)(height / 0.25F); - + int count = (int) (gW * 1.5 * gH); - + if(data.hasKey("cDiv")) count = (int) Math.ceil(count / (double)data.getInteger("cDiv")); - + boolean blowMeIntoTheGodDamnStratosphere = rand.nextInt(15) == 0; double mult = 1D; - + if(blowMeIntoTheGodDamnStratosphere) mult *= 10; - + for(int i = 0; i < count; i++) { Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleGiblet(man, world, x, y, z, rand.nextGaussian() * 0.25 * mult, rand.nextDouble() * mult, rand.nextGaussian() * 0.25 * mult)); } } - + if("amat".equals(type)) { Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleAmatFlash(world, x, y, z, data.getFloat("scale"))); } - + if("debug".equals(type)) { String t = data.getString("text"); int color = data.getInteger("color"); @@ -1946,7 +1945,7 @@ public class ClientProxy extends ServerProxy { text.multipleParticleScaleBy(scale); Minecraft.getMinecraft().effectRenderer.addEffect(text); } - + if("debugline".equals(type)) { double mX = data.getDouble("mX"); double mY = data.getDouble("mY"); @@ -1955,10 +1954,10 @@ public class ClientProxy extends ServerProxy { ParticleDebugLine text = new ParticleDebugLine(world, x, y, z, mX, mY, mZ, color); Minecraft.getMinecraft().effectRenderer.addEffect(text); } - + if("debugdrone".equals(type)) { Item held = player.getHeldItem() == null ? null : player.getHeldItem().getItem(); - + if(held == ModItems.drone || held == Item.getItemFromBlock(ModBlocks.drone_crate_provider) || held == Item.getItemFromBlock(ModBlocks.drone_crate_requester) || @@ -1974,7 +1973,7 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().effectRenderer.addEffect(text); } } - + if("network".equals(type)) { ParticleDebug debug = null; double mX = data.getDouble("mX"); @@ -1990,7 +1989,7 @@ public class ClientProxy extends ServerProxy { } Minecraft.getMinecraft().effectRenderer.addEffect(debug); } - + if("gasfire".equals(type)) { double mX = data.getDouble("mX"); double mY = data.getDouble("mY"); @@ -1999,38 +1998,38 @@ public class ClientProxy extends ServerProxy { ParticleGasFlame text = new ParticleGasFlame(world, x, y, z, mX, mY, mZ, scale > 0 ? scale : 6.5F); Minecraft.getMinecraft().effectRenderer.addEffect(text); } - + if("marker".equals(type)) { int color = data.getInteger("color"); String label = data.getString("label"); int expires = data.getInteger("expires"); double dist = data.getDouble("dist"); - + RenderOverhead.queuedMarkers.put(new BlockPos(x, y, z), new Marker(color).setDist(dist).setExpire(expires > 0 ? System.currentTimeMillis() + expires : 0).withLabel(label.isEmpty() ? null : label)); } - + if("casing".equals(type)) { CasingEjector ejector = CasingEjector.fromId(data.getInteger("ej")); if(ejector == null) return; SpentCasing casingConfig = SpentCasing.fromName((data.getString("name"))); if(casingConfig == null) return; - + for(int i = 0; i < ejector.getAmount(); i++) { ejector.spawnCasing(man, casingConfig, world, x, y, z, data.getFloat("pitch"), data.getFloat("yaw"), data.getBoolean("crouched")); } } - + if("foundry".equals(type)) { int color = data.getInteger("color"); byte dir = data.getByte("dir"); float length = data.getFloat("len"); float base = data.getFloat("base"); float offset = data.getFloat("off"); - + ParticleFoundry sploosh = new ParticleFoundry(man, world, x, y, z, color, dir, length, base, offset); Minecraft.getMinecraft().effectRenderer.addEffect(sploosh); } - + if("frozen".equals(type)) { player.motionX = 0; player.motionZ = 0; @@ -2039,35 +2038,35 @@ public class ClientProxy extends ServerProxy { player.moveStrafing = 0; } } - + private HashMap vanished = new HashMap(); - + public void vanish(int ent) { vanished.put(ent, System.currentTimeMillis() + 2000); } - + @Override public boolean isVanished(Entity e) { - + if(e == null) return false; - + if(!this.vanished.containsKey(e.getEntityId())) return false; - + return this.vanished.get(e.getEntityId()) > System.currentTimeMillis(); } - + @Override public AudioWrapper getLoopedSound(String sound, float x, float y, float z, float volume, float range, float pitch) { - + AudioWrapperClient audio = new AudioWrapperClient(new ResourceLocation(sound)); audio.updatePosition(x, y, z); audio.updateVolume(volume); audio.updateRange(range); return audio; } - + @Override public AudioWrapper getLoopedSound(String sound, float x, float y, float z, float volume, float range, float pitch, int keepAlive) { AudioWrapper audio = getLoopedSound(sound, x, y, z, volume, range, pitch); @@ -2077,10 +2076,10 @@ public class ClientProxy extends ServerProxy { @Override public void playSound(String sound, Object data) { } - + @Override public void displayTooltip(String msg, int time, int id) { - + if(id != 0) this.theInfoSystem.push(new InfoEntry(msg, time), id); else @@ -2108,7 +2107,7 @@ public class ClientProxy extends ServerProxy { case GUN_SECONDARY: return HbmKeybinds.gunSecondaryKey.getIsKeyPressed(); case GUN_TERTIARY: return HbmKeybinds.gunTertiaryKey.getIsKeyPressed(); } - + return false; } @@ -2116,17 +2115,17 @@ public class ClientProxy extends ServerProxy { public EntityPlayer me() { return Minecraft.getMinecraft().thePlayer; } - + @Override public void openLink(String url) { try { Desktop.getDesktop().browse(new URI(url)); } catch (Exception e) { } } - + @Override public List getSubItems(ItemStack stack) { - + List list = new ArrayList(); stack.getItem().getSubItems(stack.getItem(), stack.getItem().getCreativeTab(), list); for(ItemStack sta : list) { @@ -2160,7 +2159,7 @@ public class ClientProxy extends ServerProxy { Language lang = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage(); return lang.getLanguageCode(); } - + @Override public int getStackColor(ItemStack stack, boolean amplify) { if(stack == null) return 0x000000; diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d5e09faa1..78097c5a3 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -1,8 +1,5 @@ package com.hbm.main; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockEnums.DecoCabinetEnum; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockConcreteColoredExt.EnumConcreteType; @@ -18,16 +15,13 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.NTMMaterial; - -import static com.hbm.inventory.OreDictManager.*; - -import com.hbm.items.ModItems; import com.hbm.items.ItemAmmoEnums.Ammo50BMG; import com.hbm.items.ItemAmmoEnums.Ammo5mm; import com.hbm.items.ItemEnums.EnumLegendaryType; import com.hbm.items.ItemEnums.EnumPages; import com.hbm.items.ItemEnums.EnumPlantType; import com.hbm.items.ItemGenericPart.EnumPartType; +import com.hbm.items.ModItems; import com.hbm.items.food.ItemConserve.EnumFoodType; import com.hbm.items.machine.ItemArcElectrode.EnumElectrodeType; import com.hbm.items.machine.ItemBattery; @@ -38,7 +32,8 @@ import com.hbm.items.special.ItemPlasticScrap.ScrapType; import com.hbm.items.tool.ItemDrone.EnumDroneType; import com.hbm.items.tool.ItemGuideBook.BookType; import com.hbm.util.EnchantmentUtil; - +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; import net.minecraft.enchantment.Enchantment; import net.minecraft.init.Blocks; @@ -50,16 +45,19 @@ import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.registry.GameRegistry; + +import java.util.ArrayList; +import java.util.List; + +import static com.hbm.inventory.OreDictManager.*; public class CraftingManager { - + public static void mainRegistry() { - + AddCraftingRec(); SmeltingRecipes.AddSmeltingRec(); - + MineralRecipes.register(); RodRecipes.register(); ToolRecipes.register(); @@ -67,13 +65,13 @@ public class CraftingManager { WeaponRecipes.register(); ConsumableRecipes.register(); PowderRecipes.register(); - + GameRegistry.addRecipe(new RBMKFuelCraftingHandler()); GameRegistry.addRecipe(new MKUCraftingHandler()); GameRegistry.addRecipe(new ToolboxCraftingHandler()); GameRegistry.addRecipe(new CargoShellCraftingHandler()); GameRegistry.addRecipe(new ScrapsCraftingHandler()); - + RecipeSorter.register("hbm:rbmk", RBMKFuelCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); RecipeSorter.register("hbm:toolbox", ToolboxCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); RecipeSorter.register("hbm:cargo", CargoShellCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); @@ -90,7 +88,7 @@ public class CraftingManager { for(Object[] array : BlockGenericStairs.recipeGen) { addRecipeAuto(new ItemStack((Block) array[2], 4), new Object[] { "# ", "## ", "###", '#', new ItemStack((Block) array[0], 1, (int) array[1]) }); } - + addRecipeAuto(new ItemStack(ModItems.redstone_sword, 1), new Object[] { "R", "R", "S", 'R', REDSTONE.block(), 'S', KEY_STICK }); addRecipeAuto(new ItemStack(ModItems.big_sword, 1), new Object[] { "QIQ", "QIQ", "GSG", 'G', Items.gold_ingot, 'S', KEY_STICK, 'I', Items.iron_ingot, 'Q', Items.quartz}); @@ -129,9 +127,9 @@ public class CraftingManager { addRecipeAuto(DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CHIP_QUANTUM), new Object[] { "HHH", "SIS", "WWW", 'H', ANY_HARDPLASTIC.ingot(), 'S', BSCCO.wireDense(), 'I', ModItems.pellet_charged, 'W', GOLD.wireFine() }); addRecipeAuto(DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CONTROLLER_CHASSIS), new Object[] { "PPP", "CBB", "PPP", 'P', ANY_PLASTIC.ingot(), 'C', ModItems.crt_display, 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.PCB) }); addRecipeAuto(DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ATOMIC_CLOCK), new Object[] { "ICI", "CSC", "ICI", 'I', ModItems.plate_polymer, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CHIP), 'S', SR.dust() }); - + addRecipeAuto(new ItemStack(ModItems.crt_display, 4), new Object[] { " A ", "SGS", " T ", 'A', AL.dust(), 'S', STEEL.plate(), 'G', KEY_ANYPANE, 'T', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE) }); - + addRecipeAuto(new ItemStack(ModItems.cell_empty, 6), new Object[] { " S ", "G G", " S ", 'S', STEEL.plate(), 'G', KEY_ANYPANE }); addRecipeAuto(new ItemStack(ModItems.cell_deuterium, 8), new Object[] { "DDD", "DTD", "DDD", 'D', ModItems.cell_empty, 'T', ModItems.mike_deut }); addRecipeAuto(new ItemStack(ModItems.particle_empty, 2), new Object[] { "STS", "G G", "STS", 'S', STEEL.plate(), 'T', W.ingot(), 'G', KEY_ANYPANE }); @@ -238,7 +236,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.radio_torch_logic, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CHIP) }); addRecipeAuto(new ItemStack(ModBlocks.radio_torch_counter, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE) }); addRecipeAuto(new ItemStack(ModBlocks.radio_telex, 2), new Object[] { "SCR", "W#W", "WWW", 'S', ModBlocks.radio_torch_sender, 'C', ModItems.crt_display, 'R', ModBlocks.radio_torch_receiver, 'W', KEY_PLANKS, '#', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG) }); - + addRecipeAuto(new ItemStack(ModBlocks.conveyor, 16), new Object[] { "LLL", "I I", "LLL", 'L', Items.leather, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.conveyor, 16), new Object[] { "RSR", "I I", "RSR", 'I', IRON.ingot(), 'R', DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE), 'S', IRON.plate() }); addRecipeAuto(new ItemStack(ModBlocks.conveyor, 64), new Object[] { "LLL", "I I", "LLL", 'L', ANY_RUBBER.ingot(), 'I', IRON.ingot() }); @@ -283,7 +281,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.crate_template, 1), new Object[] { "IPI", "P P", "IPI", 'I', IRON.ingot(), 'P', Items.paper }); addRecipeAuto(new ItemStack(ModBlocks.crate_iron, 1), new Object[] { "PPP", "I I", "III", 'P', IRON.plate(), 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.crate_steel, 1), new Object[] { "PPP", "I I", "III", 'P', STEEL.plate(), 'I', STEEL.ingot() }); - + GameRegistry.addRecipe(new ContainerUpgradeCraftingHandler(new ItemStack(ModBlocks.crate_desh, 1), new Object[] { " D ", "DSD", " D ", 'D', ModItems.plate_desh, 'S', ModBlocks.crate_steel })); GameRegistry.addRecipe(new ContainerUpgradeCraftingHandler(new ItemStack(ModBlocks.crate_tungsten, 1), new Object[] { "BPB", "PCP", "BPB", 'B', W.block(), 'P', CU.plateCast(), 'C', ModBlocks.crate_steel })); // Note: voids the last few slots when placed, because a safe's inventory is smaller than a crate's one @@ -293,7 +291,7 @@ public class CraftingManager { GameRegistry.addRecipe(new ContainerUpgradeCraftingHandler(new ItemStack(ModBlocks.mass_storage, 1, 1), new Object[] { "PCP", "PMP", "PPP", 'P', DESH.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CHIP), 'M', new ItemStack(ModBlocks.mass_storage, 1, 0) })); GameRegistry.addRecipe(new ContainerUpgradeCraftingHandler(new ItemStack(ModBlocks.mass_storage, 1, 2), new Object[] { "PCP", "PMP", "PPP", 'P', ANY_RESISTANTALLOY.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'M', new ItemStack(ModBlocks.mass_storage, 1, 1) })); addRecipeAuto(new ItemStack(ModBlocks.mass_storage, 1, 3), new Object[] { "PPP", "PIP", "PPP", 'P', KEY_PLANKS, 'I', IRON.plate() }); - + addRecipeAuto(new ItemStack(ModBlocks.machine_autocrafter, 1), new Object[] { "SCS", "MWM", "SCS", 'S', STEEL.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE), 'M', ModItems.motor, 'W', Blocks.crafting_table }); addRecipeAuto(new ItemStack(ModBlocks.machine_funnel, 1), new Object[] { "S S", "SRS", " S ", 'S', STEEL.ingot(), 'R', REDSTONE.dust() }); addRecipeAuto(new ItemStack(ModBlocks.machine_waste_drum, 1), new Object[] { "LRL", "BRB", "LRL", 'L', PB.ingot(), 'B', Blocks.iron_bars, 'R', ModItems.rod_quad_empty }); @@ -326,7 +324,7 @@ public class CraftingManager { addRecipeAuto(DictFrame.fromOne(ModItems.arc_electrode, EnumElectrodeType.DESH), new Object[] { "C", "T", "C", 'C', DESH.ingot(), 'T', TI.ingot() }); addRecipeAuto(DictFrame.fromOne(ModItems.arc_electrode, EnumElectrodeType.DESH), new Object[] { "C", "T", "C", 'C', DESH.ingot(), 'T', W.ingot() }); addRecipeAuto(DictFrame.fromOne(ModItems.arc_electrode, EnumElectrodeType.SATURNITE), new Object[] { "C", "T", "C", 'C', BIGMT.ingot(), 'T', NB.ingot() }); - + addRecipeAuto(new ItemStack(ModItems.detonator, 1), new Object[] { " W", "SC", "CE", 'S', STEEL.plate(), 'W', MINGRADE.wireFine(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'E', STEEL.ingot() }); addShapelessAuto(new ItemStack(ModItems.detonator_multi, 1), new Object[] { ModItems.detonator, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); addRecipeAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', DIAMOND.gem(), 'I', STEEL.ingot() }); @@ -343,16 +341,16 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModItems.fuse, 1), new Object[] { STEEL.plate(), ModItems.plate_polymer, W.wireFine() }); addShapelessAuto(new ItemStack(ModItems.overfuse, 1), new Object[] { STEEL.bolt(), NP237.dust(), I.dust(), TH232.dust(), AT.dust(), ND.dust(), CU.plateCast(), ModItems.black_hole, CS.dust() }); addShapelessAuto(new ItemStack(ModItems.overfuse, 1), new Object[] { STEEL.bolt(), ST.dust(), BR.dust(), CO.dust(), TS.dust(), NB.dust(), CU.plateCast(), ModItems.black_hole, CE.dust() }); - + addRecipeAuto(new ItemStack(ModItems.blades_steel, 1), new Object[] { " P ", "PIP", " P ", 'P', STEEL.plate(), 'I', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.blades_titanium, 1), new Object[] { " P ", "PIP", " P ", 'P', TI.plate(), 'I', TI.ingot() }); addRecipeAuto(new ItemStack(ModItems.blades_advanced_alloy, 1), new Object[] { " P ", "PIP", " P ", 'P', ALLOY.plate(), 'I', ALLOY.ingot() }); addRecipeAuto(new ItemStack(ModItems.blades_desh, 1), new Object[] { " S ", "PBP", " S ", 'S', BIGMT.plate(), 'P', ModItems.plate_desh, 'B', ModItems.blades_advanced_alloy }); //4 desh ingots still needed to do anything - + addRecipeAuto(new ItemStack(ModItems.blades_steel, 1), new Object[] { "PIP", 'P', STEEL.plate(), 'I', new ItemStack(ModItems.blades_steel, 1, OreDictionary.WILDCARD_VALUE) }); addRecipeAuto(new ItemStack(ModItems.blades_titanium, 1), new Object[] { "PIP", 'P', TI.plate(), 'I', new ItemStack(ModItems.blades_titanium, 1, OreDictionary.WILDCARD_VALUE) }); addRecipeAuto(new ItemStack(ModItems.blades_advanced_alloy, 1), new Object[] { "PIP", 'P', ALLOY.plate(), 'I', new ItemStack(ModItems.blades_advanced_alloy, 1, OreDictionary.WILDCARD_VALUE) }); - + addRecipeAuto(new ItemStack(ModItems.laser_crystal_co2, 1), new Object[] { "QDQ", "NCN", "QDQ", 'Q', ModBlocks.glass_quartz, 'D', DESH.ingot(), 'N', NB.ingot(), 'C', new ItemStack(ModItems.fluid_tank_full, 1, Fluids.CARBONDIOXIDE.getID()) }); addRecipeAuto(new ItemStack(ModItems.laser_crystal_bismuth, 1), new Object[] {"QUQ", "BCB", "QTQ", 'Q', ModBlocks.glass_quartz, 'U', U.ingot(), 'T', TH232.ingot(), 'B', ModItems.nugget_bismuth, 'C', ModItems.crystal_rare }); addRecipeAuto(new ItemStack(ModItems.laser_crystal_cmb, 1), new Object[] {"QBQ", "CSC", "QBQ", 'Q', ModBlocks.glass_quartz, 'B', CMB.ingot(), 'C', SBD.ingot(), 'S', ModItems.cell_anti_schrabidium }); @@ -360,7 +358,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.laser_crystal_digamma, 1), new Object[] {"QUQ", "UEU", "QUQ", 'Q', ModBlocks.glass_quartz, 'U', ModItems.undefined, 'E', ModItems.ingot_electronium } ); Item[] bricks = new Item[] {Items.brick, Items.netherbrick}; - + for(Item brick : bricks) { addRecipeAuto(new ItemStack(ModItems.stamp_stone_flat, 1), new Object[] { "III", "SSS", 'I', brick, 'S', "stone" }); addRecipeAuto(new ItemStack(ModItems.stamp_iron_flat, 1), new Object[] { "III", "SSS", 'I', brick, 'S', IRON.ingot() }); @@ -369,7 +367,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.stamp_obsidian_flat, 1), new Object[] { "III", "SSS", 'I', brick, 'S', Blocks.obsidian }); addRecipeAuto(new ItemStack(ModItems.stamp_desh_flat, 1), new Object[] { "BDB", "DSD", "BDB", 'B', brick, 'D', DESH.ingot(), 'S', BIGMT.ingot() }); } - + addRecipeAuto(new ItemStack(ModItems.mechanism_revolver_1, 1), new Object[] { "ICI", "CAC", "ICI", 'I', IRON.plate(), 'C', CU.ingot(), 'A', AL.ingot() }); addRecipeAuto(new ItemStack(ModItems.mechanism_revolver_2, 1), new Object[] { "ATA", "TDT", "ATA", 'A', ALLOY.plate(), 'T', W.ingot(), 'D', DURA.ingot() }); addRecipeAuto(new ItemStack(ModItems.mechanism_rifle_1, 1), new Object[] { "ICI", "MAM", "ICI", 'I', IRON.plate(), 'C', CU.ingot(), 'A', AL.ingot(), 'M', ModItems.mechanism_revolver_1 }); @@ -406,16 +404,16 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.tile_lab_broken, 6), new Object[] { " C " , "C C", " C ", 'C', ModBlocks.tile_lab_cracked }); addShapelessAuto(new ItemStack(ModBlocks.asphalt_light, 1), new Object[] { ModBlocks.asphalt, Items.glowstone_dust }); addShapelessAuto(new ItemStack(ModBlocks.asphalt, 1), new Object[] { ModBlocks.asphalt_light }); - + String[] dyes = { "Black", "Red", "Green", "Brown", "Blue", "Purple", "Cyan", "LightGray", "Gray", "Pink", "Lime", "Yellow", "LightBlue", "Magenta", "Orange", "White" }; - + for(int i = 0; i < 16; i++) { String dyeName = "dye" + dyes[15 - i]; addRecipeAuto(new ItemStack(ModBlocks.concrete_colored, 8, i), new Object[] { "CCC", "CDC", "CCC", 'C', ModBlocks.concrete_smooth, 'D', dyeName }); } addShapelessAuto(new ItemStack(ModBlocks.concrete_smooth, 1), new Object[] { new ItemStack(ModBlocks.concrete_colored, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(ModBlocks.concrete_smooth, 1), new Object[] { new ItemStack(ModBlocks.concrete_colored_ext, 1, OreDictionary.WILDCARD_VALUE) }); - + addRecipeAuto(new ItemStack(ModBlocks.concrete_colored_ext, 6, EnumConcreteType.MACHINE.ordinal()), new Object[] { "CCC", "1 2", "CCC", 'C', ModBlocks.concrete_smooth, '1', KEY_BROWN, '2', KEY_GRAY }); addRecipeAuto(new ItemStack(ModBlocks.concrete_colored_ext, 6, EnumConcreteType.MACHINE_STRIPE.ordinal()), new Object[] { "CCC", "1 2", "CCC", 'C', ModBlocks.concrete_smooth, '1', KEY_BROWN, '2', KEY_BLACK }); addRecipeAuto(new ItemStack(ModBlocks.concrete_colored_ext, 6, EnumConcreteType.INDIGO.ordinal()), new Object[] { "CCC", "1 2", "CCC", 'C', ModBlocks.concrete_smooth, '1', KEY_BLUE, '2', KEY_PURPLE }); @@ -453,7 +451,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.spotlight_fluoro, 8), new Object[] { "G", "M", "A", 'G', KEY_ANYPANE, 'M', ModItems.ingot_mercury, 'A', ModItems.plate_aluminium }); addRecipeAuto(new ItemStack(ModBlocks.spotlight_halogen, 8), new Object[] { "G", "B", "S", 'G', KEY_ANYPANE, 'B', ModItems.powder_bromine, 'S', STEEL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.floodlight, 2), new Object[] { "CSC", "TST", "G G", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CAPACITOR), 'S', STEEL.plate(), 'T', ModItems.coil_tungsten, 'G', KEY_ANYPANE }); - + addRecipeAuto(new ItemStack(ModBlocks.barbed_wire, 16), new Object[] { "AIA", "I I", "AIA", 'A', STEEL.wireFine(), 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_fire, 8), new Object[] { "BBB", "BIB", "BBB", 'B', ModBlocks.barbed_wire, 'I', P_RED.dust() }); addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_poison, 8), new Object[] { "BBB", "BIB", "BBB", 'B', ModBlocks.barbed_wire, 'I', ModItems.powder_poison }); @@ -475,16 +473,16 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 4), new Object[] { "SS", "SS", 'S', ModBlocks.steel_beam }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate_wide), 4), new Object[] { "SS", 'S', ModBlocks.steel_grate }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 1), new Object[] { "SS", 'S', ModBlocks.steel_grate_wide }); - + addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 0), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeGray" }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 1), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeRed" }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 2), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeWhite" }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 3), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeYellow" }); - + reg2(); } - + public static void reg2() { addRecipeAuto(new ItemStack(ModItems.stamp_357, 1), new Object[] { "RSR", "III", " C ", 'R', REDSTONE.dust(), 'S', ModItems.stamp_iron_flat, 'I', ModItems.plate_polymer, 'C', ModItems.casing_357 }); @@ -496,7 +494,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.stamp_desh_44, 1), new Object[] { "RSR", "III", " C ", 'R', ModItems.ingot_dura_steel, 'S', ModItems.stamp_desh_flat, 'I', ModItems.ingot_saturnite, 'C', ModItems.casing_44 }); addRecipeAuto(new ItemStack(ModItems.stamp_desh_9, 1), new Object[] { "RSR", "III", " C ", 'R', ModItems.ingot_dura_steel, 'S', ModItems.stamp_desh_flat, 'I', ModItems.ingot_saturnite, 'C', ModItems.casing_9 }); addRecipeAuto(new ItemStack(ModItems.stamp_desh_50, 1), new Object[] { "RSR", "III", " C ", 'R', ModItems.ingot_dura_steel, 'S', ModItems.stamp_desh_flat, 'I', ModItems.ingot_saturnite, 'C', ModItems.casing_50 }); - + addRecipeAuto(new ItemStack(ModBlocks.sat_dock, 1), new Object[] { "SSS", "PCP", 'S', STEEL.ingot(), 'P', ANY_PLASTIC.ingot(), 'C', ModBlocks.crate_iron }); addRecipeAuto(new ItemStack(ModBlocks.book_guide, 1), new Object[] { "IBI", "LBL", "IBI", 'B', Items.book, 'I', KEY_BLACK, 'L', KEY_BLUE }); @@ -526,12 +524,12 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.flame_conspiracy, 1), new Object[] { " S ", "STS", " S ", 'S', Fluids.KEROSENE.getDict(1000), 'T', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.flame_politics, 1), new Object[] { " I ", "IPI", " I ", 'P', Items.paper, 'I', KEY_BLACK }); addRecipeAuto(new ItemStack(ModItems.flame_opinion, 1), new Object[] { " R ", "RPR", " R ", 'P', Items.paper, 'R', KEY_RED }); - + addRecipeAuto(new ItemStack(ModItems.solid_fuel_presto, 1), new Object[] { " P ", "SRS", " P ", 'P', Items.paper, 'S', ModItems.solid_fuel, 'R', REDSTONE.dust() }); addShapelessAuto(new ItemStack(ModItems.solid_fuel_presto_triplet, 1), new Object[] { ModItems.solid_fuel_presto, ModItems.solid_fuel_presto, ModItems.solid_fuel_presto, ModItems.ball_dynamite }); addRecipeAuto(new ItemStack(ModItems.solid_fuel_presto_bf, 1), new Object[] { " P ", "SRS", " P ", 'P', Items.paper, 'S', ModItems.solid_fuel_bf, 'R', REDSTONE.dust() }); addShapelessAuto(new ItemStack(ModItems.solid_fuel_presto_triplet_bf, 1), new Object[] { ModItems.solid_fuel_presto_bf, ModItems.solid_fuel_presto_bf, ModItems.solid_fuel_presto_bf, ModItems.ingot_c4 }); - + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.flame_war), 1), new Object[] { "WHW", "CTP", "WOW", 'W', Item.getItemFromBlock(Blocks.planks), 'T', Item.getItemFromBlock(Blocks.tnt), 'H', ModItems.flame_pony, 'C', ModItems.flame_conspiracy, 'P', ModItems.flame_politics, 'O', ModItems.flame_opinion }); addRecipeAuto(new ItemStack(ModBlocks.det_cord, 4), new Object[] { " P ", "PGP", " P ", 'P', Items.paper, 'G', Items.gunpowder }); addRecipeAuto(new ItemStack(ModBlocks.det_charge, 1), new Object[] { "PDP", "DTD", "PDP", 'P', STEEL.plate(), 'D', ModBlocks.det_cord, 'T', ANY_PLASTICEXPLOSIVE.ingot() }); @@ -593,9 +591,9 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.battery_sc_gold), new Object[] { "NBN", "PCP", "NBN", 'N', TA.nugget(), 'B', AU198.billet(), 'P', ANY_PLASTIC.ingot(), 'C', ModItems.battery_sc_polonium }); addRecipeAuto(new ItemStack(ModItems.battery_sc_lead), new Object[] { "NBN", "PCP", "NBN", 'N', TA.nugget(), 'B', PB209.billet(), 'P', ANY_PLASTIC.ingot(), 'C', ModItems.battery_sc_gold }); addRecipeAuto(new ItemStack(ModItems.battery_sc_americium), new Object[] { "NBN", "PCP", "NBN", 'N', TA.nugget(), 'B', AM241.billet(), 'P', ANY_PLASTIC.ingot(), 'C', ModItems.battery_sc_lead }); - + addRecipeAuto(new ItemStack(ModItems.wiring_red_copper, 1), new Object[] { "PPP", "PIP", "PPP", 'P', STEEL.plate(), 'I', STEEL.ingot() }); - + addRecipeAuto(new ItemStack(ModItems.jetpack_tank, 1), new Object[] { " S ", "BKB", " S ", 'S', STEEL.plate(), 'B', STEEL.bolt(), 'K', Fluids.KEROSENE.getDict(1000) }); addRecipeAuto(new ItemStack(ModItems.gun_kit_1, 4), new Object[] { "I ", "LB", "P ", 'I', ANY_RUBBER.ingot(), 'L', Fluids.LUBRICANT.getDict(1000), 'B', STEEL.bolt(), 'P', IRON.plate() }); addRecipeAuto(new ItemStack(ModItems.gun_kit_2, 1), new Object[] { "III", "GLG", "PPP", 'I', ANY_RUBBER.ingot(), 'L', ModItems.ducttape, 'G', ModItems.gun_kit_1, 'P', IRON.plate() }); @@ -611,7 +609,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.padlock, 1), new Object[] { " P ", "PBP", "PPP", 'P', STEEL.plate(), 'B', STEEL.bolt() }); addRecipeAuto(new ItemStack(ModItems.padlock_reinforced, 1), new Object[] { " P ", "PBP", "PDP", 'P', ALLOY.plate(), 'D', ModItems.plate_desh, 'B', DURA.bolt() }); addRecipeAuto(new ItemStack(ModItems.padlock_unbreakable, 1), new Object[] { " P ", "PBP", "PDP", 'P', BIGMT.plate(), 'D', DIAMOND.gem(), 'B', DURA.bolt() }); - + addRecipeAuto(new ItemStack(ModItems.record_lc, 1), new Object[] { " S ", "SDS", " S ", 'S', ANY_PLASTIC.ingot(), 'D', LAPIS.dust() }); addRecipeAuto(new ItemStack(ModItems.record_ss, 1), new Object[] { " S ", "SDS", " S ", 'S', ANY_PLASTIC.ingot(), 'D', ALLOY.dust() }); addRecipeAuto(new ItemStack(ModItems.record_vc, 1), new Object[] { " S ", "SDS", " S ", 'S', ANY_PLASTIC.ingot(), 'D', CMB.dust() }); @@ -635,12 +633,12 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.fluid_tank_empty, 8), new Object[] { "121", "1G1", "121", '1', AL.plate(), '2', IRON.plate(), 'G', KEY_ANYPANE }); addRecipeAuto(new ItemStack(ModItems.fluid_tank_lead_empty, 4), new Object[] { "LUL", "LTL", "LUL", 'L', PB.plate(), 'U', U238.billet(), 'T', ModItems.fluid_tank_empty }); addRecipeAuto(new ItemStack(ModItems.fluid_barrel_empty, 2), new Object[] { "121", "1G1", "121", '1', STEEL.plate(), '2', AL.plate(), 'G', KEY_ANYPANE }); - + if(!GeneralConfig.enable528) { addRecipeAuto(new ItemStack(ModItems.inf_water, 1), new Object[] { "222", "131", "222", '1', Items.water_bucket, '2', AL.plate(), '3', DIAMOND.gem() }); addRecipeAuto(new ItemStack(ModItems.inf_water_mk2, 1), new Object[] { "BPB", "PTP", "BPB", 'B', ModItems.inf_water, 'P', ModBlocks.fluid_duct_neo, 'T', ModItems.tank_steel }); } - + //not so Temporary Crappy Recipes addRecipeAuto(new ItemStack(ModItems.piston_selenium, 1), new Object[] { "SSS", "STS", " D ", 'S', STEEL.plate(), 'T', W.ingot(), 'D', DURA.bolt() }); addShapelessAuto(new ItemStack(ModItems.catalyst_clay), new Object[] { IRON.dust(), Items.clay_ball }); @@ -702,15 +700,15 @@ public class CraftingManager { for(int i = 1; i < Fluids.getAll().length; ++i) { addShapelessAuto(new ItemStack(ModItems.fluid_duct, 1, i), new Object[] { new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModItems.fluid_identifier, 1, i) }); - - addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), - new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), + + addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), + new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModItems.fluid_identifier, 1, i) }); - + addShapelessAuto(new ItemStack(ModItems.fluid_duct, 1, i), new Object[] { new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_identifier, 1, i) }); - - addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), - new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), + + addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), + new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_identifier, 1, i) }); } @@ -740,7 +738,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModBlocks.sand_boron, 8), new Object[] { "sand", "sand", "sand", "sand", "sand", "sand", "sand", "sand", B.dust() }); addShapelessAuto(new ItemStack(ModBlocks.sand_lead, 8), new Object[] { "sand", "sand", "sand", "sand", "sand", "sand", "sand", "sand", PB.dust() }); addShapelessAuto(new ItemStack(ModBlocks.sand_quartz, 1), new Object[] { "sand", "sand", NETHERQUARTZ.dust(), NETHERQUARTZ.dust() }); - + addRecipeAuto(new ItemStack(ModItems.rune_blank, 1), new Object[] { "PSP", "SDS", "PSP", 'P', ModItems.powder_magic, 'S', STAR.ingot(), 'D', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID) }); addShapelessAuto(new ItemStack(ModItems.rune_isa, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity_counter_resonant }); addShapelessAuto(new ItemStack(ModItems.rune_dagaz, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity }); @@ -791,7 +789,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.upgrade_crystallizer, 1), new Object[] { "PHP", "CUC", "DTD", 'P', new ItemStack(ModItems.fluid_barrel_full, 1, Fluids.PEROXIDE.getID()), 'H', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'C', ModBlocks.barrel_steel, 'U', ModItems.upgrade_centrifuge, 'D', ModItems.motor, 'T', ModBlocks.machine_transformer }); addRecipeAuto(new ItemStack(ModItems.upgrade_screm, 1), new Object[] { "SUS", "SCS", "SUS", 'S', STEEL.plate(), 'U', ModItems.upgrade_template, 'C', ModItems.crystal_xen }); addRecipeAuto(new ItemStack(ModItems.upgrade_gc_speed, 1), new Object[] {"GNG", "RUR", "GMG", 'R', RUBBER.ingot(), 'M', ModItems.motor, 'G', ModItems.coil_gold, 'N', NB.ingot(), 'U', ModItems.upgrade_template}); - + addRecipeAuto(new ItemStack(ModItems.upgrade_stack, 1, 0), new Object[] { " C ", "PUP", " C ", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE), 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'U', ModItems.upgrade_template }); addRecipeAuto(new ItemStack(ModItems.upgrade_stack, 1, 1), new Object[] { " C ", "PUP", " C ", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CAPACITOR), 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_HYDRAULIC), 'U', new ItemStack(ModItems.upgrade_stack, 1, 0) }); addRecipeAuto(new ItemStack(ModItems.upgrade_stack, 1, 2), new Object[] { " C ", "PUP", " C ", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CHIP), 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_ELECTRIC), 'U', new ItemStack(ModItems.upgrade_stack, 1, 1) }); @@ -801,7 +799,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.mech_key, 1), new Object[] { "MCM", "MKM", "MMM", 'M', ModItems.ingot_meteorite_forged, 'C', ModItems.coin_maskman, 'K', ModItems.key }); addRecipeAuto(new ItemStack(ModItems.spawn_ufo, 1), new Object[] { "MMM", "DCD", "MMM", 'M', ModItems.ingot_meteorite, 'D', DNT.ingot(), 'C', ModItems.coin_worm }); - + addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_alloy, 1), new Object[] { "WWW", "WCW", "WWW", 'W', ALLOY.wireFine(), 'C', ModBlocks.fusion_conductor }); addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_alloy, 1), new Object[] { "WW", "WW", 'W', ALLOY.wireDense() }); addRecipeAuto(new ItemStack(ModBlocks.hadron_coil_gold, 1), new Object[] { "PGP", "PCP", "PGP", 'G', GOLD.dust(), 'C', ModBlocks.hadron_coil_alloy, 'P', IRON.plate() }); @@ -838,7 +836,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.fireworks, 1), new Object[] { "PPP", "PPP", "WIW", 'P', Items.paper, 'W', KEY_PLANKS, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModItems.safety_fuse, 8), new Object[] { "SSS", "SGS", "SSS", 'S', Items.string, 'G', Items.gunpowder }); - + addRecipeAuto(new ItemStack(ModItems.rbmk_lid, 4), new Object[] { "PPP", "CCC", "PPP", 'P', STEEL.plate(), 'C', ModBlocks.concrete_asbestos }); addRecipeAuto(new ItemStack(ModItems.rbmk_lid_glass, 4), new Object[] { "LLL", "BBB", "P P", 'P', STEEL.plate(), 'L', ModBlocks.glass_lead, 'B', ModBlocks.glass_boron }); addRecipeAuto(new ItemStack(ModItems.rbmk_lid_glass, 4), new Object[] { "BBB", "LLL", "P P", 'P', STEEL.plate(), 'L', ModBlocks.glass_lead, 'B', ModBlocks.glass_boron }); @@ -921,7 +919,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.deco_pipe_rim_marked, 8), new Object[] { "PPP", "PCP", "PPP", 'P', ModBlocks.deco_pipe_rim_green, 'C', KEY_GREEN }); addRecipeAuto(new ItemStack(ModBlocks.deco_pipe_quad_marked, 8), new Object[] { "PPP", "PCP", "PPP", 'P', ModBlocks.deco_pipe_quad_green, 'C', KEY_GREEN }); addRecipeAuto(new ItemStack(ModBlocks.deco_pipe_framed_marked, 8), new Object[] { "PPP", "PCP", "PPP", 'P', ModBlocks.deco_pipe_framed_green, 'C', KEY_GREEN }); - + addRecipeAuto(new ItemStack(ModBlocks.deco_emitter), new Object[] { "IDI", "DRD", "IDI", 'I', IRON.ingot(), 'D', DIAMOND.gem(), 'R', REDSTONE.block() }); addRecipeAuto(new ItemStack(Items.name_tag), new Object[] { "SB ", "BPB", " BP", 'S', Items.string, 'B', KEY_SLIME, 'P', Items.paper }); @@ -947,20 +945,20 @@ public class CraftingManager { addShapelessAuto(ItemBattery.getEmptyBattery(ModItems.anchor_remote), new Object[] { DIAMOND.gem(), ModItems.ducttape, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); addRecipeAuto(new ItemStack(ModBlocks.teleanchor), new Object[] { "ODO", "EAE", "ODO", 'O', Blocks.obsidian, 'D', DIAMOND.gem(), 'E', ModItems.powder_magic, 'A', ModItems.gem_alexandrite }); addRecipeAuto(new ItemStack(ModBlocks.field_disturber), new Object[] { "ICI", "CAC", "ICI", 'I', STAR.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'A', ModItems.gem_alexandrite }); - + addShapelessAuto(new ItemStack(ModItems.holotape_image, 1, EnumHoloImage.HOLO_RESTORED.ordinal()), new Object[] { new ItemStack(ModItems.holotape_image, 1, EnumHoloImage.HOLO_DIGAMMA.ordinal()), KEY_TOOL_SCREWDRIVER, ModItems.ducttape, ModItems.armor_polish }); addShapelessAuto(new ItemStack(ModItems.holotape_damaged), new Object[] { DictFrame.fromOne(ModItems.holotape_image, EnumHoloImage.HOLO_RESTORED), ModItems.upgrade_muffler, ModItems.crt_display, ModItems.gem_alexandrite /* placeholder for amplifier */ }); addRecipeAuto(DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC, 4), new Object[] { " I ", "CPC", " I ", 'I', IRON.ingot(), 'C', CU.ingot(), 'P', IRON.plate() }); addRecipeAuto(DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_HYDRAULIC, 4), new Object[] { " I ", "CPC", " I ", 'I', STEEL.ingot(), 'C', TI.ingot(), 'P', Fluids.LUBRICANT.getDict(1000) }); addRecipeAuto(DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_ELECTRIC, 4), new Object[] { " I ", "CPC", " I ", 'I', ANY_RESISTANTALLOY.ingot(), 'C', ANY_PLASTIC.ingot(), 'P', ModItems.motor }); - + Object[] craneCasing = new Object[] { Blocks.stonebrick, 1, IRON.ingot(), 2, STEEL.ingot(), 4 }; - + for(int i = 0; i < craneCasing.length / 2; i++) { Object casing = craneCasing[i * 2]; int amount = (int) craneCasing[i * 2 + 1]; @@ -997,7 +995,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.drone_dock), new Object[] { "T", "C", "B", 'T', ModBlocks.drone_waypoint_request, 'C', ModBlocks.crate_steel, 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); addRecipeAuto(new ItemStack(ModItems.ball_resin), new Object[] { "DD", "DD", 'D', Blocks.yellow_flower }); - + addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1), new Object[] { ModItems.ingot_chainsteel, ASBESTOS.ingot(), ModItems.gem_alexandrite }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1, 3), new Object[] { DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER2) }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER2), new Object[] { ModItems.ingot_chainsteel, ModItems.ingot_bismuth, ModItems.gem_alexandrite, ModItems.gem_alexandrite }); @@ -1019,19 +1017,19 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModItems.ingot_firebrick, 4), new Object[] { ModBlocks.brick_fire }); addRecipeAuto(new ItemStack(ModBlocks.machine_drain), new Object[] { "PPP", "T ", "PPP", 'P', STEEL.plateCast(), 'T', ModItems.tank_steel }); - + addRecipeAuto(new ItemStack(ModBlocks.filing_cabinet, 1, DecoCabinetEnum.STEEL.ordinal()), new Object[] { " P ", "PIP", " P ", 'P', STEEL.plate(), 'I', ModItems.plate_polymer }); - + addRecipeAuto(new ItemStack(ModBlocks.vinyl_tile, 4), new Object[] { " I ", "IBI", " I ", 'I', ModItems.plate_polymer, 'B', ModBlocks.brick_light }); addRecipeAuto(new ItemStack(ModBlocks.vinyl_tile, 4, 1), new Object[] { "BB", "BB", 'B', new ItemStack(ModBlocks.vinyl_tile, 1, 0) }); addShapelessAuto(new ItemStack(ModBlocks.vinyl_tile), new Object[] { new ItemStack(ModBlocks.vinyl_tile, 1, 1) }); - + addShapelessAuto(new ItemStack(ModItems.upgrade_5g), new Object[] { ModItems.upgrade_template, ModItems.gem_alexandrite }); - + addShapelessAuto(new ItemStack(ModItems.bdcl), new Object[] { ANY_TAR.any(), Fluids.WATER.getDict(1_000), KEY_WHITE }); - + addShapelessAuto(new ItemStack(ModItems.book_of_), new Object[] { DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE1), DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE2), DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE3), DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE4), DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE5), DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE6), DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE7), DictFrame.fromOne(ModItems.page_of_, EnumPages.PAGE8), ModItems.egg_balefire }); - + if(GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleCrafting) { addShapelessAuto(new ItemStack(ModItems.cordite, 3), new Object[] { ModItems.ballistite, Items.gunpowder, new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(ModItems.ingot_semtex, 3), new Object[] { Items.slime_ball, Blocks.tnt, KNO.dust() }); @@ -1062,7 +1060,7 @@ public class CraftingManager { for(NTMMaterial mat : Mats.orderedList) { if(mat.autogen.contains(MaterialShapes.WIRE)) for(String name : mat.names) addRecipeAuto(new ItemStack(ModItems.wire_fine, 24, mat.id), new Object[] { "###", '#', MaterialShapes.INGOT.prefixes[0] + name }); } - + addRecipeAuto(new ItemStack(ModItems.book_of_), new Object[] { "BGB", "GAG", "BGB", 'B', ModItems.egg_balefire_shard, 'G', GOLD.ingot(), 'A', Items.book }); } @@ -1084,7 +1082,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.rbmk_heater, 1), new Object[] { "CIC", "PRP", "CIC", 'C', CU.pipe(), 'P', STEEL.shell(), 'R', ModBlocks.rbmk_blank, 'I', ANY_PLASTIC.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.rbmk_cooler, 1), new Object[] { "IGI", "GCG", "IGI", 'C', ModBlocks.rbmk_blank, 'I', ModItems.plate_polymer, 'G', ModBlocks.steel_grate }); } - + addShapelessAuto(new ItemStack(ModItems.launch_code), new Object[] { new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), @@ -1092,7 +1090,7 @@ public class CraftingManager { new ItemStack(ModItems.launch_code_piece), new ItemStack(ModItems.launch_code_piece), DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - + addShapelessAuto(ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CHIPSET), new Object[] { ModItems.circuit_star_piece.stackFromEnum(ScrapType.BRIDGE_BIOS), ModItems.circuit_star_piece.stackFromEnum(ScrapType.BRIDGE_BUS), @@ -1102,7 +1100,7 @@ public class CraftingManager { ModItems.circuit_star_piece.stackFromEnum(ScrapType.BRIDGE_NORTH), ModItems.circuit_star_piece.stackFromEnum(ScrapType.BRIDGE_SOUTH) }); - + addShapelessAuto(ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CPU), new Object[] { ModItems.circuit_star_piece.stackFromEnum(ScrapType.CPU_CACHE), ModItems.circuit_star_piece.stackFromEnum(ScrapType.CPU_CLOCK), @@ -1111,7 +1109,7 @@ public class CraftingManager { ModItems.circuit_star_piece.stackFromEnum(ScrapType.CPU_REGISTER), ModItems.circuit_star_piece.stackFromEnum(ScrapType.CPU_SOCKET) }); - + addShapelessAuto(ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.RAM), new Object[] { ModItems.circuit_star_piece.stackFromEnum(ScrapType.MEM_SOCKET), ModItems.circuit_star_piece.stackFromEnum(ScrapType.MEM_16K_A), @@ -1119,12 +1117,12 @@ public class CraftingManager { ModItems.circuit_star_piece.stackFromEnum(ScrapType.MEM_16K_C), ModItems.circuit_star_piece.stackFromEnum(ScrapType.MEM_16K_D) }); - + addShapelessAuto(ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CARD), new Object[] { ModItems.circuit_star_piece.stackFromEnum(ScrapType.CARD_BOARD), ModItems.circuit_star_piece.stackFromEnum(ScrapType.CARD_PROCESSOR) }); - + addShapelessAuto(new ItemStack(ModItems.circuit_star), new Object[] { ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CHIPSET), ModItems.circuit_star_component.stackFromEnum(CircuitComponentType.CPU), @@ -1144,7 +1142,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.cm_block, 4, 1), " I ", "IPI", " I ", 'I', ALLOY.ingot(), 'P', ALLOY.plateCast()); addRecipeAuto(new ItemStack(ModBlocks.cm_block, 4, 2), " I ", "IPI", " I ", 'I', DESH.ingot(), 'P', DESH.plateCast()); addRecipeAuto(new ItemStack(ModBlocks.cm_block, 4, 3), " I ", "IPI", " I ", 'I', ANY_RESISTANTALLOY.ingot(), 'P', ANY_RESISTANTALLOY.plateCast()); - + for(int i = 0; i < 4; i++) { addRecipeAuto(new ItemStack(ModBlocks.cm_sheet, 16, i), "BB", "BB", 'B', new ItemStack(ModBlocks.cm_block, 1, i)); addRecipeAuto(new ItemStack(ModBlocks.cm_tank, 4, i), " B ", "BGB", " B ", 'B', new ItemStack(ModBlocks.cm_block, 1, i), 'G', KEY_ANYGLASS); @@ -1167,39 +1165,39 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.plushie, 1, PlushieType.YOMI.ordinal()), "LCR", 'L', "cropCarrot", 'C', ModItems.rag, 'R', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE)); addRecipeAuto(new ItemStack(ModBlocks.plushie, 1, PlushieType.NUMBERNINE.ordinal()), " C ", "LCR", " C ", 'L', ModItems.cigarette, 'C', ModItems.rag, 'R', COAL.gem()); } - + public static void crumple() { - + List targets = new ArrayList(); - + if(GeneralConfig.enableMekanismChanges) { - + if(Loader.isModLoaded("Mekanism")) { Block mb = (Block) Block.blockRegistry.getObject("Mekanism:MachineBlock"); Item disassembler = (Item) Item.itemRegistry.getObject("Mekanism:AtomicDisassembler"); targets.add(new ItemStack(mb, 1, 4)); // digiminer targets.add(new ItemStack(disassembler)); // atomic disassembler } - + if(Loader.isModLoaded("MekanismGenerators")) { Block mb = (Block) Block.blockRegistry.getObject("MekanismGenerators:Generator"); targets.add(new ItemStack(mb, 1, 6)); // wind turbine } - + List toDestroy = new ArrayList(); - + for(Object o : net.minecraft.item.crafting.CraftingManager.getInstance().getRecipeList()) { - + if(o instanceof IRecipe) { IRecipe rec = (IRecipe)o; ItemStack stack = rec.getRecipeOutput(); - + for(ItemStack target : targets) { if(stack != null && stack.getItem() == target.getItem() && stack.getItemDamage() == target.getItemDamage()) toDestroy.add(rec); } } } - + if(toDestroy.size() > 0) { net.minecraft.item.crafting.CraftingManager.getInstance().getRecipeList().removeAll(toDestroy); } @@ -1208,26 +1206,26 @@ public class CraftingManager { Item disassembler = (Item) Item.itemRegistry.getObject("Mekanism:AtomicDisassembler"); if(disassembler != null) addRecipeAuto(new ItemStack(disassembler, 1), "GAG", "EIE", " I ", 'G', GOLD.plateCast(), 'A', "alloyUltimate", 'E', "battery", 'I', "ingotRefinedObsidian"); } - + if(Loader.isModLoaded("MekanismGenerators")) { Block generator = (Block) Block.blockRegistry.getObject("MekanismGenerators:Generator"); if(generator != null) addRecipeAuto(new ItemStack(generator, 1, 6), " T ", "TAT", "BCB", 'T', TI.plateCast(), 'A', "alloyAdvanced", 'B', "battery", 'C', ANY_PLASTIC.ingot()); } } } - + //option 1: find every entry that needs to be ore dicted and change the recipe method by hand and commit to doing it right in the future //option 2: just make the computer do all the stupid work for us public static void addRecipeAuto(ItemStack result, Object... ins) { - + boolean shouldUseOD = false; boolean engage = false; - + for(int i = 0; i < ins.length; i++) { Object ingredient = ins[i]; - + if(ingredient instanceof String) { - + if(engage) { shouldUseOD = true; break; @@ -1236,26 +1234,26 @@ public class CraftingManager { engage = true; } } - + if(shouldUseOD) GameRegistry.addRecipe(new ShapedOreRecipe(result, ins)); else GameRegistry.addRecipe(result, ins); } - + public static void addShapelessAuto(ItemStack result, Object... ins) { - + boolean shouldUseOD = false; - + for(int i = 0; i < ins.length; i ++) { Object ingredient = ins[i]; - + if(ingredient instanceof String) { shouldUseOD = true; break; } } - + if(shouldUseOD) GameRegistry.addRecipe(new ShapelessOreRecipe(result, ins)); else diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 3058b4ea8..b32dace00 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -86,7 +86,6 @@ import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.util.EnumHelper; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -99,7 +98,7 @@ import java.util.Random; @Mod(modid = RefStrings.MODID, name = RefStrings.NAME, version = RefStrings.VERSION) public class MainRegistry { - + @Instance(RefStrings.MODID) public static MainRegistry instance; @@ -154,7 +153,7 @@ public class MainRegistry { public static ArmorMaterial aMatBismuth = EnumHelper.addArmorMaterial("HBM_BISMUTH", 100, new int[] { 3, 8, 6, 3 }, 100); // Creative Tabs - + public static CreativeTabs partsTab = new PartsTab(CreativeTabs.getNextID(), "tabParts"); // ingots, nuggets, wires, machine parts public static CreativeTabs controlTab = new ControlTab(CreativeTabs.getNextID(), "tabControl"); // items that belong in machines, fuels, etc public static CreativeTabs templateTab = new TemplateTab(CreativeTabs.getNextID(), "tabTemplate"); // templates, siren tracks @@ -201,7 +200,7 @@ public class MainRegistry { public static Achievement digammaKnow; public static Achievement digammaKauaiMoho; public static Achievement digammaUpOnTop; - + public static Achievement achBurnerPress; public static Achievement achBlastFurnace; public static Achievement achAssembly; @@ -233,10 +232,10 @@ public class MainRegistry { public static Achievement achBreeding; public static Achievement achFusion; public static Achievement achMeltdown; - + public static int generalOverride = 0; public static int polaroidID = 1; - + public static long startupTime = 0; public static File configDir; public static File configHbmDir; @@ -246,13 +245,13 @@ public class MainRegistry { @EventHandler public void PreLoad(FMLPreInitializationEvent PreEvent) { CrashHelper.init(); - + startupTime = System.currentTimeMillis(); configDir = PreEvent.getModConfigurationDirectory(); configHbmDir = new File(configDir.getAbsolutePath() + File.separatorChar + "hbmConfig"); if(!configHbmDir.exists()) configHbmDir.mkdir(); - + logger.info("Let us celebrate the fact that the logger finally works again!"); // Reroll Polaroid @@ -267,7 +266,7 @@ public class MainRegistry { //ShadyUtil.test(); loadConfig(PreEvent); HbmPotion.init(); - + /* For whichever fucking reason, replacing the bolt items with a bolt autogen broke all autogen items, most likely due to the load order. * This "fix" just makes sure that the material system is loaded first no matter what. */ Mats.MAT_STONE.getUnlocalizedName(); @@ -286,12 +285,12 @@ public class MainRegistry { SiegeTier.registerTiers(); HazardRegistry.registerItems(); HazardRegistry.registerTrafos(); - + OreDictManager oreMan = new OreDictManager(); MinecraftForge.EVENT_BUS.register(oreMan); //OreRegisterEvent OreDictManager.registerGroups(); //important to run first OreDictManager.registerOres(); - + if(WorldConfig.enableCraterBiomes) BiomeGenCraterBase.initDictionary(); aMatSchrab.customCraftingMaterial = ModItems.ingot_schrabidium; @@ -319,13 +318,13 @@ public class MainRegistry { tMatDesh.setRepairItem(new ItemStack(ModItems.ingot_desh)); NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GUIHandler()); - + TileMappings.writeMappings(); MachineDynConfig.initialize(); TileEntityLaunchPadBase.registerLaunchables(); - + for(Entry, String[]> e : TileMappings.map.entrySet()) { - + if(e.getValue().length == 1) GameRegistry.registerTileEntity(e.getKey(), e.getValue()[0]); else @@ -348,7 +347,7 @@ public class MainRegistry { EntityMappings.writeMappings(); //CompatNER.init(); - + ForgeChunkManager.setForcedChunkLoadingCallback(this, new LoadingCallback() { @Override @@ -636,7 +635,7 @@ public class MainRegistry { private boolean dispenseSound = true; @Override protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { - + EnumFacing facing = BlockDispenser.func_149937_b(source.getBlockMetadata()); World world = source.getWorld(); int x = source.getXInt() + facing.getFrontOffsetX(); @@ -657,7 +656,7 @@ public class MainRegistry { @EventHandler public static void load(FMLInitializationEvent event) { - + RodRecipes.registerInit(); achSacrifice = new Achievement("achievement.sacrifice", "sacrifice", -3, 1, ModItems.burnt_bark, null).initIndependentStat().setSpecial().registerStat(); @@ -679,7 +678,7 @@ public class MainRegistry { achSulfuric = new Achievement("achievement.sulfuric", "sulfuric", -10, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.BALLS), achSlimeball).initIndependentStat().setSpecial().registerStat(); achInferno = new Achievement("achievement.inferno", "inferno", -8, 10, ModItems.canister_napalm, null).initIndependentStat().setSpecial().registerStat(); achRedRoom = new Achievement("achievement.redRoom", "redRoom", -10, 10, ModItems.key_red, null).initIndependentStat().setSpecial().registerStat(); - + bobHidden = new Achievement("achievement.hidden", "hidden", 15, -4, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.QUESTIONMARK), null).initIndependentStat().registerStat(); horizonsStart = new Achievement("achievement.horizonsStart", "horizonsStart", -5, 4, ModItems.sat_gerald, null).initIndependentStat().registerStat(); @@ -696,13 +695,13 @@ public class MainRegistry { achRadDeath = new Achievement("achievement.radDeath", "radDeath", 0, 6, Items.skull, achRadPoison).initIndependentStat().registerStat().setSpecial(); achSomeWounds = new Achievement("achievement.someWounds", "someWounds", -2, 10, ModItems.injector_knife, null).initIndependentStat().registerStat(); - + digammaSee = new Achievement("achievement.digammaSee", "digammaSee", -1, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMASEE), null).initIndependentStat().registerStat(); digammaFeel = new Achievement("achievement.digammaFeel", "digammaFeel", 1, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAFEEL), digammaSee).initIndependentStat().registerStat(); digammaKnow = new Achievement("achievement.digammaKnow", "digammaKnow", 3, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAKNOW), digammaFeel).initIndependentStat().registerStat().setSpecial(); digammaKauaiMoho = new Achievement("achievement.digammaKauaiMoho", "digammaKauaiMoho", 5, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAKAUAIMOHO), digammaKnow).initIndependentStat().registerStat().setSpecial(); digammaUpOnTop = new Achievement("achievement.digammaUpOnTop", "digammaUpOnTop", 7, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAUPONTOP), digammaKauaiMoho).initIndependentStat().registerStat().setSpecial(); - + //progression achieves achBurnerPress = new Achievement("achievement.burnerPress", "burnerPress", 0, 0, new ItemStack(ModBlocks.machine_press), null).initIndependentStat().registerStat(); achBlastFurnace = new Achievement("achievement.blastFurnace", "blastFurnace", 1, 3, new ItemStack(ModBlocks.machine_difurnace_off), achBurnerPress).initIndependentStat().registerStat(); @@ -735,7 +734,7 @@ public class MainRegistry { achMeltdown = new Achievement("achievement.meltdown", "meltdown", 15, -7, ModItems.powder_balefire, achFusion).initIndependentStat().setSpecial().registerStat(); achRedBalloons = new Achievement("achievement.redBalloons", "redBalloons", 11, 0, ModItems.missile_nuclear, achPolymer).initIndependentStat().setSpecial().registerStat(); achManhattan = new Achievement("achievement.manhattan", "manhattan", 11, -4, new ItemStack(ModBlocks.nuke_boy), achPolymer).initIndependentStat().setSpecial().registerStat(); - + AchievementPage.registerAchievementPage(new AchievementPage("Nuclear Tech", new Achievement[] { achSacrifice, achImpossible, @@ -772,7 +771,7 @@ public class MainRegistry { digammaKnow, digammaKauaiMoho, digammaUpOnTop, - + achBurnerPress, achBlastFurnace, achAssembly, @@ -819,15 +818,15 @@ public class MainRegistry { } } } - + @EventHandler public static void initIMC(IMCEvent event) { - + ImmutableList inbox = event.getMessages(); //tee-hee - + for(IMCMessage message : inbox) { IMCHandler handler = IMCHandler.getHandler(message.key); - + if(handler != null) { MainRegistry.logger.info("Received IMC of type >" + message.key + "< from " + message.getSender() + "!"); handler.process(message); @@ -845,19 +844,19 @@ public class MainRegistry { SILEXRecipes.register(); RefineryRecipes.registerRefinery(); GasCentrifugeRecipes.register(); - + CustomMachineConfigJSON.initialize(); //the good stuff SerializableRecipe.registerAllHandlers(); SerializableRecipe.initialize(); - + //Anvil has to come after serializables (i.e. anvil) AnvilRecipes.register(); //has to register after cracking, and therefore after all serializable recipes RadiolysisRecipes.registerRadiolysis(); - + FalloutConfigJSON.initialize(); ItemPoolConfigJSON.initialize(); ClientConfig.initConfig(); @@ -887,11 +886,11 @@ public class MainRegistry { //new BiomeCave().setThreshold(1.5D).setRangeMult(20).setYLevel(40).setMaxRange(20); //new OreLayer(Blocks.coal_ore, 0.2F).setThreshold(4).setRangeMult(3).setYLevel(70); BedrockOre.init(); - + Compat.handleRailcraftNonsense(); SuicideThreadDump.register(); CommandReloadClient.register(); - + //ExplosionTests.runTest(); } @@ -910,7 +909,7 @@ public class MainRegistry { FMLCommonHandler.instance().bus().register(impactHandler); MinecraftForge.EVENT_BUS.register(impactHandler); MinecraftForge.TERRAIN_GEN_BUS.register(impactHandler); - + PacketDispatcher.registerPackets(); ChunkRadiationManager radiationSystem = new ChunkRadiationManager(); @@ -920,14 +919,14 @@ public class MainRegistry { PollutionHandler pollution = new PollutionHandler(); MinecraftForge.EVENT_BUS.register(pollution); FMLCommonHandler.instance().bus().register(pollution); - + if(event.getSide() == Side.CLIENT) { HbmKeybinds.register(); HbmKeybinds keyHandler = new HbmKeybinds(); FMLCommonHandler.instance().bus().register(keyHandler); } } - + //yes kids, this is where we would usually register commands @EventHandler public void serverStart(FMLServerStartingEvent event) { @@ -938,17 +937,17 @@ public class MainRegistry { event.registerServerCommand(new CommandSatellites()); event.registerServerCommand(new CommandRadiation()); } - + @EventHandler public void serverStart(FMLServerStartedEvent event) { - + if(GeneralConfig.enableStatReRegistering) { logger.info("Attempting to re-register item stats..."); StatHelper.resetStatShitFuck(); //shit yourself logger.info("Item stats re-registered"); } } - + private void loadConfig(FMLPreInitializationEvent event) { Configuration config = new Configuration(event.getSuggestedConfigurationFile()); @@ -966,7 +965,7 @@ public class MainRegistry { StructureConfig.loadFromConfig(config); config.save(); - + try { if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.ThermosClassTransformer") != null) { throw new IllegalStateException("The mod tried to start on a Thermos or its fork server and therefore stopped. To allow the server to start on Thermos, change the appropriate " @@ -979,17 +978,17 @@ public class MainRegistry { } } catch(ClassNotFoundException e) { } } - + private static HashSet ignoreMappings = new HashSet(); private static HashMap remapItems = new HashMap(); - + @EventHandler public void handleMissingMappings(FMLMissingMappingsEvent event) { - + ignoreMappings.clear(); remapItems.clear(); - + /// IGNORE /// for(int i = 1; i <= 8; i++) ignoreMappings.add("hbm:item.gasflame" + i); ignoreMappings.add("hbm:item.cyclotron_tower"); @@ -1454,15 +1453,15 @@ public class MainRegistry { ignoreMappings.add("hbm:item.powder_daffergon"); ignoreMappings.add("hbm:item.powder_verticium"); ignoreMappings.add("hbm:tile.ore_random"); - + /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); remapItems.put("hbm:item.man_explosive8", ModItems.explosive_lenses); remapItems.put("hbm:item.briquette_lignite", ModItems.briquette); remapItems.put("hbm:item.antiknock", ModItems.fuel_additive); - + for(MissingMapping mapping : event.get()) { - + // ignore all ammo prefixes because those are from the time we threw out all the ammo items if(mapping.name.startsWith("hbm:item.ammo_")) { mapping.ignore(); @@ -1473,9 +1472,9 @@ public class MainRegistry { mapping.ignore(); continue; } - + if(mapping.type == GameRegistry.Type.ITEM) { - + if(remapItems.get(mapping.name) != null) { mapping.remap(remapItems.get(mapping.name)); continue; diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index c86c2208f..b30c9bfdf 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -1,27 +1,6 @@ package com.hbm.main; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Random; -import java.util.UUID; - -import com.hbm.handler.neutron.NeutronHandler; -import com.hbm.handler.neutron.NeutronNodeWorld; -import com.hbm.tileentity.machine.rbmk.RBMKDials; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import com.hbm.handler.threading.BufPacketThreading; -import net.minecraft.command.CommandGameRule; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraftforge.event.CommandEvent; -import org.apache.commons.lang3.math.NumberUtils; -import org.apache.logging.log4j.Level; - +import api.hbm.energymk2.Nodespace; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.hbm.blocks.IStepTickReceiver; @@ -30,37 +9,25 @@ import com.hbm.blocks.generic.BlockAshes; import com.hbm.config.GeneralConfig; import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; -import com.hbm.entity.mob.EntityCyberCrab; -import com.hbm.entity.mob.EntityDuck; -import com.hbm.entity.mob.EntityCreeperNuclear; -import com.hbm.entity.mob.EntityQuackos; +import com.hbm.entity.mob.*; import com.hbm.entity.mob.ai.EntityAIFireGun; -import com.hbm.entity.mob.EntityCreeperTainted; import com.hbm.entity.projectile.EntityBulletBaseNT; import com.hbm.entity.projectile.EntityBurningFOEQ; import com.hbm.entity.train.EntityRailCarBase; import com.hbm.extprop.HbmLivingProps; import com.hbm.extprop.HbmPlayerProps; -import com.hbm.handler.ArmorModHandler; -import com.hbm.handler.BobmazonOfferFactory; -import com.hbm.handler.BossSpawnHandler; -import com.hbm.handler.BulletConfigSyncingUtil; -import com.hbm.handler.BulletConfiguration; -import com.hbm.handler.EntityEffectHandler; -import com.hbm.hazard.HazardSystem; -import com.hbm.interfaces.IBomb; -import com.hbm.handler.HTTPHandler; +import com.hbm.handler.*; import com.hbm.handler.HbmKeybinds.EnumKeybind; +import com.hbm.handler.neutron.NeutronHandler; +import com.hbm.handler.neutron.NeutronNodeWorld; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; +import com.hbm.handler.threading.PacketThreading; +import com.hbm.hazard.HazardSystem; +import com.hbm.interfaces.IBomb; import com.hbm.items.IEquipReceiver; import com.hbm.items.ModItems; -import com.hbm.items.armor.ArmorFSB; -import com.hbm.items.armor.IAttackHandler; -import com.hbm.items.armor.IDamageHandler; -import com.hbm.items.armor.ItemArmorMod; -import com.hbm.items.armor.ItemModRevive; -import com.hbm.items.armor.ItemModShackles; +import com.hbm.items.armor.*; import com.hbm.items.food.ItemConserve.EnumFoodType; import com.hbm.items.tool.ItemGuideBook.BookType; import com.hbm.items.weapon.ItemGunBase; @@ -74,13 +41,12 @@ import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.potion.HbmPotion; import com.hbm.saveddata.AuxSavedData; import com.hbm.tileentity.machine.TileEntityMachineRadarNT; +import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.tileentity.network.RTTYSystem; import com.hbm.tileentity.network.RequestNetwork; import com.hbm.util.*; import com.hbm.util.ArmorRegistry.HazardClass; import com.hbm.world.generator.TimedGenerator; - -import api.hbm.energymk2.Nodespace; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; @@ -89,7 +55,12 @@ import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; import cpw.mods.fml.relauncher.ReflectionHelper; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.block.Block; +import net.minecraft.command.CommandGameRule; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandSender; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; @@ -99,12 +70,7 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAITasks; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntityCaveSpider; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.monster.*; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityCow; import net.minecraft.entity.passive.EntityMooshroom; @@ -127,26 +93,27 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.AnvilUpdateEvent; +import net.minecraftforge.event.CommandEvent; import net.minecraftforge.event.ServerChatEvent; import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.EntityEvent.EnteringChunk; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.item.ItemTossEvent; -import net.minecraftforge.event.entity.living.LivingAttackEvent; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingDropsEvent; +import net.minecraftforge.event.entity.living.*; import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.event.entity.living.LivingFallEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.entity.player.PlayerUseItemEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; +import net.minecraftforge.event.entity.player.PlayerUseItemEvent; import net.minecraftforge.event.world.BlockEvent.BreakEvent; import net.minecraftforge.event.world.WorldEvent; +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.logging.log4j.Level; + +import java.lang.reflect.Field; +import java.util.*; public class ModEventHandler { @@ -1203,25 +1170,31 @@ public class ModEventHandler { if(event.phase == Phase.START) { - NetworkHandler.flush(); // Flush ALL network packets. - // Yes this technically happens a tick late, I am aware. - // I was encountering some kind of race condition when I flushed packets at the end of the tick, - // leading to occasional ticks of incorrect packets. - - NeutronHandler.onWorldTick(); // All neutron interactions - // do other shit I guess? RTTYSystem.updateBroadcastQueue(); RequestNetwork.updateEntries(); TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); // bob i beg of you i need fluid nodespace :pray: + + NeutronHandler.onWorldTick(); // All neutron interactions } + // There is an issue here somewhere... + // I cannot, for the life of me, figure out why a single certain bug happens. + // Every 20-30 or so ticks, players will receive wrong/outdated/weird information in packets + // I have tried everything to see if I can get this to stop, but it just doesn't seem to work. + + // ^ Update ^ - I figured it out, when the packets were being made for some machines they were being created inside the thread, + // meaning sometimes the machine would change data *after* the packet was supposed to be sent, meaning incorrect data was being sent. + // This has since been fixed. + if(event.phase == Phase.END) { - // As ByteBufs are added to the queue in `com.hbm.packet.toclient.BufPacketThreading`, they are processed by the packet thread. + // As ByteBufs are added to the queue in `com.hbm.packet.toclient.PacketThreading`, they are processed by the packet thread. // This waits until the thread is finished, which most of the time will be instantly since it has plenty of time to process in parallel to everything else. - BufPacketThreading.waitUntilThreadFinished(); + PacketThreading.waitUntilThreadFinished(); + + NetworkHandler.flush(); // Flush ALL network packets. } } diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 336fb1b64..fdeb01deb 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1,16 +1,5 @@ package com.hbm.main; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.Random; - -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; - import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockAshes; @@ -21,12 +10,7 @@ import com.hbm.entity.projectile.EntityChopperMine; import com.hbm.entity.train.EntityRailCarRidable; import com.hbm.extprop.HbmLivingProps; import com.hbm.extprop.HbmPlayerProps; -import com.hbm.handler.ArmorModHandler; -import com.hbm.handler.GunConfiguration; -import com.hbm.handler.HTTPHandler; -import com.hbm.handler.HazmatRegistry; -import com.hbm.handler.HbmKeybinds; -import com.hbm.handler.ImpactWorldHandler; +import com.hbm.handler.*; import com.hbm.hazard.HazardSystem; import com.hbm.interfaces.IHoldableWeapon; import com.hbm.interfaces.IItemHUD; @@ -36,12 +20,7 @@ import com.hbm.inventory.gui.GUIArmorTable; import com.hbm.inventory.gui.GUIScreenPreview; import com.hbm.inventory.gui.GUIScreenWikiRender; import com.hbm.items.ModItems; -import com.hbm.items.armor.ArmorFSB; -import com.hbm.items.armor.ArmorFSBPowered; -import com.hbm.items.armor.ArmorNo9; -import com.hbm.items.armor.ItemArmorMod; -import com.hbm.items.armor.JetpackBase; -import com.hbm.items.armor.JetpackFueledBase; +import com.hbm.items.armor.*; import com.hbm.items.machine.ItemDepletedFuel; import com.hbm.items.machine.ItemFluidDuct; import com.hbm.items.machine.ItemRBMKPellet; @@ -65,24 +44,17 @@ import com.hbm.sound.MovingSoundChopper; import com.hbm.sound.MovingSoundChopperMine; import com.hbm.sound.MovingSoundCrashing; import com.hbm.sound.MovingSoundPlayerLoop; +import com.hbm.sound.MovingSoundPlayerLoop.EnumHbmSound; import com.hbm.tileentity.bomb.TileEntityNukeCustom; import com.hbm.tileentity.bomb.TileEntityNukeCustom.CustomNukeEntry; import com.hbm.tileentity.bomb.TileEntityNukeCustom.EnumEntryType; import com.hbm.tileentity.machine.TileEntityNukeFurnace; -import com.hbm.util.I18nUtil; -import com.hbm.util.ItemStackUtil; -import com.hbm.util.LoggingUtil; -import com.hbm.util.ShadyUtil; +import com.hbm.util.*; +import com.hbm.util.ArmorRegistry.HazardClass; import com.hbm.wiaj.GuiWorldInAJar; import com.hbm.wiaj.cannery.CanneryBase; import com.hbm.wiaj.cannery.Jars; -import com.hbm.util.ArmorRegistry; -import com.hbm.util.ArmorUtil; -import com.hbm.util.ArmorRegistry.HazardClass; import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; - -import com.hbm.sound.MovingSoundPlayerLoop.EnumHbmSound; - import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; @@ -110,8 +82,8 @@ import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; @@ -120,43 +92,35 @@ import net.minecraft.network.play.client.C03PacketPlayer; import net.minecraft.network.play.client.C0CPacketInput; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Vec3; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraft.world.WorldProviderSurface; import net.minecraftforge.client.GuiIngameForge; import net.minecraftforge.client.IRenderHandler; -import net.minecraftforge.client.event.FOVUpdateEvent; -import net.minecraftforge.client.event.GuiOpenEvent; -import net.minecraftforge.client.event.MouseEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.*; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; -import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.client.event.RenderItemInFrameEvent; -import net.minecraftforge.client.event.RenderLivingEvent; -import net.minecraftforge.client.event.RenderPlayerEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.event.sound.PlaySoundEvent17; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import java.lang.reflect.Method; +import java.util.*; public class ModEventHandlerClient { - + public static final int flashDuration = 5_000; public static long flashTimestamp; public static final int shakeDuration = 1_500; public static long shakeTimestamp; - + @SubscribeEvent public void onOverlayRender(RenderGameOverlayEvent.Pre event) { - + EntityPlayer player = Minecraft.getMinecraft().thePlayer; - + /// NUKE FLASH /// if(event.type == ElementType.CROSSHAIRS && (flashTimestamp + flashDuration - System.currentTimeMillis()) > 0 && ClientConfig.NUKE_HUD_FLASH.get()) { int width = event.resolution.getScaledWidth(); @@ -181,21 +145,21 @@ public class ModEventHandlerClient { GL11.glDepthMask(true); return; } - + /// HANDLE GUN OVERLAYS /// if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemHUD) { ((IItemHUD)player.getHeldItem().getItem()).renderHUD(event, event.type, player, player.getHeldItem()); } - + /// HANDLE GEIGER COUNTER HUD /// if(event.type == ElementType.HOTBAR) { - + if(!(ArmorFSB.hasFSBArmor(player) && ((ArmorFSB)player.inventory.armorInventory[2].getItem()).customGeiger)) { - + if(player.inventory.hasItem(ModItems.geiger_counter)) { - + float rads = HbmLivingProps.getRadiation(player); - + RenderScreenOverlay.renderRadCounter(event.resolution, rads, Minecraft.getMinecraft().ingameGUI); } } @@ -206,37 +170,37 @@ public class ModEventHandlerClient { Minecraft mc = Minecraft.getMinecraft(); World world = mc.theWorld; MovingObjectPosition mop = mc.objectMouseOver; - + if(mop != null) { - + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ILookOverlay) { ((ILookOverlay) player.getHeldItem().getItem()).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); - + } else if(world.getBlock(mop.blockX, mop.blockY, mop.blockZ) instanceof ILookOverlay) { ((ILookOverlay) world.getBlock(mop.blockX, mop.blockY, mop.blockZ)).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); } - + /*List text = new ArrayList(); text.add("Meta: " + world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ)); ILookOverlay.printGeneric(event, "DEBUG", 0xffff00, 0x4040000, text);*/ - + } else if(mop.typeOfHit == mop.typeOfHit.ENTITY) { Entity entity = mop.entityHit; - + if(entity instanceof ILookOverlay) { ((ILookOverlay) entity).printHook(event, world, 0, 0, 0); } } } - + /*List text = new ArrayList(); text.add("IMPACT: " + ImpactWorldHandler.getImpactForClient(world)); text.add("DUST: " + ImpactWorldHandler.getDustForClient(world)); text.add("FIRE: " + ImpactWorldHandler.getFireForClient(world)); ILookOverlay.printGeneric(event, "DEBUG", 0xffff00, 0x4040000, text);*/ - + /*if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { ScaledResolution resolution = event.resolution; GL11.glPushMatrix(); @@ -248,136 +212,136 @@ public class ModEventHandlerClient { GL11.glPopMatrix(); Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); }*/ - + /*List text = new ArrayList(); MovingObjectPosition pos = Library.rayTrace(player, 500, 1, false, true, false); - + for(int i = 0; i < 2; i++) if(pos != null && pos.typeOfHit == pos.typeOfHit.BLOCK) { - + float yaw = player.rotationYaw; - + Vec3 next = Vec3.createVectorHelper(pos.hitVec.xCoord, pos.hitVec.yCoord, pos.hitVec.zCoord); int it = 0; - + BlockPos anchor = new BlockPos(pos.blockX, pos.blockY, pos.blockZ); - + double distanceToCover = 4D * (i == 0 ? 1 : -1); - + if(distanceToCover < 0) { distanceToCover *= -1; yaw += 180; } - + do { - + it++; - + if(it > 30) { world.createExplosion(player, pos.hitVec.xCoord, pos.hitVec.yCoord, pos.hitVec.zCoord, 5F, false); break; } - + int x = anchor.getX(); int y = anchor.getY(); int z = anchor.getZ(); Block block = world.getBlock(x, y, z); - + Vec3 rot = Vec3.createVectorHelper(0, 0, 1); rot.rotateAroundY((float) (-yaw * Math.PI / 180D)); - + if(block instanceof IRailNTM) { IRailNTM rail = (IRailNTM) block; RailContext info = new RailContext(); - + boolean flip = distanceToCover < 0; - + if(it == 1) { Vec3 snap = next = rail.getTravelLocation(world, x, y, z, next.xCoord, next.yCoord, next.zCoord, rot.xCoord, rot.yCoord, rot.zCoord, 0, info, new MoveContext(RailCheckType.CORE, 0)); if(i == 0) world.spawnParticle("reddust", snap.xCoord, snap.yCoord + 0.25, snap.zCoord, 0.1, 1, 0.1); } - + Vec3 prev = next; next = rail.getTravelLocation(world, x, y, z, prev.xCoord, prev.yCoord, prev.zCoord, rot.xCoord, rot.yCoord, rot.zCoord, distanceToCover, info, new MoveContext(i == 0 ? RailCheckType.FRONT : RailCheckType.BACK, 0)); distanceToCover = info.overshoot; anchor = info.pos; if(i == 0) world.spawnParticle("reddust", next.xCoord, next.yCoord + 0.25, next.zCoord, 0, distanceToCover != 0 ? 0.5 : 0, 0); else world.spawnParticle("reddust", next.xCoord, next.yCoord + 0.25, next.zCoord, 0, distanceToCover != 0 ? 0.5 : 0, 1); - + double deltaX = next.xCoord - prev.xCoord; double deltaZ = next.zCoord - prev.zCoord; double radians = -Math.atan2(deltaX, deltaZ); yaw = (float) MathHelper.wrapAngleTo180_double(radians * 180D / Math.PI + (flip ? 180 : 0)); - + text.add(it + ": " + yaw); - + } else { break; } - + } while(distanceToCover != 0); - + ILookOverlay.printGeneric(event, "DEBUG", 0xffff00, 0x4040000, text); }*/ } - + /// HANLDE ANIMATION BUSES /// - + for(int i = 0; i < HbmAnimations.hotbar.length; i++) { for(int j = 0; j < HbmAnimations.hotbar[i].length; j++) { - + Animation animation = HbmAnimations.hotbar[i][j]; - + if(animation == null) continue; - + if(animation.holdLastFrame) continue; - + long time = System.currentTimeMillis() - animation.startMillis; - + if(time > animation.animation.getDuration()) HbmAnimations.hotbar[i][j] = null; } } - + if(!ducked && Keyboard.isKeyDown(Keyboard.KEY_O) && Minecraft.getMinecraft().currentScreen == null) { ducked = true; PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(0, 0, 0, 999, 0)); } - + /// HANDLE SCOPE OVERLAY /// ItemStack held = player.getHeldItem(); - + if(player.isSneaking() && held != null && held.getItem() instanceof ItemGunBase && event.type == event.type.HOTBAR) { GunConfiguration config = ((ItemGunBase) held.getItem()).mainConfig; - + if(config.scopeTexture != null) { ScaledResolution resolution = event.resolution; RenderScreenOverlay.renderScope(resolution, config.scopeTexture); } } - + /// HANDLE FSB HUD /// ItemStack helmet = player.inventory.armorInventory[3]; - + if(helmet != null && helmet.getItem() instanceof ArmorFSB) { ((ArmorFSB)helmet.getItem()).handleOverlay(event, player); } if(!event.isCanceled() && event.type == event.type.HOTBAR) { - + HbmPlayerProps props = HbmPlayerProps.getData(player); if(props.getDashCount() > 0) { RenderScreenOverlay.renderDashBar(event.resolution, Minecraft.getMinecraft().ingameGUI, props); - + } } } - + @SubscribeEvent(receiveCanceled = true) public void onHUDRenderShield(RenderGameOverlayEvent.Pre event) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; - + if(event.type == event.type.ARMOR) { HbmPlayerProps props = HbmPlayerProps.getData(player); @@ -386,17 +350,17 @@ public class ModEventHandlerClient { } } } - + @SubscribeEvent(receiveCanceled = true, priority = EventPriority.LOW) public void onHUDRenderBar(RenderGameOverlayEvent.Post event) { - + /// HANDLE ELECTRIC FSB HUD /// - + EntityPlayer player = Minecraft.getMinecraft().thePlayer; Tessellator tess = Tessellator.instance; - + if(event.type == event.type.ARMOR) { - + if(ForgeHooks.getTotalArmorValue(player) == 0) { GuiIngameForge.left_height -= 10; } @@ -413,7 +377,7 @@ public class ModEventHandlerClient { tess.startDrawingQuads(); for(int i = 0; i < (noHelmet ? 3 : 4); i++) { - + int top = height - GuiIngameForge.left_height + 7; ItemStack stack = player.inventory.armorInventory[i]; @@ -447,7 +411,7 @@ public class ModEventHandlerClient { ItemStack stack = player.inventory.armorInventory[2]; float tot = (float) ((JetpackFueledBase) stack.getItem()).getFuel(stack) / (float) ((JetpackFueledBase) stack.getItem()).getMaxFill(stack); - + int top = height - GuiIngameForge.left_height + 3; GL11.glDisable(GL11.GL_TEXTURE_2D); @@ -470,45 +434,45 @@ public class ModEventHandlerClient { } } } - + @SubscribeEvent public void setupFOV(FOVUpdateEvent event) { - + EntityPlayer player = Minecraft.getMinecraft().thePlayer; ItemStack held = player.getHeldItem(); - + if(held == null) return; if(!(held.getItem() instanceof ItemGunBase)) return; - + GunConfiguration config = ((ItemGunBase) held.getItem()).mainConfig; - + if(config == null) return; if(config.zoomFOV == 0F || !player.isSneaking()) return; - + if(config.absoluteFOV) { event.newfov = config.zoomFOV; } else { event.newfov += config.zoomFOV; } } - + public static boolean ducked = false; - + @SubscribeEvent public void preRenderEvent(RenderPlayerEvent.Pre event) { - + RenderPlayer renderer = event.renderer; AbstractClientPlayer player = (AbstractClientPlayer)event.entityPlayer; - + PotionEffect invis = player.getActivePotionEffect(Potion.invisibility); - + if(invis != null && invis.getAmplifier() > 0) event.setCanceled(true); if(player.getDisplayName().toLowerCase(Locale.US).equals("martmn")) { - + event.setCanceled(true); - + float pX = (float) (player.prevPosX + (player.posX - player.prevPosX) * (double)event.partialRenderTick); float pY = (float) (player.prevPosY + (player.posY - player.prevPosY) * (double)event.partialRenderTick); float pZ = (float) (player.prevPosZ + (player.posZ - player.prevPosZ) * (double)event.partialRenderTick); @@ -532,49 +496,49 @@ public class ModEventHandlerClient { t.addVertexWithUV(1, -1, 0, 1, 1); t.addVertexWithUV(-1, -1, 0, 0, 1); t.draw(); - + GL11.glEnable(GL11.GL_LIGHTING); - + GL11.glPopMatrix(); } - + ResourceLocation cloak = RenderAccessoryUtility.getCloakFromPlayer(player); - + if(cloak != null) player.func_152121_a(Type.CAPE, cloak); - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IHoldableWeapon) { renderer.modelBipedMain.aimedBow = true; renderer.modelArmor.aimedBow = true; renderer.modelArmorChestplate.aimedBow = true; } } - + @SubscribeEvent public void onRenderArmorEvent(RenderPlayerEvent.SetArmorModel event) { - + EntityPlayer player = event.entityPlayer; - + for(int i = 0; i < 4; i++) { - + ItemStack armor = player.getCurrentArmor(i); - + if(armor != null && ArmorModHandler.hasMods(armor)) { - + for(ItemStack mod : ArmorModHandler.pryMods(armor)) { - + if(mod != null && mod.getItem() instanceof ItemArmorMod) { ((ItemArmorMod)mod.getItem()).modRender(event, armor); } } } - + //because armor that isn't ItemArmor doesn't render at all if(armor != null && armor.getItem() instanceof JetpackBase) { ((ItemArmorMod)armor.getItem()).modRender(event, armor); } } - + if(player.getCurrentArmor(2) == null && !player.isPotionActive(Potion.invisibility)) { if(player.getUniqueID().toString().equals(ShadyUtil.HbMinecraft) || player.getDisplayName().equals("HbMinecraft")) RenderAccessoryUtility.renderWings(event, 2); if(player.getUniqueID().toString().equals(ShadyUtil.the_NCR) || player.getDisplayName().equals("the_NCR")) RenderAccessoryUtility.renderWings(event, 3); @@ -585,20 +549,20 @@ public class ModEventHandlerClient { @SubscribeEvent public void clickHandler(MouseEvent event) { - + EntityPlayer player = Minecraft.getMinecraft().thePlayer; - + if(player.getHeldItem() != null) { - + Item held = player.getHeldItem().getItem(); - + if(held instanceof ItemGunBase) { - + if(event.button == 0) event.setCanceled(true); - + ItemGunBase item = (ItemGunBase)player.getHeldItem().getItem(); - + if(event.button == 0 && !item.m1 && !item.m2) { item.m1 = true; PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(true, (byte) 0)); @@ -616,55 +580,55 @@ public class ModEventHandlerClient { @Spaghetti("please get this shit out of my face") @SubscribeEvent public void onPlaySound(PlaySoundEvent17 e) { - + EntityPlayer player = MainRegistry.proxy.me(); Minecraft mc = Minecraft.getMinecraft(); - + if(player != null && mc.theWorld != null) { int i = MathHelper.floor_double(player.posX); int j = MathHelper.floor_double(player.posY); int k = MathHelper.floor_double(player.posZ); Block block = mc.theWorld.getBlock(i, j, k); - + if(block == ModBlocks.vacuum) { e.result = null; return; } } - + ResourceLocation r = e.sound.getPositionedSoundLocation(); WorldClient wc = mc.theWorld; - + //Alright, alright, I give the fuck up, you've wasted my time enough with this bullshit. You win. //A winner is you. //Conglaturations. //Fuck you. - + if(r.toString().equals("hbm:misc.nullChopper") && Library.getClosestChopperForSound(wc, e.sound.getXPosF(), e.sound.getYPosF(), e.sound.getZPosF(), 2) != null) { EntityHunterChopper ent = Library.getClosestChopperForSound(wc, e.sound.getXPosF(), e.sound.getYPosF(), e.sound.getZPosF(), 2); - + if(MovingSoundPlayerLoop.getSoundByPlayer(ent, EnumHbmSound.soundChopperLoop) == null) { MovingSoundPlayerLoop.globalSoundList.add(new MovingSoundChopper(new ResourceLocation("hbm:entity.chopperFlyingLoop"), ent, EnumHbmSound.soundChopperLoop)); MovingSoundPlayerLoop.getSoundByPlayer(ent, EnumHbmSound.soundChopperLoop).setVolume(10.0F); } } - + if(r.toString().equals("hbm:misc.nullCrashing") && Library.getClosestChopperForSound(wc, e.sound.getXPosF(), e.sound.getYPosF(), e.sound.getZPosF(), 2) != null) { EntityHunterChopper ent = Library.getClosestChopperForSound(wc, e.sound.getXPosF(), e.sound.getYPosF(), e.sound.getZPosF(), 2); - + if(MovingSoundPlayerLoop.getSoundByPlayer(ent, EnumHbmSound.soundCrashingLoop) == null) { MovingSoundPlayerLoop.globalSoundList.add(new MovingSoundCrashing(new ResourceLocation("hbm:entity.chopperCrashingLoop"), ent, EnumHbmSound.soundCrashingLoop)); MovingSoundPlayerLoop.getSoundByPlayer(ent, EnumHbmSound.soundCrashingLoop).setVolume(10.0F); } } - + if(r.toString().equals("hbm:misc.nullMine") && Library.getClosestMineForSound(wc, e.sound.getXPosF(), e.sound.getYPosF(), e.sound.getZPosF(), 2) != null) { EntityChopperMine ent = Library.getClosestMineForSound(wc, e.sound.getXPosF(), e.sound.getYPosF(), e.sound.getZPosF(), 2); - + if(MovingSoundPlayerLoop.getSoundByPlayer(ent, EnumHbmSound.soundMineLoop) == null) { MovingSoundPlayerLoop.globalSoundList.add(new MovingSoundChopperMine(new ResourceLocation("hbm:entity.chopperMineLoop"), ent, EnumHbmSound.soundMineLoop)); MovingSoundPlayerLoop.getSoundByPlayer(ent, EnumHbmSound.soundMineLoop).setVolume(10.0F); @@ -680,67 +644,67 @@ public class ModEventHandlerClient { } } } - + @SubscribeEvent public void drawTooltip(ItemTooltipEvent event) { - + ItemStack stack = event.itemStack; List list = event.toolTip; - + /// HAZMAT INFO /// List hazInfo = ArmorRegistry.hazardClasses.get(stack.getItem()); - + if(hazInfo != null) { - + if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("hazard.prot")); for(HazardClass clazz : hazInfo) { list.add(EnumChatFormatting.YELLOW + " " + I18nUtil.resolveKey(clazz.lang)); } } else { - + list.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC +"Hold <" + EnumChatFormatting.YELLOW + "" + EnumChatFormatting.ITALIC + "LSHIFT" + EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "> to display protection info"); } } - + /// CLADDING (LEGACY) /// double rad = HazmatRegistry.getResistance(stack); rad = ((int)(rad * 1000)) / 1000D; if(rad > 0) list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.radResistance", rad)); - + /// ARMOR MODS /// if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { - + if(!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && !(Minecraft.getMinecraft().currentScreen instanceof GUIArmorTable)) { - + list.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC +"Hold <" + EnumChatFormatting.YELLOW + "" + EnumChatFormatting.ITALIC + "LSHIFT" + EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "> to display installed armor mods"); - + } else { - + list.add(EnumChatFormatting.YELLOW + "Mods:"); - + ItemStack[] mods = ArmorModHandler.pryMods(stack); - + for(int i = 0; i < 8; i++) { - + if(mods[i] != null && mods[i].getItem() instanceof ItemArmorMod) { - + ((ItemArmorMod)mods[i].getItem()).addDesc(list, mods[i], stack); } } } } - + /// HAZARDS /// HazardSystem.addFullTooltip(stack, event.entityPlayer, list); - + if(event.showAdvancedItemTooltips && ClientConfig.ITEM_TOOLTIP_SHOW_OREDICT.get()) { List names = ItemStackUtil.getOreDictNames(stack); - + if(names.size() > 0) { list.add(EnumChatFormatting.BLUE + "Ore Dict:"); for(String s : names) { @@ -750,33 +714,33 @@ public class ModEventHandlerClient { list.add(EnumChatFormatting.RED + "No Ore Dict data!"); } } - + /// NUCLEAR FURNACE FUELS /// int breeder = TileEntityNukeFurnace.getFuelValue(stack); - + if(breeder != 0) { list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.furnace", breeder)); } - + /// CUSTOM NUKE /// ComparableStack comp = new ComparableStack(stack).makeSingular(); - + if(ClientConfig.ITEM_TOOLTIP_SHOW_CUSTOM_NUKE.get()) { CustomNukeEntry entry = TileEntityNukeCustom.entries.get(comp); - + if(entry != null) { - + if(!list.isEmpty()) list.add(""); - + if(entry.entry == EnumEntryType.ADD) list.add(EnumChatFormatting.GOLD + "Adds " + entry.value + " to the custom nuke stage " + entry.type); - + if(entry.entry == EnumEntryType.MULT) list.add(EnumChatFormatting.GOLD + "Adds multiplier " + entry.value + " to the custom nuke stage " + entry.type); } } - + try { CanneryBase cannery = Jars.canneries.get(comp); if(cannery != null) { @@ -787,36 +751,36 @@ public class ModEventHandlerClient { } catch(Exception ex) { list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage()); } - + /*ItemStack copy = stack.copy(); List materials = Mats.getMaterialsFromItem(copy); - + if(!materials.isEmpty()) { for(MaterialStack mat : materials) { list.add(EnumChatFormatting.DARK_PURPLE + mat.material.names[0] + ": " + Mats.formatAmount(mat.amount * stack.stackSize)); } }*/ } - + private static long canneryTimestamp; private static ComparableStack lastCannery = null; - + private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); - + @SideOnly(Side.CLIENT) //@SubscribeEvent public void onRenderStorm(RenderHandEvent event) { - + if(BlockAshes.ashes == 0) return; - + GL11.glPushMatrix(); - + Minecraft mc = Minecraft.getMinecraft(); GL11.glRotatef((float)-mc.thePlayer.rotationYaw, 0, 1, 0); GL11.glRotatef((float)(mc.thePlayer.rotationPitch), 1, 0, 0); - + ScaledResolution resolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); GL11.glDisable(GL11.GL_DEPTH_TEST); @@ -824,12 +788,12 @@ public class ModEventHandlerClient { GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); GL11.glEnable(GL11.GL_ALPHA_TEST); - + int w = resolution.getScaledWidth(); int h = resolution.getScaledHeight(); double off = System.currentTimeMillis() / -10000D % 10000D; double aw = 25; - + Tessellator tessellator = Tessellator.instance; //int d = mc.theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(mc.thePlayer.posX), MathHelper.floor_double(mc.thePlayer.posY), MathHelper.floor_double(mc.thePlayer.posZ), 0); @@ -838,21 +802,21 @@ public class ModEventHandlerClient { int lX = lastBrightness % 65536; int lY = lastBrightness / 65536; float interp = (mc.theWorld.getTotalWorldTime() % 20) * 0.05F; - + if(mc.theWorld.getTotalWorldTime() == 1) lastBrightness = currentBrightness; - + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)(lX + (cX - lX) * interp) / 1.0F, (float)(lY + (cY - lY) * interp) / 1.0F); mc.entityRenderer.enableLightmap((double)event.partialTicks); - + mc.getTextureManager().bindTexture(ashes); - + for(int i = 1; i < 3; i++) { - + GL11.glRotatef(-15, 0, 0, 1); GL11.glColor4f(1.0F, 1.0F, 1.0F, BlockAshes.ashes / 256F * 0.98F / i); - + tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-w * 0.25, h * 0.25, aw, 0.0D + off * i, 1.0D); tessellator.addVertexWithUV(w * 0.25, h * 0.25, aw, 1.0D + off * i, 1.0D); @@ -862,7 +826,7 @@ public class ModEventHandlerClient { } mc.entityRenderer.disableLightmap((double)event.partialTicks); - + GL11.glDepthMask(true); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDisable(GL11.GL_BLEND); @@ -875,15 +839,15 @@ public class ModEventHandlerClient { public static int lastBrightness = 0; static boolean isRenderingItems = false; - + @SubscribeEvent public void clientTick(ClientTickEvent event) { - + Minecraft mc = Minecraft.getMinecraft(); ArmorNo9.updateWorldHook(mc.theWorld); boolean supportsHighRenderDistance = FMLClientHandler.instance().hasOptifine() || Loader.isModLoaded("angelica"); - + if(mc.gameSettings.renderDistanceChunks > 16 && GeneralConfig.enableRenderDistCheck && !supportsHighRenderDistance) { mc.gameSettings.renderDistanceChunks = 16; LoggingUtil.errorWithHighlight("========================== WARNING =========================="); @@ -894,35 +858,35 @@ public class ModEventHandlerClient { LoggingUtil.errorWithHighlight("If you got this error after downgrading your Minecraft version: Consider using a launcher that doesn't reuse the same folders for every game instance. MultiMC for example, it's really good and it comes with a dedicated cat button. You like cats, right? Are you using the Microsoft launcher? The one launcher that turns every version switch into a tightrope act because all the old config and options files are still here because different instances all use the same folder structure instead of different folders like a competent launcher would, because some MO-RON thought that this was an acceptable way of doing things? Really? The launcher that circumcises every crashlog into indecipherable garbage, tricking oblivious people into posting that as a \"crash report\", effectively wasting everyone's time? The launcher made by the company that thought it would be HI-LA-RI-OUS to force everyone to use Microsoft accounts, effectively breaking every other launcher until they implement their terrible auth system?"); LoggingUtil.errorWithHighlight("========================== WARNING =========================="); } - + if(mc.theWorld == null || mc.thePlayer == null) return; - + if(event.phase == Phase.START && event.side == Side.CLIENT) { - + if(BlockAshes.ashes > 256) BlockAshes.ashes = 256; if(BlockAshes.ashes > 0) BlockAshes.ashes -= 2; if(BlockAshes.ashes < 0) BlockAshes.ashes = 0; - + if(mc.theWorld.getTotalWorldTime() % 20 == 0) { this.lastBrightness = this.currentBrightness; currentBrightness = mc.theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(mc.thePlayer.posX), MathHelper.floor_double(mc.thePlayer.posY), MathHelper.floor_double(mc.thePlayer.posZ), 0); } - + if(ArmorUtil.isWearingEmptyMask(mc.thePlayer)) { MainRegistry.proxy.displayTooltip(EnumChatFormatting.RED + "Your mask has no filter!", MainRegistry.proxy.ID_FILTER); } } - + if(Keyboard.isKeyDown(Keyboard.KEY_F1) && Minecraft.getMinecraft().currentScreen != null) { - + ComparableStack comp = canneryTimestamp > System.currentTimeMillis() - 100 ? lastCannery : null; - + if(comp == null) { ItemStack stack = getMouseOverStack(); if(stack != null) comp = new ComparableStack(stack).makeSingular(); } - + if(comp != null) { CanneryBase cannery = Jars.canneries.get(comp); if(cannery != null) { @@ -930,9 +894,9 @@ public class ModEventHandlerClient { } } } - + if(Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_LMENU)) { - + ItemStack stack = getMouseOverStack(); if(stack != null) { stack = stack.copy(); @@ -981,27 +945,27 @@ public class ModEventHandlerClient { } EntityPlayer player = mc.thePlayer; - + if(event.phase == Phase.START) { - + float discriminator = 0.003F; float defaultStepSize = 0.5F; int newStepSize = 0; - + if(player.inventory.armorInventory[2] != null && player.inventory.armorInventory[2].getItem() instanceof ArmorFSB) { ArmorFSB plate = (ArmorFSB) player.inventory.armorInventory[2].getItem(); if(plate.hasFSBArmor(player)) newStepSize = plate.stepSize; } - + if(newStepSize > 0) { player.stepHeight = newStepSize + discriminator; } else { for(int i = 1; i < 4; i++) if(player.stepHeight == i + discriminator) player.stepHeight = defaultStepSize; } } - + if(event.phase == Phase.END) { - + ItemGunBaseNT.offsetVertical += ItemGunBaseNT.recoilVertical; ItemGunBaseNT.offsetHorizontal += ItemGunBaseNT.recoilHorizontal; player.rotationPitch -= ItemGunBaseNT.recoilVertical; @@ -1013,16 +977,16 @@ public class ModEventHandlerClient { ItemGunBaseNT.recoilHorizontal *= decay; float dV = ItemGunBaseNT.offsetVertical * rebound; float dH = ItemGunBaseNT.offsetHorizontal * rebound; - + ItemGunBaseNT.offsetVertical -= dV; ItemGunBaseNT.offsetHorizontal -= dH; player.rotationPitch += dV; player.rotationYaw += dH; } } - + public static ItemStack getMouseOverStack() { - + Minecraft mc = Minecraft.getMinecraft(); if(mc.currentScreen instanceof GuiContainer) { @@ -1031,41 +995,41 @@ public class ModEventHandlerClient { int height = scaledresolution.getScaledHeight(); int mouseX = Mouse.getX() * width / mc.displayWidth; int mouseY = height - Mouse.getY() * height / mc.displayHeight - 1; - + GuiContainer container = (GuiContainer) mc.currentScreen; - + for(Object o : container.inventorySlots.inventorySlots) { Slot slot = (Slot) o; - + if(slot.getHasStack()) { try { Method isMouseOverSlot = ReflectionHelper.findMethod(GuiContainer.class, container, new String[] {"func_146981_a", "isMouseOverSlot"}, Slot.class, int.class, int.class); - + if((boolean) isMouseOverSlot.invoke(container, slot, mouseX, mouseY)) { return slot.getStack(); } - + } catch(Exception ex) { } } } } - + return null; } - + @SideOnly(Side.CLIENT) @SubscribeEvent(priority = EventPriority.LOWEST) public void onClientTickLast(ClientTickEvent event) { - + if(event.phase == Phase.START && GeneralConfig.enableSkyboxes) { - + World world = Minecraft.getMinecraft().theWorld; if(world == null) return; - + IRenderHandler sky = world.provider.getSkyRenderer(); - + if(world.provider instanceof WorldProviderSurface) { - + if(ImpactWorldHandler.getDustForClient(world) > 0 || ImpactWorldHandler.getFireForClient(world) > 0) { //using a chainloader isn't necessary since none of the sky effects should render anyway @@ -1075,9 +1039,9 @@ public class ModEventHandlerClient { } } } - + if(world.provider.dimensionId == 0) { - + if(!(sky instanceof RenderNTMSkyboxChainloader)) { world.provider.setSkyRenderer(new RenderNTMSkyboxChainloader(sky)); } @@ -1088,16 +1052,16 @@ public class ModEventHandlerClient { @SideOnly(Side.CLIENT) @SubscribeEvent(priority = EventPriority.LOW) public void onMouseClicked(InputEvent.MouseInputEvent event) { - + Minecraft mc = Minecraft.getMinecraft(); if(GeneralConfig.enableKeybindOverlap && (mc.currentScreen == null || mc.currentScreen.allowUserInput)) { boolean state = Mouse.getEventButtonState(); int keyCode = Mouse.getEventButton() - 100; - + //if anything errors here, run ./gradlew clean setupDecompWorkSpace for(Object o : KeyBinding.keybindArray) { KeyBinding key = (KeyBinding) o; - + if(key.getKeyCode() == keyCode && KeyBinding.hash.lookup(key.getKeyCode()) != key) { key.pressed = state; @@ -1106,20 +1070,20 @@ public class ModEventHandlerClient { } } } - + boolean gunKey = keyCode == HbmKeybinds.gunPrimaryKey.getKeyCode() || keyCode == HbmKeybinds.gunSecondaryKey.getKeyCode() || keyCode == HbmKeybinds.gunTertiaryKey.getKeyCode() || keyCode == HbmKeybinds.reloadKey.getKeyCode(); - + EntityPlayer player = mc.thePlayer; - + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT) { - + /* Shoot in favor of attacking */ if(gunKey && keyCode == mc.gameSettings.keyBindAttack.getKeyCode()) { mc.gameSettings.keyBindAttack.pressed = false; mc.gameSettings.keyBindAttack.pressTime = 0; } - + if(gunKey && keyCode == mc.gameSettings.keyBindPickBlock.getKeyCode()) { mc.gameSettings.keyBindPickBlock.pressed = false; mc.gameSettings.keyBindPickBlock.pressTime = 0; @@ -1136,13 +1100,13 @@ public class ModEventHandlerClient { if(GeneralConfig.enableKeybindOverlap && (mc.currentScreen == null || mc.currentScreen.allowUserInput)) { boolean state = Keyboard.getEventKeyState(); int keyCode = Keyboard.getEventKey(); - + //if anything errors here, run ./gradlew clean setupDecompWorkSpace for(Object o : KeyBinding.keybindArray) { KeyBinding key = (KeyBinding) o; - + if(keyCode != 0 && key.getKeyCode() == keyCode && KeyBinding.hash.lookup(key.getKeyCode()) != key) { - + key.pressed = state; if(state && key.pressTime == 0) { key.pressTime = 1; @@ -1151,7 +1115,7 @@ public class ModEventHandlerClient { } } } - + @SideOnly(Side.CLIENT) @SubscribeEvent public void onRenderWorldLastEvent(RenderWorldLastEvent event) { @@ -1222,7 +1186,7 @@ public class ModEventHandlerClient { GL11.glEnable(GL11.GL_CULL_FACE); GL11.glPopMatrix(); } - + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); RenderHelper.disableStandardItemLighting(); @@ -1231,51 +1195,51 @@ public class ModEventHandlerClient { } GL11.glPopMatrix(); - + boolean hudOn = HbmPlayerProps.getData(player).enableHUD; - + if(hudOn) { RenderOverhead.renderMarkers(event.partialTicks); - + if(ArmorFSB.hasFSBArmor(player)) { ItemStack plate = player.inventory.armorInventory[2]; ArmorFSB chestplate = (ArmorFSB) plate.getItem(); - + if(chestplate.thermal) RenderOverhead.renderThermalSight(event.partialTicks); } } } - + @SubscribeEvent(priority = EventPriority.HIGHEST) public void preRenderEventFirst(RenderLivingEvent.Pre event) { - + if(MainRegistry.proxy.isVanished(event.entity)) event.setCanceled(true); } - + @SubscribeEvent public void preRenderEvent(RenderLivingEvent.Pre event) { - + EntityPlayer player = Minecraft.getMinecraft().thePlayer; - + if(ArmorFSB.hasFSBArmor(player) && HbmPlayerProps.getData(player).enableHUD) { ItemStack plate = player.inventory.armorInventory[2]; ArmorFSB chestplate = (ArmorFSB)plate.getItem(); - + if(chestplate.vats) { - + int count = (int)Math.min(event.entity.getMaxHealth(), 100); - + int bars = (int)Math.ceil(event.entity.getHealth() * count / event.entity.getMaxHealth()); - + String bar = EnumChatFormatting.RED + ""; - + for(int i = 0; i < count; i++) { - + if(i == bars) bar += EnumChatFormatting.RESET + ""; - + bar += "|"; } RenderOverhead.renderTag(event.entity, event.x, event.y, event.z, event.renderer, bar, chestplate.thermal); @@ -1289,7 +1253,7 @@ public class ModEventHandlerClient { @SubscribeEvent public void onTextureStitch(TextureStitchEvent.Pre event) { - + if(event.map.getTextureType() == 0) { particleBase = event.map.registerIcon(RefStrings.MODID + ":particle/particle_base"); particleLeaf = event.map.registerIcon(RefStrings.MODID + ":particle/dead_leaf"); @@ -1304,16 +1268,16 @@ public class ModEventHandlerClient { private static final ResourceLocation poster = new ResourceLocation(RefStrings.MODID + ":textures/models/misc/poster.png"); private static final ResourceLocation poster_cat = new ResourceLocation(RefStrings.MODID + ":textures/models/misc/poster_cat.png"); - + @SubscribeEvent public void renderFrame(RenderItemInFrameEvent event) { - + if(event.item != null && event.item.getItem() == ModItems.flame_pony) { event.setCanceled(true); - + double p = 0.0625D; double o = p * 2.75D; - + GL11.glDisable(GL11.GL_LIGHTING); Minecraft.getMinecraft().renderEngine.bindTexture(poster); Tessellator tess = Tessellator.instance; @@ -1325,10 +1289,10 @@ public class ModEventHandlerClient { tess.draw(); GL11.glEnable(GL11.GL_LIGHTING); } - + if(event.item != null && event.item.getItem() == Items.paper) { event.setCanceled(true); - + double p = 0.0625D; double o = p * 2.75D; @@ -1344,16 +1308,16 @@ public class ModEventHandlerClient { GL11.glEnable(GL11.GL_LIGHTING); } } - + @SubscribeEvent public void worldTick(WorldTickEvent event) { - + EntityPlayer player = Minecraft.getMinecraft().thePlayer; - + if(player != null && player.ridingEntity instanceof EntityRailCarRidable && player instanceof EntityClientPlayerMP) { EntityRailCarRidable train = (EntityRailCarRidable) player.ridingEntity; EntityClientPlayerMP client = (EntityClientPlayerMP) player; - + //mojank compensation, because apparently the "this makes the render work" method also determines the fucking input if(!train.shouldRiderSit()) { client.sendQueue.addToSendQueue(new C03PacketPlayer.C05PacketPlayerLook(client.rotationYaw, client.rotationPitch, client.onGround)); @@ -1361,14 +1325,14 @@ public class ModEventHandlerClient { } } } - + @SubscribeEvent public void onOpenGUI(GuiOpenEvent event) { - + if(event.gui instanceof GuiMainMenu && ClientConfig.MAIN_MENU_WACKY_SPLASHES.get()) { GuiMainMenu main = (GuiMainMenu) event.gui; int rand = (int)(Math.random() * 150); - + switch(rand) { case 0: main.splashText = "Floppenheimer!"; break; case 1: main.splashText = "i should dip my balls in sulfuric acid"; break; @@ -1384,7 +1348,7 @@ public class ModEventHandlerClient { case 11: main.splashText = "Do drugs!"; break; case 12: main.splashText = "Imagine being scared by splash texts!"; break; } - + double d = Math.random(); if(d < 0.1) main.splashText = "Redditors aren't people!"; else if(d < 0.2) main.splashText = "Can someone tell me what corrosive fumes the people on Reddit are huffing so I can avoid those more effectively?"; diff --git a/src/main/java/com/hbm/main/ModEventHandlerImpact.java b/src/main/java/com/hbm/main/ModEventHandlerImpact.java index 7f178531f..723410c6d 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerImpact.java +++ b/src/main/java/com/hbm/main/ModEventHandlerImpact.java @@ -1,26 +1,16 @@ package com.hbm.main; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.handler.ImpactWorldHandler; import com.hbm.saveddata.TomSaveData; import com.hbm.world.WorldProviderNTM; - +import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.gameevent.TickEvent.Phase; import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; -import net.minecraft.block.Block; -import net.minecraft.block.BlockBush; -import net.minecraft.block.BlockCrops; -import net.minecraft.block.BlockDoor; -import net.minecraft.block.BlockLeaves; -import net.minecraft.block.BlockLog; +import net.minecraft.block.*; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityWaterMob; @@ -34,50 +24,54 @@ import net.minecraftforge.common.DimensionManager; import net.minecraftforge.event.entity.living.LivingSpawnEvent.CheckSpawn; import net.minecraftforge.event.terraingen.BiomeEvent; import net.minecraftforge.event.terraingen.DecorateBiomeEvent; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType; import net.minecraftforge.event.terraingen.PopulateChunkEvent; import net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate; -import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType; import net.minecraftforge.event.world.WorldEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class ModEventHandlerImpact { - + ////////////////////////////////////////// private static Random rand = new Random(); ////////////////////////////////////////// - + @SubscribeEvent public void worldTick(WorldTickEvent event) { if(event.world != null && !event.world.isRemote && event.phase == Phase.START) { float settle = 1F / 14400000F; // 600 days to completely clear all dust. float cool = 1F / 24000F; // One MC day between initial impact and total darkness. - + ImpactWorldHandler.impactEffects(event.world); TomSaveData data = TomSaveData.forWorld(event.world); - + if(data.dust > 0 && data.fire == 0) { data.dust = Math.max(0, data.dust - settle); data.markDirty(); } - + if(data.fire > 0) { data.fire = Math.max(0, (data.fire - cool)); data.dust = Math.min(1, (data.dust + cool)); data.markDirty(); } - + if(!event.world.loadedEntityList.isEmpty()) { - + List oList = new ArrayList(); oList.addAll(event.world.loadedEntityList); - + for(Object e : oList) { if(e instanceof EntityLivingBase) { EntityLivingBase entity = (EntityLivingBase) e; - + if(entity.worldObj.provider.dimensionId == 0 && data.fire > 0 && data.dust < 0.75f && event.world.getSavedLightValue(EnumSkyBlock.Sky, (int) entity.posX, (int) entity.posY, (int) entity.posZ) > 7) { - + entity.setFire(5); entity.attackEntityFrom(DamageSource.onFire, 2); } @@ -102,9 +96,9 @@ public class ModEventHandlerImpact { @SubscribeEvent public void extinction(CheckSpawn event) { - + TomSaveData data = TomSaveData.forWorld(event.world); - + if(data.impact) { if(!(event.entityLiving instanceof EntityPlayer) && event.entityLiving instanceof EntityLivingBase) { if(event.world.provider.dimensionId == 0) { @@ -126,22 +120,22 @@ public class ModEventHandlerImpact { @SubscribeEvent public void onPopulate(Populate event) { - + if(event.type == Populate.EventType.ANIMALS) { - + TomSaveData data = TomSaveData.forWorld(event.world); - + if(data.impact) { event.setResult(Result.DENY); } } } - + @SubscribeEvent(priority = EventPriority.LOWEST) public void onLoad(WorldEvent.Load event) { - + TomSaveData.resetLastCached(); - + if(GeneralConfig.enableImpactWorldProvider) { DimensionManager.unregisterProviderType(0); DimensionManager.registerProviderType(0, WorldProviderNTM.class, true); @@ -152,18 +146,18 @@ public class ModEventHandlerImpact { public void modifyVillageGen(BiomeEvent.GetVillageBlockID event) { Block b = event.original; Material mat = event.original.getMaterial(); - + TomSaveData data = TomSaveData.getLastCachedOrNull(); - + if(data == null || event.biome == null) { return; } - + if(data.impact) { if(mat == Material.wood || mat == Material.glass || b == Blocks.ladder || b instanceof BlockCrops || b == Blocks.chest || b instanceof BlockDoor || mat == Material.cloth || mat == Material.water || b == Blocks.stone_slab) { event.replacement = Blocks.air; - + } else if(b == Blocks.cobblestone || b == Blocks.stonebrick) { if(rand.nextInt(3) == 1) { event.replacement = Blocks.gravel; @@ -176,19 +170,19 @@ public class ModEventHandlerImpact { event.replacement = Blocks.dirt; } } - + if(event.replacement != null) { event.setResult(Result.DENY); } } - + @SubscribeEvent public void postImpactGeneration(BiomeEvent event) { /// Disables post-impact surface replacement for superflat worlds /// because they are retarded and crash with a NullPointerException if /// you try to look for biome-specific blocks. - TomSaveData data = TomSaveData.getLastCachedOrNull(); //despite forcing the data, we cannot rule out canceling events or custom firing shenanigans + TomSaveData data = TomSaveData.getLastCachedOrNull(); //despite forcing the data, we cannot rule out canceling events or custom firing shenanigans if(data != null && event.biome != null) { if(event.biome.topBlock != null) { if(event.biome.topBlock == Blocks.grass) { @@ -204,18 +198,18 @@ public class ModEventHandlerImpact { @SubscribeEvent public void postImpactDecoration(DecorateBiomeEvent.Decorate event) { - + TomSaveData data = TomSaveData.forWorld(event.world); - + if(data.impact) { EventType type = event.type; - + if(data.dust > 0 || data.fire > 0) { if(type == event.type.TREE || type == event.type.BIG_SHROOM || type == event.type.GRASS || type == event.type.REED || type == event.type.FLOWERS || type == event.type.DEAD_BUSH || type == event.type.CACTUS || type == event.type.PUMPKIN || type == event.type.LILYPAD) { event.setResult(Result.DENY); } - + } else if(data.dust == 0 && data.fire == 0) { if(type == event.type.TREE || type == event.type.BIG_SHROOM || type == event.type.CACTUS) { if(event.world.rand.nextInt(9) == 0) { @@ -224,12 +218,12 @@ public class ModEventHandlerImpact { event.setResult(Result.DENY); } } - + if(type == event.type.GRASS || type == event.type.REED) { event.setResult(Result.DEFAULT); } } - + } else { event.setResult(Result.DEFAULT); } @@ -242,20 +236,20 @@ public class ModEventHandlerImpact { @SubscribeEvent public void populateChunkPost(PopulateChunkEvent.Post event) { - + TomSaveData data = TomSaveData.forWorld(event.world); - + if(data.impact) { Chunk chunk = event.world.getChunkFromChunkCoords(event.chunkX, event.chunkZ); - + for(ExtendedBlockStorage storage : chunk.getBlockStorageArray()) { - + if(storage != null) { - + for(int x = 0; x < 16; ++x) { for(int y = 0; y < 16; ++y) { for(int z = 0; z < 16; ++z) { - + if(data.dust > 0.25 || data.fire > 0) { if(storage.getBlockByExtId(x, y, z) == Blocks.grass) { storage.func_150818_a(x, y, z, ModBlocks.impact_dirt); diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index cc5e5d459..063f5ddfe 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -1,9 +1,5 @@ package com.hbm.main; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; -import org.lwjgl.opengl.GLContext; - import com.hbm.blocks.ICustomBlockHighlight; import com.hbm.config.ClientConfig; import com.hbm.config.RadiationConfig; @@ -15,7 +11,6 @@ import com.hbm.packet.PermaSyncHandler; import com.hbm.render.item.weapon.sedna.ItemRenderWeaponBase; import com.hbm.render.model.ModelMan; import com.hbm.world.biome.BiomeGenCraterBase; - import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; @@ -43,13 +38,16 @@ import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.client.event.DrawBlockHighlightEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors; import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.common.ForgeModContainer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GLContext; public class ModEventHandlerRenderer { @@ -116,11 +114,11 @@ public class ModEventHandlerRenderer { EntityPlayer player = event.entityPlayer; RenderPlayer renderer = event.renderer; - + boolean akimbo = false; ItemStack held = player.getHeldItem(); - + if(held != null) { IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(held, IItemRenderer.ItemRenderType.EQUIPPED); if(customRenderer instanceof ItemRenderWeaponBase) { @@ -132,7 +130,7 @@ public class ModEventHandlerRenderer { } boolean isManly = PermaSyncHandler.boykissers.contains(player.getEntityId()); - + if(akimbo) { ModelBiped biped = renderer.modelBipedMain; renderer.modelArmorChestplate.bipedLeftArm.rotateAngleY = renderer.modelArmor.bipedLeftArm.rotateAngleY = biped.bipedLeftArm.rotateAngleY = @@ -159,7 +157,7 @@ public class ModEventHandlerRenderer { if(f6 > 1.0F) { f6 = 1.0F; } - + manlyModel.render(event.entityPlayer, f7, f6, yawWrapped, yaw, pitch, 0.0625F, renderer); } } @@ -176,14 +174,14 @@ public class ModEventHandlerRenderer { } } } - + @SubscribeEvent public void onRenderHeldGun(RenderPlayerEvent.Pre event) { EntityPlayer player = event.entityPlayer; RenderPlayer renderer = event.renderer; ItemStack held = player.getHeldItem(); - + if(held != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT) { renderer.modelBipedMain.aimedBow = true; renderer.modelArmor.aimedBow = true; @@ -210,7 +208,7 @@ public class ModEventHandlerRenderer { if(held == null) return; IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(held, IItemRenderer.ItemRenderType.EQUIPPED); - + if(customRenderer instanceof ItemRenderWeaponBase) { ItemRenderWeaponBase renderWeapon = (ItemRenderWeaponBase) customRenderer; if(renderWeapon.isAkimbo()) { @@ -251,16 +249,16 @@ public class ModEventHandlerRenderer { if(manlyModel == null) manlyModel = new ModelMan(); - + event.renderItem = false; float f2 = 1.3333334F; ItemStack held = player.getHeldItem(); - + if(held == null) return; - + GL11.glPushMatrix(); manlyModel.rightArm.postRender(0.0625F); GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); @@ -358,16 +356,16 @@ public class ModEventHandlerRenderer { default: return null; } } - + @SubscribeEvent public void onDrawHighlight(DrawBlockHighlightEvent event) { MovingObjectPosition mop = event.target; - + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { Block b = event.player.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ); if(b instanceof ICustomBlockHighlight) { ICustomBlockHighlight cus = (ICustomBlockHighlight) b; - + if(cus.shouldDrawHighlight(event.player.worldObj, mop.blockX, mop.blockY, mop.blockZ)) { cus.drawHighlight(event, event.player.worldObj, mop.blockX, mop.blockY, mop.blockZ); event.setCanceled(true); @@ -445,17 +443,17 @@ public class ModEventHandlerRenderer { GL11.glPopMatrix(); } }*/ - + float renderSoot = 0; - + @SubscribeEvent public void worldTick(WorldTickEvent event) { - + if(event.phase == event.phase.START && RadiationConfig.enableSootFog) { float step = 0.05F; float soot = PermaSyncHandler.pollution[PollutionType.SOOT.ordinal()]; - + if(Math.abs(renderSoot - soot) < step) { renderSoot = soot; } else if(renderSoot < soot) { @@ -470,7 +468,7 @@ public class ModEventHandlerRenderer { public void thickenFog(FogDensity event) { float soot = (float) (renderSoot - RadiationConfig.sootFogThreshold); if(soot > 0 && RadiationConfig.enableSootFog) { - + float farPlaneDistance = (float) (Minecraft.getMinecraft().gameSettings.renderDistanceChunks * 16); float fogDist = farPlaneDistance / (1 + soot * 5F / (float) RadiationConfig.sootFogDivisor); GL11.glFogf(GL11.GL_FOG_START, 0); @@ -484,10 +482,10 @@ public class ModEventHandlerRenderer { event.setCanceled(true); } } - + @SubscribeEvent(priority = EventPriority.LOW) public void tintFog(FogColors event) { - + EntityPlayer player = MainRegistry.proxy.me(); if(player.worldObj.getBlock((int) Math.floor(player.posX), (int) Math.floor(player.posY), (int) Math.floor(player.posZ)).getMaterial() != Material.water) { Vec3 color = getFogBlendColor(player.worldObj, (int) Math.floor(player.posX), (int) Math.floor(player.posZ), event.red, event.green, event.blue, event.renderPartialTicks); @@ -497,7 +495,7 @@ public class ModEventHandlerRenderer { event.blue = (float) color.zCoord; } } - + float soot = (float) (renderSoot - RadiationConfig.sootFogThreshold); float sootColor = 0.15F; float sootReq = (float) RadiationConfig.sootFogDivisor; @@ -508,10 +506,10 @@ public class ModEventHandlerRenderer { event.blue = event.blue * (1 - interp) + sootColor * interp; } } - + @SubscribeEvent public void onRenderHUD(RenderGameOverlayEvent.Pre event) { - + if(event.type == ElementType.HOTBAR && (ModEventHandlerClient.shakeTimestamp + ModEventHandlerClient.shakeDuration - System.currentTimeMillis()) > 0 && ClientConfig.NUKE_HUD_SHAKE.get()) { double mult = (ModEventHandlerClient.shakeTimestamp + ModEventHandlerClient.shakeDuration - System.currentTimeMillis()) / (double) ModEventHandlerClient.shakeDuration * 2; double horizontal = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.02), -0.7, 0.7) * 15; @@ -522,13 +520,13 @@ public class ModEventHandlerRenderer { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { - + //can't use plaxer.getHeldItem() here because the item rendering persists for a few frames after hitting the switch key ItemStack toRender = Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender; - + if(toRender != null) { IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(toRender, ItemRenderType.EQUIPPED_FIRST_PERSON); - + if(renderer instanceof ItemRenderWeaponBase) { ((ItemRenderWeaponBase) renderer).setPerspectiveAndRender(toRender, event.partialTicks); event.setCanceled(true); @@ -542,10 +540,10 @@ public class ModEventHandlerRenderer { private static Vec3 fogRGBMultiplier; private static boolean doesBiomeApply = false; private static long fogTimer = 0; - + /** Same procedure as getting the blended sky color but for fog */ public static Vec3 getFogBlendColor(World world, int playerX, int playerZ, float red, float green, float blue, double partialTicks) { - + long millis = System.currentTimeMillis() - fogTimer; if(playerX == fogX && playerZ == fogZ && fogInit && millis < 3000) return fogRGBMultiplier; @@ -554,7 +552,7 @@ public class ModEventHandlerRenderer { GameSettings settings = Minecraft.getMinecraft().gameSettings; int[] ranges = ForgeModContainer.blendRanges; int distance = 0; - + if(settings.fancyGraphics && settings.renderDistanceChunks >= 0) { distance = ranges[Math.min(settings.renderDistanceChunks, ranges.length - 1)]; } @@ -562,10 +560,10 @@ public class ModEventHandlerRenderer { float r = 0F; float g = 0F; float b = 0F; - + int divider = 0; doesBiomeApply = false; - + for(int x = -distance; x <= distance; x++) { for(int z = -distance; z <= distance; z++) { BiomeGenBase biome = world.getBiomeGenForCoords(playerX + x, playerZ + z); @@ -579,7 +577,7 @@ public class ModEventHandlerRenderer { fogX = playerX; fogZ = playerZ; - + if(doesBiomeApply) { fogRGBMultiplier = Vec3.createVectorHelper(r / divider, g / divider, b / divider); } else { @@ -588,25 +586,25 @@ public class ModEventHandlerRenderer { return fogRGBMultiplier; } - + /** Returns the current biome's fog color adjusted for brightness if in a crater, or the world's cached fog color if not */ public static Vec3 getBiomeFogColors(World world, BiomeGenBase biome, float r, float g, float b, double partialTicks) { - + if(biome instanceof BiomeGenCraterBase) { int color = biome.getSkyColorByTemp(biome.temperature); r = ((color & 0xff0000) >> 16) / 255F; g = ((color & 0x00ff00) >> 8) / 255F; b = (color & 0x0000ff) / 255F; - + float celestialAngle = world.getCelestialAngle((float) partialTicks); float skyBrightness = MathHelper.clamp_float(MathHelper.cos(celestialAngle * (float) Math.PI * 2.0F) * 2.0F + 0.5F, 0F, 1F); r *= skyBrightness; g *= skyBrightness; b *= skyBrightness; - + doesBiomeApply = true; } - + return Vec3.createVectorHelper(r, g, b); } } diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 371573df3..6cfe07db3 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -1,7 +1,9 @@ package com.hbm.main; -import java.util.List; - +import codechicken.nei.api.API; +import codechicken.nei.api.IConfigureNEI; +import codechicken.nei.api.IHighlightHandler; +import codechicken.nei.api.ItemInfo.Layout; import codechicken.nei.recipe.*; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; @@ -10,19 +12,16 @@ import com.hbm.handler.nei.CustomMachineHandler; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBattery; import com.hbm.lib.RefStrings; - -import codechicken.nei.api.API; -import codechicken.nei.api.IConfigureNEI; -import codechicken.nei.api.IHighlightHandler; -import codechicken.nei.api.ItemInfo.Layout; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import java.util.List; + public class NEIConfig implements IConfigureNEI { - + @Override public void loadConfig() { for (TemplateRecipeHandler handler: NEIRegistry.listAllHandlers()) { @@ -32,7 +31,7 @@ public class NEIConfig implements IConfigureNEI { for(CustomMachineConfigJSON.MachineConfiguration conf : CustomMachineConfigJSON.niceList) { registerHandlerBypass(new CustomMachineHandler(conf)); } - + //Some things are even beyond my control...or are they? API.hideItem(ItemBattery.getEmptyBattery(ModItems.memory)); API.hideItem(ItemBattery.getFullBattery(ModItems.memory)); @@ -77,7 +76,7 @@ public class NEIConfig implements IConfigureNEI { API.hideItem(new ItemStack(ModBlocks.spotlight_fluoro_off)); API.hideItem(new ItemStack(ModBlocks.spotlight_halogen_off)); API.hideItem(new ItemStack(ModBlocks.spotlight_beam)); - + API.registerHighlightIdentifier(ModBlocks.plushie, new IHighlightHandler() { @Override public ItemStack identifyHighlight(World world, EntityPlayer player, MovingObjectPosition mop) { int x = mop.blockX; @@ -93,12 +92,12 @@ public class NEIConfig implements IConfigureNEI { @Override public List handleTextData(ItemStack itemStack, World world, EntityPlayer player, MovingObjectPosition mop, List currenttip, Layout layout) { return currenttip; } }); } - + public static void registerHandler(Object o) { API.registerRecipeHandler((ICraftingHandler) o); API.registerUsageHandler((IUsageHandler) o); } - + /** Bypasses the utterly useless restriction of one registered handler per class */ public static void registerHandlerBypass(Object o) { GuiCraftingRecipe.craftinghandlers.add((ICraftingHandler) o); diff --git a/src/main/java/com/hbm/main/NEIRegistry.java b/src/main/java/com/hbm/main/NEIRegistry.java index 3899820c8..7db2caf5b 100644 --- a/src/main/java/com/hbm/main/NEIRegistry.java +++ b/src/main/java/com/hbm/main/NEIRegistry.java @@ -1,19 +1,18 @@ package com.hbm.main; +import codechicken.nei.recipe.TemplateRecipeHandler; +import com.hbm.config.VersatileConfig; +import com.hbm.handler.nei.*; + import java.util.ArrayList; import java.util.List; -import com.hbm.config.VersatileConfig; -import com.hbm.handler.nei.*; - -import codechicken.nei.recipe.TemplateRecipeHandler; - public class NEIRegistry { public static List handlers = new ArrayList(); - + public static List listAllHandlers() { - + if(!handlers.isEmpty()) return handlers; handlers.add(new AnvilRecipeHandler()); @@ -70,7 +69,7 @@ public class NEIRegistry { //this shit comes last handlers.add(new FluidRecipeHandler()); - + return handlers; } } diff --git a/src/main/java/com/hbm/main/NetworkHandler.java b/src/main/java/com/hbm/main/NetworkHandler.java index 99d8a4e8c..bd9caa725 100644 --- a/src/main/java/com/hbm/main/NetworkHandler.java +++ b/src/main/java/com/hbm/main/NetworkHandler.java @@ -1,24 +1,104 @@ package com.hbm.main; +import com.hbm.packet.PrecompiledPacket; import cpw.mods.fml.common.network.FMLEmbeddedChannel; import cpw.mods.fml.common.network.FMLOutboundHandler; import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.simpleimpl.*; +import cpw.mods.fml.common.network.internal.FMLProxyPacket; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.SimpleChannelHandlerWrapper; import cpw.mods.fml.relauncher.Side; +import gnu.trove.map.hash.TByteObjectHashMap; +import gnu.trove.map.hash.TObjectByteHashMap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.CodecException; +import io.netty.handler.codec.MessageToMessageCodec; import net.minecraft.entity.player.EntityPlayerMP; +import java.lang.ref.WeakReference; import java.util.EnumMap; +import java.util.List; -// Essentially the `SimpleNetworkWrapper` from FML but doesn't flush the packets immediately. +import static cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.INBOUNDPACKETTRACKER; + +// Essentially the `SimpleNetworkWrapper` from FML but doesn't flush the packets immediately. Also now with a custom codec! public class NetworkHandler { + // Network codec for allowing packets to be "precompiled". + @ChannelHandler.Sharable + private static class PrecompilingNetworkCodec extends MessageToMessageCodec { + + private final TByteObjectHashMap> discriminators = new TByteObjectHashMap<>(); + private final TObjectByteHashMap> types = new TObjectByteHashMap<>(); + + public void addDiscriminator(int discriminator, Class type) { + discriminators.put((byte) discriminator, type); + types.put(type, (byte) discriminator); + } + + @Override + public void handlerAdded(ChannelHandlerContext ctx) { + ctx.attr(INBOUNDPACKETTRACKER).set(new ThreadLocal<>()); + } + + @Override + protected void encode(ChannelHandlerContext ctx, Object msg, List out) { + ByteBuf outboundBuf = PooledByteBufAllocator.DEFAULT.heapBuffer(); + byte discriminator; + Class msgClass = msg.getClass(); + discriminator = types.get(msgClass); + outboundBuf.writeByte(discriminator); + + if(msg instanceof PrecompiledPacket) // Precompiled packet to avoid race conditions/speed up serialization. + outboundBuf.writeBytes(((PrecompiledPacket) msg).getPreBuf()); + else if(msg instanceof IMessage) + ((IMessage) msg).toBytes(outboundBuf); + else + throw new CodecException("Unknown packet codec requested during encoding, expected IMessage/PrecompiledPacket, got " + msg.getClass().getName()); + + FMLProxyPacket proxy = new FMLProxyPacket(Unpooled.buffer().writeBytes(outboundBuf), ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get()); + outboundBuf.release(); + WeakReference ref = ctx.attr(INBOUNDPACKETTRACKER).get().get(); + FMLProxyPacket old = ref == null ? null : ref.get(); + if (old != null) { + proxy.setDispatcher(old.getDispatcher()); + } + out.add(proxy); + } + + @Override + protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List out) throws Exception { + ByteBuf inboundBuf = msg.payload(); + byte discriminator = inboundBuf.readByte(); + Class originalMsgClass = discriminators.get(discriminator); + + if(originalMsgClass == null) + throw new CodecException("Undefined message for discriminator " + discriminator + " in channel " + msg.channel()); + + Object newMsg = originalMsgClass.newInstance(); + ctx.attr(INBOUNDPACKETTRACKER).get().set(new WeakReference<>(msg)); + + if(newMsg instanceof IMessage) // pretty much always the case + ((IMessage) newMsg).fromBytes(inboundBuf.slice()); + else + throw new CodecException("Unknown packet codec requested during decoding, expected IMessage/PrecompiledPacket, got " + msg.getClass().getName()); + + out.add(newMsg); + } + } + private static FMLEmbeddedChannel clientChannel; private static FMLEmbeddedChannel serverChannel; - private static SimpleIndexedCodec packetCodec; + private static PrecompilingNetworkCodec packetCodec; public NetworkHandler(String name) { - packetCodec = new SimpleIndexedCodec(); + packetCodec = new PrecompilingNetworkCodec(); EnumMap channels = NetworkRegistry.INSTANCE.newChannel(name, packetCodec); clientChannel = channels.get(Side.CLIENT); serverChannel = channels.get(Side.SERVER); @@ -27,18 +107,15 @@ public class NetworkHandler { public void registerMessage(Class> messageHandler, Class requestMessageType, int discriminator, Side side) { packetCodec.addDiscriminator(discriminator, requestMessageType); + FMLEmbeddedChannel channel; if(side.isClient()) channel = clientChannel; else channel = serverChannel; - String type = channel.findChannelHandlerNameForType(SimpleIndexedCodec.class); + String type = channel.findChannelHandlerNameForType(PrecompilingNetworkCodec.class); SimpleChannelHandlerWrapper handler; - if (side == Side.SERVER) { - handler = new SimpleChannelHandlerWrapper<>(messageHandler, side, requestMessageType); - } else { - handler = new SimpleChannelHandlerWrapper<>(messageHandler, side, requestMessageType); - } + handler = new SimpleChannelHandlerWrapper<>(messageHandler, side, requestMessageType); channel.pipeline().addAfter(type, messageHandler.getName(), handler); } @@ -56,14 +133,18 @@ public class NetworkHandler { serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION); serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId); serverChannel.write(message); - } public void sendToAllAround(IMessage message, NetworkRegistry.TargetPoint point) { serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); serverChannel.write(message); + } + public void sendToAllAround(ByteBuf message, NetworkRegistry.TargetPoint point) { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + serverChannel.write(message); } public void sendTo(IMessage message, EntityPlayerMP player) { diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 4dab49328..099eaf2de 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1,7 +1,5 @@ package com.hbm.main; -import java.util.HashMap; - import com.hbm.animloader.AnimatedModel; import com.hbm.animloader.Animation; import com.hbm.animloader.ColladaLoader; @@ -10,15 +8,16 @@ import com.hbm.render.anim.AnimationLoader; import com.hbm.render.anim.BusAnimation; import com.hbm.render.loader.HFRWavefrontObject; import com.hbm.render.loader.IModelCustomNamed; - import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; +import java.util.HashMap; + public class ResourceManager { - + ////Obj TEs - + //Turrets public static final IModelCustom turret_chekhov = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_chekhov.obj")).asVBO(); public static final IModelCustom turret_jeremy = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_jeremy.obj")).asVBO(); @@ -33,14 +32,14 @@ public class ResourceManager { public static final IModelCustom turret_sentry = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_sentry.obj")).asVBO(); public static final IModelCustom turret_howard_damaged = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_howard_damaged.obj")).asVBO(); - + //Heaters public static final IModelCustom heater_firebox = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/firebox.obj"), false).asVBO(); public static final IModelCustom heater_oven = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/heating_oven.obj"), false).asVBO(); public static final IModelCustom heater_oilburner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/oilburner.obj")).asVBO(); public static final IModelCustom heater_electric = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/electric_heater.obj"), false).asVBO(); public static final IModelCustom heater_heatex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/heatex.obj")).asVBO(); - + //Heat Engines public static final IModelCustom stirling = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/stirling.obj")); public static final IModelCustom sawmill = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/sawmill.obj")); @@ -57,18 +56,18 @@ public class ResourceManager { public static final IModelCustom furnace_iron = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_iron.obj")); public static final IModelCustom furnace_steel = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_steel.obj")); public static final IModelCustom combination_oven = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/combination_oven.obj")); - + //Landmines public static final IModelCustom mine_ap = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mine_ap.obj")); public static final IModelCustom mine_he = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mine_he.obj")); public static final IModelCustom mine_marelet = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/marelet.obj")); public static final IModelCustom mine_fat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mine_fat.obj")); - + //Oil Pumps public static final IModelCustom derrick = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/derrick.obj")).asVBO(); public static final IModelCustom pumpjack = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/pumpjack.obj")).asVBO(); public static final IModelCustom fracking_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fracking_tower.obj")).asVBO(); - + //Refinery public static final IModelCustom refinery = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/refinery.obj")).asVBO(); public static final IModelCustom vacuum_distill = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/vacuum_distill.obj")).asVBO(); @@ -83,7 +82,7 @@ public class ResourceManager { public static final IModelCustom compressor = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/compressor.obj")).asVBO(); public static final IModelCustom coker = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/coker.obj")).asVBO(); public static final IModelCustom pyrooven = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/pyrooven.obj")).asVBO(); - + //Flare Stack public static final IModelCustom oilflare = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/flare_stack.obj")).asVBO(); public static final IModelCustom chimney_brick = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chimney_brick.obj")).asVBO(); @@ -94,50 +93,50 @@ public class ResourceManager { public static final IModelCustom fluidtank_exploded = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/fluidtank_exploded.obj")).asVBO(); public static final IModelCustom bat9000 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/bat9000.obj")).asVBO(); public static final IModelCustom orbus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/orbus.obj")).asVBO(); - + //Turbofan public static final IModelCustom turbofan = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbofan.obj")).asVBO(); - + //Gas Turbine public static final IModelCustom turbinegas = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbinegas.obj")).asVBO(); - + //Pumps public static final IModelCustom pump = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/pump.obj")).asVBO(); - + //Large Turbine public static final IModelCustom steam_engine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/steam_engine.obj")).asVBO(); public static final IModelCustom turbine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbine.obj")); public static final IModelCustom chungus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chungus.obj")).asVBO(); - + //Cooling Tower public static final IModelCustom tower_small = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_small.obj")).asVBO(); public static final IModelCustom tower_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_large.obj")).asVBO(); public static final IModelCustom condenser = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/condenser.obj")).asVBO(); - + //Wood burner public static final IModelCustom wood_burner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/wood_burner.obj")); - + //IGen public static final IModelCustom igen = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/igen.obj")); - + //Combustion Engine public static final IModelCustom dieselgen = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/dieselgen.obj")); public static final IModelCustom combustion_engine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/combustion_engine.obj")).asVBO(); - + //Press public static final IModelCustom press_body = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/press_body.obj")); public static final IModelCustom press_head = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/press_head.obj")); public static final IModelCustom epress_body = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/epress_body.obj")); public static final IModelCustom epress_head = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/epress_head.obj")); public static final IModelCustom conveyor_press = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/conveyor_press.obj")); - + //Assembler public static final IModelCustom assembler_body = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_body.obj")); public static final IModelCustom assembler_cog = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_cog.obj")); public static final IModelCustom assembler_slider = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_slider.obj")); public static final IModelCustom assembler_arm = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_arm.obj")); public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")); - + //Chemplant public static final IModelCustom chemplant_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_body.obj")); public static final IModelCustom chemplant_spinner = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_spinner.obj")); @@ -145,114 +144,114 @@ public class ResourceManager { public static final IModelCustom chemplant_fluid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluid.hmf")); public static final IModelCustom chemplant_fluidcap = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluidcap.hmf")); public static final IModelCustom chemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemfac.obj")); - + //Mixer public static final IModelCustom mixer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mixer.obj")); - + //Arc Welder public static final IModelCustom arc_welder = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/arc_welder.obj"), false).asVBO(); - + //Solderer public static final IModelCustom soldering_station = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/soldering_station.obj"), false).asVBO(); - + //Arc Furnace public static final IModelCustom arc_furnace = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/arc_furnace.obj")).asVBO(); - + //F6 TANKS public static final IModelCustom tank = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/tank.obj")); - + //Centrifuge public static final IModelCustom centrifuge = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/centrifuge.obj")).asVBO(); public static final IModelCustom gascent = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/gascent.obj")).asVBO(); public static final IModelCustom silex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/silex.obj")).asVBO(); public static final IModelCustom fel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fel.obj")).asVBO(); - + //Magnusson Device public static final IModelCustom microwave = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/microwave.obj")); - + //Big Man Johnson public static final IModelCustom autosaw = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/autosaw.obj")); - + //Mining Drill public static final IModelCustom mining_drill = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mining_drill.obj")).asVBO(); public static final IModelCustom ore_slopper = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/ore_slopper.obj")).asVBO(); - + //Laser Miner public static final IModelCustom mining_laser = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mining_laser.obj")).asVBO(); - + //Crystallizer public static final IModelCustom crystallizer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/acidizer.obj")).asVBO(); - + //Cyclotron public static final IModelCustom cyclotron = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/cyclotron.obj")).asVBO(); - + //Exposure Chamber public static final IModelCustom exposure_chamber = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/exposure_chamber.obj")).asVBO(); - + //RTG public static final IModelCustom rtg = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/rtg.obj")); //Waste Drum public static final IModelCustom waste_drum = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/drum.obj")); - + //Deuterium Tower public static final IModelCustom deuterium_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/machine_deuterium_tower.obj")).asVBO(); - + //Dark Matter Core public static final IModelCustom dfc_emitter = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/core_emitter.obj")); public static final IModelCustom dfc_receiver = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/core_receiver.obj")); public static final IModelCustom dfc_injector = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/core_injector.obj")); - + //Fan public static final IModelCustom fan = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/fan.obj")); - + //Piston Inserter public static final IModelCustom piston_inserter = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/piston_inserter.obj")); - + //Sphere public static final IModelCustom sphere_ruv = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/sphere_ruv.obj")); public static final IModelCustom sphere_iuv = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/sphere_iuv.obj")); public static final IModelCustom sphere_uv = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/sphere_uv.obj")); public static final IModelCustom sphere_uv_anim = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/sphere_uv.hmf")); - + //Meteor public static final IModelCustom meteor = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/weapons/meteor.obj")); - + //Radgen public static final IModelCustom radgen = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/radgen.obj")); - + //Small Reactor public static final IModelCustom reactor_small_base = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/reactors/reactor_small_base.obj")); public static final IModelCustom reactor_small_rods = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/reactors/reactor_small_rods.obj")); - + //Breeder public static final IModelCustom breeder = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/reactors/breeder.obj")); - + //ITER public static final IModelCustom iter = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/reactors/iter.obj")).asVBO(); - + //ICF public static final IModelCustom icf = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/reactors/icf.obj")).asVBO(); - + //ICF public static final IModelCustom lpw2 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/lpw2.obj")).asVBO(); - + //Watz public static final IModelCustom watz = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/reactors/watz.obj")).asVBO(); public static final IModelCustom watz_pump = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/watz_pump.obj")).asVBO(); - + //FENSU public static final IModelCustom fensu = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fensu.obj")).asVBO(); - + //Radar public static final IModelCustom radar_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/radar_base.obj"), false).asVBO(); public static final IModelCustom radar = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/radar.obj"), false).asVBO(); public static final IModelCustom radar_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/radar_large.obj"), false).asVBO(); public static final IModelCustom radar_screen = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/radar_screen.obj"), false).asVBO(); - + //Forcefield public static final IModelCustom forcefield_top = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/forcefield_top.obj")); - + //Bombs public static final IModelCustom bomb_gadget = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/gadget.obj")).asVBO(); public static final IModelCustom bomb_boy = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/LilBoy1.obj")); @@ -280,20 +279,20 @@ public class ResourceManager { //SatDock public static final IModelCustom satDock = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/sat_dock.obj")); - + //Solar Tower public static final IModelCustom solar_boiler = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/solar_boiler.obj")).asVBO(); public static final IModelCustom solar_mirror = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/solar_mirror.obj")); - + //Drain public static final IModelCustom drain = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/drain.obj")); - + //Vault Door public static final IModelCustom vault_cog = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vault_cog.obj")); public static final IModelCustom vault_frame = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vault_frame.obj")); public static final IModelCustom vault_teeth = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vault_teeth.obj")); public static final IModelCustom vault_label = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vault_label.obj")); - + //Blast Door public static final IModelCustom blast_door_base = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blast_door_base.obj")); public static final IModelCustom blast_door_tooth = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blast_door_tooth.obj")); @@ -341,13 +340,13 @@ public class ResourceManager { public static final ResourceLocation silo_hatch_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch_large.png"); public static IModelCustomNamed silo_hatch_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch_large.obj")).asVBO(); - + //Lights public static final IModelCustom lantern = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/lantern.obj")); public static final IModelCustom cage_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/cage_lamp.obj")); public static final IModelCustom fluorescent_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/fluorescent_lamp.obj")); public static final IModelCustom flood_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/flood_lamp.obj")); - + //Tesla Coil public static final IModelCustom tesla = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/tesla.obj")); public static final IModelCustom teslacrab = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mobs/teslacrab.obj")); @@ -359,43 +358,43 @@ public class ResourceManager { public static final IModelCustom siege_ufo = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/siege_ufo.obj")); public static final IModelCustom glyphid = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/glyphid.obj")); public static final IModelCustom drone = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mobs/quadcopter.obj")); - + //ZIRNOX public static final IModelCustom zirnox = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/zirnox.obj")).asVBO(); public static final IModelCustom zirnox_destroyed = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/zirnox_destroyed.obj")).asVBO(); - + //Belt public static final IModelCustom arrow = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/arrow.obj")); - + //Network public static final IModelCustom connector = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/network/connector.obj")); public static final IModelCustom pylon_medium = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/network/pylon_medium.obj")); public static final IModelCustom pylon_large = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/network/pylon_large.obj")); public static final IModelCustom substation = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/network/substation.obj")); - + //Radiolysis public static final IModelCustom radiolysis = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/radiolysis.obj")); - + //RotaryFurnace public static final IModelCustom rotary_furnace = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/rotary_furnace.obj")).asVBO(); - + //Electrolyser public static final IModelCustom electrolyser = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/electrolyser.obj")).asVBO(); - + //Charging Station public static final IModelCustom charger = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/blocks/charger.obj")); - + //DecoContainer (File Cabinet for now) public static final IModelCustom file_cabinet = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/file_cabinet.obj")); - + //TELEX public static final IModelCustom telex = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/telex.obj")); - + ////Textures TEs - + public static final ResourceLocation universal = new ResourceLocation(RefStrings.MODID, "textures/models/TheGadget3_.png"); public static final ResourceLocation universal_bright = new ResourceLocation(RefStrings.MODID, "textures/models/turbofan_blades.png"); - + public static final ResourceLocation turret_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/base.png"); public static final ResourceLocation turret_base_friendly_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/base_friendly.png"); public static final ResourceLocation turret_carriage_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/carriage.png"); @@ -424,7 +423,7 @@ public class ResourceManager { public static final ResourceLocation turret_carriage_ciws_rusted = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/rusted/carriage_ciws.png"); public static final ResourceLocation turret_howard_rusted = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/rusted/howard.png"); public static final ResourceLocation turret_howard_barrels_rusted = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/rusted/howard_barrels.png"); - + public static final ResourceLocation brandon_explosive = new ResourceLocation(RefStrings.MODID, "textures/models/turrets/brandon_drum.png"); //Landmines @@ -433,7 +432,7 @@ public class ResourceManager { public static final ResourceLocation mine_marelet_tex = new ResourceLocation(RefStrings.MODID, "textures/models/bombs/mine_marelet.png"); public static final ResourceLocation mine_shrap_tex = new ResourceLocation(RefStrings.MODID, "textures/models/mine_shrap.png"); public static final ResourceLocation mine_fat_tex = new ResourceLocation(RefStrings.MODID, "textures/models/mine_fat.png"); - + //Heaters public static final ResourceLocation heater_firebox_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/firebox.png"); public static final ResourceLocation heater_oven_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/heating_oven.png"); @@ -441,7 +440,7 @@ public class ResourceManager { public static final ResourceLocation heater_oilburner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/oilburner.png"); public static final ResourceLocation heater_electric_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/electric_heater.png"); public static final ResourceLocation heater_heatex_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/heater_heatex.png"); - + //Heat Engines public static final ResourceLocation stirling_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling.png"); public static final ResourceLocation stirling_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling_steel.png"); @@ -459,12 +458,12 @@ public class ResourceManager { public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png"); public static final ResourceLocation furnace_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_steel.png"); public static final ResourceLocation combination_oven_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/combination_oven.png"); - + //Oil Pumps public static final ResourceLocation derrick_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/derrick.png"); public static final ResourceLocation pumpjack_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/pumpjack.png"); public static final ResourceLocation fracking_tower_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fracking_tower.png"); - + //Refinery public static final ResourceLocation refinery_tex = new ResourceLocation(RefStrings.MODID, "textures/models/refinery.png"); public static final ResourceLocation vacuum_distill_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/vacuum_distill.png"); @@ -478,27 +477,27 @@ public class ResourceManager { public static final ResourceLocation compressor_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/compressor.png"); public static final ResourceLocation coker_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/coker.png"); public static final ResourceLocation pyrooven_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/pyrooven.png"); - + //Flare Stack public static final ResourceLocation oilflare_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/flare_stack.png"); public static final ResourceLocation chimney_brick_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chimney_brick.png"); public static final ResourceLocation chimney_industrial_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chimney_industrial.png"); - + //Tank public static final ResourceLocation tank_tex = new ResourceLocation(RefStrings.MODID, "textures/models/tank.png"); public static final ResourceLocation tank_inner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/tank/tank_inner.png"); public static final ResourceLocation tank_label_tex = new ResourceLocation(RefStrings.MODID, "textures/models/tank/tank_NONE.png"); public static final ResourceLocation bat9000_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/bat9000.png"); public static final ResourceLocation orbus_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/orbus.png"); - + //Turbofan public static final ResourceLocation turbofan_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/turbofan.png"); public static final ResourceLocation turbofan_back_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/turbofan_back.png"); public static final ResourceLocation turbofan_afterburner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/turbofan_afterburner.png"); - + //Gas Turbine public static final ResourceLocation turbinegas_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/turbinegas.png"); - + //Pumps public static final ResourceLocation pump_steam_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/pump_steam.png"); public static final ResourceLocation pump_electric_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/pump_electric.png"); @@ -507,29 +506,29 @@ public class ResourceManager { public static final ResourceLocation steam_engine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/steam_engine.png"); public static final ResourceLocation turbine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/turbine.png"); public static final ResourceLocation chungus_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chungus.png"); - + //Cooling Tower public static final ResourceLocation tower_small_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/tower_small.png"); public static final ResourceLocation tower_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/tower_large.png"); public static final ResourceLocation condenser_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/condenser.png"); - + //Deuterium Tower public static final ResourceLocation deuterium_tower_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/machine_deuterium_tower.png"); - + //Wood Burner public static final ResourceLocation wood_burner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/wood_burner.png"); - + //IGen public static final ResourceLocation igen_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/igen.png"); public static final ResourceLocation igen_rotor = new ResourceLocation(RefStrings.MODID, "textures/models/machines/igen_rotor.png"); public static final ResourceLocation igen_cog = new ResourceLocation(RefStrings.MODID, "textures/models/machines/igen_cog.png"); public static final ResourceLocation igen_arm = new ResourceLocation(RefStrings.MODID, "textures/models/machines/igen_arm.png"); public static final ResourceLocation igen_pistons = new ResourceLocation(RefStrings.MODID, "textures/models/machines/igen_pistons.png"); - + //Combustion Engine public static final ResourceLocation dieselgen_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/dieselgen.png"); public static final ResourceLocation combustion_engine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/combustion_engine.png"); - + //Press public static final ResourceLocation press_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/press_body.png"); public static final ResourceLocation press_head_tex = new ResourceLocation(RefStrings.MODID, "textures/models/press_head.png"); @@ -537,49 +536,49 @@ public class ResourceManager { public static final ResourceLocation epress_head_tex = new ResourceLocation(RefStrings.MODID, "textures/models/epress_head.png"); public static final ResourceLocation conveyor_press_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/conveyor_press.png"); public static final ResourceLocation conveyor_press_belt_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/conveyor_press_belt.png"); - + //Assembler public static final ResourceLocation assembler_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_base_new.png"); public static final ResourceLocation assembler_cog_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_cog_new.png"); public static final ResourceLocation assembler_slider_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_slider_new.png"); public static final ResourceLocation assembler_arm_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_arm_new.png"); public static final ResourceLocation assemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assemfac.png"); - + //Chemplant public static final ResourceLocation chemplant_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/chemplant_base_new.png"); public static final ResourceLocation chemplant_spinner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/chemplant_spinner_new.png"); public static final ResourceLocation chemplant_piston_tex = new ResourceLocation(RefStrings.MODID, "textures/models/chemplant_piston_new.png"); public static final ResourceLocation chemplant_fluid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/lavabase_small.png"); public static final ResourceLocation chemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemfac.png"); - + //Mixer public static final ResourceLocation mixer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mixer.png"); - + //Welder public static final ResourceLocation arc_welder_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/arc_welder.png"); - + //Solderer public static final ResourceLocation soldering_station_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/soldering_station.png"); - + //Arc Furnace public static final ResourceLocation arc_furnace_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/arc_furnace.png"); //F6 TANKS public static final ResourceLocation uf6_tex = new ResourceLocation(RefStrings.MODID, "textures/models/UF6Tank.png"); public static final ResourceLocation puf6_tex = new ResourceLocation(RefStrings.MODID, "textures/models/PUF6Tank.png"); - + //Centrifuge public static final ResourceLocation centrifuge_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/centrifuge.png"); public static final ResourceLocation gascent_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/gascent.png"); public static final ResourceLocation fel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fel.png"); public static final ResourceLocation silex_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/silex.png"); - + //Magnusson Device public static final ResourceLocation microwave_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/microwave.png"); - + //Big Man Johnson public static final ResourceLocation autosaw_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/autosaw.png"); - + //Mining Drill public static final ResourceLocation mining_drill_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mining_drill.png"); public static final ResourceLocation ore_slopper_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/ore_slopper.png"); @@ -588,10 +587,10 @@ public class ResourceManager { public static final ResourceLocation mining_laser_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mining_laser_base.png"); public static final ResourceLocation mining_laser_pivot_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mining_laser_pivot.png"); public static final ResourceLocation mining_laser_laser_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mining_laser_laser.png"); - + //Crystallizer public static final ResourceLocation crystallizer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/acidizer.png"); - + //Cyclotron public static final ResourceLocation cyclotron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/cyclotron.png"); public static final ResourceLocation cyclotron_ashes = new ResourceLocation(RefStrings.MODID, "textures/models/machines/cyclotron_ashes.png"); @@ -602,40 +601,40 @@ public class ResourceManager { public static final ResourceLocation cyclotron_gavel_filled = new ResourceLocation(RefStrings.MODID, "textures/models/machines/cyclotron_gavel_filled.png"); public static final ResourceLocation cyclotron_coin = new ResourceLocation(RefStrings.MODID, "textures/models/machines/cyclotron_coin.png"); public static final ResourceLocation cyclotron_coin_filled = new ResourceLocation(RefStrings.MODID, "textures/models/machines/cyclotron_coin_filled.png"); - + //Exposure Chamber public static final ResourceLocation exposure_chamber_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/exposure_chamber.png"); - + //RTG public static final ResourceLocation rtg_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rtg.png"); public static final ResourceLocation rtg_cell_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rtg_cell.png"); public static final ResourceLocation rtg_polonium_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rtg_polonium.png"); - + //Waste Drum public static final ResourceLocation waste_drum_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/drum_gray.png"); - + //Dark Matter Core public static final ResourceLocation dfc_emitter_tex = new ResourceLocation(RefStrings.MODID, "textures/models/core_emitter.png"); public static final ResourceLocation dfc_receiver_tex = new ResourceLocation(RefStrings.MODID, "textures/models/core_receiver.png"); public static final ResourceLocation dfc_injector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/core_injector.png"); public static final ResourceLocation dfc_stabilizer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/core_stabilizer.png"); - + //Fan public static final ResourceLocation fan_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fan.png"); - + //Piston_Inserter public static final ResourceLocation piston_inserter_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/piston_inserter.png"); - + //Radgen public static final ResourceLocation radgen_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radgen.png"); - + //Small Reactor public static final ResourceLocation reactor_small_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/reactor_small_base.png"); public static final ResourceLocation reactor_small_rods_tex = new ResourceLocation(RefStrings.MODID, "textures/models/reactor_small_rods.png"); //Breeder public static final ResourceLocation breeder_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/breeder.png"); - + //ITER public static final ResourceLocation iter_glass = new ResourceLocation(RefStrings.MODID, "textures/models/iter/glass.png"); public static final ResourceLocation iter_microwave = new ResourceLocation(RefStrings.MODID, "textures/models/iter/microwave.png"); @@ -649,22 +648,22 @@ public class ResourceManager { public static final ResourceLocation iter_torus_desh = new ResourceLocation(RefStrings.MODID, "textures/models/iter/torus_desh.png"); public static final ResourceLocation iter_torus_chlorophyte = new ResourceLocation(RefStrings.MODID, "textures/models/iter/torus_chlorophyte.png"); public static final ResourceLocation iter_torus_vaporwave = new ResourceLocation(RefStrings.MODID, "textures/models/iter/torus_vaporwave.png"); - + //ICF public static final ResourceLocation icf_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/icf.png"); - + //Fat Fuck public static final ResourceLocation lpw2_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lpw2.png"); public static final ResourceLocation lpw2_term_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lpw2_term.png"); public static final ResourceLocation lpw2_error_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lpw2_term_error.png"); - + //Watz public static final ResourceLocation watz_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/watz.png"); public static final ResourceLocation watz_pump_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/watz_pump.png"); - + //FENSU public static final ResourceLocation fensu_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fensu.png"); - + //Radar public static final ResourceLocation radar_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/radar_base.png"); public static final ResourceLocation radar_head_tex = new ResourceLocation(RefStrings.MODID, "textures/models/radar_head.png"); @@ -672,11 +671,11 @@ public class ResourceManager { public static final ResourceLocation radar_dish_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radar_dish.png"); public static final ResourceLocation radar_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radar_large.png"); public static final ResourceLocation radar_screen_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radar_screen.png"); - + //Forcefield public static final ResourceLocation forcefield_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/forcefield_base.png"); public static final ResourceLocation forcefield_top_tex = new ResourceLocation(RefStrings.MODID, "textures/models/forcefield_top.png"); - + //Bombs public static final ResourceLocation bomb_gadget_tex = new ResourceLocation(RefStrings.MODID, "textures/models/bombs/gadget.png"); public static final ResourceLocation bomb_boy_tex = new ResourceLocation(RefStrings.MODID, "textures/models/lilboy.png"); @@ -696,7 +695,7 @@ public class ResourceManager { public static final ResourceLocation n45_chain_tex = new ResourceLocation(RefStrings.MODID, "textures/models/bombs/n45_chain.png"); public static final ResourceLocation fstbmb_tex = new ResourceLocation(RefStrings.MODID, "textures/models/bombs/fstbmb.png"); public static final ResourceLocation dud_tex = new ResourceLocation(RefStrings.MODID, "textures/models/BalefireCrashed.png"); - + //Satellites public static final ResourceLocation sat_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/sat_base.png"); public static final ResourceLocation sat_radar_tex = new ResourceLocation(RefStrings.MODID, "textures/models/sat_radar.png"); @@ -706,10 +705,10 @@ public class ResourceManager { public static final ResourceLocation sat_laser_tex = new ResourceLocation(RefStrings.MODID, "textures/models/sat_laser.png"); public static final ResourceLocation sat_foeq_tex = new ResourceLocation(RefStrings.MODID, "textures/models/sat_foeq.png"); public static final ResourceLocation sat_foeq_burning_tex = new ResourceLocation(RefStrings.MODID, "textures/models/sat_foeq_burning.png"); - + //SatDock public static final ResourceLocation satdock_tex = new ResourceLocation(RefStrings.MODID, "textures/models/sat_dock.png"); - + //Vault Door public static final ResourceLocation vault_cog_tex = new ResourceLocation(RefStrings.MODID, "textures/models/vault_cog.png"); public static final ResourceLocation vault_frame_tex = new ResourceLocation(RefStrings.MODID, "textures/models/vault_frame.png"); @@ -722,20 +721,20 @@ public class ResourceManager { public static final ResourceLocation vault4_cog_tex = new ResourceLocation(RefStrings.MODID, "textures/models/vault4_cog.png"); public static final ResourceLocation vault4_label_111_tex = new ResourceLocation(RefStrings.MODID, "textures/models/vault4_label_111.png"); public static final ResourceLocation vault4_label_81_tex = new ResourceLocation(RefStrings.MODID, "textures/models/vault4_label_81.png"); - + //Solar Tower public static final ResourceLocation solar_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/solar_boiler.png"); public static final ResourceLocation solar_mirror_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/solar_mirror.png"); - + //Drain public static final ResourceLocation drain_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/drain.png"); - + //Blast Door public static final ResourceLocation blast_door_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/blast_door_base.png"); public static final ResourceLocation blast_door_tooth_tex = new ResourceLocation(RefStrings.MODID, "textures/models/blast_door_tooth.png"); public static final ResourceLocation blast_door_slider_tex = new ResourceLocation(RefStrings.MODID, "textures/models/blast_door_slider.png"); public static final ResourceLocation blast_door_block_tex = new ResourceLocation(RefStrings.MODID, "textures/models/blast_door_block.png"); - + //Doors public static final ResourceLocation transition_seal_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/transition_seal.png"); public static final ResourceLocation fire_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/fire_door.png"); @@ -761,11 +760,11 @@ public class ResourceManager { public static final ResourceLocation glyphid_scout_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/glyphid_scout.png"); public static final ResourceLocation glyphid_nuclear_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/glyphid_nuclear.png"); public static final ResourceLocation glyphid_digger_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/glyphid_digger.png"); - + //ZIRNOX public static final ResourceLocation zirnox_tex = new ResourceLocation(RefStrings.MODID, "textures/models/zirnox.png"); public static final ResourceLocation zirnox_destroyed_tex = new ResourceLocation(RefStrings.MODID, "textures/models/zirnox_destroyed.png"); - + //Electricity public static final ResourceLocation connector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/connector.png"); public static final ResourceLocation pylon_medium_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_medium.png"); @@ -777,25 +776,25 @@ public class ResourceManager { //Radiolysis public static final ResourceLocation radiolysis_tex = new ResourceLocation(RefStrings.MODID, "textures/models/radiolysis.png"); - + //Rotary Furnace public static final ResourceLocation rotary_furnace_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rotary_furnace.png"); - + //Electrolyser public static final ResourceLocation electrolyser_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/electrolyser.png"); - + //Charger public static final ResourceLocation charger_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/charger.png"); - + //DecoContainer public static final ResourceLocation file_cabinet_tex = new ResourceLocation(RefStrings.MODID, "textures/models/file_cabinet.png"); public static final ResourceLocation file_cabinet_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/file_cabinet_steel.png"); - + //TELEX public static final ResourceLocation telex_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/telex.png"); - + ////Obj Items - + //Shimmer Sledge public static final IModelCustom shimmer_sledge = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/shimmer_sledge.obj")); public static final IModelCustom shimmer_axe = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/shimmer_axe.obj")); @@ -873,7 +872,7 @@ public class ResourceManager { public static final HashMap congolake_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/congolake.json")); public static final HashMap am180_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/am180.json")); public static final HashMap flamethrower_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/flamethrower.json")); - + public static final IModelCustom lance = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lance.obj")); public static final IModelCustom grenade_frag = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/grenade_frag.obj")); @@ -898,7 +897,7 @@ public class ResourceManager { public static final IModelCustom player_manly_af = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/armor/player_fem.obj")); public static final IModelCustom armor_envsuit = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/envsuit.obj")); public static final IModelCustom armor_trenchmaster = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/trenchmaster.obj")); - + ////Texture Items //Shimmer Sledge @@ -995,7 +994,7 @@ public class ResourceManager { public static final ResourceLocation missile_launcher_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/missile_launcher.png"); public static final ResourceLocation tesla_cannon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/tesla_cannon.png"); public static final ResourceLocation stg77_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/stg77.png"); - + public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); public static final ResourceLocation ff_gold = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/ff/gold.png"); @@ -1074,7 +1073,7 @@ public class ResourceManager { public static final ResourceLocation trenchmaster_arm = new ResourceLocation(RefStrings.MODID, "textures/armor/trenchmaster_arm.png"); public static final ResourceLocation mod_tesla = new ResourceLocation(RefStrings.MODID, "textures/armor/mod_tesla.png"); - + public static final ResourceLocation armor_bismuth_tex = new ResourceLocation(RefStrings.MODID, "textures/armor/bismuth.png"); public static final ResourceLocation wings_murk = new ResourceLocation(RefStrings.MODID, "textures/armor/wings_murk.png"); @@ -1087,13 +1086,13 @@ public class ResourceManager { public static final ResourceLocation no9 = new ResourceLocation(RefStrings.MODID, "textures/armor/no9.png"); public static final ResourceLocation no9_insignia = new ResourceLocation(RefStrings.MODID, "textures/armor/no9_insignia.png"); public static final ResourceLocation goggles = new ResourceLocation(RefStrings.MODID, "textures/armor/goggles.png"); - - public static final ResourceLocation player_manly_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/player_fem.png"); - - - + + public static final ResourceLocation player_manly_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/player_fem.png"); + + + ////Obj Entities - + //Boxcar public static final IModelCustom boxcar = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/boxcar.obj")); public static final IModelCustom duchessgambit = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/duchessgambit.obj")); @@ -1102,16 +1101,16 @@ public class ResourceManager { public static final IModelCustom tom_main = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/weapons/tom_main.obj")); public static final IModelCustom tom_flame = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/weapons/tom_flame.hmf")); public static final IModelCustom nikonium = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/nikonium.obj")); - + //Projectiles public static final IModelCustom projectiles = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/projectiles/projectiles.obj")); public static final IModelCustom leadburster = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/projectiles/leadburster.obj")); public static final IModelCustom casings = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/effect/casings.obj")); - + //Bomber public static final IModelCustom dornier = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/dornier.obj")); public static final IModelCustom b29 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/b29.obj")); - + //Missiles public static final IModelCustom missileV2 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_v2.obj")).asVBO(); public static final IModelCustom missileABM = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_abm.obj")).asVBO(); @@ -1131,7 +1130,7 @@ public class ResourceManager { public static final IModelCustom soyuz_launcher_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_tower.obj"), false).asVBO(); public static final IModelCustom soyuz_launcher_support_base = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_support_base.obj"), false).asVBO(); public static final IModelCustom soyuz_launcher_support = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_support.obj"), false).asVBO(); - + //Missile Parts public static final IModelCustom missile_pad = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/weapons/launch_pad_silo.obj")); public static final IModelCustom missile_erector = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/launch_pad_erector.obj")).asVBO(); @@ -1182,7 +1181,7 @@ public class ResourceManager { public static final IModelCustom mp_f_15_hydrogen = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_hydrogen.obj")); public static final IModelCustom mp_f_15_20_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_20_kerosene.obj")); public static final IModelCustom mp_f_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_20.obj")); - + public static final IModelCustom mp_w_10_he = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_he.obj")); public static final IModelCustom mp_w_10_incendiary = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_incendiary.obj")); public static final IModelCustom mp_w_10_buster = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_buster.obj")); @@ -1197,7 +1196,7 @@ public class ResourceManager { public static final IModelCustom mp_w_15_balefire = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_balefire.obj")); public static final IModelCustom mp_w_15_turbine = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_turbine.obj")); public static final IModelCustom mp_w_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_20.obj")); - + //Carts public static final IModelCustom cart = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart.obj")); public static final IModelCustom cart_destroyer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart_destroyer.obj")); @@ -1205,17 +1204,17 @@ public class ResourceManager { public static final IModelCustom train_cargo_tram = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/tram.obj")); public static final IModelCustom train_cargo_tram_trailer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/tram_trailer.obj")); public static final IModelCustom tunnel_bore = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/vehicles/tunnel_bore.obj")); - + //Drones public static final IModelCustom delivery_drone = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/drone.obj")); - + ////Texture Entities - + //Blast public static final ResourceLocation fireball = new ResourceLocation(RefStrings.MODID, "textures/models/explosion/fireball.png"); public static final ResourceLocation balefire = new ResourceLocation(RefStrings.MODID, "textures/models/explosion/balefire.png"); public static final ResourceLocation tomblast = new ResourceLocation(RefStrings.MODID, "textures/models/explosion/tomblast.png"); - + //Boxcar public static final ResourceLocation boxcar_tex = new ResourceLocation(RefStrings.MODID, "textures/models/boxcar.png"); public static final ResourceLocation duchessgambit_tex = new ResourceLocation(RefStrings.MODID, "textures/models/duchessgambit.png"); @@ -1224,7 +1223,7 @@ public class ResourceManager { public static final ResourceLocation tom_main_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/tom_main.png"); public static final ResourceLocation tom_flame_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/tom_flame.png"); public static final ResourceLocation nikonium_tex = new ResourceLocation(RefStrings.MODID, "textures/models/misc/nikonium.png"); - + //Projectiles public static final ResourceLocation bullet_pistol_tex = new ResourceLocation(RefStrings.MODID, "textures/models/projectiles/bullet_pistol.png"); public static final ResourceLocation bullet_rifle_tex = new ResourceLocation(RefStrings.MODID, "textures/models/projectiles/bullet_rifle.png"); @@ -1237,7 +1236,7 @@ public class ResourceManager { public static final ResourceLocation mini_mirv_tex = new ResourceLocation(RefStrings.MODID, "textures/models/projectiles/mini_mirv.png"); public static final ResourceLocation leadburster_tex = new ResourceLocation(RefStrings.MODID, "textures/models/projectiles/leadburster.png"); public static final ResourceLocation casings_tex = new ResourceLocation(RefStrings.MODID, "textures/particle/casings.png"); - + //Bomber public static final ResourceLocation dornier_0_tex = new ResourceLocation(RefStrings.MODID, "textures/models/dornier_0.png"); public static final ResourceLocation dornier_1_tex = new ResourceLocation(RefStrings.MODID, "textures/models/dornier_1.png"); @@ -1248,7 +1247,7 @@ public class ResourceManager { public static final ResourceLocation b29_1_tex = new ResourceLocation(RefStrings.MODID, "textures/models/b29_1.png"); public static final ResourceLocation b29_2_tex = new ResourceLocation(RefStrings.MODID, "textures/models/b29_2.png"); public static final ResourceLocation b29_3_tex = new ResourceLocation(RefStrings.MODID, "textures/models/b29_3.png"); - + //Missiles public static final ResourceLocation missileV2_HE_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_v2.png"); public static final ResourceLocation missileV2_IN_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_v2_inc.png"); @@ -1283,7 +1282,7 @@ public class ResourceManager { public static final ResourceLocation missileMicroSchrab_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_micro_schrab.png"); public static final ResourceLocation missileMicroEMP_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_micro_emp.png"); public static final ResourceLocation missileMicroTest_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_test.png"); - + public static final ResourceLocation soyuz_engineblock = new ResourceLocation(RefStrings.MODID, "textures/models/soyuz/engineblock.png"); public static final ResourceLocation soyuz_bottomstage = new ResourceLocation(RefStrings.MODID, "textures/models/soyuz/bottomstage.png"); public static final ResourceLocation soyuz_topstage = new ResourceLocation(RefStrings.MODID, "textures/models/soyuz/topstage.png"); @@ -1334,7 +1333,7 @@ public class ResourceManager { public static final ResourceLocation soyuz_launcher_tower_tex = new ResourceLocation(RefStrings.MODID, "textures/models/soyuz_launcher/launcher_tower.png"); public static final ResourceLocation soyuz_launcher_support_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/soyuz_launcher/launcher_support_base.png"); public static final ResourceLocation soyuz_launcher_support_tex = new ResourceLocation(RefStrings.MODID, "textures/models/soyuz_launcher/launcher_support.png"); - + //Missile Parts public static final ResourceLocation missile_pad_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/silo.png"); public static final ResourceLocation missile_pad_rusted_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/silo_rusted.png"); @@ -1355,7 +1354,7 @@ public class ResourceManager { public static final ResourceLocation launch_table_large_scaffold_connector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/launch_table_large_scaffold_connector.png"); public static final ResourceLocation launch_table_small_scaffold_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/launch_table_small_scaffold_base.png"); public static final ResourceLocation launch_table_small_scaffold_connector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/launch_table_small_scaffold_connector.png"); - + public static final ResourceLocation mp_t_10_kerosene_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_10_kerosene.png"); public static final ResourceLocation mp_t_10_solid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_10_solid.png"); public static final ResourceLocation mp_t_10_xenon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_10_xenon.png"); @@ -1369,7 +1368,7 @@ public class ResourceManager { public static final ResourceLocation mp_t_15_balefire_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_15_balefire.png"); public static final ResourceLocation mp_t_15_balefire_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_15_balefire_large.png"); public static final ResourceLocation mp_t_15_balefire_large_rad_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_15_balefire_large_rad.png"); - + public static final ResourceLocation mp_t_20_kerosene_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_20_kerosene.png"); public static final ResourceLocation mp_t_20_kerosene_dual_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_20_kerosene_dual.png"); public static final ResourceLocation mp_t_20_solid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/thrusters/mp_t_20_solid.png"); @@ -1392,7 +1391,7 @@ public class ResourceManager { public static final ResourceLocation mp_f_10_kerosene_sleek_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_kerosene_sleek.png"); public static final ResourceLocation mp_f_10_kerosene_metal_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_kerosene_metal.png"); public static final ResourceLocation mp_f_10_kerosene_taint_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_10_kerosene_taint.png"); - + public static final ResourceLocation mp_f_10_solid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_solid.png"); public static final ResourceLocation mp_f_10_solid_flames_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_solid_flames.png"); public static final ResourceLocation mp_f_10_solid_insulation_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_solid_insulation.png"); @@ -1405,7 +1404,7 @@ public class ResourceManager { public static final ResourceLocation mp_f_10_xenon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_xenon.png"); public static final ResourceLocation mp_f_10_xenon_bhole_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_10_xenon_bhole.png"); - + public static final ResourceLocation mp_f_10_long_kerosene_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_long_kerosene.png"); public static final ResourceLocation mp_f_10_long_kerosene_camo_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_long_kerosene_camo.png"); public static final ResourceLocation mp_f_10_long_kerosene_desert_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_long_kerosene_desert.png"); @@ -1417,7 +1416,7 @@ public class ResourceManager { public static final ResourceLocation mp_f_10_long_kerosene_dash_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_10_long_kerosene_dash.png"); public static final ResourceLocation mp_f_10_long_kerosene_taint_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_10_long_kerosene_taint.png"); public static final ResourceLocation mp_f_10_long_kerosene_vap_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_10_long_kerosene_vap.png"); - + public static final ResourceLocation mp_f_10_long_solid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_long_solid.png"); public static final ResourceLocation mp_f_10_long_solid_flames_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_long_solid_flames.png"); public static final ResourceLocation mp_f_10_long_solid_insulation_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_long_solid_insulation.png"); @@ -1425,12 +1424,12 @@ public class ResourceManager { public static final ResourceLocation mp_f_10_long_solid_soviet_glory_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_long_solid_soviet_glory.png"); public static final ResourceLocation mp_f_10_long_solid_bullet_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_10_long_solid_bullet.png"); public static final ResourceLocation mp_f_10_long_solid_silvermoonlight_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_10_long_solid_silvermoonlight.png"); - + public static final ResourceLocation mp_f_10_15_kerosene_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_15_kerosene.png"); public static final ResourceLocation mp_f_10_15_solid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_15_solid.png"); public static final ResourceLocation mp_f_10_15_hydrogen_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_15_hydrogen.png"); public static final ResourceLocation mp_f_10_15_balefire_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_10_15_balefire.png"); - + public static final ResourceLocation mp_f_15_kerosene_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_kerosene.png"); public static final ResourceLocation mp_f_15_kerosene_camo_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_kerosene_camo.png"); public static final ResourceLocation mp_f_15_kerosene_desert_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_kerosene_desert.png"); @@ -1446,7 +1445,7 @@ public class ResourceManager { public static final ResourceLocation mp_f_15_kerosene_pip_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_15_kerosene_pip.png"); public static final ResourceLocation mp_f_15_kerosene_taint_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/contest/mp_f_15_kerosene_taint.png"); public static final ResourceLocation mp_f_15_kerosene_yuck_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_kerosene_yuck.png"); - + public static final ResourceLocation mp_f_15_solid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_solid.png"); public static final ResourceLocation mp_f_15_solid_insulation_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_solid_insulation.png"); public static final ResourceLocation mp_f_15_solid_desh_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_solid_desh.png"); @@ -1467,7 +1466,7 @@ public class ResourceManager { public static final ResourceLocation mp_f_15_20_kerosene_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_20_kerosene.png"); public static final ResourceLocation mp_f_15_20_kerosene_magnusson_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_20_kerosene_magnusson.png"); public static final ResourceLocation mp_f_15_20_solid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/fuselages/mp_f_15_20_solid.png"); - + public static final ResourceLocation mp_w_10_he_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/warheads/mp_w_10_he.png"); public static final ResourceLocation mp_w_10_incendiary_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/warheads/mp_w_10_incendiary.png"); public static final ResourceLocation mp_w_10_buster_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/warheads/mp_w_10_buster.png"); @@ -1483,7 +1482,7 @@ public class ResourceManager { public static final ResourceLocation mp_w_15_n2_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/warheads/mp_w_15_n2.png"); public static final ResourceLocation mp_w_15_balefire_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/warheads/mp_w_15_balefire.png"); public static final ResourceLocation mp_w_15_turbine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missile_parts/warheads/mp_w_15_turbine.png"); - + //Carts public static final ResourceLocation cart_metal = new ResourceLocation(RefStrings.MODID, "textures/entity/cart_metal.png"); public static final ResourceLocation cart_blank = new ResourceLocation(RefStrings.MODID, "textures/entity/cart_metal_naked.png"); @@ -1494,12 +1493,12 @@ public class ResourceManager { public static final ResourceLocation cart_semtex_top = new ResourceLocation(RefStrings.MODID, "textures/blocks/semtex_bottom.png"); public static final ResourceLocation train_tram = new ResourceLocation(RefStrings.MODID, "textures/models/trains/tram.png"); public static final ResourceLocation tram_trailer = new ResourceLocation(RefStrings.MODID, "textures/models/trains/tram_trailer.png"); - + //Drone public static final ResourceLocation delivery_drone_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/drone.png"); public static final ResourceLocation delivery_drone_express_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/drone_express.png"); public static final ResourceLocation delivery_drone_request_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/drone_request.png"); - + //ISBRHs public static final IModelCustom scaffold = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/scaffold.obj")); public static final IModelCustom taperecorder = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/taperecorder.obj")); @@ -1519,7 +1518,7 @@ public class ResourceManager { public static final IModelCustom toaster = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/toaster.obj")); public static final IModelCustom deco_computer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/puter.obj")); - + // Some RBMK elements are loaded twice due to VBOs not supporting tessellation public static final IModelCustom rbmk_element = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_element.obj")); public static final IModelCustom rbmk_element_vbo = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_element.obj")).asVBO(); @@ -1560,7 +1559,7 @@ public class ResourceManager { public static final IModelCustom charge_dynamite = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/charge_dynamite.obj")); public static final IModelCustom charge_c4 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/charge_c4.obj")); - + //RBMK DEBRIS public static final IModelCustom deb_blank = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/projectiles/deb_blank.obj")); public static final IModelCustom deb_element = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/projectiles/deb_element.obj")); @@ -1574,5 +1573,5 @@ public class ResourceManager { public static final IModelCustom deb_zirnox_element = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/zirnox/deb_element.obj")); public static final IModelCustom deb_zirnox_exchanger = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/zirnox/deb_exchanger.obj")); public static final IModelCustom deb_zirnox_shrapnel = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/zirnox/deb_shrapnel.obj")); - + } diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index da21cb2f7..829e46a7a 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -1,18 +1,17 @@ package com.hbm.main; -import java.util.ArrayList; -import java.util.List; - import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.saveddata.TomSaveData; import com.hbm.sound.AudioWrapper; - import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.List; + public class ServerProxy { //sort by estimated time of display. longer lasting ones should be sorted at the top. @@ -37,25 +36,25 @@ public class ServerProxy { public void registerBlockRenderer() { } public void registerGunCfg() { } public void handleNHNEICompat() { } - + public void particleControl(double x, double y, double z, int type) { } public void spawnParticle(double x, double y, double z, String type, float[] args) { } - + public void effectNT(NBTTagCompound data) { } public void registerMissileItems() { } public AudioWrapper getLoopedSound(String sound, float x, float y, float z, float volume, float range, float pitch) { return null; } public AudioWrapper getLoopedSound(String sound, float x, float y, float z, float volume, float range, float pitch, int keepAlive) { return null; } - + public void playSound(String sound, Object data) { } public void displayTooltip(String msg, int id) { displayTooltip(msg, 1000, id); } public void displayTooltip(String msg, int time, int id) { } - + public boolean getIsKeyPressed(EnumKeybind key) { return false; } @@ -68,29 +67,29 @@ public class ServerProxy { } public void openLink(String url) { } - + public List getSubItems(ItemStack stack) { - + List list = new ArrayList(); list.add(stack); return list; } - + public float getImpactDust(World world) { return TomSaveData.forWorld(world).dust; } - + public float getImpactFire(World world) { return TomSaveData.forWorld(world).fire; } - + public boolean getImpact(World world) { return TomSaveData.forWorld(world).impact; } - + public void playSoundClient(double x, double y, double z, String sound, float volume, float pitch) { } - + public String getLanguageCode() { return "en_US"; } - + public int getStackColor(ItemStack stack, boolean amplify) { return 0x000000; } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/packet/PrecompiledPacket.java b/src/main/java/com/hbm/packet/PrecompiledPacket.java new file mode 100644 index 000000000..5e0131fbc --- /dev/null +++ b/src/main/java/com/hbm/packet/PrecompiledPacket.java @@ -0,0 +1,31 @@ +package com.hbm.packet; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +/** + * Abstract class for precompiled packets. This should be used if the packet is going to be threaded through the `PacketThreading` handler. + */ +public abstract class PrecompiledPacket implements IMessage { + + ByteBuf preCompiledBuf; + + /** + * Returns a precompiled buffer used to avoid race conditions when sending certain packets in threads. + * @return The precompiled packet in a `ByteBuf`. + */ + public ByteBuf getPreBuf() { + if(preCompiledBuf == null || preCompiledBuf.readableBytes() <= 0 /* No data written */) + this.makePreBuf(); + return preCompiledBuf; + } + + /** + * Forcefully creates the precompiled buffer, use `getPreBuf()` whenever possible. + */ + public void makePreBuf() { + preCompiledBuf = Unpooled.buffer(); + this.toBytes(preCompiledBuf); // Create buffer and read data to it. + } +} diff --git a/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java index beace3830..8637a3611 100644 --- a/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java +++ b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java @@ -14,22 +14,22 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; public class AuxParticlePacketNT implements IMessage { - + PacketBuffer buffer; public AuxParticlePacketNT() { } public AuxParticlePacketNT(NBTTagCompound nbt, double x, double y, double z) { - + this.buffer = new PacketBuffer(Unpooled.buffer()); nbt.setDouble("posX", x); nbt.setDouble("posY", y); nbt.setDouble("posZ", z); - + try { buffer.writeNBTTagCompoundToBuffer(nbt); - + } catch (IOException e) { e.printStackTrace(); } @@ -37,7 +37,7 @@ public class AuxParticlePacketNT implements IMessage { @Override public void fromBytes(ByteBuf buf) { - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -46,7 +46,7 @@ public class AuxParticlePacketNT implements IMessage { @Override public void toBytes(ByteBuf buf) { - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -54,25 +54,25 @@ public class AuxParticlePacketNT implements IMessage { } public static class Handler implements IMessageHandler { - + @Override public IMessage onMessage(AuxParticlePacketNT m, MessageContext ctx) { - + if(Minecraft.getMinecraft().theWorld == null) return null; - + try { NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); - + if(nbt != null) MainRegistry.proxy.effectNT(nbt); - + } catch (IOException e) { e.printStackTrace(); } - + return null; } } diff --git a/src/main/java/com/hbm/packet/toclient/BufPacket.java b/src/main/java/com/hbm/packet/toclient/BufPacket.java index 720be19df..ffad60456 100644 --- a/src/main/java/com/hbm/packet/toclient/BufPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BufPacket.java @@ -1,6 +1,7 @@ package com.hbm.packet.toclient; import com.hbm.main.MainRegistry; +import com.hbm.packet.PrecompiledPacket; import com.hbm.tileentity.IBufPacketReceiver; import cpw.mods.fml.common.network.simpleimpl.IMessage; @@ -10,7 +11,7 @@ import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; -public class BufPacket implements IMessage { +public class BufPacket extends PrecompiledPacket { int x; int y; diff --git a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java index b4c33e12f..87c620ca7 100644 --- a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java @@ -1,7 +1,5 @@ package com.hbm.packet.toclient; -import java.io.IOException; - import com.hbm.extprop.HbmLivingProps; import com.hbm.extprop.HbmPlayerProps; @@ -13,10 +11,7 @@ import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; public class ExtPropPacket implements IMessage { diff --git a/src/main/java/com/hbm/test/ExplosionTests.java b/src/main/java/com/hbm/test/ExplosionTests.java index 544a61157..bbc3dcd78 100644 --- a/src/main/java/com/hbm/test/ExplosionTests.java +++ b/src/main/java/com/hbm/test/ExplosionTests.java @@ -1,32 +1,33 @@ package com.hbm.test; -import com.hbm.test.MK5Frame.*; +import com.hbm.test.MK5Frame.BufferArray; +import com.hbm.test.MK5Frame.BufferMap; +import com.hbm.test.MK5Frame.BufferNone; import com.hbm.util.TimeAnalyzer; - import cpw.mods.fml.common.FMLCommonHandler; public class ExplosionTests { private static ExplosionWorld world = new ExplosionWorld(); public static double BUFFER_THRESHOLD = 0.25D; - + public static void runTest() { - + int standardSpeed = (int)Math.ceil(100000 / 300); double[] thresholds = new double[] {0.25, 0.5}; int[] radii = new int[] {100, 250}; - + int x = 200; int y = 70; int z = 200; long mem = 0; - + for(int radius : radii) { - + int strength = radius * 2; int length = radius; - + System.gc(); mem = getMem(); System.out.println("#### STARTING TEST WITH NO PROXIMITY BUFFER " + radius + " ####"); @@ -36,7 +37,7 @@ public class ExplosionTests { TimeAnalyzer.endCount(); TimeAnalyzer.dump(); System.out.println("Mem diff: " + ((getMem() - mem) / 1_048_576) + "MB"); - + for(double threshold : thresholds) { BUFFER_THRESHOLD = threshold; @@ -61,10 +62,10 @@ public class ExplosionTests { System.out.println("Mem diff: " + ((getMem() - mem) / 1_048_576) + "MB"); } } - + FMLCommonHandler.instance().exitJava(0, true); } - + public static long getMem() { return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); } diff --git a/src/main/java/com/hbm/test/MK5Frame.java b/src/main/java/com/hbm/test/MK5Frame.java index a20fd01aa..383ecc043 100644 --- a/src/main/java/com/hbm/test/MK5Frame.java +++ b/src/main/java/com/hbm/test/MK5Frame.java @@ -1,19 +1,14 @@ package com.hbm.test; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; - import com.hbm.util.TimeAnalyzer; import com.hbm.util.fauxpointtwelve.BlockPos; - import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.util.Vec3; import net.minecraft.world.ChunkCoordIntPair; +import java.util.*; + public class MK5Frame { public HashMap> perChunk = new HashMap(); //for future: optimize blockmap further by using sub-chunks instead of chunks @@ -52,7 +47,7 @@ public class MK5Frame { } private void generateGspUp(){ - + if (this.gspNum < this.gspNumMax) { int k = this.gspNum + 1; double hk = -1.0 + 2.0 * (k - 1.0) / (this.gspNumMax - 1.0); @@ -77,7 +72,7 @@ public class MK5Frame { } public void collectTip(int count) { - + TimeAnalyzer.startCount("collect"); int amountProcessed = 0; @@ -107,24 +102,24 @@ public class MK5Frame { double fac = 100 - ((double) i) / ((double) length) * 100; fac *= 0.07D; - + Block block = null; boolean withinThreshold = (double) i / (double) length <= ExplosionTests.BUFFER_THRESHOLD; - + Float buffered = withinThreshold ? buffer.getBufferedResult(iX, iY, iZ) : null; - + float f = 0; - + if(buffered == null) { - + block = world.getBlock(iX, iY, iZ); if(!block.getMaterial().isLiquid()) { f = (float) Math.pow(block.getExplosionResistance(null), 7.5D - fac); } - + if(withinThreshold) buffer.setBufferedResult(iX, iY, iZ, f); - + } else { f = buffered; } @@ -142,18 +137,18 @@ public class MK5Frame { break; } } - + for(ChunkCoordIntPair pos : chunkCoords) { List triplets = perChunk.get(pos); - + if(triplets == null) { triplets = new ArrayList(); perChunk.put(pos, triplets); //we re-use the same pos instead of using individualized per-chunk ones to save on RAM } - + triplets.add(lastPos); } - + // Raise one generalized spiral points this.generateGspUp(); @@ -163,14 +158,14 @@ public class MK5Frame { return; } } - + orderedChunks.addAll(perChunk.keySet()); orderedChunks.sort(comparator); - + isCollectionComplete = true; TimeAnalyzer.endCount(); } - + /* TEST INSERT START */ private ResultBuffer buffer; public MK5Frame setBuffer(ResultBuffer buffer) { @@ -205,7 +200,7 @@ public class MK5Frame { } } /* TEST INSERT END */ - + /** little comparator for roughly sorting chunks by distance to the center */ public class CoordComparator implements Comparator { @@ -217,29 +212,29 @@ public class MK5Frame { int diff1 = Math.abs((chunkX - o1.chunkXPos)) + Math.abs((chunkZ - o1.chunkZPos)); int diff2 = Math.abs((chunkX - o2.chunkXPos)) + Math.abs((chunkZ - o2.chunkZPos)); - + return diff1 > diff2 ? 1 : diff1 < diff2 ? -1 : 0; } } public void processChunk() { - + TimeAnalyzer.startCount("processChunk"); if(this.perChunk.isEmpty()) { TimeAnalyzer.endCount(); return; } - + ChunkCoordIntPair coord = orderedChunks.get(0); List list = perChunk.get(coord); HashSet toRem = new HashSet(); int chunkX = coord.chunkXPos; int chunkZ = coord.chunkZPos; - + int enter = (int) (Math.min( Math.abs(posX - (chunkX << 4)), Math.abs(posZ - (chunkZ << 4)))) - 16; //jump ahead to cut back on NOPs - + for(FloatTriplet triplet : list) { float x = triplet.xCoord; float y = triplet.yCoord; @@ -248,13 +243,13 @@ public class MK5Frame { double pX = vec.xCoord / vec.lengthVector(); double pY = vec.yCoord / vec.lengthVector(); double pZ = vec.zCoord / vec.lengthVector(); - + boolean inChunk = false; for(int i = enter; i < vec.lengthVector(); i++) { int x0 = (int) Math.floor(posX + pX * i); int y0 = (int) Math.floor(posY + pY * i); int z0 = (int) Math.floor(posZ + pZ * i); - + if(x0 >> 4 != chunkX || z0 >> 4 != chunkZ) { if(inChunk) { break; @@ -262,7 +257,7 @@ public class MK5Frame { continue; } } - + inChunk = true; if(!world.isAirBlock(x0, y0, z0)) { @@ -270,22 +265,22 @@ public class MK5Frame { } } } - + for(BlockPos pos : toRem) { world.setBlock(pos.getX(), pos.getY(), pos.getZ(), Blocks.air); } - + perChunk.remove(coord); orderedChunks.remove(0); - + TimeAnalyzer.endCount(); } - + public class FloatTriplet { public float xCoord; public float yCoord; public float zCoord; - + public FloatTriplet(float x, float y, float z) { xCoord = x; yCoord = y; diff --git a/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java b/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java index 7c1422820..4250d6edd 100644 --- a/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java +++ b/src/main/java/com/hbm/tileentity/IBufPacketReceiver.java @@ -1,14 +1,9 @@ package com.hbm.tileentity; -import com.hbm.handler.threading.BufPacketThreading; import io.netty.buffer.ByteBuf; public interface IBufPacketReceiver { public void serialize(ByteBuf buf); public void deserialize(ByteBuf buf); - - public default void sendStandard(int range) { - BufPacketThreading.createBufPacket(this, range); - } } diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index 11ec8ddd1..583a3cb9d 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -1,16 +1,20 @@ package com.hbm.tileentity; +import com.hbm.handler.threading.PacketThreading; +import com.hbm.packet.toclient.BufPacket; import com.hbm.sound.AudioWrapper; import api.hbm.tile.ILoadedTile; +import cpw.mods.fml.common.network.NetworkRegistry; +import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class TileEntityLoadedBase extends TileEntity implements ILoadedTile { - +public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBufPacketReceiver { + public boolean isLoaded = true; public boolean muffled = false; - + @Override public boolean isLoaded() { return isLoaded; @@ -21,29 +25,68 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile { super.onChunkUnload(); this.isLoaded = false; } - + public AudioWrapper createAudioLoop() { return null; } - + public AudioWrapper rebootAudio(AudioWrapper wrapper) { wrapper.stopSound(); AudioWrapper audio = createAudioLoop(); audio.startSound(); return audio; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.muffled = nbt.getBoolean("muffled"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("muffled", muffled); } - + public float getVolume(float baseVolume) { return muffled ? baseVolume * 0.1F : baseVolume; } + + private ByteBuf lastPackedBuf; + + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(muffled); + } + + @Override + public void deserialize(ByteBuf buf) { + this.muffled = buf.readBoolean(); + } + + /** Sends a sync packet that uses ByteBuf for efficient information-cramming */ + public void networkPackNT(int range) { + if(worldObj.isRemote) { + return; + } + + BufPacket packet = new BufPacket(xCoord, yCoord, zCoord, this); + + ByteBuf preBuf = packet.getPreBuf(); + + // Don't send unnecessary packets, except for maybe one every second or so. + // If we stop sending duplicate packets entirely, this causes issues when + // a client unloads and then loads back a chunk with an unchanged tile entity. + // For that client, the tile entity will appear default until anything changes about it. + // In my testing, this can be reliably reproduced with a full fluid barrel, for instance. + // I think it might be fixable by doing something with getDescriptionPacket() and onDataPacket(), + // but this sidesteps the problem for the mean time. + if (preBuf.equals(lastPackedBuf) && this.worldObj.getWorldTime() % 20 == 0) { + return; + } + + this.lastPackedBuf = preBuf; + + PacketThreading.createThreadedPacket(packet, new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + } + } diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 82eb25fa1..7fecf29d5 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -2,13 +2,9 @@ package com.hbm.tileentity; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxGaugePacket; -import com.hbm.packet.toclient.BufPacket; -import com.hbm.handler.threading.BufPacketThreading; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; @@ -18,14 +14,12 @@ import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidTank; -public abstract class TileEntityMachineBase extends TileEntityLoadedBase implements ISidedInventory, IBufPacketReceiver { +public abstract class TileEntityMachineBase extends TileEntityLoadedBase implements ISidedInventory { public ItemStack slots[]; private String customName; - private ByteBuf lastPackedBuf = null; - public TileEntityMachineBase(int slotCount) { slots = new ItemStack[slotCount]; } @@ -158,39 +152,6 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme } @Deprecated public void processGauge(int val, int id) { } - /** Sends a sync packet that uses ByteBuf for efficient information-cramming */ - public void networkPackNT(int range) { - if(worldObj.isRemote) { - return; - } - - BufPacket packet = new BufPacket(xCoord, yCoord, zCoord, this); - ByteBuf buf = Unpooled.buffer(); - packet.toBytes(buf); - - // Don't send unnecessary packets, except for maybe one every second or so. - // If we stop sending duplicate packets entirely, this causes issues when - // a client unloads and then loads back a chunk with an unchanged tile entity. - // For that client, the tile entity will appear default until anything changes about it. - // In my testing, this can be reliably reproduced with a full fluid barrel, for instance. - // I think it might be fixable by doing something with getDescriptionPacket() and onDataPacket(), - // but this sidesteps the problem for the mean time. - if (buf.equals(lastPackedBuf) && worldObj.getWorldTime() % 20 != 0) { - return; - } - this.lastPackedBuf = buf; - - BufPacketThreading.createBufPacket(packet, new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - - @Override public void serialize(ByteBuf buf) { - buf.writeBoolean(muffled); - } - - @Override public void deserialize(ByteBuf buf) { - this.muffled = buf.readBoolean(); - } - @Deprecated public void handleButtonPacket(int value, int meta) { } diff --git a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java index c678ba677..2924a3467 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityTickingBase.java @@ -1,14 +1,13 @@ package com.hbm.tileentity; -import io.netty.buffer.ByteBuf; import net.minecraftforge.fluids.FluidTank; -public abstract class TileEntityTickingBase extends TileEntityLoadedBase implements IBufPacketReceiver { - +public abstract class TileEntityTickingBase extends TileEntityLoadedBase { + public TileEntityTickingBase() { } - + public abstract String getInventoryName(); - + public int getGaugeScaled(int i, FluidTank tank) { return tank.getFluidAmount() * i / tank.getCapacity(); } @@ -22,16 +21,5 @@ public abstract class TileEntityTickingBase extends TileEntityLoadedBase impleme @Deprecated public void handleButtonPacket(int value, int meta) { } - - public void networkPackNT(int range) { - if(!worldObj.isRemote) sendStandard(range); - } - @Override public void serialize(ByteBuf buf) { - buf.writeBoolean(muffled); - } - - @Override public void deserialize(ByteBuf buf) { - this.muffled = buf.readBoolean(); - } } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java index 4d4b08836..18a08483e 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCharge.java @@ -1,33 +1,32 @@ package com.hbm.tileentity.bomb; import com.hbm.blocks.bomb.BlockChargeBase; -import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; import io.netty.buffer.ByteBuf; -import net.minecraft.tileentity.TileEntity; -public class TileEntityCharge extends TileEntity implements IBufPacketReceiver { - +public class TileEntityCharge extends TileEntityLoadedBase { + public boolean started; public int timer; @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(started) { timer--; - + if(timer % 20 == 0 && timer > 0) worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.fstbmbPing", 1.0F, 1.0F); - + if(timer <= 0) { ((BlockChargeBase)this.getBlockType()).explode(worldObj, xCoord, yCoord, zCoord); } } - sendStandard(100); + networkPackNT(100); } } @@ -42,24 +41,24 @@ public class TileEntityCharge extends TileEntity implements IBufPacketReceiver { this.timer = buf.readInt(); this.started = buf.readBoolean(); } - + public String getMinutes() { - + String mins = "" + (timer / 1200); - + if(mins.length() == 1) mins = "0" + mins; - + return mins; } - + public String getSeconds() { - + String mins = "" + ((timer / 20) % 60); - + if(mins.length() == 1) mins = "0" + mins; - + return mins; } } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index e573bd5fe..d724c833e 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -54,7 +54,7 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I public int solid; public static final int maxSolid = 25000; public FluidTank[] tanks; - + public MissileStruct load; private static final int[] access = new int[] { 0 }; @@ -157,11 +157,11 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I return null; } } - + public long getPowerScaled(long i) { return (power * i) / maxPower; } - + public int getSolidScaled(int i) { return (solid * i) / maxSolid; } @@ -170,16 +170,16 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I public void updateEntity() { if (!worldObj.isRemote) { - + updateTypes(); tanks[0].loadTank(2, 6, slots); tanks[1].loadTank(3, 7, slots); - + power = Library.chargeTEFromItems(slots, 5, power, maxPower); - + if(slots[4] != null && slots[4].getItem() == ModItems.rocket_fuel && solid + 250 <= maxSolid) { - + this.decrStackSize(4, 1); solid += 250; } @@ -187,10 +187,10 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I if(worldObj.getTotalWorldTime() % 20 == 0) this.updateConnections(); - sendStandard(50); + networkPackNT(50); MissileStruct multipart = getStruct(slots[0]); - + if(multipart != null) PacketDispatcher.wrapper.sendToAllAround(new TEMissileMultipartPacket(xCoord, yCoord, zCoord, multipart), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); else @@ -199,7 +199,7 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I outer: for(int x = -1; x <= 1; x++) { for(int z = -1; z <= 1; z++) { - + if(worldObj.isBlockIndirectlyGettingPowered(xCoord + x, yCoord, zCoord + z) && canLaunch()) { launchFromDesignator(); break outer; @@ -207,22 +207,22 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I } } } else { - + List entities = worldObj.getEntitiesWithinAABBExcludingEntity(null, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); - + for(Entity e : entities) { - + if(e instanceof EntityMissileCustom) { - + for(int i = 0; i < 15; i++) { - + boolean dir = worldObj.rand.nextBoolean(); float moX = (float) (dir ? 0 : worldObj.rand.nextGaussian() * 0.5F); float moZ = (float) (!dir ? 0 : worldObj.rand.nextGaussian() * 0.5F); - + MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); } - + break; } } @@ -235,23 +235,23 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I tanks[0].serialize(buf); tanks[1].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { this.power = buf.readLong(); this.solid = buf.readInt(); tanks[0].deserialize(buf); tanks[1].deserialize(buf); } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + public DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), @@ -268,12 +268,12 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I new DirPos(xCoord - 1, yCoord - 1, zCoord - 1, Library.NEG_Y) }; } - + public boolean canLaunch() { - + if(power >= maxPower * 0.75 && isMissileValid() && hasDesignator() && hasFuel()) return true; - + return false; } @@ -288,66 +288,66 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I this.launchTo(x, z); return true; } - + public void launchFromDesignator() { if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { IDesignatorItem designator = (IDesignatorItem) slots[1].getItem(); - + if(designator.isReady(worldObj, slots[1], xCoord, yCoord, zCoord)) { Vec3 coords = designator.getCoords(worldObj, slots[1], xCoord, yCoord, zCoord); int tX = (int) Math.floor(coords.xCoord); int tZ = (int) Math.floor(coords.zCoord); - + this.launchTo(tX, tZ); } } } - + public void launchTo(int tX, int tZ) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.missileTakeOff", 10.0F, 1.0F); - + ItemCustomMissilePart chip = (ItemCustomMissilePart) Item.getItemById(ItemCustomMissile.readFromNBT(slots[0], "chip")); float c = (Float)chip.attributes[0]; float f = 1.0F; - + if(getStruct(slots[0]).fins != null) { ItemCustomMissilePart fins = (ItemCustomMissilePart) Item.getItemById(ItemCustomMissile.readFromNBT(slots[0], "stability")); f = (Float) fins.attributes[0]; } - + Vec3 target = Vec3.createVectorHelper(xCoord - tX, 0, zCoord - tZ); target.xCoord *= c * f; target.zCoord *= c * f; - + target.rotateAroundY(worldObj.rand.nextFloat() * 360); - + EntityMissileCustom missile = new EntityMissileCustom(worldObj, xCoord + 0.5F, yCoord + 2.5F, zCoord + 0.5F, tX + (int)target.xCoord, tZ + (int)target.zCoord, getStruct(slots[0])); worldObj.spawnEntityInWorld(missile); - + subtractFuel(); - + slots[0] = null; } - + private boolean hasFuel() { return solidState() != 0 && liquidState() != 0 && oxidizerState() != 0; } - + private void subtractFuel() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + float f = (Float)fuselage.attributes[1]; int fuel = (int)f; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: tanks[0].setFill(tanks[0].getFill() - fuel); @@ -368,114 +368,114 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I this.solid -= fuel; break; default: break; } - + this.power -= maxPower * 0.75; } - + public static MissileStruct getStruct(ItemStack stack) { - + return ItemCustomMissile.getStruct(stack); } - + public boolean isMissileValid() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return false; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + return fuselage.top == PartSize.SIZE_10; } - + public boolean hasDesignator() { - + if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem && ((IDesignatorItem)slots[1].getItem()).isReady(worldObj, slots[1], xCoord, yCoord, zCoord)) { return true; } - + return false; } - + public int solidState() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return -1; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + if((FuelType)fuselage.attributes[0] == FuelType.SOLID) { - + if(solid >= (Float)fuselage.attributes[1]) return 1; else return 0; } - + return -1; } - + public int liquidState() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return -1; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: case HYDROGEN: case XENON: case BALEFIRE: - + if(tanks[0].getFill() >= (Float)fuselage.attributes[1]) return 1; else return 0; default: break; } - + return -1; } - + public int oxidizerState() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return -1; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: case HYDROGEN: case BALEFIRE: - + if(tanks[1].getFill() >= (Float)fuselage.attributes[1]) return 1; else return 0; default: break; } - + return -1; } - + public void updateTypes() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: tanks[0].setTankType(Fluids.KEROSENE); @@ -520,7 +520,7 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList list = new NBTTagList(); tanks[0].writeToNBT(nbt, "fuel"); @@ -558,7 +558,7 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() @@ -583,16 +583,16 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I @Override public long transferPower(long power) { - + this.power += power; - + if(this.power > this.getMaxPower()) { - + long overshoot = this.power - this.getMaxPower(); this.power = this.getMaxPower(); return overshoot; } - + return 0; } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index 0d1abdf7b..053ae6eff 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -61,7 +61,7 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide public FluidTank[] tanks; public PartSize padSize; public int height; - + public MissileStruct load; private static final int[] access = new int[] { 0 }; @@ -166,11 +166,11 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide return null; } } - + public long getPowerScaled(long i) { return (power * i) / maxPower; } - + public int getSolidScaled(int i) { return (solid * i) / maxSolid; } @@ -179,27 +179,27 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide public void updateEntity() { if (!worldObj.isRemote) { - + updateTypes(); - + if(worldObj.getTotalWorldTime() % 20 == 0) this.updateConnections(); tanks[0].loadTank(2, 6, slots); tanks[1].loadTank(3, 7, slots); - + power = Library.chargeTEFromItems(slots, 5, power, maxPower); - + if(slots[4] != null && slots[4].getItem() == ModItems.rocket_fuel && solid + 250 <= maxSolid) { - + this.decrStackSize(4, 1); solid += 250; } - sendStandard(50); + networkPackNT(50); MissileStruct multipart = getStruct(slots[0]); - + if(multipart != null) PacketDispatcher.wrapper.sendToAllAround(new TEMissileMultipartPacket(xCoord, yCoord, zCoord, multipart), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); else @@ -208,7 +208,7 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide outer: for(int x = -4; x <= 4; x++) { for(int z = -4; z <= 4; z++) { - + if(worldObj.isBlockIndirectlyGettingPowered(xCoord + x, yCoord, zCoord + z) && canLaunch()) { launchFromDesignator(); break outer; @@ -216,16 +216,16 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide } } } else { - + List entities = worldObj.getEntitiesWithinAABB(EntityMissileCustom.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); - + if(!entities.isEmpty()) { for(int i = 0; i < 15; i++) { boolean dir = worldObj.rand.nextBoolean(); float moX = (float) (dir ? 0 : worldObj.rand.nextGaussian() * 0.65F); float moZ = (float) (!dir ? 0 : worldObj.rand.nextGaussian() * 0.65F); - + MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); } } @@ -239,7 +239,7 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide tanks[0].serialize(buf); tanks[1].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { this.power = buf.readLong(); this.solid = buf.readInt(); @@ -247,7 +247,7 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide tanks[0].deserialize(buf); tanks[1].deserialize(buf); } - + private void updateConnections() { for(int i = -4; i <= 4; i++) { @@ -255,7 +255,7 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide this.trySubscribe(worldObj, xCoord + i, yCoord, zCoord - 5, Library.NEG_Z); this.trySubscribe(worldObj, xCoord + 5, yCoord, zCoord + i, Library.POS_X); this.trySubscribe(worldObj, xCoord - 5, yCoord, zCoord + i, Library.NEG_X); - + for(int j = 0; j < 2; j++) { this.trySubscribe(tanks[j].getTankType(), worldObj, xCoord + i, yCoord, zCoord + 5, Library.POS_Z); this.trySubscribe(tanks[j].getTankType(), worldObj, xCoord + i, yCoord, zCoord - 5, Library.NEG_Z); @@ -264,12 +264,12 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide } } } - + public boolean canLaunch() { - + if(power >= maxPower * 0.75 && isMissileValid() && hasFuel()) return true; - + return false; } @@ -284,66 +284,66 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide this.launchTo(x, z); return true; } - + public void launchFromDesignator() { if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { IDesignatorItem designator = (IDesignatorItem) slots[1].getItem(); - + if(designator.isReady(worldObj, slots[1], xCoord, yCoord, zCoord)) { Vec3 coords = designator.getCoords(worldObj, slots[1], xCoord, yCoord, zCoord); int tX = (int) Math.floor(coords.xCoord); int tZ = (int) Math.floor(coords.zCoord); - + this.launchTo(tX, tZ); } } } - + public void launchTo(int tX, int tZ) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.missileTakeOff", 10.0F, 1.0F); - + ItemCustomMissilePart chip = (ItemCustomMissilePart) Item.getItemById(ItemCustomMissile.readFromNBT(slots[0], "chip")); float c = (Float)chip.attributes[0]; float f = 1.0F; - + if(getStruct(slots[0]).fins != null) { ItemCustomMissilePart fins = (ItemCustomMissilePart) Item.getItemById(ItemCustomMissile.readFromNBT(slots[0], "stability")); f = (Float) fins.attributes[0]; } - + Vec3 target = Vec3.createVectorHelper(xCoord - tX, 0, zCoord - tZ); target.xCoord *= c * f; target.zCoord *= c * f; - + target.rotateAroundY(worldObj.rand.nextFloat() * 360); - + EntityMissileCustom missile = new EntityMissileCustom(worldObj, xCoord + 0.5F, yCoord + 2.5F, zCoord + 0.5F, tX + (int)target.xCoord, tZ + (int)target.zCoord, getStruct(slots[0])); worldObj.spawnEntityInWorld(missile); - + subtractFuel(); - + slots[0] = null; } - + private boolean hasFuel() { return solidState() != 0 && liquidState() != 0 && oxidizerState() != 0; } - + private void subtractFuel() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + float f = (Float)fuselage.attributes[1]; int fuel = (int)f; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: tanks[0].setFill(tanks[0].getFill() - fuel); @@ -364,114 +364,114 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide this.solid -= fuel; break; default: break; } - + this.power -= maxPower * 0.75; } - + public static MissileStruct getStruct(ItemStack stack) { - + return ItemCustomMissile.getStruct(stack); } - + public boolean isMissileValid() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return false; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + return fuselage.top == padSize; } - + public boolean hasDesignator() { - + if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem && ((IDesignatorItem)slots[1].getItem()).isReady(worldObj, slots[1], xCoord, yCoord, zCoord)) { return true; } - + return false; } - + public int solidState() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return -1; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + if((FuelType)fuselage.attributes[0] == FuelType.SOLID) { - + if(solid >= (Float)fuselage.attributes[1]) return 1; else return 0; } - + return -1; } - + public int liquidState() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return -1; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: case HYDROGEN: case XENON: case BALEFIRE: - + if(tanks[0].getFill() >= (Float)fuselage.attributes[1]) return 1; else return 0; default: break; } - + return -1; } - + public int oxidizerState() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return -1; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: case HYDROGEN: case BALEFIRE: - + if(tanks[1].getFill() >= (Float)fuselage.attributes[1]) return 1; else return 0; default: break; } - + return -1; } - + public void updateTypes() { - + MissileStruct multipart = getStruct(slots[0]); - + if(multipart == null || multipart.fuselage == null) return; - + ItemCustomMissilePart fuselage = (ItemCustomMissilePart)multipart.fuselage; - + switch((FuelType)fuselage.attributes[0]) { case KEROSENE: tanks[0].setTankType(Fluids.KEROSENE); @@ -517,7 +517,7 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList list = new NBTTagList(); tanks[0].writeToNBT(nbt, "fuel"); @@ -551,12 +551,12 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide public boolean canExtractItem(int i, ItemStack itemStack, int j) { return false; } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() @@ -578,19 +578,19 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide public long getMaxPower() { return this.maxPower; } - + @Override public long transferPower(long power) { - + this.power += power; - + if(this.power > this.getMaxPower()) { - + long overshoot = this.power - this.getMaxPower(); this.power = this.getMaxPower(); return overshoot; } - + return 0; } diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java index 30fc9e132..eb5e45113 100644 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java +++ b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java @@ -13,9 +13,9 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.special.ItemKitCustom; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IRepairable; +import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -24,25 +24,24 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; -public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketReceiver, IRepairable { - +public class TileEntityLanternBehemoth extends TileEntityLoadedBase implements IRepairable { + public boolean isBroken = false; public int comTimer = -1; @Override public void updateEntity() { - + if(!worldObj.isRemote) { if(comTimer == 360) worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.hornNearSingle", 10F, 1F); if(comTimer == 280) worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.hornFarSingle", 10000F, 1F); if(comTimer == 220) worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.hornNearDual", 10F, 1F); if(comTimer == 100) worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:block.hornFarDual", 10000F, 1F); - + if(comTimer == 0) { List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord - 10, yCoord - 10, zCoord - 10, xCoord + 11, yCoord + 11, zCoord + 11)); EntityPlayer first = players.isEmpty() ? null : players.get(0); @@ -57,18 +56,18 @@ public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketR bonus ? new ItemStack(ModItems.gem_alexandrite) : new ItemStack(Items.diamond, 6 + worldObj.rand.nextInt(6)), new ItemStack(Blocks.red_flower)); shuttle.payload = payload; - + worldObj.spawnEntityInWorld(shuttle); } - + if(comTimer >= 0) { comTimer--; } - sendStandard(250); + networkPackNT(250); } } - + @Override public void invalidate() { super.invalidate(); @@ -88,14 +87,14 @@ public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketR public void deserialize(ByteBuf buf) { this.isBroken = buf.readBoolean(); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); isBroken = nbt.getBoolean("isBroken"); comTimer = nbt.getInteger("comTimer"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -107,11 +106,11 @@ public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketR public boolean isDamaged() { return isBroken; } - + List repair = new ArrayList(); @Override public List getRepairMaterials() { - + if(!repair.isEmpty()) return repair; @@ -128,12 +127,12 @@ public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketR } @Override public void tryExtinguish(World world, int x, int y, int z, EnumExtinguishType type) { } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord, @@ -144,10 +143,10 @@ public class TileEntityLanternBehemoth extends TileEntity implements IBufPacketR zCoord + 1 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java index 966c25326..313d19986 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java @@ -15,57 +15,57 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyReceiverMK2, IBufPacketReceiver { - + private List players = new ArrayList(); private long charge = 0; private int lastOp = 0; - + boolean particles = false; - + public int usingTicks; public int lastUsingTicks; public static final int delay = 20; @Override public void updateEntity() { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); - + if(!worldObj.isRemote) { this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir); - + players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(0.5, 0.0, 0.5)); - + charge = 0; - + for(EntityPlayer player : players) { - + for(int i = 0; i < 5; i++) { - + ItemStack stack = player.getEquipmentInSlot(i); - + if(stack != null && stack.getItem() instanceof IBatteryItem) { IBatteryItem battery = (IBatteryItem) stack.getItem(); charge += Math.min(battery.getMaxCharge(stack) - battery.getCharge(stack), battery.getChargeRate()); } } } - + particles = lastOp > 0; - + if(particles) { - + lastOp--; - + if(worldObj.getTotalWorldTime() % 20 == 0) worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 0.2F, 0.5F); } - - sendStandard(50); + + networkPackNT(50); } - + lastUsingTicks = usingTicks; - + if((charge > 0 || particles) && usingTicks < delay) { usingTicks++; if(usingTicks == 2) @@ -76,7 +76,7 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe if(usingTicks == 4) worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "tile.piston.in", 0.5F, 0.5F); } - + if(particles) { Random rand = worldObj.rand; worldObj.spawnParticle("magicCrit", @@ -113,32 +113,32 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe @Override public void setPower(long power) { } - + @Override public long transferPower(long power) { - + if(this.usingTicks < delay || power == 0) return power; - + for(EntityPlayer player : players) { - + for(int i = 0; i < 5; i++) { - + ItemStack stack = player.getEquipmentInSlot(i); - + if(stack != null && stack.getItem() instanceof IBatteryItem) { IBatteryItem battery = (IBatteryItem) stack.getItem(); - + long toCharge = Math.min(battery.getMaxCharge(stack) - battery.getCharge(stack), battery.getChargeRate()); toCharge = Math.min(toCharge, power / 5); battery.chargeBattery(stack, toCharge); power -= toCharge; - + lastOp = 4; } } } - + return power; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java index dd6627066..3638afecb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChimneyBase.java @@ -19,15 +19,15 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme public long ashTick = 0; public long sootTick = 0; public int onTicks; - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(worldObj.getTotalWorldTime() % 20 == 0) { FluidType[] types = new FluidType[] {Fluids.SMOKE, Fluids.SMOKE_LEADED, Fluids.SMOKE_POISON}; - + for(FluidType type : types) { this.trySubscribe(type, worldObj, xCoord + 2, yCoord, zCoord, Library.POS_X); this.trySubscribe(type, worldObj, xCoord - 2, yCoord, zCoord, Library.NEG_X); @@ -35,11 +35,11 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme this.trySubscribe(type, worldObj, xCoord, yCoord, zCoord - 2, Library.NEG_Z); } } - + if(ashTick > 0 || sootTick > 0) { TileEntity below = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - + if(below instanceof TileEntityAshpit) { TileEntityAshpit ashpit = (TileEntityAshpit) below; ashpit.ashLevelFly += ashTick; @@ -48,13 +48,13 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme this.ashTick = 0; this.sootTick = 0; } - - sendStandard(150); - + + networkPackNT(150); + if(onTicks > 0) onTicks--; - + } else { - + if(onTicks > 0) { this.spawnParticles(); } @@ -64,11 +64,11 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme public boolean cpaturesAsh() { return true; } - + public boolean cpaturesSoot() { return false; } - + public void spawnParticles() { } @Override @@ -89,23 +89,23 @@ public abstract class TileEntityChimneyBase extends TileEntityLoadedBase impleme @Override public long transferFluid(FluidType type, int pressure, long fluid) { - + if(type != Fluids.SMOKE && type != Fluids.SMOKE_LEADED && type != Fluids.SMOKE_POISON) return fluid; - + onTicks = 20; if(cpaturesAsh()) ashTick += fluid; if(cpaturesSoot()) sootTick += fluid; - + fluid *= getPollutionMod(); if(type == Fluids.SMOKE) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, fluid / 100F); if(type == Fluids.SMOKE_LEADED) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.HEAVYMETAL, fluid / 100F); if(type == Fluids.SMOKE_POISON) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.POISON, fluid / 100F); - + return 0; } - + public abstract double getPollutionMod(); @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index eae8f56cf..1732ea799 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -46,10 +46,10 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr public float rotor; public float lastRotor; public float fanAcceleration = 0F; - + public FluidTank[] tanks; protected double[] info = new double[3]; - + private AudioWrapper audio; private float audioDesync; @@ -58,7 +58,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr public static int inputTankSize = 1_000_000_000; public static int outputTankSize = 1_000_000_000; public static double efficiency = 0.85D; - + public TileEntityChungus() { tanks = new FluidTank[2]; tanks[0] = new FluidTank(Fluids.STEAM, inputTankSize); @@ -94,11 +94,11 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.info = new double[3]; - + boolean operational = false; FluidType in = tanks[0].getTankType(); boolean valid = false; @@ -120,45 +120,45 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr operational = ops > 0; } } - + if(!valid) tanks[1].setTankType(Fluids.NONE); if(power > maxPower) power = maxPower; - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); this.tryProvide(worldObj, xCoord - dir.offsetX * 11, yCoord, zCoord - dir.offsetZ * 11, dir.getOpposite()); - + for(DirPos pos : this.getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + if(power > maxPower) power = maxPower; - + turnTimer--; - + if(operational) turnTimer = 25; - sendStandard(150); - + networkPackNT(150); + } else { - + this.lastRotor = this.rotor; this.rotor += this.fanAcceleration; - + if(this.rotor >= 360) { this.rotor -= 360; this.lastRotor -= 360; } - + if(turnTimer > 0) { // Fan accelerates with a random offset to ensure the audio doesn't perfectly align, makes for a more pleasant hum this.fanAcceleration = Math.max(0F, Math.min(25F, this.fanAcceleration += 0.075F + audioDesync)); - + Random rand = worldObj.rand; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection side = dir.getRotation(ForgeDirection.UP); - + for(int i = 0; i < 10; i++) { worldObj.spawnParticle("cloud", xCoord + 0.5 + dir.offsetX * (rand.nextDouble() + 1.25) + rand.nextGaussian() * side.offsetX * 0.65, @@ -167,7 +167,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr -dir.offsetX * 0.2, 0, -dir.offsetZ * 0.2); } - + if(audio == null) { audio = MainRegistry.proxy.getLoopedSound("hbm:block.chungusTurbineRunning", xCoord, yCoord, zCoord, 1.0F, 20F, 1.0F); audio.startSound(); @@ -178,7 +178,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr audio.updatePitch(0.25F + 0.75F * turbineSpeed); } else { this.fanAcceleration = Math.max(0F, Math.min(25F, this.fanAcceleration -= 0.1F)); - + if(audio != null) { if(this.fanAcceleration > 0) { float turbineSpeed = this.fanAcceleration / 25F; @@ -189,16 +189,16 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr audio = null; } } - } + } } } - + public void onLeverPull(FluidType previous) { for(BlockPos pos : getConPos()) { this.tryUnsubscribe(previous, worldObj, pos.getX(), pos.getY(), pos.getZ()); } } - + public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); @@ -222,7 +222,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr this.turnTimer = buf.readInt(); this.tanks[0].deserialize(buf); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -230,7 +230,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr tanks[1].readFromNBT(nbt, "steam"); power = nbt.getLong("power"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -238,12 +238,12 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr tanks[1].writeToNBT(nbt, "steam"); nbt.setLong("power", power); } - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -275,7 +275,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IEnergyPr public String getComponentName() { return "ntm_turbine"; } - + @Override public void onChunkUnload() { super.onChunkUnload(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 443ab576e..f29d0c0c1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -90,7 +90,7 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidS this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); - sendStandard(150); + networkPackNT(150); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java index c90d9ec0b..5c5b8969c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -6,12 +6,12 @@ import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.material.Mats.MaterialStack; import api.hbm.block.ICrucibleAcceptor; +import com.hbm.tileentity.TileEntityLoadedBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -21,25 +21,25 @@ import net.minecraftforge.common.util.ForgeDirection; * @author hbm * */ -public abstract class TileEntityFoundryBase extends TileEntity implements ICrucibleAcceptor, ICopiable { - +public abstract class TileEntityFoundryBase extends TileEntityLoadedBase implements ICrucibleAcceptor, ICopiable { + public NTMMaterial type; protected NTMMaterial lastType; public int amount; protected int lastAmount; - + @Override public void updateEntity() { - + if(worldObj.isRemote) { - + if(shouldClientReRender() && this.lastType != this.type || this.lastAmount != this.amount) { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); this.lastType = this.type; this.lastAmount = this.amount; } } else { - + if(this.lastType != this.type || this.lastAmount != this.amount) { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); this.lastType = this.type; @@ -47,7 +47,7 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci } } } - + /** Recommended FALSE for things that update a whole lot. TRUE if updates only happen once every few ticks. */ protected boolean shouldClientReRender() { return true; @@ -59,7 +59,7 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); @@ -75,18 +75,18 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + if(this.type == null) { nbt.setInteger("type", -1); } else { nbt.setInteger("type", this.type.id); } - + nbt.setInteger("amount", this.amount); } - + public abstract int getCapacity(); - + /** * Standard check for testing if this material stack can be added to the casting block. Checks:
* - type matching
@@ -97,7 +97,7 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full return true; } - + /** * Standardized adding of material via pouring or flowing. Does:
* - sets material to match the input @@ -106,17 +106,17 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci */ public MaterialStack standardAdd(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { this.type = stack.material; - + if(stack.amount + this.amount <= this.getCapacity()) { this.amount += stack.amount; return null; } - + int required = this.getCapacity() - this.amount; this.amount = this.getCapacity(); - + stack.amount -= required; - + return stack; } @@ -125,7 +125,7 @@ public abstract class TileEntityFoundryBase extends TileEntity implements ICruci public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return this.standardCheck(world, x, y, z, side, stack); } - + /** Standard flow, no special handling required */ @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java index c42db2790..3423d2583 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java @@ -18,16 +18,16 @@ public class TileEntityHadronPower extends TileEntityLoadedBase implements IEner public boolean canUpdate() { return true; //yeah idk wtf happened with the old behavior and honestly i'm not keen on figuring that one out } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - sendStandard(15); + networkPackNT(15); } } @@ -54,13 +54,13 @@ public class TileEntityHadronPower extends TileEntityLoadedBase implements IEner @Override public long getMaxPower() { - + Block b = this.getBlockType(); - + if(b instanceof BlockHadronPower) { return ((BlockHadronPower)b).power; } - + return 0; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index 7bd2a4a27..f3c74ce7c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -29,9 +29,8 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; +import io.netty.buffer.PooledByteBufAllocator; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.EnumSkyBlock; @@ -59,13 +58,15 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa this.tanks[1] = new FluidTank(Fluids.STEAM, 16_000 * 100); } - ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + ByteBuf buf; @Override public void updateEntity() { if(!worldObj.isRemote) { + this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + buf.writeBoolean(this.hasExploded); if(!this.hasExploded) { @@ -93,7 +94,7 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa buf.writeBoolean(this.muffled); buf.writeBoolean(this.isOn); - sendStandard(25); + networkPackNT(25); } else { if(this.isOn) audioTime = 20; @@ -150,7 +151,7 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf = new PacketBuffer(Unpooled.buffer()); + this.buf.release(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java index ac1cb9641..1f37f1d14 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java @@ -24,9 +24,8 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; +import io.netty.buffer.PooledByteBufAllocator; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.EnumSkyBlock; @@ -36,10 +35,10 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme public int heat; public FluidTank[] tanks; public boolean isOn; - + private AudioWrapper audio; private int audioTime; - + /* CONFIGURABLE */ public static int maxHeat = 12_800_000; public static double diffusion = 0.1D; @@ -51,18 +50,20 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme this.tanks[1] = new FluidTank(Fluids.STEAM, 64_000 * 100); } - ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + ByteBuf buf; @Override public void updateEntity() { if(!worldObj.isRemote) { + this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + this.setupTanks(); this.updateConnections(); this.tryPullHeat(); int lastHeat = this.heat; - + int light = this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, this.xCoord, this.yCoord, this.zCoord); if(light > 7 && TomSaveData.forWorld(worldObj).fire > 1e-5) { this.heat += ((maxHeat - heat) * 0.000005D); //constantly heat up 0.0005% of the remaining heat buffer for rampant but diminishing heating @@ -74,23 +75,23 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme this.isOn = false; this.tryConvert(); tanks[1].serialize(buf); - + if(this.tanks[1].getFill() > 0) { this.sendFluid(); } buf.writeBoolean(this.isOn); buf.writeBoolean(this.muffled); - sendStandard(25); + networkPackNT(25); } else { - + if(this.isOn) audioTime = 20; - + if(audioTime > 0) { - + audioTime--; - + if(audio == null) { audio = createAudioLoop(); audio.startSound(); @@ -100,9 +101,9 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme audio.updateVolume(getVolume(1F)); audio.keepAlive(); - + } else { - + if(audio != null) { audio.stopSound(); audio = null; @@ -110,7 +111,7 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme } } } - + @Override public AudioWrapper createAudioLoop() { return MainRegistry.proxy.getLoopedSound("hbm:block.boiler", xCoord, yCoord, zCoord, 0.125F, 10F, 1.0F, 20); @@ -139,7 +140,7 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf = new PacketBuffer(Unpooled.buffer()); + this.buf.release(); } @Override @@ -150,18 +151,18 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme this.isOn = buf.readBoolean(); this.muffled = buf.readBoolean(); } - + protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - + if(con instanceof IHeatSource) { IHeatSource source = (IHeatSource) con; int diff = source.getHeatStored() - this.heat; - + if(diff == 0) { return; } - + if(diff > 0) { diff = (int) Math.ceil(diff * diffusion); source.useUpHeat(diff); @@ -171,12 +172,12 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme return; } } - + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } - + protected void setupTanks() { - + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); if(trait.getEfficiency(HeatingType.BOILER) > 0) { @@ -190,49 +191,49 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme tanks[0].setTankType(Fluids.NONE); tanks[1].setTankType(Fluids.NONE); } - + protected void tryConvert() { - + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); if(trait.getEfficiency(HeatingType.BOILER) > 0) { - + HeatingStep entry = trait.getFirstStep(); int inputOps = this.tanks[0].getFill() / entry.amountReq; int outputOps = (this.tanks[1].getMaxFill() - this.tanks[1].getFill()) / entry.amountProduced; int heatOps = this.heat / entry.heatReq; - + int ops = Math.min(inputOps, Math.min(outputOps, heatOps)); this.tanks[0].setFill(this.tanks[0].getFill() - entry.amountReq * ops); this.tanks[1].setFill(this.tanks[1].getFill() + entry.amountProduced * ops); this.heat -= entry.heatReq * ops; - + if(ops > 0 && worldObj.rand.nextInt(400) == 0) { worldObj.playSoundEffect(xCoord + 0.5, yCoord + 2, zCoord + 0.5, "hbm:block.boilerGroan", 0.5F, 1.0F); } - + if(ops > 0) { this.isOn = true; } } } } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private void sendFluid() { - + for(DirPos pos : getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir().getOpposite()); } } - + private DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), @@ -242,7 +243,7 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme new DirPos(xCoord, yCoord + 5, zCoord, Library.POS_Y), }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -250,7 +251,7 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme tanks[1].readFromNBT(nbt, "steam"); heat = nbt.getInteger("heat"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -273,12 +274,12 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -289,10 +290,10 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java index 895d5d319..1ad302c0b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -51,7 +51,7 @@ public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IH this.isOn = true; } - sendStandard(25); + networkPackNT(25); } else { if(isOn) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java index 702589b42..2f8bb86d2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java @@ -3,14 +3,14 @@ package com.hbm.tileentity.machine; import com.hbm.items.ModItems; import com.hbm.items.tool.ItemKey; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.ArmorUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -public abstract class TileEntityLockableBase extends TileEntity { +public abstract class TileEntityLockableBase extends TileEntityLoadedBase { protected int lock; private boolean isLocked = false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index 0b264743a..b5bba66f0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -176,7 +176,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB } } - sendStandard(100); + networkPackNT(100); } else { this.lastSpin = this.spin; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java index 09b7a0e09..22b99e917 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java @@ -29,23 +29,23 @@ import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFluidStandardReceiver, IBufPacketReceiver, IFluidCopiable { - + public FluidTank tank; - + public TileEntityMachineDrain() { this.tank = new FluidTank(Fluids.NONE, 2_000); } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(worldObj.getTotalWorldTime() % 20 == 0) { for(DirPos pos : getConPos()) this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - sendStandard(50); + networkPackNT(50); if(tank.getFill() > 0) { if(tank.getTankType().hasTrait(FT_Amat.class)) { @@ -55,13 +55,13 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu int toSpill = Math.max(tank.getFill() / 2, 1); tank.setFill(tank.getFill() - toSpill); FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.SPILL, toSpill); - + if(toSpill >= 100 && worldObj.rand.nextInt(20) == 0 && tank.getTankType().hasTrait(FT_Liquid.class) && tank.getTankType().hasTrait(FT_Viscous.class) && tank.getTankType().hasTrait(FT_Flammable.class)) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); Vec3 start = Vec3.createVectorHelper(xCoord + 0.5 - dir.offsetX * 3, yCoord + 0.5, zCoord + 0.5 - dir.offsetZ * 3); Vec3 end = start.addVector(worldObj.rand.nextGaussian() * 5, -25, worldObj.rand.nextGaussian() * 5); MovingObjectPosition mop = worldObj.func_147447_a(start, end, false, true, false); - + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK && mop.sideHit == 1) { Block block = worldObj.getBlock(mop.blockX, mop.blockY + 1, mop.blockZ); if(!block.getMaterial().isLiquid() && block.isReplaceable(worldObj, mop.blockX, mop.blockY + 1, mop.blockZ) && ModBlocks.oil_spill.canPlaceBlockAt(worldObj, mop.blockX, mop.blockY + 1, mop.blockZ)) { @@ -70,12 +70,12 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu } } } - + } else { - + if(tank.getFill() > 0 && MainRegistry.proxy.me().getDistance(xCoord, yCoord, zCoord) < 100) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); - + NBTTagCompound data = new NBTTagCompound(); if(tank.getTankType().hasTrait(FT_Gaseous.class)) { data.setString("type", "tower"); @@ -86,17 +86,17 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu } else { data.setString("type", "splash"); } - + data.setInteger("color", tank.getTankType().getColor()); data.setDouble("posX", xCoord + 0.5 - dir.offsetX * 2.5); data.setDouble("posZ", zCoord + 0.5 - dir.offsetZ * 2.5); data.setDouble("posY", yCoord + 0.5); - + MainRegistry.proxy.effectNT(data); } } } - + public DirPos[] getConPos() { ForgeDirection dir0 = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection dir1 = dir0.getRotation(ForgeDirection.UP); @@ -107,13 +107,13 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu new DirPos(xCoord + dir2.offsetX, yCoord, zCoord + dir2.offsetZ, dir2) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.tank.readFromNBT(nbt, "t"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -125,17 +125,17 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu @Override public FluidTank[] getAllTanks() { return new FluidTank[] {tank}; } @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } - + @Override public boolean canConnect(FluidType type, ForgeDirection dir) { return dir != ForgeDirection.UP && dir != ForgeDirection.DOWN; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -146,10 +146,10 @@ public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFlu zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java index 96e0b5c3b..e227b2dbf 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java @@ -19,11 +19,10 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; +import io.netty.buffer.PooledByteBufAllocator; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; @@ -32,7 +31,7 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements public FluidTank input; public FluidTank output; public int bufferedHeat; - + public float rot; public float prevRot; @@ -40,31 +39,33 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements this.input = new FluidTank(Fluids.OIL, 24_000); this.output = new FluidTank(Fluids.HOTOIL, 24_000); } - + private int[] heat = new int[10]; private long fissureScanTime; private AudioWrapper audio; - ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + ByteBuf buf; @Override public void updateEntity() { if(!worldObj.isRemote) { - + + this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + setupTanks(); - + if(worldObj.getTotalWorldTime() % 20 == 0) { this.updateConnections(); } - + int height = (int) (worldObj.getTotalWorldTime() % 10); int range = 7; int y = yCoord - 1 - height; - + heat[height] = 0; - + if(y >= 0) { for(int x = -range; x <= range; x++) { for(int z = -range; z <= range; z++) { @@ -74,26 +75,26 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements } input.serialize(buf); - + heatFluid(); - + output.serialize(buf); - + if(output.getFill() > 0) { for(DirPos pos : getConPos()) { this.sendFluid(output, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } buf.writeInt(this.getTotalHeat()); - sendStandard(150); - + networkPackNT(150); + } else { - + this.prevRot = this.rot; - + if(this.bufferedHeat > 0) { this.rot += 0.5F; - + if(worldObj.rand.nextInt(7) == 0) { double x = worldObj.rand.nextGaussian() * 2; double y = worldObj.rand.nextGaussian() * 3; @@ -111,23 +112,23 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements audio = null; } } - + if(this.rot >= 360F) { this.prevRot -= 360F; this.rot -= 360F; } } } - + protected void heatFluid() { - + FluidType type = input.getTankType(); - + if(type.hasTrait(FT_Heatable.class)) { FT_Heatable trait = type.getTrait(FT_Heatable.class); int heat = this.getTotalHeat(); HeatingStep step = trait.getFirstStep(); - + int inputOps = input.getFill() / step.amountReq; int outputOps = (output.getMaxFill() - output.getFill()) / step.amountProduced; int heatOps = heat / step.heatReq; @@ -138,14 +139,14 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this); } } - + protected void setupTanks() { - + FluidType type = input.getTankType(); - + if(type.hasTrait(FT_Heatable.class)) { FT_Heatable trait = type.getTrait(FT_Heatable.class); - + if(trait.getEfficiency(HeatingType.HEATEXCHANGER) > 0) { FluidType outType = trait.getFirstStep().typeProduced; output.setTankType(outType); @@ -156,40 +157,40 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements input.setTankType(Fluids.NONE); output.setTankType(Fluids.NONE); } - + protected int heatFromBlock(int x, int y, int z) { Block b = worldObj.getBlock(x, y, z); - + if(b == Blocks.lava || b == Blocks.flowing_lava) return 5; if(b == ModBlocks.volcanic_lava_block) return 150; - + if(b == ModBlocks.ore_volcano) { this.fissureScanTime = worldObj.getTotalWorldTime(); return 300; } - + return 0; } - + public int getTotalHeat() { boolean fissure = worldObj.getTotalWorldTime() - this.fissureScanTime < 20; int heat = 0; - + for(int h : this.heat) { heat += h; } - + if(fissure) { heat *= 3; } - + return heat; } @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf = new PacketBuffer(Unpooled.buffer()); + this.buf.release(); } @Override @@ -199,18 +200,18 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements this.bufferedHeat = buf.readInt(); } - + private void updateConnections() { - + if(input.getTankType() == Fluids.NONE) return; - + for(DirPos pos : getConPos()) { this.trySubscribe(input.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private DirPos[] getConPos() { - + return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), new DirPos(xCoord - 2, yCoord, zCoord, Library.NEG_X), @@ -222,7 +223,7 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements new DirPos(xCoord, yCoord + 11, zCoord - 2, Library.NEG_Z) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -230,7 +231,7 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements this.input.readFromNBT(nbt, "0"); this.output.readFromNBT(nbt, "1"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -253,12 +254,12 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] {input}; } - + @Override public boolean canConnect(FluidType type, ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN && dir != ForgeDirection.UP && dir != ForgeDirection.DOWN; } - + @Override public void onChunkUnload() { super.onChunkUnload(); @@ -278,12 +279,12 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements audio = null; } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 3, @@ -294,10 +295,10 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements zCoord + 4 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java index 91378d08d..46131c44b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpBase.java @@ -23,7 +23,7 @@ import net.minecraft.util.AxisAlignedBB; public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase implements IFluidStandardTransceiver, IBufPacketReceiver, IConfigurableMachine, IFluidCopiable { public static final HashSet validBlocks = new HashSet(); - + static { validBlocks.add(Blocks.grass); validBlocks.add(Blocks.dirt); @@ -35,7 +35,7 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp validBlocks.add(ModBlocks.sand_dirty); validBlocks.add(ModBlocks.sand_dirty_red); } - + public FluidTank water; public boolean isOn = false; @@ -69,65 +69,65 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp writer.name("I:steamSpeed").value(steamSpeed); writer.name("I:electricSpeed").value(electricSpeed); } - + public void updateEntity() { - + if(!worldObj.isRemote) { - + for(DirPos pos : getConPos()) { if(water.getFill() > 0) this.sendFluid(water, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + if(groundCheckDelay > 0) { groundCheckDelay--; } else { onGround = this.checkGround(); } - + this.isOn = false; if(this.canOperate() && yCoord <= groundHeight && onGround) { this.isOn = true; this.operate(); } - sendStandard(150); - + networkPackNT(150); + } else { - + this.lastRotor = this.rotor; if(this.isOn) this.rotor += 10F; - + if(this.rotor >= 360F) { this.rotor -= 360F; this.lastRotor -= 360F; - + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.steamEngineOperate", 0.5F, 0.75F); MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "game.neutral.swim.splash", 1F, 0.5F); } } } - + protected boolean checkGround() { - + if(worldObj.provider.hasNoSky) return false; - + int validBlocks = 0; int invalidBlocks = 0; - + for(int x = -1; x <= 1; x++) { for(int y = -1; y >= -groundDepth; y--) { for(int z = -1; z <= 1; z++) { - + Block b = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); - + if(y == -1 && !b.isNormalCube()) return false; // first layer has to be full solid - + if(this.validBlocks.contains(b)) validBlocks++; else invalidBlocks ++; } } } - + return validBlocks >= invalidBlocks; // valid block count has to be at least 50% } @@ -147,7 +147,7 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp protected abstract boolean canOperate(); protected abstract void operate(); - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), @@ -171,12 +171,12 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp public FluidTank[] getReceivingTanks() { return new FluidTank[0]; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -187,10 +187,10 @@ public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase imp zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index 7d6fc0390..b830abfe9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -72,14 +72,14 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public boolean smartMode = true; public boolean redMode = true; public boolean showMap = false; - + public boolean jammed = false; public float prevRotation; public float rotation; public long power = 0; - + protected int pingTimer = 0; protected int lastPower; protected final static int maxTimer = 80; @@ -91,10 +91,10 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public static int radarAltitude = 55; public static int chunkLoadCap = 10; public static boolean generateChunks = false; - + public byte[] map = new byte[40_000]; public boolean clearFlag = false; - + public List entries = new ArrayList(); @Override @@ -131,18 +131,18 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public String getName() { return "container.radar"; } - + public int getRange() { return radarRange; } @Override public void updateEntity() { - + if(this.map == null || this.map.length != 40_000) this.map = new byte[40_000]; - + if(!worldObj.isRemote) { - + this.power = Library.chargeTEFromItems(slots, 9, power, maxPower); if(worldObj.getTotalWorldTime() % 20 == 0) { @@ -150,37 +150,37 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); this.jammed = false; allocateTargets(); - + if(this.lastPower != getRedPower()) { this.markChanged(); for(DirPos pos : getConPos()) this.updateRedstoneConnection(pos); } lastPower = getRedPower(); - + if(!this.muffled) { - + pingTimer++; - + if(power > 0 && pingTimer >= maxTimer) { this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.sonarPing", 5.0F, 1.0F); pingTimer = 0; } } - + if(this.showMap) { int chunkLoads = 0; for(int i = 0; i < 100; i++) { int index = (int) (worldObj.getTotalWorldTime() % 400) * 100 + i; int iX = (index % 200) * getRange() * 2 / 200; int iZ = index / 200 * getRange() * 2 / 200; - + int x = xCoord - getRange() + iX; int z = zCoord - getRange() + iZ; - + if(worldObj.getChunkProvider().chunkExists(x >> 4, z >> 4)) { this.map[index] = (byte) MathHelper.clamp_int(worldObj.getHeightValue(x, z), 50, 128); } else { @@ -198,7 +198,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } } } - + if(slots[8] != null && slots[8].getItem() == ModItems.radar_linker) { BlockPos pos = ItemCoordinateBase.getPosition(slots[8]); if(pos != null) { @@ -212,11 +212,11 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I screen.refZ = zCoord; screen.range = this.getRange(); screen.linked = true; - sendStandard(25); + networkPackNT(25); } } } - + this.networkPackNT(50); if(this.clearFlag) { this.map = new byte[40_000]; @@ -225,14 +225,14 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } else { prevRotation = rotation; if(power > 0) rotation += 5F; - + if(rotation >= 360) { rotation -= 360F; prevRotation -= 360F; } } } - + public DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X), @@ -241,7 +241,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z), }; } - + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -271,7 +271,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } } } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -327,30 +327,30 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I nbt.setBoolean("showMap", showMap); nbt.setByteArray("map", map); } - + protected void allocateTargets() { this.entries.clear(); - + if(this.yCoord < radarAltitude) return; if(this.power < consumption) return; this.power -= consumption; - + int scan = this.getRange(); - + RadarScanParams params = new RadarScanParams(this.scanMissiles, this.scanShells, this.scanPlayers, this.smartMode); - + for(Entity e : matchingEntities) { - + if(e.dimension == worldObj.provider.dimensionId && Math.abs(e.posX - (xCoord + 0.5)) <= scan && Math.abs(e.posZ - (zCoord + 0.5)) <= scan && e.posY - yCoord > radarBuffer) { - + if(e instanceof EntityLivingBase && HbmLivingProps.getDigamma((EntityLivingBase) e) > 0.001) { this.jammed = true; entries.clear(); return; } - + for(Function, RadarEntry> converter : converters) { - + RadarEntry entry = converter.apply(new Triplet(e, this, params)); if(entry != null) { this.entries.add(entry); @@ -360,33 +360,33 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } } } - + public int getRedPower() { - + if(!entries.isEmpty()) { - + /// PROXIMITY /// if(redMode) { - + double maxRange = this.getRange() * Math.sqrt(2D); int power = 0; - + for(int i = 0; i < entries.size(); i++) { RadarEntry e = entries.get(i); if(!e.redstone) continue; double dist = Math.sqrt(Math.pow(e.posX - xCoord, 2) + Math.pow(e.posZ - zCoord, 2)); int p = 15 - (int)Math.floor(dist / maxRange * 15); - + if(p > power) power = p; } - + return power; - + /// TIER /// } else { - + int power = 0; - + for(int i = 0; i < entries.size(); i++) { RadarEntry e = entries.get(i); if(!e.redstone) continue; @@ -394,11 +394,11 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I power = e.blipLevel + 1; } } - + return power; } } - + return 0; } @@ -423,10 +423,10 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } @Override public void receiveControl(NBTTagCompound data) { } - + @Override public void receiveControl(EntityPlayer player, NBTTagCompound data) { - + if(data.hasKey("missiles")) this.scanMissiles = !this.scanMissiles; if(data.hasKey("shells")) this.scanShells = !this.scanShells; if(data.hasKey("players")) this.scanPlayers = !this.scanPlayers; @@ -436,11 +436,11 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I if(data.hasKey("clear")) this.clearFlag = true; if(data.hasKey("gui1")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); - + if(data.hasKey("link")) { int id = data.getInteger("link"); ItemStack link = slots[id]; - + if(link != null && link.getItem() == ModItems.sat_relay) { World world = player.getEntityWorld(); Satellite sat = SatelliteSavedData.getData(world).getSatFromFreq(ISatChip.getFreqS(link)); @@ -473,12 +473,12 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } if(link != null && link.getItem() == ModItems.radar_linker) { BlockPos pos = ItemCoordinateBase.getPosition(link); - + if(pos != null) { TileEntity tile = worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); if(tile instanceof IRadarCommandReceiver) { IRadarCommandReceiver rec = (IRadarCommandReceiver) tile; - + if(data.hasKey("launchEntity")) { Entity entity = worldObj.getEntityByID(data.getInteger("launchEntity")); if(entity != null) { @@ -498,12 +498,12 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -514,10 +514,10 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -546,20 +546,20 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I if(ID == 1) return new GUIMachineRadarNTSlots(player.inventory, this); return null; } - + /** List of lambdas that are supplied a Pair with the entity and radar in question to generate a RadarEntry The converters coming first have the highest priority */ public static List, RadarEntry>> converters = new ArrayList(); public static List classes = new ArrayList(); public static List matchingEntities = new ArrayList(); - + /** * Iterates over every entity in the world and add them to the matchingEntities list if the class is in the detectable list * From this compiled list, radars can easily grab the required entities since we can assume that the total amount of detectable entities is comparatively low */ public static void updateSystem() { matchingEntities.clear(); - + for(WorldServer world : MinecraftServer.getServer().worldServers) { for(Object entity : world.loadedEntityList) { for(Class clazz : classes) { @@ -578,7 +578,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I classes.add(IRadarDetectable.class); classes.add(EntityPlayer.class); } - + /** Registers converters. Converters are used to go over the list of detected entities and turn them into a RadarEntry using the entity instance and the radar's instance. */ public static void registerConverters() { //IRadarDetectableNT diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java index 9da001e51..9b55ca183 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java @@ -13,7 +13,7 @@ import io.netty.buffer.ByteBuf; import net.minecraft.util.AxisAlignedBB; public class TileEntityMachineRadarScreen extends TileEntityLoadedBase implements IBufPacketReceiver { - + public List entries = new ArrayList(); public int refX; public int refY; @@ -23,9 +23,9 @@ public class TileEntityMachineRadarScreen extends TileEntityLoadedBase implement @Override public void updateEntity() { - + if(!worldObj.isRemote) { - this.sendStandard(100); + this.networkPackNT(100); entries.clear(); this.linked = false; } @@ -41,7 +41,7 @@ public class TileEntityMachineRadarScreen extends TileEntityLoadedBase implement buf.writeInt(entries.size()); for(RadarEntry entry : entries) entry.toBytes(buf); } - + @Override public void deserialize(ByteBuf buf) { linked = buf.readBoolean(); @@ -57,12 +57,12 @@ public class TileEntityMachineRadarScreen extends TileEntityLoadedBase implement this.entries.add(entry); } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -73,10 +73,10 @@ public class TileEntityMachineRadarScreen extends TileEntityLoadedBase implement zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index a8b20a0d0..00b4812ce 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -11,7 +11,6 @@ import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemScraps; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; @@ -29,7 +28,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; //god thank you bob for this base class -public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase implements IGUIProvider, ICrucibleAcceptor, ISidedInventory, IFluidStandardTransceiver, IBufPacketReceiver, IInventory { +public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase implements IGUIProvider, ICrucibleAcceptor, ISidedInventory, IFluidStandardTransceiver, IInventory { public FluidTank water; public FluidTank steam; @@ -117,7 +116,7 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase } } - sendStandard(150); + networkPackNT(150); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java index 2fc9636d8..cdcbea5a3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java @@ -43,22 +43,22 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements @Override public void updateEntity() { - + if(!this.worldObj.isRemote) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - + if(this.targetY != -1) { List entities = this.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(this.xCoord + 0.25, this.yCoord, this.zCoord + 0.25, this.xCoord + 0.75, this.yCoord + 2, this.zCoord + 0.75)); - + if(!entities.isEmpty()) { for(Entity e : entities) { teleport(e); } } } - - sendStandard(15); - + + networkPackNT(15); + } else { if(this.targetY != -1 && power >= consumption) { @@ -100,7 +100,7 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setInteger("x1", targetX); nbt.setInteger("y1", targetY); @@ -109,25 +109,25 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements } public void teleport(Entity entity) { - + if(this.power < consumption) return; - + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, "mob.endermen.portal", 1.0F, 1.0F); - + if((entity instanceof EntityPlayerMP)) { - + EntityPlayerMP player = (EntityPlayerMP) entity; if(entity.dimension == this.targetDim) { player.setPositionAndUpdate(this.targetX + 0.5D, this.targetY + 1.5D + entity.getYOffset(), this.targetZ + 0.5D); } else { teleportPlayerInterdimensionally(player, this.targetX + 0.5D, this.targetY + 1.5D + entity.getYOffset(), this.targetZ + 0.5D, this.targetDim); } - + } else { - + if(entity.dimension == this.targetDim) { entity.setPositionAndRotation(this.targetX + 0.5D, this.targetY + 1.5D + entity.getYOffset(), this.targetZ + 0.5D, entity.rotationYaw, entity.rotationPitch); - + try { EntityTracker entitytracker = ((WorldServer)worldObj).getEntityTracker(); IntHashMap map = ReflectionHelper.getPrivateValue(EntityTracker.class, entitytracker, "trackedEntityIDs", "field_72794_c"); @@ -143,21 +143,21 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements teleportEntityInterdimensionally(entity, this.targetX + 0.5D, this.targetY + 1.5D + entity.getYOffset(), this.targetZ + 0.5D, this.targetDim); } } - + worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); - + this.power -= consumption; this.markDirty(); } - + /** Teleports a player to a different dimension, gracefully copied from ServerConfigurationManager */ public static boolean teleportPlayerInterdimensionally(EntityPlayerMP player, double x, double y, double z, int dim) { - + int prevDim = player.dimension; WorldServer prevWorld = player.mcServer.worldServerForDimension(prevDim); WorldServer newWorld = player.mcServer.worldServerForDimension(dim); player.dimension = dim; - + if(newWorld == null) return false; ServerConfigurationManager man = player.mcServer.getConfigurationManager(); @@ -165,15 +165,15 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements net.sendPacket(new S07PacketRespawn(player.dimension, player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), player.theItemInWorldManager.getGameType())); prevWorld.removePlayerEntityDangerously(player); player.isDead = false; - + if(player.isEntityAlive()) { player.setLocationAndAngles(x, y, z, player.rotationYaw, player.rotationPitch); newWorld.spawnEntityInWorld(player); newWorld.updateEntityWithOptionalForce(player, false); } - + player.setWorld(newWorld); - + man.func_72375_a(player, prevWorld); net.setPlayerLocation(player.posX, player.posY, player.posZ, player.rotationYaw, player.rotationPitch); player.theItemInWorldManager.setWorld(newWorld); @@ -188,18 +188,18 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements FMLCommonHandler.instance().firePlayerChangedDimensionEvent(player, prevDim, dim); return true; } - + /** Teleports non-player entities to different dimensions, gracefully copied from Entity */ public static boolean teleportEntityInterdimensionally(Entity oldEntity, double x, double y, double z, int dim) { MinecraftServer minecraftserver = MinecraftServer.getServer(); WorldServer newWorld = minecraftserver.worldServerForDimension(dim); - + if(newWorld == null) return false; oldEntity.worldObj.removeEntity(oldEntity); oldEntity.isDead = false; - + Entity entity = EntityList.createEntityByName(EntityList.getEntityString(oldEntity), newWorld); if(entity != null) { @@ -207,7 +207,7 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements entity.setLocationAndAngles(x, y, z, entity.rotationYaw, entity.rotationPitch); newWorld.updateEntityWithOptionalForce(entity, false); entity.setWorld(newWorld); - + IChunkProvider provider = newWorld.getChunkProvider(); provider.loadChunk(((int) Math.floor(x)) >> 4, ((int) Math.floor(z)) >> 4); newWorld.spawnEntityInWorld(entity); @@ -215,7 +215,7 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements oldEntity.isDead = true; newWorld.resetUpdateEntityTick(); - + return true; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 9ea860818..88f1c3694 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -49,14 +49,14 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS public long power; public int age = 0; public FluidTank[] tanks; - + private static final int[] slots_top = new int[] {4}; private static final int[] slots_bottom = new int[] {6}; private static final int[] slots_side = new int[] {4}; - + private String customName; protected double[] info = new double[3]; - + //Configurable values public static long maxPower = 1_000_000; public static int inputTankSize = 64_000; @@ -133,7 +133,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @@ -152,7 +152,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; } } - + //You scrubs aren't needed for anything (right now) @Override public void openInventory() {} @@ -161,14 +161,14 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - + if(i == 4) if(stack != null && stack.getItem() instanceof IBatteryItem) return true; - + return false; } - + @Override public ItemStack decrStackSize(int i, int j) { if(slots[i] != null) @@ -184,13 +184,13 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS { slots[i] = null; } - + return itemStack1; } else { return null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -199,9 +199,9 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS tanks[0].readFromNBT(nbt, "water"); tanks[1].readFromNBT(nbt, "steam"); power = nbt.getLong("power"); - + slots = new ItemStack[getSizeInventory()]; - + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); @@ -212,16 +212,16 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS } } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); tanks[0].writeToNBT(nbt, "water"); tanks[1].writeToNBT(nbt, "steam"); nbt.setLong("power", power); - + NBTTagList list = new NBTTagList(); - + for(int i = 0; i < slots.length; i++) { if(slots[i] != null) @@ -234,7 +234,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS } nbt.setTag("items", list); } - + @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { @@ -250,32 +250,32 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS public boolean canExtractItem(int i, ItemStack itemStack, int j) { return false; } - + public long getPowerScaled(int i) { return (power * i) / maxPower; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.info = new double[3]; - + age++; if(age >= 2) { age = 0; } - + this.subscribeToAllAround(tanks[0].getTankType(), this); - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); tanks[0].setType(0, 1, slots); tanks[0].loadTank(2, 3, slots); power = Library.chargeItemsFromTE(slots, 4, power, maxPower); - + FluidType in = tanks[0].getTankType(); boolean valid = false; if(in.hasTrait(FT_Coolable.class)) { @@ -298,12 +298,12 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS } if(!valid) tanks[1].setTankType(Fluids.NONE); if(power > maxPower) power = maxPower; - + this.sendFluidToAll(tanks[1], this); - + tanks[1].unloadTank(5, 6, slots); - - this.sendStandard(25); + + this.networkPackNT(25); } } @@ -318,7 +318,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS tanks[0].deserialize(buf); tanks[1].deserialize(buf); } - + @Override public long getPower() { return power; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java index 817a57adb..bc148cff5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRadioRec.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.network.RTTYSystem; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; import com.hbm.util.BufferUtil; @@ -14,29 +14,28 @@ import com.hbm.util.Tuple.Triplet; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioRec extends TileEntity implements IBufPacketReceiver, IControlReceiver { - +public class TileEntityRadioRec extends TileEntityLoadedBase implements IControlReceiver { + public String channel = ""; public boolean isOn = false; - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(this.isOn && !this.channel.isEmpty()) { RTTYChannel chan = RTTYSystem.listen(worldObj, this.channel); - + if(chan != null && chan.timeStamp == worldObj.getTotalWorldTime() - 1) { Triplet[] notes = NoteBuilder.translate(chan.signal + ""); - + for(Triplet note : notes) { Instrument i = note.getX(); Note n = note.getY(); Octave o = note.getZ(); - + int noteId = n.ordinal() + o.ordinal() * 12; String s = "harp"; @@ -50,8 +49,8 @@ public class TileEntityRadioRec extends TileEntity implements IBufPacketReceiver } } } - - sendStandard(15); + + networkPackNT(15); } } @@ -66,15 +65,15 @@ public class TileEntityRadioRec extends TileEntity implements IBufPacketReceiver this.channel = BufferUtil.readString(buf); this.isOn = buf.readBoolean(); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + channel = nbt.getString("channel"); isOn = nbt.getBoolean("isOn"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -92,7 +91,7 @@ public class TileEntityRadioRec extends TileEntity implements IBufPacketReceiver public void receiveControl(NBTTagCompound data) { if(data.hasKey("channel")) this.channel = data.getString("channel"); if(data.hasKey("isOn")) this.isOn = data.getBoolean("isOn"); - + this.markDirty(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index 1599374d9..a6f591167 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -20,7 +20,6 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Blocks; @@ -29,14 +28,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.common.util.ForgeDirection; public class TileEntitySawmill extends TileEntityMachineBase { - + public int heat; public static final double diffusion = 0.1D; private int warnCooldown = 0; @@ -44,7 +42,7 @@ public class TileEntitySawmill extends TileEntityMachineBase { public boolean hasBlade = true; public int progress = 0; public static final int processingTime = 600; - + public float spin; public float lastSpin; @@ -57,41 +55,41 @@ public class TileEntitySawmill extends TileEntityMachineBase { @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(hasBlade) { tryPullHeat(); - + if(warnCooldown > 0) warnCooldown--; - + if(heat >= 100) { - + ItemStack result = this.getOutput(slots[0]); - + if(result != null) { progress += heat / 10; - + if(progress >= this.processingTime) { progress = 0; slots[0] = null; slots[1] = result; - + if(result.getItem() != ModItems.powder_sawdust) { float chance = result.getItem() == Items.stick ? 0.1F : 0.5F; if(worldObj.rand.nextFloat() < chance) { slots[2] = new ItemStack(ModItems.powder_sawdust); } } - + this.markDirty(); } - + } else { this.progress = 0; } - + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(-1D, 0.375D, -1D, -0.875, 2.375D, 1D); aabb = BlockDummyable.getAABBRotationOffset(aabb, xCoord + 0.5, yCoord, zCoord + 0.5, ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP)); for(Object o : worldObj.getEntitiesWithinAABB(EntityLivingBase.class, aabb)) { @@ -108,37 +106,37 @@ public class TileEntitySawmill extends TileEntityMachineBase { PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY, e.posZ, 50)); } } - + } else { this.progress = 0; } - + if(heat > 300) { - + this.overspeed++; - + if(overspeed > 60 && warnCooldown == 0) { warnCooldown = 100; worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1, zCoord + 0.5, "hbm:block.warnOverspeed", 2.0F, 1.0F); } - + if(overspeed > 300) { this.hasBlade = false; this.worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 5F, false, false); - + int orientation = this.getBlockMetadata() - BlockDummyable.offset; ForgeDirection dir = ForgeDirection.getOrientation(orientation); EntitySawblade cog = new EntitySawblade(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + cog.motionX = rot.offsetX; cog.motionY = 1 + (heat - 100) * 0.0001D; cog.motionZ = rot.offsetZ; worldObj.spawnEntityInWorld(cog); - + this.markDirty(); } - + } else { this.overspeed = 0; } @@ -150,14 +148,14 @@ public class TileEntitySawmill extends TileEntityMachineBase { networkPackNT(150); this.heat = 0; - + } else { - + float momentum = heat * 25F / ((float) 300); - + this.lastSpin = this.spin; this.spin += momentum; - + if(this.spin >= 360F) { this.spin -= 360F; this.lastSpin -= 360F; @@ -171,13 +169,9 @@ public class TileEntitySawmill extends TileEntityMachineBase { buf.writeInt(progress); buf.writeBoolean(hasBlade); - ByteBuf itemBuf = new PacketBuffer(Unpooled.buffer()); - for (ItemStack slot : slots) { BufferUtil.writeItemStack(buf, slot); } - - buf.writeBytes(itemBuf); } @Override @@ -190,38 +184,38 @@ public class TileEntitySawmill extends TileEntityMachineBase { slots[i] = BufferUtil.readItemStack(buf); } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.hasBlade = nbt.getBoolean("hasBlade"); this.progress = nbt.getInteger("progress"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("hasBlade", hasBlade); nbt.setInteger("progress", progress); } - + protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - + if(con instanceof IHeatSource) { IHeatSource source = (IHeatSource) con; int heatSrc = (int) (source.getHeatStored() * diffusion); - + if(heatSrc > 0) { source.useUpHeat(heatSrc); this.heat += heatSrc; return; } } - + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } - + protected InventoryCraftingAuto craftingInventory = new InventoryCraftingAuto(1, 1); @Override @@ -238,20 +232,20 @@ public class TileEntitySawmill extends TileEntityMachineBase { public int[] getAccessibleSlotsFromSide(int side) { return new int[] {0, 1, 2}; } - + public ItemStack getOutput(ItemStack input) { - + if(input == null) return null; - + craftingInventory.setInventorySlotContents(0, input); - + List names = ItemStackUtil.getOreDictNames(input); - + if(names.contains("stickWood")) { return new ItemStack(ModItems.powder_sawdust); } - + if(names.contains("logWood")) { for(Object o : CraftingManager.getInstance().getRecipeList()) { IRecipe recipe = (IRecipe) o; @@ -265,35 +259,35 @@ public class TileEntitySawmill extends TileEntityMachineBase { } } } - + if(names.contains("plankWood")) { return new ItemStack(Items.stick, 6); } - + if(names.contains("treeSapling")) { return new ItemStack(Items.stick, 1); } - + return null; } public static HashMap getRecipes() { - + HashMap recipes = new HashMap(); recipes.put(new OreDictStack("logWood"), new ItemStack[] { new ItemStack(Blocks.planks, 6), ItemStackUtil.addTooltipToStack(new ItemStack(ModItems.powder_sawdust), EnumChatFormatting.RED + "50%") }); recipes.put(new OreDictStack("plankWood"), new ItemStack[] { new ItemStack(Items.stick, 6), ItemStackUtil.addTooltipToStack(new ItemStack(ModItems.powder_sawdust), EnumChatFormatting.RED + "10%") }); recipes.put(new OreDictStack("stickWood"), new ItemStack[] { new ItemStack(ModItems.powder_sawdust) }); recipes.put(new OreDictStack("treeSapling"), new ItemStack[] { new ItemStack(Items.stick, 1), ItemStackUtil.addTooltipToStack(new ItemStack(ModItems.powder_sawdust), EnumChatFormatting.RED + "10%") }); - + return recipes; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -304,10 +298,10 @@ public class TileEntitySawmill extends TileEntityMachineBase { zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java index 3f6ba78a0..107fe54ab 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java @@ -25,7 +25,7 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui public HashSet primary = new HashSet(); public HashSet secondary = new HashSet(); - + public TileEntitySolarBoiler() { water = new FluidTank(Fluids.WATER, 100); steam = new FluidTank(Fluids.STEAM, 10_000); @@ -33,16 +33,16 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.trySubscribe(water.getTankType(), worldObj, xCoord, yCoord + 3, zCoord, Library.POS_Y); this.trySubscribe(water.getTankType(), worldObj, xCoord, yCoord - 1, zCoord, Library.NEG_Y); - + int process = heat / 50; process = Math.min(process, water.getFill()); process = Math.min(process, (steam.getMaxFill() - steam.getFill()) / 100); - + if(process < 0) process = 0; @@ -51,12 +51,12 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui this.sendFluid(steam, worldObj, xCoord, yCoord + 3, zCoord, Library.POS_Y); this.sendFluid(steam, worldObj, xCoord, yCoord - 1, zCoord, Library.NEG_Y); - + heat = 0; - sendStandard(15); + networkPackNT(15); } else { - + //a delayed queue of mirror positions because we can't expect the boiler to always tick first secondary.clear(); secondary.addAll(primary); @@ -79,12 +79,12 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui this.water.writeToNBT(nbt, "water"); this.steam.writeToNBT(nbt, "steam"); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -95,10 +95,10 @@ public class TileEntitySolarBoiler extends TileEntityLoadedBase implements IFlui zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java index 599ca66b9..381e81c39 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java @@ -20,9 +20,8 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; +import io.netty.buffer.PooledByteBufAllocator; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; @@ -71,13 +70,15 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner writer.name("D:efficiency").value(efficiency); } - ByteBuf buf = new PacketBuffer(Unpooled.buffer()); + ByteBuf buf; @Override public void updateEntity() { if(!worldObj.isRemote) { + this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + this.powerBuffer = 0; tanks[0].setTankType(Fluids.STEAM); @@ -120,7 +121,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - sendStandard(150); + networkPackNT(150); } else { this.lastRotor = this.rotor; @@ -214,7 +215,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf = new PacketBuffer(Unpooled.buffer()); + this.buf.release(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java index 8c86ca568..44a71b5d5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java @@ -24,16 +24,16 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityStirling extends TileEntityLoadedBase implements IBufPacketReceiver, IEnergyProviderMK2, IConfigurableMachine { - + public long powerBuffer; public int heat; private int warnCooldown = 0; private int overspeed = 0; public boolean hasCog = true; - + public float spin; public float lastSpin; - + /* CONFIGURABLE CONSTANTS */ public static double diffusion = 0.1D; public static double efficiency = 0.5D; @@ -43,44 +43,44 @@ public class TileEntityStirling extends TileEntityLoadedBase implements IBufPack @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(hasCog) { this.powerBuffer = 0; tryPullHeat(); - + this.powerBuffer = (long) (this.heat * (this.isCreative() ? 1 : this.efficiency)); - + if(warnCooldown > 0) warnCooldown--; - + if(heat > maxHeat() && !isCreative()) { - + this.overspeed++; - + if(overspeed > 60 && warnCooldown == 0) { warnCooldown = 100; worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1, zCoord + 0.5, "hbm:block.warnOverspeed", 2.0F, 1.0F); } - + if(overspeed > overspeedLimit) { this.hasCog = false; this.worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 5F, false, false); - + int orientation = this.getBlockMetadata() - BlockDummyable.offset; ForgeDirection dir = ForgeDirection.getOrientation(orientation); EntityCog cog = new EntityCog(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation).setMeta(this.getGeatMeta()); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + cog.motionX = rot.offsetX; cog.motionY = 1 + (heat - maxHeat()) * 0.0001D; cog.motionZ = rot.offsetZ; worldObj.spawnEntityInWorld(cog); - + this.markDirty(); } - + } else { this.overspeed = 0; } @@ -88,48 +88,48 @@ public class TileEntityStirling extends TileEntityLoadedBase implements IBufPack this.overspeed = 0; this.warnCooldown = 0; } - - sendStandard(150); - + + networkPackNT(150); + if(hasCog) { for(DirPos pos : getConPos()) { this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } else { - + if(this.powerBuffer > 0) this.powerBuffer--; } - + this.heat = 0; } else { - + float momentum = powerBuffer * 50F / ((float) maxHeat()); - + if(this.isCreative()) momentum = Math.min(momentum, 45F); - + this.lastSpin = this.spin; this.spin += momentum; - + if(this.spin >= 360F) { this.spin -= 360F; this.lastSpin -= 360F; } } } - + public int getGeatMeta() { return this.getBlockType() == ModBlocks.machine_stirling ? 0 : this.getBlockType() == ModBlocks.machine_stirling_creative ? 2 : 1; } - + public int maxHeat() { return this.getBlockType() == ModBlocks.machine_stirling ? 300 : 1500; } - + public boolean isCreative() { return this.getBlockType() == ModBlocks.machine_stirling_creative; } - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), @@ -152,24 +152,24 @@ public class TileEntityStirling extends TileEntityLoadedBase implements IBufPack this.heat = buf.readInt(); this.hasCog = buf.readBoolean(); } - + protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - + if(con instanceof IHeatSource) { IHeatSource source = (IHeatSource) con; int heatSrc = (int) (source.getHeatStored() * diffusion); - + if(heatSrc > 0) { source.useUpHeat(heatSrc); this.heat += heatSrc; return; } } - + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -178,7 +178,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements IBufPack this.hasCog = nbt.getBoolean("hasCog"); this.overspeed = nbt.getInteger("overspeed"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -202,12 +202,12 @@ public class TileEntityStirling extends TileEntityLoadedBase implements IBufPack public long getMaxPower() { return powerBuffer; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -218,10 +218,10 @@ public class TileEntityStirling extends TileEntityLoadedBase implements IBufPack zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java index 0ea865d8d..407c79868 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java @@ -55,61 +55,61 @@ public class TileEntityStorageDrum extends TileEntityMachineBase implements IFlu @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + float rad = 0; - + int liquid = 0; int gas = 0; - + for(int i = 0; i < 24; i++) { - + if(slots[i] != null) { - + Item item = slots[i].getItem(); - + if(worldObj.getTotalWorldTime() % 20 == 0) { rad += HazardSystem.getHazardLevelFromStack(slots[i], HazardRegistry.RADIATION); } - + int meta = slots[i].getItemDamage(); - + if(item == ModItems.nuclear_waste_long && worldObj.rand.nextInt(VersatileConfig.getLongDecayChance()) == 0) { ItemWasteLong.WasteClass wasteClass = ItemWasteLong.WasteClass.values()[ItemWasteLong.rectify(meta)]; liquid += wasteClass.liquid; gas += wasteClass.gas; slots[i] = new ItemStack(ModItems.nuclear_waste_long_depleted, 1, meta); } - + if(item == ModItems.nuclear_waste_long_tiny && worldObj.rand.nextInt(VersatileConfig.getLongDecayChance() / 10) == 0) { ItemWasteLong.WasteClass wasteClass = ItemWasteLong.WasteClass.values()[ItemWasteLong.rectify(meta)]; liquid += wasteClass.liquid / 10; gas += wasteClass.gas / 10; slots[i] = new ItemStack(ModItems.nuclear_waste_long_depleted_tiny, 1, meta); } - + if(item == ModItems.nuclear_waste_short && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance()) == 0) { ItemWasteShort.WasteClass wasteClass = ItemWasteShort.WasteClass.values()[ItemWasteLong.rectify(meta)]; liquid += wasteClass.liquid; gas += wasteClass.gas; slots[i] = new ItemStack(ModItems.nuclear_waste_short_depleted, 1, meta); } - + if(item == ModItems.nuclear_waste_short_tiny && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 10) == 0) { ItemWasteShort.WasteClass wasteClass = ItemWasteShort.WasteClass.values()[ItemWasteLong.rectify(meta)]; liquid += wasteClass.liquid / 10; gas += wasteClass.gas / 10; slots[i] = new ItemStack(ModItems.nuclear_waste_short_depleted_tiny, 1, meta); } - + if(item == ModItems.ingot_au198 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 20) == 0) { slots[i] = new ItemStack(ModItems.ingot_mercury, 1, meta); } if(item == ModItems.nugget_au198 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 100) == 0) { slots[i] = new ItemStack(ModItems.nugget_mercury, 1, meta); } - + if(item == ModItems.ingot_pb209 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 10) == 0) { slots[i] = new ItemStack(ModItems.ingot_bismuth, 1, meta); } @@ -128,27 +128,27 @@ public class TileEntityStorageDrum extends TileEntityMachineBase implements IFlu this.tanks[0].setFill(this.tanks[0].getFill() + liquid); this.tanks[1].setFill(this.tanks[1].getFill() + gas); - + for(int i = 0; i < 2; i++) { - + int overflow = Math.max(this.tanks[i].getFill() - this.tanks[i].getMaxFill(), 0); - + if(overflow > 0) { this.tanks[i].setFill(this.tanks[i].getFill() - overflow); this.tanks[i].getTankType().onFluidRelease(this, this.tanks[i], overflow); } } - + age++; - + if(age >= 20) age -= 20; - + this.sendFluidToAll(tanks[0], this); this.sendFluidToAll(tanks[1], this); - - this.sendStandard(25); - + + this.networkPackNT(25); + if(rad > 0) { radiate(worldObj, xCoord, yCoord, zCoord, rad); } @@ -159,58 +159,58 @@ public class TileEntityStorageDrum extends TileEntityMachineBase implements IFlu tanks[0].serialize(buf); tanks[1].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { tanks[0].deserialize(buf); tanks[1].deserialize(buf); } - + private void radiate(World world, int x, int y, int z, float rads) { - + double range = 32D; - + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x + 0.5, y + 0.5, z + 0.5, x + 0.5, y + 0.5, z + 0.5).expand(range, range, range)); - + for(EntityLivingBase e : entities) { - + Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); double len = vec.lengthVector(); vec = vec.normalize(); - + float res = 0; - + for(int i = 1; i < len; i++) { int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); - + res += world.getBlock(ix, iy, iz).getExplosionResistance(null); } - + if(res < 1) res = 1; - + float eRads = rads; eRads /= (float)res; eRads /= (float)(len * len); - + ContaminationUtil.contaminate(e, HazardType.RADIATION, ContaminationType.CREATIVE, eRads); } } @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - + Item item = itemStack.getItem(); - - if(item == ModItems.nuclear_waste_long || - item == ModItems.nuclear_waste_long_tiny || - item == ModItems.nuclear_waste_short || - item == ModItems.nuclear_waste_short_tiny || + + if(item == ModItems.nuclear_waste_long || + item == ModItems.nuclear_waste_long_tiny || + item == ModItems.nuclear_waste_short || + item == ModItems.nuclear_waste_short_tiny || item == ModItems.ingot_au198) return true; - + return false; } @@ -223,14 +223,14 @@ public class TileEntityStorageDrum extends TileEntityMachineBase implements IFlu public boolean canExtractItem(int i, ItemStack itemStack, int j) { Item item = itemStack.getItem(); - - if(item == ModItems.nuclear_waste_long_depleted || - item == ModItems.nuclear_waste_long_depleted_tiny || - item == ModItems.nuclear_waste_short_depleted || - item == ModItems.nuclear_waste_short_depleted_tiny || + + if(item == ModItems.nuclear_waste_long_depleted || + item == ModItems.nuclear_waste_long_depleted_tiny || + item == ModItems.nuclear_waste_short_depleted || + item == ModItems.nuclear_waste_short_depleted_tiny || item == ModItems.ingot_mercury) return true; - + return false; } @@ -238,19 +238,19 @@ public class TileEntityStorageDrum extends TileEntityMachineBase implements IFlu public int getInventoryStackLimit() { return 1; } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return slots_arr; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.tanks[0].readFromNBT(nbt, "liquid"); this.tanks[1].readFromNBT(nbt, "gas"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java index dfab96b7c..d4e2c6705 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java @@ -57,7 +57,7 @@ public class TileEntityMachineCatalyticCracker extends TileEntityLoadedBase impl } this.worldObj.theProfiler.endSection(); - sendStandard(25); + networkPackNT(25); } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index 13a77332f..d186eb1e3 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -20,36 +20,36 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; public class TileEntityMachineFractionTower extends TileEntityLoadedBase implements IBufPacketReceiver, IFluidStandardTransceiver, IFluidCopiable { - + public FluidTank[] tanks; - + public TileEntityMachineFractionTower() { tanks = new FluidTank[3]; tanks[0] = new FluidTank(Fluids.HEAVYOIL, 4000); tanks[1] = new FluidTank(Fluids.BITUMEN, 4000); tanks[2] = new FluidTank(Fluids.SMEAR, 4000); } - + @Override public void updateEntity() { if(!worldObj.isRemote) { - + TileEntity stack = worldObj.getTileEntity(xCoord, yCoord + 3, zCoord); - + if(stack instanceof TileEntityMachineFractionTower) { TileEntityMachineFractionTower frac = (TileEntityMachineFractionTower) stack; - + //make types equal for(int i = 0; i < 3; i++) { frac.tanks[i].setTankType(tanks[i].getTankType()); } - + //calculate transfer int oil = Math.min(tanks[0].getFill(), frac.tanks[0].getMaxFill() - frac.tanks[0].getFill()); int left = Math.min(frac.tanks[1].getFill(), tanks[1].getMaxFill() - tanks[1].getFill()); int right = Math.min(frac.tanks[2].getFill(), tanks[2].getMaxFill() - tanks[2].getFill()); - + //move oil up, pull fractions down tanks[0].setFill(tanks[0].getFill() - oil); tanks[1].setFill(tanks[1].getFill() + left); @@ -58,16 +58,16 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme frac.tanks[1].setFill(frac.tanks[1].getFill() - left); frac.tanks[2].setFill(frac.tanks[2].getFill() - right); } - + setupTanks(); this.updateConnections(); - + if(worldObj.getTotalWorldTime() % 10 == 0) fractionate(); - + this.sendFluid(); - sendStandard(50); + networkPackNT(50); } } @@ -82,22 +82,22 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme for(int i = 0; i < 3; i++) tanks[i].deserialize(buf); } - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private void sendFluid() { - + for(DirPos pos : getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + private DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), @@ -106,11 +106,11 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme new DirPos(xCoord, yCoord, zCoord - 2, Library.NEG_Z) }; } - + private void setupTanks() { - + Pair quart = FractionRecipes.getFractions(tanks[0].getTankType()); - + if(quart != null) { tanks[1].setTankType(quart.getKey().type); tanks[2].setTankType(quart.getValue().type); @@ -120,16 +120,16 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme tanks[2].setTankType(Fluids.NONE); } } - + private void fractionate() { - + Pair quart = FractionRecipes.getFractions(tanks[0].getTankType()); - + if(quart != null) { - + int left = quart.getKey().fill; int right = quart.getValue().fill; - + if(tanks[0].getFill() >= 100 && hasSpace(left, right)) { tanks[0].setFill(tanks[0].getFill() - 100); tanks[1].setFill(tanks[1].getFill() + left); @@ -137,11 +137,11 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme } } } - + private boolean hasSpace(int left, int right) { return tanks[1].getFill() + left <= tanks[1].getMaxFill() && tanks[2].getFill() + right <= tanks[2].getMaxFill(); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -149,7 +149,7 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme for(int i = 0; i < 3; i++) tanks[i].readFromNBT(nbt, "tank" + i); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -157,12 +157,12 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme for(int i = 0; i < 3; i++) tanks[i].writeToNBT(nbt, "tank" + i); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -173,10 +173,10 @@ public class TileEntityMachineFractionTower extends TileEntityLoadedBase impleme zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 40efccc6b..8b168d177 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -11,7 +11,6 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.stream.Collectors; public class RBMKDials { @@ -64,10 +63,23 @@ public class RBMKDials { } } - // Refresh all gamerules. + + /** + * Refresh all gamerules. + * @param world World to refresh for. + */ public static void refresh(World world) { + List> toRemove = new ArrayList<>(); for(List> values : gameRules.values()) { - values.removeAll(values.stream().filter(a -> a.key == world).collect(Collectors.toList())); + + for(Tuple.Pair rulePair : values) + if(rulePair.key == world) + toRemove.add(rulePair); + + for(Tuple.Pair pair : toRemove) + values.remove(pair); + + toRemove.clear(); } gameRules.get(RBMKKeys.KEY_PASSIVE_COOLING).add(new Tuple.Pair<>(world, GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_PASSIVE_COOLING, 0.0D))); @@ -94,8 +106,20 @@ public class RBMKDials { gameRules.get(RBMKKeys.KEY_REFLECTOR_EFFICIENCY).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_REFLECTOR_EFFICIENCY, 0.0D, 1.0D))); } + /** + * Gets a gamerule from the internal cache. + * @param world World to get the gamerule for. + * @param rule Rule to get. + * @return The rule in an Object. + */ public static Object getGameRule(World world, RBMKKeys rule) { - List> rulesList = gameRules.get(rule).stream().filter(a -> a.key == world).collect(Collectors.toList()); + List> rulesList = new ArrayList<>(); + + for(Tuple.Pair rulePair : gameRules.get(rule)) { + if(rulePair.key == world) { + rulesList.add(rulePair); + } + } if(rulesList.isEmpty()) throw new NullPointerException("No gamerule found for " + rule.keyString); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index eaa4ec64d..06970b7b6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -6,7 +6,7 @@ import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.CompatHandler; import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.items.machine.ItemRBMKRod; -import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -19,7 +19,6 @@ import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; @@ -27,7 +26,7 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.List; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityCraneConsole extends TileEntity implements IBufPacketReceiver, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityCraneConsole extends TileEntityLoadedBase implements SimpleComponent, CompatHandler.OCComponent { public int centerX; public int centerY; @@ -165,7 +164,7 @@ public class TileEntityCraneConsole extends TileEntity implements IBufPacketRece this.loadedEnrichment = 0; } - sendStandard(250); + networkPackNT(250); } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index ff74f602a..8ee80176b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -54,26 +54,26 @@ import java.util.Iterator; * */ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements IBufPacketReceiver { - + public double heat; - + public int water; public static final int maxWater = 16000; public int steam; public static final int maxSteam = 16000; public boolean hasLid() { - + if(!isLidRemovable()) return true; - + return this.getBlockMetadata() != RBMKBase.DIR_NO_LID.ordinal() + RBMKBase.offset; } public boolean isLidRemovable() { return true; } - + /** * Approx melting point of steel * Fuels often burn much hotter than this but it won't affect the column too much due to low diffusion @@ -82,7 +82,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements public double maxHeat() { return 1500D; } - + /** * Around the same for every component except boilers which do not have passive cooling * @return @@ -90,22 +90,22 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements public double passiveCooling() { return RBMKDials.getPassiveCooling(worldObj); //default: 1.0D } - + //necessary checks to figure out whether players are close enough to ensure that the reactor can be safely used public boolean shouldUpdate() { return true; } - + //unused public int trackingRange() { return 15; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.worldObj.theProfiler.startSection("rbmkBase_heat_movement"); moveHeat(); if(RBMKDials.getReasimBoilers(worldObj)) { @@ -117,70 +117,73 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements coolPassively(); this.worldObj.theProfiler.endSection(); - this.sendStandard(trackingRange()); + this.networkPackNT(trackingRange()); } } - + /** * The ReaSim boiler dial causes all RBMK parts to behave like boilers */ private void boilWater() { - + if(heat < 100D) return; - + double heatConsumption = RBMKDials.getBoilerHeatConsumption(worldObj); double availableHeat = (this.heat - 100) / heatConsumption; double availableWater = this.water; double availableSpace = this.maxSteam - this.steam; - + int processedWater = (int) Math.floor(Math.min(availableHeat, Math.min(availableWater, availableSpace)) * RBMKDials.getReaSimBoilerSpeed(worldObj)); - + this.water -= processedWater; this.steam += processedWater; this.heat -= processedWater * heatConsumption; } - + public static final ForgeDirection[] neighborDirs = new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.EAST, ForgeDirection.SOUTH, ForgeDirection.WEST }; - + protected TileEntityRBMKBase[] neighborCache = new TileEntityRBMKBase[4]; - + /** * Moves heat to neighboring parts, if possible, in a relatively fair manner */ private void moveHeat() { - + + if(heat == 20 && RBMKDials.getReasimBoilers(worldObj)) + return; + List rec = new ArrayList(); rec.add(this); double heatTot = this.heat; int waterTot = this.water; int steamTot = this.steam; - + int index = 0; for(ForgeDirection dir : neighborDirs) { - + if(neighborCache[index] != null && neighborCache[index].isInvalid()) neighborCache[index] = null; - + if(neighborCache[index] == null) { TileEntity te = Compat.getTileStandard(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); - + if(te instanceof TileEntityRBMKBase) { TileEntityRBMKBase base = (TileEntityRBMKBase) te; neighborCache[index] = base; } } - + index++; } - + for(TileEntityRBMKBase base : neighborCache) { - + if(base != null) { rec.add(base); heatTot += base.heat; @@ -188,32 +191,32 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements steamTot += base.steam; } } - + int members = rec.size(); double stepSize = RBMKDials.getColumnHeatFlow(worldObj); - + if(members > 1) { - + double targetHeat = heatTot / (double)members; - + int tWater = waterTot / members; int rWater = waterTot % members; int tSteam = steamTot / members; int rSteam = steamTot % members; - + for(TileEntityRBMKBase rbmk : rec) { double delta = targetHeat - rbmk.heat; rbmk.heat += delta * stepSize; - + //set to the averages, rounded down rbmk.water = tWater; rbmk.steam = tSteam; } - + //add the modulo to make up for the losses coming from rounding this.water += rWater; this.steam += rSteam; - + this.markDirty(); } } @@ -227,12 +230,12 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements @Override public void markDirty() { - + if(this.worldObj != null) { this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); } } - + protected void coolPassively() { if(TomSaveData.forWorld(worldObj).fire > 1e-5) { @@ -241,9 +244,9 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements this.heat += this.passiveCooling() * 2; } } - + this.heat -= this.passiveCooling(); - + if(heat < 20) heat = 20D; } @@ -253,7 +256,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements } protected static boolean diag = false; - + @Override public void readFromNBT(NBTTagCompound nbt) { @@ -265,14 +268,14 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements this.water = nbt.getInteger("water"); this.steam = nbt.getInteger("steam"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { - + if(!diag) { super.writeToNBT(nbt); } - + nbt.setDouble("heat", this.heat); nbt.setInteger("water", this.water); nbt.setInteger("steam", this.steam); @@ -297,7 +300,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements this.writeToNBT(nbt); diag = false; } - + @SideOnly(Side.CLIENT) public static void diagnosticPrintHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { @@ -353,80 +356,80 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements GL11.glPopMatrix(); Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - + public void onOverheat() { - + for(int i = 0; i < 4; i++) { worldObj.setBlock(xCoord, yCoord + i, zCoord, Blocks.lava); } } - + public void onMelt(int reduce) { - + standardMelt(reduce); - + if(this.getBlockMetadata() == RBMKBase.DIR_NORMAL_LID.ordinal() + RBMKBase.offset) spawnDebris(DebrisType.LID); } - + protected void standardMelt(int reduce) { - + int h = RBMKDials.getColumnHeight(worldObj); reduce = MathHelper.clamp_int(reduce, 1, h); - + if(worldObj.rand.nextInt(3) == 0) reduce++; - + for(int i = h; i >= 0; i--) { - + if(i <= h + 1 - reduce) { - + if(reduce > 1 && i == h + 1 - reduce) { worldObj.setBlock(xCoord, yCoord + i, zCoord, ModBlocks.pribris_burning); } else { worldObj.setBlock(xCoord, yCoord + i, zCoord, ModBlocks.pribris); } - + } else { worldObj.setBlock(xCoord, yCoord + i, zCoord, Blocks.air); } worldObj.markBlockForUpdate(xCoord, yCoord + i, zCoord); } } - + protected void spawnDebris(DebrisType type) { EntityRBMKDebris debris = new EntityRBMKDebris(worldObj, xCoord + 0.5D, yCoord + 4D, zCoord + 0.5D, type); debris.motionX = worldObj.rand.nextGaussian() * 0.25D; debris.motionZ = worldObj.rand.nextGaussian() * 0.25D; debris.motionY = 0.25D + worldObj.rand.nextDouble() * 1.25D; - + if(type == DebrisType.LID) { debris.motionX *= 0.5D; debris.motionY += 0.5D; debris.motionZ *= 0.5D; } - + worldObj.spawnEntityInWorld(debris); } - + public static HashSet columns = new HashSet(); public static HashSet pipes = new HashSet(); - + //assumes that !worldObj.isRemote public void meltdown() { - + RBMKBase.dropLids = false; - + columns.clear(); pipes.clear(); getFF(xCoord, yCoord, zCoord); - + int minX = xCoord; int maxX = xCoord; int minZ = zCoord; int maxZ = zCoord; - + //set meltdown bounds for(TileEntityRBMKBase rbmk : columns) { @@ -439,31 +442,31 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements if(rbmk.zCoord > maxZ) maxZ = rbmk.zCoord; } - + for(TileEntityRBMKBase rbmk : columns) { int distFromMinX = rbmk.xCoord - minX; int distFromMaxX = maxX - rbmk.xCoord; int distFromMinZ = rbmk.zCoord - minZ; int distFromMaxZ = maxZ - rbmk.zCoord; - + int minDist = Math.min(distFromMinX, Math.min(distFromMaxX, Math.min(distFromMinZ, distFromMaxZ))); - + rbmk.onMelt(minDist + 1); } - + for(TileEntityRBMKBase rbmk : columns) { - + if(rbmk instanceof TileEntityRBMKRod && worldObj.getBlock(rbmk.xCoord, rbmk.yCoord, rbmk.zCoord) == ModBlocks.corium_block) { - + for(int x = rbmk.xCoord - 1; x <= rbmk.xCoord + 1; x ++) { for(int y = rbmk.yCoord - 1; y <= rbmk.yCoord + 1; y ++) { for(int z = rbmk.zCoord - 1; z <= rbmk.zCoord + 1; z ++) { - + Block b = worldObj.getBlock(x, y, z); - + if(worldObj.rand.nextInt(3) == 0 && (b == ModBlocks.pribris || b == ModBlocks.pribris_burning)) { - + if(RBMKBase.digamma) worldObj.setBlock(x, y, z, ModBlocks.pribris_digamma); else @@ -474,23 +477,23 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements } } } - + /* Hanlde overpressure event */ if(RBMKDials.getOverpressure(worldObj) && !pipes.isEmpty()) { HashSet pipeBlocks = new HashSet(); HashSet pipeReceivers = new HashSet(); - + //unify all parts into single sets to prevent redundancy pipes.forEach(x -> { pipeBlocks.addAll(x.getLinks()); pipeReceivers.addAll(x.getSubscribers()); }); - + int count = 0; int max = Math.min(pipeBlocks.size() / 5, 100); Iterator itPipes = pipeBlocks.iterator(); Iterator itReceivers = pipeReceivers.iterator(); - + while(itPipes.hasNext() && count < max) { IFluidConductor pipe = itPipes.next(); if(pipe instanceof TileEntity) { @@ -499,7 +502,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements } count++; } - + while(itReceivers.hasNext()) { IFluidConnector con = itReceivers.next(); if(con instanceof TileEntity) { @@ -513,26 +516,26 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements } } } - + int smallDim = Math.min(maxX - minX, maxZ - minZ); int avgX = minX + (maxX - minX) / 2; int avgZ = minZ + (maxZ - minZ) / 2; - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkmush"); data.setFloat("scale", smallDim); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, avgX + 0.5, yCoord + 1, avgZ + 0.5), new TargetPoint(worldObj.provider.dimensionId,avgX + 0.5, yCoord + 1, avgZ + 0.5, 250)); MainRegistry.proxy.effectNT(data); - + worldObj.playSoundEffect(avgX + 0.5, yCoord + 1, avgZ + 0.5, "hbm:block.rbmk_explosion", 50.0F, 1.0F); - + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(50, 50, 50)); - + for(EntityPlayer player : players) { player.triggerAchievement(MainRegistry.achRBMKBoom); } - + if(RBMKBase.digamma) { EntitySpear spear = new EntitySpear(worldObj); spear.posX = avgX + 0.5; @@ -540,19 +543,19 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements spear.posY = yCoord + 100; worldObj.spawnEntityInWorld(spear); } - + RBMKBase.dropLids = true; RBMKBase.digamma = false; } - + private void getFF(int x, int y, int z) { - + TileEntity te = Compat.getTileStandard(worldObj, x, y, z); - + if(te instanceof TileEntityRBMKBase) { - + TileEntityRBMKBase rbmk = (TileEntityRBMKBase) te; - + if(!columns.contains(rbmk)) { columns.add(rbmk); getFF(x + 1, y, z); @@ -562,21 +565,21 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements } } } - + public boolean isModerated() { return false; } - + public abstract ColumnType getConsoleType(); - + public NBTTagCompound getNBTForConsole() { return null; } - + public static List getFancyStats(NBTTagCompound nbt) { return null; } - + @Override public AxisAlignedBB getRenderBoundingBox() { return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 17, zCoord + 1); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 7b3a05182..fcffc21d1 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -44,7 +44,7 @@ import java.util.Set; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) public class TileEntityBarrel extends TileEntityMachineBase implements SimpleComponent, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider, CompatHandler.OCComponent, IFluidCopiable { - + public FluidTank tank; public short mode = 0; public static final short modes = 4; @@ -75,12 +75,12 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom @Override public long getDemand(FluidType type, int pressure) { - + if(this.mode == 2 || this.mode == 3 || this.sendingBrake) return 0; - + if(tank.getPressure() != pressure) return 0; - + return type == tank.getTankType() ? tank.getMaxFill() - tank.getFill() : 0; } @@ -94,7 +94,7 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom @Override public void updateEntity() { - + if(!worldObj.isRemote) { byte comp = this.getComparatorPower(); //do comparator shenanigans @@ -107,15 +107,15 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom tank.setType(0, 1, slots); tank.loadTank(2, 3, slots); tank.unloadTank(4, 5, slots); - + this.sendingBrake = true; tank.setFill(transmitFluidFairly(worldObj, tank, this, tank.getFill(), this.mode == 0 || this.mode == 1, this.mode == 1 || this.mode == 2, getConPos())); this.sendingBrake = false; - + if(tank.getFill() > 0) { checkFluidInteraction(); } - + this.networkPackNT(50); } } @@ -126,14 +126,14 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom buf.writeShort(mode); tank.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); mode = buf.readShort(); tank.deserialize(buf); } - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X), @@ -144,18 +144,18 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z) }; } - + protected static int transmitFluidFairly(World world, FluidTank tank, IFluidConnector that, int fill, boolean connect, boolean send, DirPos[] connections) { - + Set nets = new HashSet<>(); Set consumers = new HashSet<>(); FluidType type = tank.getTankType(); int pressure = tank.getPressure(); - + for(DirPos pos : connections) { - + TileEntity te = world.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); - + if(te instanceof IFluidConductor) { IFluidConductor con = (IFluidConductor) te; if(con.getPipeNet(type) != null) { @@ -163,13 +163,13 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom con.getPipeNet(type).unsubscribe(that); consumers.addAll(con.getPipeNet(type).getSubscribers()); } - + //if it's just a consumer, buffer it as a subscriber } else if(te instanceof IFluidConnector) { consumers.add((IFluidConnector) te); } } - + consumers.remove(that); if(fill > 0 && send) { @@ -177,24 +177,24 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom con.addAll(consumers); con.removeIf(x -> x == null || !(x instanceof TileEntity) || ((TileEntity)x).isInvalid()); - + if(PipeNet.trackingInstances == null) { PipeNet.trackingInstances = new ArrayList<>(); } - + PipeNet.trackingInstances.clear(); nets.forEach(x -> { if(x instanceof PipeNet) PipeNet.trackingInstances.add((PipeNet) x); }); - + fill = (int) PipeNet.fairTransfer(con, type, pressure, fill); } - + //resubscribe to buffered nets, if necessary if(connect) { nets.forEach(x -> x.subscribe(that)); } - + return fill; } @@ -208,7 +208,7 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom //if content is above 0 but still within capacity if(i == 2 && content > 0 && content <= tank.getMaxFill()) return true; - + return false; } @@ -221,23 +221,23 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom public int[] getAccessibleSlotsFromSide(int p_94128_1_) { return new int[] {2, 3, 4, 5}; } - + public void checkFluidInteraction() { - + Block b = this.getBlockType(); - + //for when you fill antimatter into a matter tank if(b != ModBlocks.barrel_antimatter && tank.getTankType().isAntimatter()) { worldObj.func_147480_a(xCoord, yCoord, zCoord, false); worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 5, true, true); } - + //for when you fill hot or corrosive liquids into a plastic tank if(b == ModBlocks.barrel_plastic && (tank.getTankType().isCorrosive() || tank.getTankType().isHot())) { worldObj.func_147480_a(xCoord, yCoord, zCoord, false); worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 1.0F, 1.0F); } - + //for when you fill corrosive liquid into an iron tank if((b == ModBlocks.barrel_iron && tank.getTankType().isCorrosive()) || (b == ModBlocks.barrel_steel && tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).getRating() > 50)) { @@ -245,16 +245,16 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom this.slots = new ItemStack[6]; worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.barrel_corroded); TileEntityBarrel barrel = (TileEntityBarrel)worldObj.getTileEntity(xCoord, yCoord, zCoord); - + if(barrel != null) { barrel.tank.setTankType(tank.getTankType()); barrel.tank.setFill(Math.min(barrel.tank.getMaxFill(), tank.getFill())); barrel.slots = copy; } - + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 1.0F, 1.0F); } - + if(b == ModBlocks.barrel_corroded ) { if(worldObj.rand.nextInt(3) == 0) { tank.setFill(tank.getFill() - 1); @@ -262,29 +262,29 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom } if(worldObj.rand.nextInt(3 * 60 * 20) == 0) worldObj.func_147480_a(xCoord, yCoord, zCoord, false); } - + //For when Tom's firestorm hits a barrel full of water if(tank.getTankType() == Fluids.WATER && TomSaveData.forWorld(worldObj).fire > 1e-5) { int light = this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, this.xCoord, this.yCoord, this.zCoord); - + if(light > 7) { worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 5, true, true); } } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + mode = nbt.getShort("mode"); tank.readFromNBT(nbt, "tank"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setShort("mode", mode); tank.writeToNBT(nbt, "tank"); } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java index 9e3e6e472..61acde31f 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityFileCabinet.java @@ -16,7 +16,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIProvider, IBufPacketReceiver { - + private int timer = 0; private int playersUsing = 0; //meh, it's literally just two extra variables @@ -24,16 +24,16 @@ public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIPr public float prevLowerExtent = 0; public float upperExtent = 0; public float prevUpperExtent = 0; - + public TileEntityFileCabinet() { super(8); } - + @Override public String getInventoryName() { return "container.fileCabinet"; } - + @Override public void openInventory() { if(!worldObj.isRemote) this.playersUsing++; @@ -48,64 +48,64 @@ public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIPr buf.writeInt(timer); buf.writeInt(playersUsing); } - + @Override public void deserialize(ByteBuf buf) { timer = buf.readInt(); playersUsing = buf.readInt(); } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(this.playersUsing > 0) { if(timer < 10) { timer++; } } else timer = 0; - - sendStandard(25); + + networkPackNT(25); } else { this.prevLowerExtent = lowerExtent; this.prevUpperExtent = upperExtent; } - + float openSpeed = playersUsing > 0 ? 1F / 16F : 1F / 25F; float maxExtent = 0.8F; - + if(this.playersUsing > 0) { if(lowerExtent == 0F && upperExtent == 0F) this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.crateOpen", 0.8F, 1.0F); else { if(upperExtent + openSpeed >= maxExtent && lowerExtent < maxExtent) this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.crateOpen", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.7F); - + if(lowerExtent + openSpeed >= maxExtent && lowerExtent < maxExtent) this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.crateOpen", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.7F); } - + this.lowerExtent += openSpeed; - + if(timer >= 10) this.upperExtent += openSpeed; - + } else if(lowerExtent > 0) { if(upperExtent - openSpeed < maxExtent / 2 && upperExtent >= maxExtent / 2 && upperExtent != lowerExtent) this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.crateClose", 0.8F, 1.0F); - + if(lowerExtent - openSpeed < maxExtent / 2 && lowerExtent >= maxExtent / 2) this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.crateClose", 0.8F, 1.0F); - + this.upperExtent -= openSpeed; this.lowerExtent -= openSpeed; } - + this.lowerExtent = MathHelper.clamp_float(lowerExtent, 0F, maxExtent); this.upperExtent = MathHelper.clamp_float(upperExtent, 0F, maxExtent); } - + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerFileCabinet(player.inventory, this); @@ -122,7 +122,7 @@ public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIPr public boolean isItemValidForSlot(int i, ItemStack stack) { return false; } - + @Override public boolean canInsertItem(int i, ItemStack itemStack, int j) { return false; @@ -132,12 +132,12 @@ public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIPr public boolean canExtractItem(int i, ItemStack itemStack, int j) { return false; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -148,10 +148,10 @@ public class TileEntityFileCabinet extends TileEntityCrateBase implements IGUIPr zCoord + 1 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index 059efaa88..d0d5abda5 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -88,7 +88,7 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa } } - sendStandard(15); + networkPackNT(15); } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java index 8afaeb73c..d88b68cc5 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java @@ -3,23 +3,23 @@ package com.hbm.tileentity.network; import api.hbm.energymk2.IEnergyConductorMK2; import api.hbm.energymk2.Nodespace; import api.hbm.energymk2.Nodespace.PowerNode; -import net.minecraft.tileentity.TileEntity; +import com.hbm.tileentity.TileEntityLoadedBase; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCableBaseNT extends TileEntity implements IEnergyConductorMK2 { - +public class TileEntityCableBaseNT extends TileEntityLoadedBase implements IEnergyConductorMK2 { + protected PowerNode node; @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(this.node == null || this.node.expired) { - + if(this.shouldCreateNode()) { this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); - + if(this.node == null || this.node.expired) { this.node = this.createNode(); Nodespace.createNode(worldObj, this.node); @@ -28,11 +28,11 @@ public class TileEntityCableBaseNT extends TileEntity implements IEnergyConducto } } } - + public boolean shouldCreateNode() { return true; } - + public void onNodeDestroyedCallback() { this.node = null; } @@ -40,7 +40,7 @@ public class TileEntityCableBaseNT extends TileEntity implements IEnergyConducto @Override public void invalidate() { super.invalidate(); - + if(!worldObj.isRemote) { if(this.node != null) { Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java index 46e1fa124..f9a6f0a0a 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneRequester.java @@ -9,7 +9,6 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.container.ContainerDroneRequester; import com.hbm.inventory.gui.GUIDroneRequester; import com.hbm.module.ModulePatternMatcher; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.network.RequestNetwork.PathNode; @@ -27,8 +26,8 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer implements IBufPacketReceiver, IGUIProvider, IControlReceiverFilter { - +public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer implements IGUIProvider, IControlReceiverFilter { + public ModulePatternMatcher matcher; public TileEntityDroneRequester() { @@ -40,14 +39,14 @@ public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer public String getName() { return "container.droneRequester"; } - + @Override public void updateEntity() { super.updateEntity(); - + if(!worldObj.isRemote) { - sendStandard(15); + networkPackNT(15); } } @@ -78,13 +77,13 @@ public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer public boolean canExtractItem(int i, ItemStack stack, int j) { return true; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.matcher.readFromNBT(nbt); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -111,7 +110,7 @@ public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer if(filter == null) continue; String mode = this.matcher.modes[i]; AStack aStack = null; - + if(ModulePatternMatcher.MODE_EXACT.equals(mode)) { aStack = new ComparableStack(filter).makeSingular(); } else if(ModulePatternMatcher.MODE_WILDCARD.equals(mode)) { @@ -119,9 +118,9 @@ public class TileEntityDroneRequester extends TileEntityRequestNetworkContainer } else if(mode != null) { aStack = new OreDictStack(mode); } - + if(aStack == null) continue; - + if(stock == null || !this.matcher.isValidForFilter(filter, i, stock)) request.add(aStack); } return new RequestNode(pos, this.reachableNodes, request); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java index ffd51fb0f..99908ee14 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypoint.java @@ -3,20 +3,19 @@ package com.hbm.tileentity.network; import java.util.List; import com.hbm.entity.item.EntityDeliveryDrone; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.ParticleUtil; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.util.fauxpointtwelve.BlockPos; import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketReceiver, IDroneLinkable { - +public class TileEntityDroneWaypoint extends TileEntityLoadedBase implements IDroneLinkable { + public int height = 5; public int nextX = -1; public int nextY = -1; @@ -25,7 +24,7 @@ public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketRec @Override public void updateEntity() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); - + if(!worldObj.isRemote) { if(nextY != -1) { List drones = worldObj.getEntitiesWithinAABB(EntityDeliveryDrone.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1).offset(dir.offsetX * height, dir.offsetY * height, dir.offsetZ * height)); @@ -36,14 +35,14 @@ public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketRec } } - sendStandard(15); + networkPackNT(15); } else { BlockPos pos = getCoord(dir); if(nextY != -1 && worldObj.getTotalWorldTime() % 2 == 0) { double x = xCoord + height * dir.offsetX + 0.5; double y = yCoord + height * dir.offsetY + 0.5; double z = zCoord + height * dir.offsetZ + 0.5; - + worldObj.spawnParticle("reddust", x, y, z, 0, 0, 0); ParticleUtil.spawnDroneLine(worldObj, @@ -60,7 +59,7 @@ public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketRec buf.writeInt(nextY); buf.writeInt(nextZ); } - + @Override public void deserialize(ByteBuf buf) { height = buf.readInt(); @@ -82,12 +81,12 @@ public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketRec this.nextZ = z; this.markDirty(); } - + public void addHeight(int h) { height += h; height = MathHelper.clamp_int(height, 1, 15); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -98,7 +97,7 @@ public class TileEntityDroneWaypoint extends TileEntity implements IBufPacketRec this.nextY = pos[1]; this.nextZ = pos[2]; } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java b/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java index 340a47ab0..ea26263ba 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPipeBaseNT.java @@ -11,6 +11,7 @@ import api.hbm.fluid.IPipeNet; import api.hbm.fluid.PipeNet; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.IFluidCopiable; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.Compat; import net.minecraft.entity.player.EntityPlayer; @@ -23,8 +24,8 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor, IFluidCopiable { - +public class TileEntityPipeBaseNT extends TileEntityLoadedBase implements IFluidConductor, IFluidCopiable { + protected IPipeNet network; protected FluidType type = Fluids.NONE; protected FluidType lastType = Fluids.NONE; @@ -36,59 +37,59 @@ public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor, worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); lastType = type; } - + if(!worldObj.isRemote && shouldConnect()) { - + //we got here either because the net doesn't exist or because it's not valid, so that's safe to assume this.setPipeNet(type, null); - + this.connect(); - + if(this.getPipeNet(type) == null) { this.setPipeNet(type, new PipeNet(type).joinLink(this)); } } } - + public FluidType getType() { return this.type; } - + public void setType(FluidType type) { this.type = type; this.markDirty(); - + if(worldObj instanceof WorldServer) { WorldServer world = (WorldServer) worldObj; world.getPlayerManager().markBlockForUpdate(xCoord, yCoord, zCoord); } - + if(this.network != null) this.network.destroy(); } - + @Override public boolean canConnect(FluidType type, ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN && type == this.type; } - + protected void connect() { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - + TileEntity te = Compat.getTileStandard(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - + if(te instanceof IFluidConductor) { - + IFluidConductor conductor = (IFluidConductor) te; - + if(!conductor.canConnect(type, dir.getOpposite())) continue; - + if(this.getPipeNet(type) == null && conductor.getPipeNet(type) != null) { conductor.getPipeNet(type).joinLink(this); } - + if(this.getPipeNet(type) != null && conductor.getPipeNet(type) != null && this.getPipeNet(type) != conductor.getPipeNet(type)) { conductor.getPipeNet(type).joinNetworks(this.getPipeNet(type)); } @@ -99,7 +100,7 @@ public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor, @Override public void invalidate() { super.invalidate(); - + if(!worldObj.isRemote) { if(this.network != null) { this.network.destroy(); @@ -116,10 +117,10 @@ public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor, @Override public long transferFluid(FluidType type, int pressure, long fluid) { - + if(this.network == null) return fluid; - + return this.network.transferFluid(fluid, pressure); } @@ -144,7 +145,7 @@ public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor, this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); @@ -163,7 +164,7 @@ public class TileEntityPipeBaseNT extends TileEntity implements IFluidConductor, } public boolean isLoaded = true; - + @Override public boolean isLoaded() { return isLoaded; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java index 222f20919..3db91ad96 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java @@ -6,8 +6,8 @@ import java.util.List; import com.hbm.handler.CompatHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.gui.GuiScreenRadioTelex; -import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; @@ -26,12 +26,11 @@ import net.minecraft.init.Items; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiver, IControlReceiver, IGUIProvider, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityRadioTelex extends TileEntityLoadedBase implements IControlReceiver, IGUIProvider, SimpleComponent, CompatHandler.OCComponent { public static final int lineWidth = 33; public String txChannel = ""; @@ -53,24 +52,24 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv public static final char print = '\u000c'; public static final char pause = '\u0016'; public static final char clear = '\u007f'; - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.sendingChar = ' '; - + if(this.isSending && this.txChannel.isEmpty()) this.isSending = false; - + if(this.isSending) { - + if(sendingWait > 0) { sendingWait--; } else { - + String line = txBuffer[sendingLine]; - + if(line.length() > sendingIndex) { char c = line.charAt(sendingIndex); sendingIndex++; @@ -81,7 +80,7 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv this.sendingChar = c; } } else { - + if(sendingLine >= 4) { this.isSending = false; RTTYSystem.broadcast(worldObj, this.txChannel, eot); @@ -95,19 +94,19 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv } } } - + if(!this.rxChannel.isEmpty()) { RTTYChannel chan = RTTYSystem.listen(worldObj, this.rxChannel); - + if(chan != null && chan.signal instanceof Character && (chan.timeStamp > worldObj.getTotalWorldTime() - 2 && chan.timeStamp != -1)) { char c = (char) chan.signal; - + if(this.deleteOnReceive) { this.deleteOnReceive = false; for(int i = 0; i < 5; i++) this.rxBuffer[i] = ""; this.writingLine = 0; } - + if(c == eot) { if(this.printAfterRx) { this.printAfterRx = false; @@ -130,8 +129,8 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv } } } - - sendStandard(16); + + networkPackNT(16); } } @@ -161,35 +160,35 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv @Override public void receiveControl(NBTTagCompound data) { - + for(int i = 0; i < 5; i++) { if(data.hasKey("tx" + i)) this.txBuffer[i] = data.getString("tx" + i); } - + String cmd = data.getString("cmd"); - + if("snd".equals(cmd) && !this.isSending) { this.isSending = true; this.sendingLine = 0; this.sendingIndex = 0; } - + if("rxprt".equals(cmd)) { print(); } - + if("rxcls".equals(cmd)) { for(int i = 0; i < 5; i++) this.rxBuffer[i] = ""; this.writingLine = 0; } - + if("sve".equals(cmd)) { this.txChannel = data.getString("txChan"); this.rxChannel = data.getString("rxChan"); this.markDirty(); } } - + public void print() { ItemStack stack = new ItemStack(Items.paper); List text = new ArrayList(); @@ -221,7 +220,7 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + for(int i = 0; i < 5; i++) { nbt.setString("tx" + i, txBuffer[i]); nbt.setString("rx" + i, rxBuffer[i]); @@ -237,12 +236,12 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GuiScreenRadioTelex(this); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 1, @@ -253,10 +252,10 @@ public class TileEntityRadioTelex extends TileEntity implements IBufPacketReceiv zCoord + 2 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java index 5a01077fa..e63a5b6e3 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.network; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; @@ -10,9 +10,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioTorchBase extends TileEntity implements IBufPacketReceiver, IControlReceiver { +public class TileEntityRadioTorchBase extends TileEntityLoadedBase implements IControlReceiver { /** channel we're broadcasting on/listening to */ public String channel = ""; @@ -31,8 +30,8 @@ public class TileEntityRadioTorchBase extends TileEntity implements IBufPacketRe public void updateEntity() { if(!worldObj.isRemote) { - - sendStandard(50); + + networkPackNT(50); } } @@ -80,7 +79,7 @@ public class TileEntityRadioTorchBase extends TileEntity implements IBufPacketRe nbt.setByte("l", (byte) this.lastState); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { int last = this.lastState; @@ -101,7 +100,7 @@ public class TileEntityRadioTorchBase extends TileEntity implements IBufPacketRe if(data.hasKey("m")) this.customMap = data.getBoolean("m"); if(data.hasKey("c")) this.channel = data.getString("c"); for(int i = 0; i < 16; i++) if(data.hasKey("m" + i)) this.mapping[i] = data.getString("m" + i); - + this.markDirty(); } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java index 36b070cb2..82f1134cb 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.network; import com.hbm.interfaces.IControlReceiver; -import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; import com.hbm.util.BufferUtil; @@ -11,10 +11,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; -public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketReceiver, IControlReceiver { - +public class TileEntityRadioTorchLogic extends TileEntityLoadedBase implements IControlReceiver { + /** channel we're broadcasting on/listening to */ public String channel = ""; /** previous redstone state for input/output, needed for state change detection */ @@ -29,34 +28,34 @@ public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketR public String[] mapping; /** mapping for conditions through [1, 10], being (<, <=, >=, >, ==, !=, equals, !equals, contains, !contains) */ public int[] conditions; - + public TileEntityRadioTorchLogic() { this.mapping = new String[16]; for(int i = 0; i < 16; i++) this.mapping[i] = ""; this.conditions = new int[16]; for(int i = 0; i < 16; i++) this.conditions[i] = 0; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(!this.channel.isEmpty()) { - + RTTYChannel chan = RTTYSystem.listen(worldObj, this.channel); - + if(chan != null && (this.polling || (chan.timeStamp > this.lastUpdate - 1 && chan.timeStamp != -1))) { // if we're either polling or a new message has come in String msg = "" + chan.signal; this.lastUpdate = worldObj.getTotalWorldTime(); int nextState = 0; //if no remap apply, default to 0 - + if(chan.timeStamp < this.lastUpdate - 2 && this.polling) { /* the vast majority use-case for this is going to be inequalities, NOT parsing, and the input is undefined - not the output * if no signal => 0 for polling, advanced users parsing strings can easily accommodate this fact instead of breaking numerical torches */ msg = "0"; } - + if(descending) { for(int i = 15; i >= 0; i--) { if(!mapping[i].equals("") && parseSignal(msg, i)) { @@ -72,7 +71,7 @@ public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketR } } } - + if(this.lastState != nextState) { this.lastState = nextState; worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); @@ -81,11 +80,11 @@ public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketR } } } - - sendStandard(50); + + networkPackNT(50); } } - + public boolean parseSignal(String signal, int index) { if(conditions[index] <= 5) { //if a non-string operator int sig = 0; @@ -93,7 +92,7 @@ public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketR try { sig = Integer.parseInt(signal); map = Integer.parseInt(mapping[index]); } catch(Exception x) { return false; //not a valid input; skip! slightly annoying about the mapping but we'll restrict input anyway }; - + switch(conditions[index]) { default: return sig < map; @@ -109,7 +108,7 @@ public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketR return sig != map; } } - + switch(conditions[index]) { default: return signal.equals(mapping[index]); @@ -170,7 +169,7 @@ public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketR nbt.setByte("l", (byte) this.lastState); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { int last = this.lastState; @@ -192,7 +191,7 @@ public class TileEntityRadioTorchLogic extends TileEntity implements IBufPacketR if(data.hasKey("d")) this.descending = data.getBoolean("d"); for(int i = 0; i < 16; i++) if(data.hasKey("m" + i)) this.mapping[i] = data.getString("m" + i); for(int i = 0; i < 16; i++) if(data.hasKey("c" + i)) this.conditions[i] = data.getInteger("c" + i); - + this.markDirty(); } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java index 35a26b5a5..7da701b58 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java @@ -4,12 +4,12 @@ import java.util.HashMap; import java.util.Iterator; import com.hbm.interfaces.NotableComments; +import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.network.RequestNetwork.PathNode; import com.hbm.util.HashedSet; import com.hbm.util.ParticleUtil; import com.hbm.util.fauxpointtwelve.BlockPos; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.ChunkCoordIntPair; @@ -21,22 +21,22 @@ import net.minecraft.world.World; * it is all spiraling out of control * in a giant mess of nested generics, magic numbers and static global variables * may god have mercy on my soul - * + * * @author hbm * */ @NotableComments -public abstract class TileEntityRequestNetwork extends TileEntity { +public abstract class TileEntityRequestNetwork extends TileEntityLoadedBase { public HashedSet reachableNodes = new HashedSet(); public HashedSet knownNodes = new HashedSet(); public static final int maxRange = 24; - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(worldObj.getTotalWorldTime() % 20 == 0) { BlockPos pos = getCoord(); @@ -44,7 +44,7 @@ public abstract class TileEntityRequestNetwork extends TileEntity { if(this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) newNode.active = false; // push new node push(worldObj, newNode); - + // remove known nodes that no longer exist // since we can assume a sane number of nodes to exist at any given time, we can run this check in full every second Iterator it = knownNodes.iterator(); @@ -58,7 +58,7 @@ public abstract class TileEntityRequestNetwork extends TileEntity { it.remove(); } } - + // draw debug crap for(PathNode known : knownNodes) { if(reachableNodes.contains(known)) ParticleUtil.spawnDroneLine(worldObj, @@ -74,41 +74,41 @@ public abstract class TileEntityRequestNetwork extends TileEntity { data.setString("text", knownNodes.size() + " / " + reachableNodes.size() + " / " + localNodes.size()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); */ - + //both following checks run the `hasPath` function which is costly, so it only runs one op at a time - + //rescan known nodes for(PathNode known : knownNodes) { - + if(!hasPath(worldObj, pos, known.pos)) { reachableNodes.remove(known); } else { reachableNodes.add(known); } } - + //discover new nodes int newNodeLimit = 5; for(PathNode node : localNodes) { - + if(!knownNodes.contains(node) && !node.equals(pos)) { newNodeLimit--; knownNodes.add(node); if(hasPath(worldObj, pos, node.pos)) reachableNodes.add(node); } - + if(newNodeLimit <= 0) break; } } } } - + public abstract PathNode createNode(BlockPos pos); - + public BlockPos getCoord() { return new BlockPos(xCoord, yCoord + 1, zCoord); } - + /** * Performs a bidirectional scan to see if the nodes have line of sight * @param world @@ -128,34 +128,31 @@ public abstract class TileEntityRequestNetwork extends TileEntity { MovingObjectPosition mop2 = world.func_147447_a(vec2, vec1, false, true, false); return (mop0 == null || mop0.typeOfHit == mop0.typeOfHit.MISS) && (mop2 == null || mop2.typeOfHit == mop2.typeOfHit.MISS); } - + /** * Adds the position to that chunk's node list. * @param world - * @param x - * @param y - * @param z */ public static void push(World world, PathNode node) { - + HashMap> coordMap = RequestNetwork.activeWaypoints.get(world); - + if(coordMap == null) { coordMap = new HashMap(); RequestNetwork.activeWaypoints.put(world, coordMap); } - + ChunkCoordIntPair chunkPos = new ChunkCoordIntPair(node.pos.getX() >> 4, node.pos.getZ() >> 4); HashedSet posList = coordMap.get(chunkPos); - + if(posList == null) { posList = new HashedSet(); coordMap.put(chunkPos, posList); } - + posList.add(node); } - + /** * Gets all active nodes in a 5x5 chunk area, centered around the given position. * Used for finding neighbors to check connections to. @@ -171,16 +168,16 @@ public abstract class TileEntityRequestNetwork extends TileEntity { x >>= 4; z >>= 4; - + HashMap> coordMap = RequestNetwork.activeWaypoints.get(world); - + if(coordMap == null) return nodes; - + for(int i = -range; i <= range; i++) { for(int j = -range; j <= range; j++) { - + HashedSet nodeList = coordMap.get(new ChunkCoordIntPair(x + i, z + j)); - + if(nodeList != null) for(PathNode node : nodeList) { if(!pos.contains(node.pos)) { nodes.add(node); @@ -189,7 +186,7 @@ public abstract class TileEntityRequestNetwork extends TileEntity { } } } - + return nodes; } } diff --git a/src/main/java/com/hbm/util/AchievementHandler.java b/src/main/java/com/hbm/util/AchievementHandler.java index 3d395a43e..5897c1949 100644 --- a/src/main/java/com/hbm/util/AchievementHandler.java +++ b/src/main/java/com/hbm/util/AchievementHandler.java @@ -1,21 +1,20 @@ package com.hbm.util; -import java.util.HashMap; - import com.hbm.blocks.ModBlocks; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ItemAmmoEnums; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.stats.Achievement; +import java.util.HashMap; + public class AchievementHandler { public static HashMap craftingAchievements = new HashMap(); - + public static void register() { craftingAchievements.put(new ComparableStack(ModItems.gun_mp40), MainRegistry.achFreytag); craftingAchievements.put(new ComparableStack(ModItems.piston_selenium), MainRegistry.achSelenium); @@ -55,7 +54,7 @@ public class AchievementHandler { craftingAchievements.put(new ComparableStack(ModItems.billet_pu_mix), MainRegistry.achChicagoPile); craftingAchievements.put(new ComparableStack(ModItems.ammo_4gauge, 1, ItemAmmoEnums.Ammo4Gauge.VAMPIRE.ordinal()), MainRegistry.achWitchtaunter); } - + public static void fire(EntityPlayer player, ItemStack stack) { if(player.worldObj.isRemote) return; ComparableStack comp = new ComparableStack(stack).makeSingular(); diff --git a/src/main/java/com/hbm/util/ArmorRegistry.java b/src/main/java/com/hbm/util/ArmorRegistry.java index c098d6a89..98b863080 100644 --- a/src/main/java/com/hbm/util/ArmorRegistry.java +++ b/src/main/java/com/hbm/util/ArmorRegistry.java @@ -1,74 +1,73 @@ package com.hbm.util; +import api.hbm.item.IGasMask; +import com.hbm.handler.ArmorModHandler; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; -import com.hbm.handler.ArmorModHandler; - -import api.hbm.item.IGasMask; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - public class ArmorRegistry { public static HashMap> hazardClasses = new HashMap(); - + public static void registerHazard(Item item, HazardClass... hazards) { hazardClasses.put(item, new ArrayList(Arrays.asList(hazards))); } - + public static boolean hasAllProtection(EntityLivingBase entity, int slot, HazardClass... clazz) { - + if(ArmorUtil.checkArmorNull(entity, slot)) return false; - + List list = getProtectionFromItem(entity.getEquipmentInSlot(slot + 1), entity); return list.containsAll(Arrays.asList(clazz)); } - + public static boolean hasAnyProtection(EntityLivingBase entity, int slot, HazardClass... clazz) { - + if(ArmorUtil.checkArmorNull(entity, slot)) return false; - + List list = getProtectionFromItem(entity.getEquipmentInSlot(slot + 1), entity); - + if(list == null) return false; - + for(HazardClass haz : clazz) { if(list.contains(haz)) return true; } - + return false; } - + public static boolean hasProtection(EntityLivingBase entity, int slot, HazardClass clazz) { - + if(ArmorUtil.checkArmorNull(entity, slot)) return false; - + List list = getProtectionFromItem(entity.getEquipmentInSlot(slot + 1), entity); - + if(list == null) return false; - + return list.contains(clazz); } - + public static List getProtectionFromItem(ItemStack stack, EntityLivingBase entity) { List prot = new ArrayList(); - + Item item = stack.getItem(); - + //if the item has HazardClasses assigned to it, add those if(hazardClasses.containsKey(item)) prot.addAll(hazardClasses.get(item)); - + if(item instanceof IGasMask) { IGasMask mask = (IGasMask) item; ItemStack filter = mask.getFilter(stack, entity); @@ -76,29 +75,29 @@ public class ArmorRegistry { if(filter != null) { //add the HazardClasses from the filter, then remove the ones blacklisted by the mask List filProt = hazardClasses.get(filter.getItem()); - + for(HazardClass c : mask.getBlacklist(stack, entity)) filProt.remove(c); - + prot.addAll(filProt); } } - + if(ArmorModHandler.hasMods(stack)) { - + ItemStack[] mods = ArmorModHandler.pryMods(stack); - + for(ItemStack mod : mods) { - + //recursion! run the exact same procedure on every mod, in case future mods will have filter support if(mod != null) prot.addAll(getProtectionFromItem(mod, entity)); } } - + return prot; } - + public static enum HazardClass { GAS_LUNG("hazard.gasChlorine"), //also attacks eyes -> no half mask GAS_MONOXIDE("hazard.gasMonoxide"), //only affects lungs @@ -110,9 +109,9 @@ public class ArmorRegistry { GAS_BLISTERING("hazard.corrosive"), //corrosive substance, also attacks skin SAND("hazard.sand"), //blinding sand particles LIGHT("hazard.light"); //blinding light - + public final String lang; - + private HazardClass(String lang) { this.lang = lang; } diff --git a/src/main/java/com/hbm/util/ArmorUtil.java b/src/main/java/com/hbm/util/ArmorUtil.java index ece9306a9..9fe8be58c 100644 --- a/src/main/java/com/hbm/util/ArmorUtil.java +++ b/src/main/java/com/hbm/util/ArmorUtil.java @@ -1,17 +1,12 @@ package com.hbm.util; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - +import api.hbm.item.IGasMask; import com.hbm.handler.ArmorModHandler; import com.hbm.handler.HazmatRegistry; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorRegistry.HazardClass; - -import api.hbm.item.IGasMask; import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -23,12 +18,16 @@ import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.event.ForgeEventFactory; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + public class ArmorUtil { - + /* * The less horrifying part */ - + public static void register() { ArmorRegistry.registerHazard(ModItems.gas_mask_filter, HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_LUNG, HazardClass.GAS_BLISTERING, HazardClass.BACTERIA); ArmorRegistry.registerHazard(ModItems.gas_mask_filter_mono, HazardClass.PARTICLE_COARSE, HazardClass.GAS_MONOXIDE); @@ -40,7 +39,7 @@ public class ArmorUtil { ArmorRegistry.registerHazard(ModItems.gas_mask_m65, HazardClass.SAND); ArmorRegistry.registerHazard(ModItems.mask_rag, HazardClass.PARTICLE_COARSE); ArmorRegistry.registerHazard(ModItems.mask_piss, HazardClass.PARTICLE_COARSE, HazardClass.GAS_LUNG); - + ArmorRegistry.registerHazard(ModItems.goggles, HazardClass.LIGHT, HazardClass.SAND); ArmorRegistry.registerHazard(ModItems.ashglasses, HazardClass.LIGHT, HazardClass.SAND); @@ -64,151 +63,151 @@ public class ArmorUtil { ArmorRegistry.registerHazard(ModItems.rpa_helmet, HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_LUNG, HazardClass.BACTERIA, HazardClass.GAS_BLISTERING, HazardClass.GAS_MONOXIDE, HazardClass.LIGHT, HazardClass.SAND); ArmorRegistry.registerHazard(ModItems.envsuit_helmet, HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_LUNG, HazardClass.BACTERIA, HazardClass.GAS_BLISTERING, HazardClass.GAS_MONOXIDE, HazardClass.LIGHT, HazardClass.SAND); ArmorRegistry.registerHazard(ModItems.trenchmaster_helmet, HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_LUNG, HazardClass.BACTERIA, HazardClass.GAS_BLISTERING, HazardClass.GAS_MONOXIDE, HazardClass.LIGHT, HazardClass.SAND); - + //Ob ihr wirklich richtig steht, seht ihr wenn das Licht angeht! registerIfExists(Compat.MOD_GT6, "gt.armor.hazmat.universal.head", HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_LUNG, HazardClass.BACTERIA, HazardClass.GAS_BLISTERING, HazardClass.GAS_MONOXIDE, HazardClass.LIGHT, HazardClass.SAND); registerIfExists(Compat.MOD_GT6, "gt.armor.hazmat.biochemgas.head", HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_LUNG, HazardClass.BACTERIA, HazardClass.GAS_BLISTERING, HazardClass.GAS_MONOXIDE, HazardClass.LIGHT, HazardClass.SAND); registerIfExists(Compat.MOD_GT6, "gt.armor.hazmat.radiation.head", HazardClass.PARTICLE_COARSE, HazardClass.PARTICLE_FINE, HazardClass.GAS_LUNG, HazardClass.BACTERIA, HazardClass.GAS_BLISTERING, HazardClass.GAS_MONOXIDE, HazardClass.LIGHT, HazardClass.SAND); } - + private static void registerIfExists(String domain, String name, HazardClass... classes) { Item item = Compat.tryLoadItem(domain, name); if(item != null) ArmorRegistry.registerHazard(item, classes); } - + public static boolean checkArmor(EntityLivingBase entity, Item... armor) { - + for(int i = 0; i < 4; i++) { if(!checkArmorPiece(entity, armor[i], 3 - i)) return false; } - + return true; } - + public static boolean checkArmorPiece(EntityLivingBase entity, Item armor, int slot) { return !checkArmorNull(entity, slot) && entity.getEquipmentInSlot(slot + 1).getItem() == armor; } - + public static boolean checkArmorNull(EntityLivingBase player, int slot) { return player.getEquipmentInSlot(slot + 1) == null; } - + public static void damageSuit(EntityLivingBase entity, int slot, int amount) { - + if(entity.getEquipmentInSlot(slot + 1) == null) return; - + entity.getEquipmentInSlot(slot + 1).damageItem(amount, entity); if(entity.getEquipmentInSlot(slot + 1).stackSize == 0) { entity.setCurrentItemOrArmor(slot + 1, null); } } - + public static void resetFlightTime(EntityPlayer player) { - + if(player instanceof EntityPlayerMP) { EntityPlayerMP mp = (EntityPlayerMP) player; ReflectionHelper.setPrivateValue(NetHandlerPlayServer.class, mp.playerNetServerHandler, 0, "floatingTickCount", "field_147365_f"); } } - + /* * The more horrifying part */ public static boolean checkForHazmat(EntityLivingBase player) { - - if(checkArmor(player, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots) || - checkArmor(player, ModItems.hazmat_helmet_red, ModItems.hazmat_plate_red, ModItems.hazmat_legs_red, ModItems.hazmat_boots_red) || - checkArmor(player, ModItems.hazmat_helmet_grey, ModItems.hazmat_plate_grey, ModItems.hazmat_legs_grey, ModItems.hazmat_boots_grey) || - checkArmor(player, ModItems.t45_helmet, ModItems.t45_plate, ModItems.t45_legs, ModItems.t45_boots) || - checkArmor(player, ModItems.schrabidium_helmet, ModItems.schrabidium_plate, ModItems.schrabidium_legs, ModItems.schrabidium_boots) || + + if(checkArmor(player, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots) || + checkArmor(player, ModItems.hazmat_helmet_red, ModItems.hazmat_plate_red, ModItems.hazmat_legs_red, ModItems.hazmat_boots_red) || + checkArmor(player, ModItems.hazmat_helmet_grey, ModItems.hazmat_plate_grey, ModItems.hazmat_legs_grey, ModItems.hazmat_boots_grey) || + checkArmor(player, ModItems.t45_helmet, ModItems.t45_plate, ModItems.t45_legs, ModItems.t45_boots) || + checkArmor(player, ModItems.schrabidium_helmet, ModItems.schrabidium_plate, ModItems.schrabidium_legs, ModItems.schrabidium_boots) || checkForHaz2(player)) { - + return true; } - + if(player.isPotionActive(HbmPotion.mutation)) return true; - + return false; } - + public static boolean checkForHaz2(EntityLivingBase player) { - - if(checkArmor(player, ModItems.hazmat_paa_helmet, ModItems.hazmat_paa_plate, ModItems.hazmat_paa_legs, ModItems.hazmat_paa_boots) || - checkArmor(player, ModItems.liquidator_helmet, ModItems.liquidator_plate, ModItems.liquidator_legs, ModItems.liquidator_boots) || - checkArmor(player, ModItems.euphemium_helmet, ModItems.euphemium_plate, ModItems.euphemium_legs, ModItems.euphemium_boots) || - checkArmor(player, ModItems.rpa_helmet, ModItems.rpa_plate, ModItems.rpa_legs, ModItems.rpa_boots) || - checkArmor(player, ModItems.fau_helmet, ModItems.fau_plate, ModItems.fau_legs, ModItems.fau_boots) || + + if(checkArmor(player, ModItems.hazmat_paa_helmet, ModItems.hazmat_paa_plate, ModItems.hazmat_paa_legs, ModItems.hazmat_paa_boots) || + checkArmor(player, ModItems.liquidator_helmet, ModItems.liquidator_plate, ModItems.liquidator_legs, ModItems.liquidator_boots) || + checkArmor(player, ModItems.euphemium_helmet, ModItems.euphemium_plate, ModItems.euphemium_legs, ModItems.euphemium_boots) || + checkArmor(player, ModItems.rpa_helmet, ModItems.rpa_plate, ModItems.rpa_legs, ModItems.rpa_boots) || + checkArmor(player, ModItems.fau_helmet, ModItems.fau_plate, ModItems.fau_legs, ModItems.fau_boots) || checkArmor(player, ModItems.dns_helmet, ModItems.dns_plate, ModItems.dns_legs, ModItems.dns_boots)) { return true; } - + return false; } - + public static boolean checkForAsbestos(EntityLivingBase player) { - + if(checkArmor(player, ModItems.asbestos_helmet, ModItems.asbestos_plate, ModItems.asbestos_legs, ModItems.asbestos_boots)) return true; return false; } - + public static boolean checkForDigamma(EntityPlayer player) { - + if(checkArmor(player, ModItems.fau_helmet, ModItems.fau_plate, ModItems.fau_legs, ModItems.fau_boots)) return true; - + if(checkArmor(player, ModItems.dns_helmet, ModItems.dns_plate, ModItems.dns_legs, ModItems.dns_boots)) return true; - - if(player.isPotionActive(HbmPotion.stability.id)) - return true; - - return false; - } - - public static boolean checkForDigamma2(EntityPlayer player) { - - if(!checkArmor(player, ModItems.robes_helmet, ModItems.robes_plate, ModItems.robes_legs, ModItems.robes_boots)) - return false; - + if(player.isPotionActive(HbmPotion.stability.id)) return true; - + + return false; + } + + public static boolean checkForDigamma2(EntityPlayer player) { + + if(!checkArmor(player, ModItems.robes_helmet, ModItems.robes_plate, ModItems.robes_legs, ModItems.robes_boots)) + return false; + + if(player.isPotionActive(HbmPotion.stability.id)) + return true; + for(int i = 0; i < 4; i++) { - + ItemStack armor = player.getCurrentArmor(i); - + if(armor != null && ArmorModHandler.hasMods(armor)) { - + ItemStack mods[] = ArmorModHandler.pryMods(armor); - + if(!(mods[ArmorModHandler.cladding] != null && mods[ArmorModHandler.cladding].getItem() == ModItems.cladding_iron)) return false; } } - + return player.getMaxHealth() < 3; } - + public static boolean checkForFaraday(EntityPlayer player) { - + ItemStack[] armor = player.inventory.armorInventory; - + if(armor[0] == null || armor[1] == null || armor[2] == null || armor[3] == null) return false; - + if(isFaradayArmor(armor[0]) && isFaradayArmor(armor[1]) && isFaradayArmor(armor[2]) && isFaradayArmor(armor[3])) return true; - + return false; } - + public static final String[] metals = new String[] { "chainmail", "iron", @@ -237,63 +236,63 @@ public class ArmorUtil { "rpa", "spacesuit" }; - + public static boolean isFaradayArmor(ItemStack item) { - + String name = item.getUnlocalizedName(); - + for(String metal : metals) { - + if(name.toLowerCase(Locale.US).contains(metal)) return true; } - + if(HazmatRegistry.getCladding(item) > 0) return true; - + return false; } - + public static boolean checkForFiend(EntityPlayer player) { - + return checkArmorPiece(player, ModItems.jackt, 2) && Library.checkForHeld(player, ModItems.shimmer_sledge); } - + public static boolean checkForFiend2(EntityPlayer player) { - + return checkArmorPiece(player, ModItems.jackt2, 2) && Library.checkForHeld(player, ModItems.shimmer_axe); } - + /* * Default implementations for IGasMask items */ public static final String FILTERK_KEY = "hfrFilter"; - + public static void installGasMaskFilter(ItemStack mask, ItemStack filter) { - + if(mask == null || filter == null) return; - + if(!mask.hasTagCompound()) mask.stackTagCompound = new NBTTagCompound(); - + NBTTagCompound attach = new NBTTagCompound(); filter.writeToNBT(attach); - + mask.stackTagCompound.setTag(FILTERK_KEY, attach); } - + public static void removeFilter(ItemStack mask) { - + if(mask == null) return; - + if(!mask.hasTagCompound()) return; - + mask.stackTagCompound.removeTag(FILTERK_KEY); } - + /** * Grabs the installed filter or the filter of the attachment, used for attachment rendering * @param mask @@ -301,126 +300,126 @@ public class ArmorUtil { * @return */ public static ItemStack getGasMaskFilterRecursively(ItemStack mask, EntityLivingBase entity) { - + ItemStack filter = getGasMaskFilter(mask); - + if(filter == null && ArmorModHandler.hasMods(mask)) { - + ItemStack mods[] = ArmorModHandler.pryMods(mask); - + if(mods[ArmorModHandler.helmet_only] != null && mods[ArmorModHandler.helmet_only].getItem() instanceof IGasMask) filter = ((IGasMask)mods[ArmorModHandler.helmet_only].getItem()).getFilter(mods[ArmorModHandler.helmet_only], entity); } - + return filter; } - + public static ItemStack getGasMaskFilter(ItemStack mask) { - + if(mask == null) return null; - + if(!mask.hasTagCompound()) return null; - + NBTTagCompound attach = mask.stackTagCompound.getCompoundTag(FILTERK_KEY); ItemStack filter = ItemStack.loadItemStackFromNBT(attach); - + return filter; } - + public static void damageGasMaskFilter(EntityLivingBase entity, int damage) { - + ItemStack mask = entity.getEquipmentInSlot(4); - + if(mask == null) return; - + if(!(mask.getItem() instanceof IGasMask)) { - + if(ArmorModHandler.hasMods(mask)) { - + ItemStack mods[] = ArmorModHandler.pryMods(mask); - + if(mods[ArmorModHandler.helmet_only] != null && mods[ArmorModHandler.helmet_only].getItem() instanceof IGasMask) mask = mods[ArmorModHandler.helmet_only]; } } - + if(mask != null) damageGasMaskFilter(mask, damage); } - + public static void damageGasMaskFilter(ItemStack mask, int damage) { ItemStack filter = getGasMaskFilter(mask); - + if(filter == null) { if(ArmorModHandler.hasMods(mask)) { ItemStack mods[] = ArmorModHandler.pryMods(mask); - + if(mods[ArmorModHandler.helmet_only] != null && mods[ArmorModHandler.helmet_only].getItem() instanceof IGasMask) filter = getGasMaskFilter(mods[ArmorModHandler.helmet_only]); } } - + if(filter == null || filter.getMaxDamage() == 0) return; - + filter.setItemDamage(filter.getItemDamage() + damage); - + if(filter.getItemDamage() > filter.getMaxDamage()) removeFilter(mask); else installGasMaskFilter(mask, filter); } - + public static void addGasMaskTooltip(ItemStack mask, EntityPlayer player, List list, boolean ext) { - + if(mask == null || !(mask.getItem() instanceof IGasMask)) return; - + ItemStack filter = ((IGasMask)mask.getItem()).getFilter(mask, player); - + if(filter == null) { list.add(EnumChatFormatting.RED + "No filter installed!"); return; } - + list.add(EnumChatFormatting.GOLD + "Installed filter:"); - + int meta = filter.getItemDamage(); int max = filter.getMaxDamage(); - + String append = ""; - + if(max > 0) { append = " (" + ((max - meta) * 100 / max) + "%)"; } - + List lore = new ArrayList(); list.add(" " + filter.getDisplayName() + append); filter.getItem().addInformation(filter, player, lore, ext); ForgeEventFactory.onItemTooltip(filter, player, lore, ext); lore.forEach(x -> list.add(EnumChatFormatting.YELLOW + " " + x)); } - + public static boolean isWearingEmptyMask(EntityPlayer player) { - + ItemStack mask = player.getEquipmentInSlot(4); - + if(mask == null) return false; - + if(mask.getItem() instanceof IGasMask) { return getGasMaskFilter(mask) == null; } - + ItemStack mod = ArmorModHandler.pryMods(mask)[ArmorModHandler.helmet_only]; - + if(mod != null && mod.getItem() instanceof IGasMask) { return getGasMaskFilter(mod) == null; } - + return false; } } diff --git a/src/main/java/com/hbm/util/BobMathUtil.java b/src/main/java/com/hbm/util/BobMathUtil.java index f9bfcc6f7..5fa0b93ee 100644 --- a/src/main/java/com/hbm/util/BobMathUtil.java +++ b/src/main/java/com/hbm/util/BobMathUtil.java @@ -1,5 +1,11 @@ package com.hbm.util; +import cpw.mods.fml.relauncher.ReflectionHelper; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; + +import javax.annotation.Nonnegative; import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; @@ -7,26 +13,19 @@ import java.text.NumberFormat; import java.util.*; import java.util.function.ToIntFunction; -import javax.annotation.Nonnegative; - -import cpw.mods.fml.relauncher.ReflectionHelper; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraftforge.common.util.ForgeDirection; - public class BobMathUtil { - + public static double safeClamp(double val, double min, double max) { val = MathHelper.clamp_double(val, min, max); - + if(val == Double.NaN) { val = (min + max) / 2D; } - + return val; } - + public static Vec3 interpVec(Vec3 vec1, Vec3 vec2, float interp) { return Vec3.createVectorHelper( interp(vec1.xCoord, vec2.xCoord, interp), @@ -34,73 +33,73 @@ public class BobMathUtil { interp(vec1.zCoord, vec2.zCoord, interp) ); } - + public static double interp(double x, double y, float interp) { return x + (y - x) * interp; } - + public static double getAngleFrom2DVecs(double x1, double z1, double x2, double z2) { - + double upper = x1 * x2 + z1 * z2; double lower = Math.sqrt(x1 * x1 + z1 * z1) * Math.sqrt(x2 * x2 + z2 * z2); - + double result = Math.toDegrees(Math.cos(upper / lower)); - + if(result >= 180) result -= 180; - + return result; } - + public static double getCrossAngle(Vec3 vel, Vec3 rel) { - + vel.normalize(); rel.normalize(); double vecProd = rel.xCoord * vel.xCoord + rel.yCoord * vel.yCoord + rel.zCoord * vel.zCoord; double bot = rel.lengthVector() * vel.lengthVector(); double angle = Math.acos(vecProd / bot) * 180 / Math.PI; - + if(angle >= 180) angle -= 180; - + return angle; } public static float remap(float num, float min1, float max1, float min2, float max2){ return ((num - min1) / (max1 - min1)) * (max2 - min2) + min2; } - + public static float remap01(float num, float min1, float max1){ return (num - min1) / (max1 - min1); } - + public static float remap01_clamp(float num, float min1, float max1){ return MathHelper.clamp_float((num - min1) / (max1 - min1), 0, 1); } - + public static ForgeDirection[] getShuffledDirs() { - + ForgeDirection[] dirs = new ForgeDirection[6]; List indices = new ArrayList() {{ add(0); add(1); add(2); add(3); add(4); add(5); }}; Collections.shuffle(indices); - + for(int i = 0; i < 6; i++) { dirs[i] = ForgeDirection.getOrientation(indices.get(i)); } - + return dirs; } public static String toPercentage(float amount, float total) { return NumberFormat.getPercentInstance().format(amount / total); } - + public static String[] ticksToDate(long ticks) { - + int tickDay = 48000; int tickYear = tickDay * 100; - + final String[] dateOut = new String[3]; long year = Math.floorDiv(ticks, tickYear); byte day = (byte) Math.floorDiv(ticks - tickYear * year, tickDay); @@ -111,7 +110,7 @@ public class BobMathUtil { dateOut[2] = String.valueOf(time); return dateOut; } - + /** * Rescale a number from one range to another * @param toScale - The integer to scale @@ -126,7 +125,7 @@ public class BobMathUtil { double newRange = newMax - newMin; return (((toScale - oldMin) * newRange) / prevRange) + newMin; } - + /** * Rounds a number to so many significant digits * @param num The number to round @@ -145,7 +144,7 @@ public class BobMathUtil { } public static String getShortNumber(long l) { - + if(l >= Math.pow(10, 18)) { double res = l / Math.pow(10, 18); res = Math.round(res * 100.0) / 100.0; @@ -176,31 +175,31 @@ public class BobMathUtil { res = Math.round(res * 100.0) / 100.0; return res + "k"; } - + return Long.toString(l); } - + /** * Adjusted sqrt, approaches standard sqrt but sqrt(x) is never bigger than x - * + * * ____________ * / 1 | 1 * _ / x + ―――――――― - ――――― * \/ (x + 2)² x + 2 - * + * * @param x * @return */ public static double squirt(double x) { return Math.sqrt(x + 1D / ((x + 2D) * (x + 2D))) - 1D / (x + 2D); } - + /** A convenient way to re-define the value of pi, should the laws of nature change. */ public static void setPi(double pi) { Field field = ReflectionHelper.findField(Math.class, "PI"); try { field.setDouble(null, pi); } catch(Exception e) { } } - + public static double angularDifference(double alpha, double beta) { double delta = (beta - alpha + 180) % 360 - 180; return delta < -180 ? delta + 360 : delta; @@ -225,7 +224,7 @@ public class BobMathUtil { public static double sps(double x) { return Math.sin(Math.PI / 2D * Math.cos(x)); } - + /** Square wave sine, make sure squarination is [0;1] */ public static double sws(double x, double squarination) { double s = Math.sin(x); diff --git a/src/main/java/com/hbm/util/BufferUtil.java b/src/main/java/com/hbm/util/BufferUtil.java index d456b7f1c..4bdf26480 100644 --- a/src/main/java/com/hbm/util/BufferUtil.java +++ b/src/main/java/com/hbm/util/BufferUtil.java @@ -1,9 +1,5 @@ package com.hbm.util; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - import io.netty.buffer.ByteBuf; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -12,6 +8,10 @@ import net.minecraft.nbt.NBTSizeTracker; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + public class BufferUtil { private static final Charset CHARSET = StandardCharsets.UTF_8; diff --git a/src/main/java/com/hbm/util/ChatBuilder.java b/src/main/java/com/hbm/util/ChatBuilder.java index fd269b5ad..84162877f 100644 --- a/src/main/java/com/hbm/util/ChatBuilder.java +++ b/src/main/java/com/hbm/util/ChatBuilder.java @@ -1,74 +1,69 @@ package com.hbm.util; +import net.minecraft.util.*; + import java.util.ArrayList; import java.util.List; import java.util.ListIterator; -import net.minecraft.util.ChatComponentStyle; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.ChatStyle; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IChatComponent; - public class ChatBuilder { private ChatComponentText text; private ChatComponentStyle last; - + private ChatBuilder(String text) { this.text = new ChatComponentText(text); this.last = this.text; } - + public static ChatBuilder start(String text) { ChatBuilder builder = new ChatBuilder(text); return builder; } - + public static ChatBuilder startTranslation(String text, Object... o) { ChatBuilder builder = new ChatBuilder("").nextTranslation(text, o); return builder; } - + public ChatBuilder next(String text) { ChatComponentText append = new ChatComponentText(text); this.last.appendSibling(append); this.last = append; return this; } - + public ChatBuilder nextTranslation(String text, Object... o) { ChatComponentTranslation append = new ChatComponentTranslation(text, o); this.last.appendSibling(append); this.last = append; return this; } - + public ChatBuilder color(EnumChatFormatting format) { ChatStyle style = this.last.getChatStyle(); style.setColor(format); return this; } - + /** Will recursively go over all IChatComponents added to the root and then set the style */ public ChatBuilder colorAll(EnumChatFormatting format) { - + List list = new ArrayList(); list.add(text); - + ListIterator it = list.listIterator(); - + while(it.hasNext()) { Object o = it.next(); IChatComponent component = (IChatComponent) o; component.getChatStyle().setColor(format); for(Object s : component.getSiblings()) it.add(s); } - + return this; } - + public ChatComponentText flush() { return this.text; } diff --git a/src/main/java/com/hbm/util/ColorUtil.java b/src/main/java/com/hbm/util/ColorUtil.java index 2d0ad9378..c863c5d02 100644 --- a/src/main/java/com/hbm/util/ColorUtil.java +++ b/src/main/java/com/hbm/util/ColorUtil.java @@ -23,34 +23,34 @@ public class ColorUtil { public static BufferedImage getImageFromStack(ItemStack stack) throws IOException { String iconName = stack.getItem().getIconFromDamage(stack.getItemDamage()).getIconName(); String domain = "minecraft"; - + if(iconName.contains(":")) { String[] parts = iconName.split(":"); domain = parts[0]; iconName = parts[1]; } - + ResourceLocation loc = new ResourceLocation(domain, "textures/items/" + iconName + ".png"); - + return ImageIO.read(Minecraft.getMinecraft().getResourceManager().getResource(loc).getInputStream()); } @SideOnly(Side.CLIENT) public static int getAverageColorFromStack(ItemStack stack) { - + try { BufferedImage tex = getImageFromStack(stack); - + int r = 0; int g = 0; int b = 0; int pixels = 0; - + for(int i = 0; i < tex.getWidth(); i++) { for(int j = 0; j < tex.getHeight(); j++) { - + Color pixel = new Color(tex.getRGB(i, j)); - + if(pixel.getAlpha() == 255) { r += pixel.getRed(); g += pixel.getGreen(); @@ -63,9 +63,9 @@ public class ColorUtil { int avgR = r / pixels; int avgG = g / pixels; int avgB = b / pixels; - + return (avgR << 16) | (avgG << 8) | avgB; - + } catch(Exception ex) { return 0xFFFFFF; } @@ -73,34 +73,34 @@ public class ColorUtil { @SideOnly(Side.CLIENT) public static int getMedianBrightnessColorFromStack(ItemStack stack) { - + try { BufferedImage tex = getImageFromStack(stack); - + HashMap brightMap = new HashMap(); List brightnesses = new ArrayList(); - + for(int i = 0; i < tex.getWidth(); i++) { for(int j = 0; j < tex.getHeight(); j++) { - + Color pixel = new Color(tex.getRGB(i, j)); int brightness = pixel.getRed() * pixel.getRed() + pixel.getGreen() * pixel.getGreen() + pixel.getBlue() * pixel.getBlue(); brightnesses.add(brightness); brightMap.put(brightness, pixel); //overlap possible, but we don't differentiate between colors anyway. } } - + Collections.sort(brightnesses); int median = brightnesses.get(brightnesses.size() / 2); Color medianColor = brightMap.get(median); - + return medianColor.getRGB(); - + } catch(Exception ex) { return 0xFFFFFF; } } - + /** * Decides whether a color is considered "colorful", i.e. weeds out colors that are too dark or too close to gray. * @param hex @@ -108,11 +108,11 @@ public class ColorUtil { */ public static boolean isColorColorful(int hex) { Color color = new Color(hex); - + /*double r = color.getRed(); double g = color.getBlue(); double b = color.getGreen(); - + if(r < 50 && g < 50 && b < 50) return false; @@ -122,13 +122,13 @@ public class ColorUtil { if(g / b > 1.5) return true; if(b / r > 1.5) return true; if(b / g > 1.5) return true;*/ - + float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), new float[3]); - + // saturation brightness return hsb[1] > 0.25 && hsb[2] > 0.25; } - + /** * Raises the highest RGB component to the specified limit, scaling the other components with it. * @param hex @@ -141,14 +141,14 @@ public class ColorUtil { int g = color.getGreen(); int b = color.getBlue(); int max = Math.max(Math.max(1, r), Math.max(g, b)); - + r = r * limit / max; g = g * limit / max; b = b * limit / max; - + return new Color(r, g, b).getRGB(); } - + /** * Same as the regular amplifyColor but it uses 255 as the limit. * @param hex @@ -157,7 +157,7 @@ public class ColorUtil { public static int amplifyColor(int hex) { return amplifyColor(hex, 255); } - + /** * Amplifies a given color by approaching all components to maximum by a given percentage. A percentage of 1 (100%) should always yield white. * @param hex @@ -169,21 +169,21 @@ public class ColorUtil { int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue(); - + r = (int) (r + (255 - r) * percent); g = (int) (g + (255 - g) * percent); b = (int) (b + (255 - b) * percent); - + return new Color(r, g, b).getRGB(); } - + /** Converts a color into HSB and then returns the brightness component [] */ public static double getColorBrightness(int hex) { Color color = new Color(hex); float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), new float[3]); return hsb[2]; } - + public static HashMap nameToColor = new HashMap() {{ put("black", 1973019); put("red", 11743532); @@ -202,17 +202,17 @@ public class ColorUtil { put("orange", 15435844); put("white", 15790320); }}; - + public static int getColorFromDye(ItemStack stack) { List oreNames = ItemStackUtil.getOreDictNames(stack); - + for(String dict : oreNames) { if(dict.length() > 3 && dict.startsWith("dye")) { String color = dict.substring(3).toLowerCase(Locale.US); if(nameToColor.containsKey(color)) return nameToColor.get(color); } } - + return 0; } } diff --git a/src/main/java/com/hbm/util/Compat.java b/src/main/java/com/hbm/util/Compat.java index 9d46d714b..cac127f1a 100644 --- a/src/main/java/com/hbm/util/Compat.java +++ b/src/main/java/com/hbm/util/Compat.java @@ -1,10 +1,5 @@ package com.hbm.util; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - import com.hbm.config.GeneralConfig; import com.hbm.handler.HazmatRegistry; import com.hbm.hazard.HazardRegistry; @@ -12,7 +7,6 @@ import com.hbm.inventory.FluidContainer; import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.Fluids; import com.hbm.main.MainRegistry; - import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.eventhandler.EventBus; @@ -26,8 +20,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + public class Compat { - + public static final String MOD_GT6 = "gregtech"; public static final String MOD_GCC = "GalacticraftCore"; public static final String MOD_AR = "advancedrocketry"; @@ -46,15 +45,15 @@ public class Compat { public static Block tryLoadBlock(String domain, String name) { return (Block) Block.blockRegistry.getObject(getReg(domain, name)); } - + private static String getReg(String domain, String name) { return domain + ":" + name; } - + public static boolean isModLoaded(String modid) { return Loader.isModLoaded(modid); } - + public static enum ReikaIsotope { C14(HazardRegistry.gen_10K), U235(HazardRegistry.u235), @@ -89,33 +88,33 @@ public class Compat { Ru103(HazardRegistry.gen_S), Pm149(HazardRegistry.gen_10D), Rh105(HazardRegistry.gen_H); - + private float rads; - + private ReikaIsotope(float rads) { this.rads = rads; } - + public float getRad() { return this.rads; } } - + public static List scrapeItemFromME(ItemStack meDrive) { List stacks = new ArrayList(); - + try { if(meDrive != null && meDrive.hasTagCompound()) { NBTTagCompound nbt = meDrive.getTagCompound(); int types = nbt.getShort("it"); //ITEM_TYPE_TAG - + for(int i = 0; i < types; i++) { NBTBase stackTag = nbt.getTag("#" + i); - + if(stackTag instanceof NBTTagCompound) { NBTTagCompound compound = (NBTTagCompound) stackTag; ItemStack stack = ItemStack.loadItemStackFromNBT(compound); - + int count = nbt.getInteger("@" + i); stack.stackSize = count; stacks.add(stack); @@ -123,66 +122,66 @@ public class Compat { } } } catch(Exception ex) { } - + return stacks; } - + public static void registerCompatHazmat() { - + double helmet = 0.2D; double chest = 0.4D; double legs = 0.3D; double boots = 0.1D; - + double p90 = 1.0D; // 90% double p99 = 2D; // 99% - + tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.radiation.head", p90 * helmet); tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.radiation.chest", p90 * chest); tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.radiation.legs", p90 * legs); tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.radiation.boots", p90 * boots); - + tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.universal.head", p99 * helmet); tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.universal.chest", p99 * chest); tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.universal.legs", p99 * legs); tryRegisterHazmat(Compat.MOD_GT6, "gt.armor.hazmat.universal.boots", p99 * boots); - + tryRegisterHazmat(Compat.MOD_REC, "reactorcraft_item_hazhelmet", p99 * helmet); tryRegisterHazmat(Compat.MOD_REC, "reactorcraft_item_hazchest", p99 * chest); tryRegisterHazmat(Compat.MOD_REC, "reactorcraft_item_hazlegs", p99 * legs); tryRegisterHazmat(Compat.MOD_REC, "reactorcraft_item_hazboots", p99 * boots); - + tryRegisterHazmat(Compat.MOD_EF, "netherite_helmet", p90 * helmet); tryRegisterHazmat(Compat.MOD_EF, "netherite_chestplate", p90 * chest); tryRegisterHazmat(Compat.MOD_EF, "netherite_leggings", p90 * legs); tryRegisterHazmat(Compat.MOD_EF, "netherite_boots", p90 * boots); } - + private static void tryRegisterHazmat(String mod, String name, double resistance) { Item item = Compat.tryLoadItem(mod, name); if(item != null) { HazmatRegistry.registerHazmat(item, resistance); } } - + public static void registerCompatFluidContainers() { - + if(Compat.isModLoaded(Compat.MOD_TC) && GeneralConfig.enableFluidContainerCompat) { Item canister = Compat.tryLoadItem(Compat.MOD_TC, "emptyCanister"); Item diesel = Compat.tryLoadItem(Compat.MOD_TC, "diesel"); if(diesel != null && canister != null) FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(diesel), new ItemStack(canister), Fluids.DIESEL, 1000)); } } - + public static void handleRailcraftNonsense() { - + if(!Loader.isModLoaded(MOD_RC)) return; MainRegistry.logger.info("#######################################################"); MainRegistry.logger.info("| Railcraft detected, deploying anti-nonsense measures..."); - + try { - + ConcurrentHashMap> listeners = ReflectionHelper.getPrivateValue(EventBus.class, FMLCommonHandler.instance().bus(), "listeners"); Object nonsense = null; for(Object o : listeners.keySet()) { @@ -192,16 +191,16 @@ public class Compat { break; } } - + FMLCommonHandler.instance().bus().unregister(nonsense); MainRegistry.logger.info("| Successfully removed Railcraft nonsense."); - + } catch(Exception x) { MainRegistry.logger.error("| Tried to remove Railcraft block but failed due to " + x.getMessage()); } MainRegistry.logger.info("#######################################################"); } - + public static Class getChunkBiomeHook() { try { return Class.forName("com.falsepattern.endlessids.mixin.helpers.ChunkBiomeHook"); @@ -209,9 +208,9 @@ public class Compat { return null; } } - + public static Method getBiomeShortArray; - + public static Method getBiomeShortArray() { if(getBiomeShortArray != null) return getBiomeShortArray; try { @@ -222,7 +221,7 @@ public class Compat { return null; } } - + public static short[] getBiomeShortArray(Object instance) { Method m = getBiomeShortArray(); if(m != null) { @@ -232,7 +231,7 @@ public class Compat { } return null; } - + /** A standard implementation of safely grabbing a tile entity without loading chunks, might have more fluff added to it later on. */ public static TileEntity getTileStandard(World world, int x, int y, int z) { if(!world.getChunkProvider().chunkExists(x >> 4, z >> 4)) return null; diff --git a/src/main/java/com/hbm/util/CompatEnergyControl.java b/src/main/java/com/hbm/util/CompatEnergyControl.java index 0de988733..3542cd5fd 100644 --- a/src/main/java/com/hbm/util/CompatEnergyControl.java +++ b/src/main/java/com/hbm/util/CompatEnergyControl.java @@ -1,8 +1,9 @@ package com.hbm.util; -import java.util.ArrayList; -import java.util.List; - +import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyHandlerMK2; +import api.hbm.fluid.IFluidUser; +import api.hbm.tile.IInfoProviderEC; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -10,20 +11,18 @@ import com.hbm.items.ModItems; import com.hbm.tileentity.machine.TileEntityMachineGasCent; import com.hbm.tileentity.machine.TileEntityMachineGasCent.PseudoFluidTank; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; - -import api.hbm.energymk2.IBatteryItem; -import api.hbm.energymk2.IEnergyHandlerMK2; -import api.hbm.fluid.IFluidUser; -import api.hbm.tile.IInfoProviderEC; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.List; + /** Provides data specified by EC's CrossModBase */ public class CompatEnergyControl { - + /** Returns the steel ingot to craft the sensor kit with */ public static ItemStack getCraftingMaterial() { return new ItemStack(ModItems.ingot_steel); //in the event that i do end up moving all ingots to metadata @@ -33,7 +32,7 @@ public class CompatEnergyControl { public static boolean isElectricItem(ItemStack stack) { return stack.getItem() instanceof IBatteryItem; } - + /** Standardized discharge for IBatteryItem, returns the amount that was removed */ public static double dischargeItem(ItemStack stack, double needed) { IBatteryItem battery = (IBatteryItem) stack.getItem(); @@ -41,97 +40,97 @@ public class CompatEnergyControl { battery.dischargeBattery(stack, toDischarge); return toDischarge; } - + /** Returns the power and maxPower values for IEnergyUser */ public static void getEnergyData(TileEntity tile, NBTTagCompound data) { - + data.setString(KEY_EUTYPE, "HE"); - + if(tile instanceof IEnergyHandlerMK2) { IEnergyHandlerMK2 user = (IEnergyHandlerMK2) tile; data.setDouble(L_ENERGY_HE, user.getPower()); data.setDouble(L_CAPACITY_HE, user.getMaxPower()); } } - + /** Returns the heat for RBMKs */ public static int getHeat(TileEntity tile) { if(tile instanceof TileEntityRBMKBase) return (int) ((TileEntityRBMKBase) tile).heat; //original implementation also used the SNR and LNR for some reason, but those no longer exist. neither ZINOX nor research reactor were part of the system. return -1; } - + /** Returns a list of Object arrays, one array for each fluid tank where the array contains fluid name, fill state and capacity (STRING, INTEGER, INTEGER) */ public static List getAllTanks(TileEntity tile) { - + List list = new ArrayList(); - + if(tile instanceof IFluidUser) { IFluidUser user = (IFluidUser) tile; - + for(FluidTank tank : user.getAllTanks()) { if(tank.getTankType() == Fluids.SMOKE || tank.getTankType() == Fluids.SMOKE_LEADED || tank.getTankType() == Fluids.SMOKE_POISON) continue; list.add(toFluidInfo(tank)); } } - + if(tile instanceof TileEntityMachineGasCent) { TileEntityMachineGasCent cent = (TileEntityMachineGasCent) tile; list.add(toFluidInfo(cent.inputTank)); list.add(toFluidInfo(cent.outputTank)); } - + if(!list.isEmpty()) return list; - + return null; } - + private static Object[] toFluidInfo(FluidTank tank) { return new Object[] {tank.getTankType().getName(), tank.getFill(), tank.getMaxFill()}; } - + private static Object[] toFluidInfo(PseudoFluidTank tank) { return new Object[] {tank.getTankType().getName(), tank.getFill(), tank.getMaxFill()}; } - + /** Returns any non-standard data like progress, unique stats and so forth. Data comes from the IInfoProviderEC implementation */ public static void getExtraData(TileEntity tile, NBTTagCompound data) { - + if(tile instanceof IInfoProviderEC) { IInfoProviderEC provider = (IInfoProviderEC) tile; provider.provideExtraInfo(data); } } - + /** Returns the core tile entity for that position, can resolve the MK1 "IMultiblock" and MK2 "BlockDummyable" systems. */ public static TileEntity findTileEntity(World world, int x, int y, int z) { return CompatExternal.getCoreFromPos(world, x, y, z); //CompatExternal you're just standing around, do something for once } - + /** Returns the ResourceLocation for the given fluid name */ public static ResourceLocation getFluidTexture(String name) { FluidType type = Fluids.fromName(name); return type == null ? null : type.getTexture(); } - + /* * [DATA TYPE] _ [NAME] _ [UNIT] */ public static final String KEY_EUTYPE = "euType"; - + public static final String L_ENERGY_HE = "energy"; public static final String L_ENERGY_TU = "energyTU"; public static final String L_ENERGY_ = "energy_"; // Blast Furnace fuel - + public static final String L_CAPACITY_HE = "capacity"; public static final String L_CAPACITY_TU = "capacityTU"; public static final String L_CAPACITY_ = "capacity_"; // Blast Furnace fuel capacity - + public static final String D_CONSUMPTION_HE = "consumptionHE"; public static final String D_CONSUMPTION_MB = "consumption"; @Deprecated public static final String S_CONSUMPTION_ = "consumption_"; // FWatz fluid consumption rates - + public static final String D_OUTPUT_HE = "output"; public static final String D_OUTPUT_MB = "outputmb"; public static final String D_OUTPUT_TU = "outputTU"; diff --git a/src/main/java/com/hbm/util/CompatExternal.java b/src/main/java/com/hbm/util/CompatExternal.java index 9881ef7fa..088190002 100644 --- a/src/main/java/com/hbm/util/CompatExternal.java +++ b/src/main/java/com/hbm/util/CompatExternal.java @@ -1,20 +1,13 @@ package com.hbm.util; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.function.BiFunction; - +import api.hbm.energymk2.IEnergyHandlerMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluid.IFluidUser; import com.hbm.blocks.BlockDummyable; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.turret.TileEntityTurretSentry; - -import api.hbm.energymk2.IEnergyHandlerMK2; -import api.hbm.energymk2.IEnergyReceiverMK2; -import api.hbm.fluid.IFluidUser; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.passive.EntityChicken; @@ -23,6 +16,12 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import java.util.function.BiFunction; + /** * EXTERNAL COMPATIBILITY CLASS - DO NOT CHANGE METHOD NAMES/PARAMS ONCE CREATED * Is there a smarter way to do this? Most likely. Is there an easier one? Probably not. @@ -36,73 +35,73 @@ public class CompatExternal { * @return the core tile entity if the given position holds a dummy, the tile entity at that position if it doesn't or null if there is no tile entity */ public static TileEntity getCoreFromPos(World world, int x, int y, int z) { - + Block b = world.getBlock(x, y, z); - + //if the block at that pos is a Dummyable, use the mk2's system to find the core if(b instanceof BlockDummyable) { BlockDummyable dummy = (BlockDummyable) b; int[] pos = dummy.findCore(world, x, y, z); - + if(pos != null) { return world.getTileEntity(pos[0], pos[1], pos[2]); } } - + TileEntity tile = world.getTileEntity(x, y, z); - + //if the tile at that pos is an old dummy tile, use mk1 if(tile instanceof TileEntityDummy) { TileEntityDummy dummy = (TileEntityDummy) tile; return world.getTileEntity(dummy.targetX, dummy.targetY, dummy.targetZ); } - + //otherwise, return the tile at that position whihc could be null return tile; } - + /** * Returns the numeric value of the buffered energy held by that tile entity. Current implementation relies on IEnergyUser. * @param tile * @return power */ public static long getBufferedPowerFromTile(TileEntity tile) { - + if(tile instanceof IEnergyHandlerMK2) { return ((IEnergyHandlerMK2) tile).getPower(); } - + return 0L; } - + /** * Returns the numeric value of the energy capacity of this tile entity. Current implementation relies on IEnergyUser. * @param tile * @return max power */ public static long getMaxPowerFromTile(TileEntity tile) { - + if(tile instanceof IEnergyHandlerMK2) { return ((IEnergyHandlerMK2) tile).getMaxPower(); } - + return 0L; } - + /** * Returns the ordinal of the energy priority from the supplied tile entity. 0 = low, 1 = normal, 2 = high. Returns -1 if not applicable. * @param tile * @return priority */ public static int getEnergyPriorityFromTile(TileEntity tile) { - + if(tile instanceof IEnergyReceiverMK2) { return ((IEnergyReceiverMK2) tile).getPriority().ordinal(); } - + return -1; } - + /** * Returns a list of tank definitions from the supplied tile entity. Uses IFluidUser, if the tile is incompatible it returns an empty list. * @param tile @@ -115,13 +114,13 @@ public class CompatExternal { */ public static ArrayList getFluidInfoFromTile(TileEntity tile) { ArrayList list = new ArrayList(); - + if(!(tile instanceof IFluidUser)) { return list; } - + IFluidUser container = (IFluidUser) tile; - + for(FluidTank tank : container.getAllTanks()) { FluidType type = tank.getTankType(); list.add(new Object[] { @@ -132,7 +131,7 @@ public class CompatExternal { tank.getMaxFill() }); } - + return list; } @@ -140,14 +139,14 @@ public class CompatExternal { public static Set turretTargetFriendly = new HashSet(); public static Set turretTargetHostile = new HashSet(); public static Set turretTargetMachine = new HashSet(); - + /** * Registers a class for turret targeting * @param clazz is the class that should be targeted. * @param type determines what setting the turret needs to have enabled to target this class. 0 is player, 1 is friendly, 2 is hostile and 3 is machine. */ public static void registerTurretTargetSimple(Class clazz, int type) { - + switch(type) { case 0: turretTargetPlayer.add(clazz); break; case 1: turretTargetFriendly.add(clazz); break; @@ -155,9 +154,9 @@ public class CompatExternal { case 3: turretTargetMachine.add(clazz); break; } } - + public static Set turretTargetBlacklist = new HashSet(); - + /** * Registers a class to be fully ignored by turrets * @param clazz is the class that should be ignored. @@ -165,9 +164,9 @@ public class CompatExternal { public static void registerTurretTargetBlacklist(Class clazz) { turretTargetBlacklist.add(clazz); } - + public static HashMap> turretTargetCondition = new HashMap(); - + /** * Registers a BiFunction lambda for more complex targeting compatibility * @param clazz is the class that this rule should apply to @@ -178,7 +177,7 @@ public class CompatExternal { public static void registerTurretTargetingCondition(Class clazz, BiFunction bi) { turretTargetBlacklist.add(clazz); } - + public static void compatExamples() { // Makes all cows be targeted by turrets if player mode is active in addition to the existing rules. Applies to all entities that inherit EntityCow. CompatExternal.registerTurretTargetSimple(EntityCow.class, 0); diff --git a/src/main/java/com/hbm/util/CompatNER.java b/src/main/java/com/hbm/util/CompatNER.java index cb4b622dd..63ba2ae2e 100644 --- a/src/main/java/com/hbm/util/CompatNER.java +++ b/src/main/java/com/hbm/util/CompatNER.java @@ -1,13 +1,9 @@ package com.hbm.util; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ModBlocks; import com.hbm.entity.mob.EntityCreeperNuclear; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; - import cpw.mods.fml.common.event.FMLInterModComms; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; @@ -15,23 +11,26 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; +import java.util.ArrayList; +import java.util.List; + public class CompatNER { - + /* * INIT */ - + public static void init() { sendRegisterOre(new ItemStack(ModBlocks.ore_alexandrite), false, 0xff00ff, new ItemStack(ModItems.gem_alexandrite)); sendRegisterMob(EntityCreeperNuclear.class, "-1", encodeDrops( new DropItem(new ItemStack(Blocks.tnt), 0, 2), new DropItem(new ItemStack(ModItems.coin_creeper), 1, 1, 0.33F))); } - + /* * REGISTERS */ - + public static void sendRegisterOre(ItemStack ore, boolean silk, int color, ItemStack... drops) { NBTTagCompound data = new NBTTagCompound(); data.setTag(stack, ore.writeToNBT(new NBTTagCompound())); @@ -41,16 +40,16 @@ public class CompatNER { int[] distribution = new int[256]; for(int i = 0; i < 256; i++) distribution[i] = 100; data.setIntArray("distribution", distribution); - + NBTTagCompound res = new NBTTagCompound(); NBTTagCompound block = new NBTTagCompound(); block.setTag("stack", new ItemStack(Blocks.stone).writeToNBT(new NBTTagCompound())); res.setTag("block", block); data.setTag(restriction, res); - + FMLInterModComms.sendMessage(notEnoughResources, registerOre, data); } - + public static void sendRegisterMob(Class clazz, String light, NBTTagList drops) { NBTTagCompound data = new NBTTagCompound(); data.setString(name, clazz.getName()); @@ -59,31 +58,31 @@ public class CompatNER { MainRegistry.logger.info("Sending " + registerMob + " to " + notEnoughResources); FMLInterModComms.sendMessage(notEnoughResources, registerMob, data); } - + /* * ENCODERS */ - + public static String encodeLightLevel(int level, boolean below) { return level + ":" + (below ? "b" : "a"); } - + public static NBTTagList encodeDrops(DropItem... stacks) { NBTTagList list = new NBTTagList(); for(DropItem stack : stacks) list.appendTag(stack.writeToNBT()); return list; } - + public static NBTTagList encodeStacks(ItemStack... stacks) { NBTTagList list = new NBTTagList(); for(ItemStack stack : stacks) list.appendTag(stack.writeToNBT(new NBTTagCompound())); return list; } - + /* * DROP SYSTEM */ - + public static class DropItem { public ItemStack drop; public int min = 1; @@ -112,11 +111,11 @@ public class CompatNER { return compound; } } - + /* * CONSTANTS */ - + public static final String notEnoughResources = "neresources"; public static final String registerDungeon = "registerDungeon"; public static final String registerMob = "registerMob"; @@ -154,7 +153,7 @@ public class CompatNER { public static final String blockRestriction = "block"; public static final String dimensionRestriction = "dimension"; public static final String biomeRestriction = "biome"; - + public static final String conditional_rareDrop = "ner.rareDrop.text"; public static final String conditional_silkTouch = "ner.ore.silkTouch"; public static final String conditional_equipmentDrop = "ner.equipmentDrop.text"; diff --git a/src/main/java/com/hbm/util/ContaminationUtil.java b/src/main/java/com/hbm/util/ContaminationUtil.java index 63689591b..35a8763e9 100644 --- a/src/main/java/com/hbm/util/ContaminationUtil.java +++ b/src/main/java/com/hbm/util/ContaminationUtil.java @@ -1,17 +1,14 @@ package com.hbm.util; -import java.util.HashSet; - -import com.hbm.entity.mob.EntityDuck; +import api.hbm.entity.IRadiationImmune; import com.hbm.entity.mob.EntityCreeperNuclear; +import com.hbm.entity.mob.EntityDuck; import com.hbm.entity.mob.EntityQuackos; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.HazmatRegistry; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorRegistry.HazardClass; - -import api.hbm.entity.IRadiationImmune; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntitySkeleton; @@ -25,25 +22,27 @@ import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import java.util.HashSet; + public class ContaminationUtil { - + /** * Calculates how much radiation can be applied to this entity by calculating resistance * @param entity * @return */ public static float calculateRadiationMod(EntityLivingBase entity) { - + if(entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; - + float koeff = 10.0F; return (float) Math.pow(koeff, -HazmatRegistry.getResistance(player)); } - + return 1; } - + public static float getRads(Entity e) { if(!(e instanceof EntityLivingBase)) @@ -51,19 +50,19 @@ public class ContaminationUtil { if(isRadImmune(e)) return 0.0F; - + EntityLivingBase entity = (EntityLivingBase)e; - + return HbmLivingProps.getRadiation(entity); } - + public static HashSet immuneEntities = new HashSet(); - + public static boolean isRadImmune(Entity e) { if(e instanceof EntityLivingBase && ((EntityLivingBase)e).isPotionActive(HbmPotion.mutation)) return true; - + if(immuneEntities.isEmpty()) { immuneEntities.add(EntityCreeperNuclear.class); immuneEntities.add(EntityMooshroom.class); @@ -73,62 +72,62 @@ public class ContaminationUtil { immuneEntities.add(EntityOcelot.class); immuneEntities.add(IRadiationImmune.class); } - + Class entityClass = e.getClass(); - + for(Class clazz : immuneEntities) { if(clazz.isAssignableFrom(entityClass)) return true; } - + if("cyano.lootable.entities.EntityLootableBody".equals(entityClass.getName())) return true; - + return false; } - + /// ASBESTOS /// public static void applyAsbestos(Entity e, int i) { if(!(e instanceof EntityLivingBase)) return; - + if(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode) return; - + if(e instanceof EntityPlayer && e.ticksExisted < 200) return; - + EntityLivingBase entity = (EntityLivingBase)e; - + if(ArmorRegistry.hasAllProtection(entity, 3, HazardClass.PARTICLE_FINE)) ArmorUtil.damageGasMaskFilter(entity, i); else HbmLivingProps.incrementAsbestos(entity, i); } - + /// DIGAMMA /// public static void applyDigammaData(Entity e, float f) { if(!(e instanceof EntityLivingBase)) return; - + if(e instanceof EntityDuck || e instanceof EntityOcelot) return; - + if(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode) return; - + if(e instanceof EntityPlayer && e.ticksExisted < 200) return; - + EntityLivingBase entity = (EntityLivingBase)e; - + if(entity.isPotionActive(HbmPotion.stability.id)) return; - + if(!(entity instanceof EntityPlayer && ArmorUtil.checkForDigamma((EntityPlayer) entity))) HbmLivingProps.incrementDigamma(entity, f); } - + public static void applyDigammaDirect(Entity e, float f) { if(!(e instanceof EntityLivingBase)) @@ -136,23 +135,23 @@ public class ContaminationUtil { if(e instanceof IRadiationImmune) return; - + if(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode) return; - + EntityLivingBase entity = (EntityLivingBase)e; HbmLivingProps.incrementDigamma(entity, f); } - + public static float getDigamma(Entity e) { if(!(e instanceof EntityLivingBase)) return 0.0F; - + EntityLivingBase entity = (EntityLivingBase)e; return HbmLivingProps.getDigamma(entity); } - + public static void printGeigerData(EntityPlayer player) { World world = player.worldObj; @@ -161,7 +160,7 @@ public class ContaminationUtil { double rads = ((int)(ChunkRadiationManager.proxy.getRadiation(world, (int) Math.floor(player.posX), (int) Math.floor(player.posY), (int) Math.floor(player.posZ)) * 10)) / 10D; double env = ((int)(HbmLivingProps.getRadBuf(player) * 10D)) / 10D; - + double res = ((int)(10000D - ContaminationUtil.calculateRadiationMod(player) * 10000D)) / 100D; double resKoeff = ((int)(HazmatRegistry.getResistance(player) * 100D)) / 100D; @@ -169,7 +168,7 @@ public class ContaminationUtil { String envPrefix = getPreffixFromRad(env); String radPrefix = ""; String resPrefix = "" + EnumChatFormatting.WHITE; - + if(eRad < 200) radPrefix += EnumChatFormatting.GREEN; else if(eRad < 400) @@ -182,7 +181,7 @@ public class ContaminationUtil { radPrefix += EnumChatFormatting.DARK_RED; else radPrefix += EnumChatFormatting.DARK_GRAY; - + if(resKoeff > 0) resPrefix += EnumChatFormatting.GREEN; @@ -194,27 +193,27 @@ public class ContaminationUtil { player.addChatMessage(new ChatComponentTranslation("geiger.playerRad").appendSibling(new ChatComponentText(" " + radPrefix + eRad + " RAD")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW))); player.addChatMessage(new ChatComponentTranslation("geiger.playerRes").appendSibling(new ChatComponentText(" " + resPrefix + res + "% (" + resKoeff + ")")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW))); } - + public static void printDosimeterData(EntityPlayer player) { double env = ((int)(HbmLivingProps.getRadBuf(player) * 10D)) / 10D; boolean limit = false; - + if(env > 3.6D) { env = 3.6D; limit = true; } - + String envPrefix = getPreffixFromRad(env); - + player.addChatMessage(new ChatComponentText("===== ☢ ").appendSibling(new ChatComponentTranslation("geiger.title.dosimeter")).appendSibling(new ChatComponentText(" ☢ =====")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GOLD))); player.addChatMessage(new ChatComponentTranslation("geiger.envRad").appendSibling(new ChatComponentText(" " + envPrefix + (limit ? ">" : "") + env + " RAD/s")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW))); } - + public static String getPreffixFromRad(double rads) { String chunkPrefix = ""; - + if(rads == 0) chunkPrefix += EnumChatFormatting.GREEN; else if(rads < 1) @@ -227,26 +226,26 @@ public class ContaminationUtil { chunkPrefix += EnumChatFormatting.DARK_RED; else chunkPrefix += EnumChatFormatting.DARK_GRAY; - + return chunkPrefix; } - + public static void printDiagnosticData(EntityPlayer player) { double digamma = ((int)(HbmLivingProps.getDigamma(player) * 100)) / 100D; double halflife = ((int)((1D - Math.pow(0.5, digamma)) * 10000)) / 100D; - + player.addChatMessage(new ChatComponentText("===== Ϝ ").appendSibling(new ChatComponentTranslation("digamma.title")).appendSibling(new ChatComponentText(" Ϝ =====")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.DARK_PURPLE))); player.addChatMessage(new ChatComponentTranslation("digamma.playerDigamma").appendSibling(new ChatComponentText(EnumChatFormatting.RED + " " + digamma + " DRX")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.LIGHT_PURPLE))); player.addChatMessage(new ChatComponentTranslation("digamma.playerHealth").appendSibling(new ChatComponentText(EnumChatFormatting.RED + " " + halflife + "%")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.LIGHT_PURPLE))); player.addChatMessage(new ChatComponentTranslation("digamma.playerRes").appendSibling(new ChatComponentText(EnumChatFormatting.BLUE + " " + "N/A")).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.LIGHT_PURPLE))); } - + public static enum HazardType { RADIATION, DIGAMMA } - + public static enum ContaminationType { FARADAY, //preventable by metal armor HAZMAT, //preventable by hazmat @@ -257,23 +256,23 @@ public class ContaminationUtil { RAD_BYPASS, //same as creative but will not apply radiation resistance calculation NONE //not preventable } - + /* * This system is nice but the cont types are a bit confusing. Cont types should have much better names and multiple cont types should be applicable. */ @SuppressWarnings("incomplete-switch") //just shut up //instead of this does-everything-but-nothing-well solution, please use the ArmorRegistry to check for protection and the HBM Props for applying contamination. still good for regular radiation tho public static boolean contaminate(EntityLivingBase entity, HazardType hazard, ContaminationType cont, float amount) { - + if(hazard == HazardType.RADIATION) { float radEnv = HbmLivingProps.getRadEnv(entity); HbmLivingProps.setRadEnv(entity, radEnv + amount); } - + if(entity instanceof EntityPlayer) { - + EntityPlayer player = (EntityPlayer)entity; - + switch(cont) { case FARADAY: if(ArmorUtil.checkForFaraday(player)) return false; break; case HAZMAT: if(ArmorUtil.checkForHazmat(player)) return false; break; @@ -281,22 +280,22 @@ public class ContaminationUtil { case DIGAMMA: if(ArmorUtil.checkForDigamma(player)) return false; if(ArmorUtil.checkForDigamma2(player)) return false; break; case DIGAMMA2: if(ArmorUtil.checkForDigamma2(player)) return false; break; } - + if(player.capabilities.isCreativeMode && cont != ContaminationType.NONE && cont != ContaminationType.DIGAMMA2) return false; - + if(player.ticksExisted < 200) return false; } - + if(hazard == HazardType.RADIATION && isRadImmune(entity)) return false; - + switch(hazard) { case RADIATION: HbmLivingProps.incrementRadiation(entity, amount * (cont == ContaminationType.RAD_BYPASS ? 1 : calculateRadiationMod(entity))); break; case DIGAMMA: HbmLivingProps.incrementDigamma(entity, amount); break; } - + return true; } } diff --git a/src/main/java/com/hbm/util/CrashHelper.java b/src/main/java/com/hbm/util/CrashHelper.java index ed5198932..3eb440287 100644 --- a/src/main/java/com/hbm/util/CrashHelper.java +++ b/src/main/java/com/hbm/util/CrashHelper.java @@ -1,7 +1,6 @@ package com.hbm.util; import com.hbm.inventory.recipes.loader.SerializableRecipe; - import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.ICrashCallable; @@ -10,7 +9,7 @@ public class CrashHelper { public static void init() { FMLCommonHandler.instance().registerCrashCallable(new CrashCallableRecipe()); } - + public static class CrashCallableRecipe implements ICrashCallable { @Override @@ -20,13 +19,13 @@ public class CrashHelper { @Override public String call() throws Exception { - + String call = ""; - + for(SerializableRecipe rec : SerializableRecipe.recipeHandlers) { if(rec.modified) call += "\n\t\t" + rec.getFileName(); } - + return call; } } diff --git a/src/main/java/com/hbm/util/CrucibleUtil.java b/src/main/java/com/hbm/util/CrucibleUtil.java index e5d06cdbd..d5cfd62aa 100644 --- a/src/main/java/com/hbm/util/CrucibleUtil.java +++ b/src/main/java/com/hbm/util/CrucibleUtil.java @@ -1,19 +1,18 @@ package com.hbm.util; -import java.util.List; - +import api.hbm.block.ICrucibleAcceptor; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; - -import api.hbm.block.ICrucibleAcceptor; import net.minecraft.block.Block; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class CrucibleUtil { - + /** * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the leftover material, just like ICrucibleAcceptor's pour. * The method directly modifies the original stack, so be careful and make a copy beforehand if you don't want that. @@ -21,21 +20,21 @@ public class CrucibleUtil { */ public static MaterialStack pourSingleStack(World world, double x, double y, double z, double range, boolean safe, MaterialStack stack, int quanta, Vec3 impactPosHolder) { - + Vec3 start = Vec3.createVectorHelper(x, y, z); Vec3 end = Vec3.createVectorHelper(x, y - range, z); - + MovingObjectPosition[] mopHolder = new MovingObjectPosition[1]; ICrucibleAcceptor acc = getPouringTarget(world, start, end, mopHolder); MovingObjectPosition mop = mopHolder[0]; - + if(acc == null) { spill(mop, safe, stack, quanta, impactPosHolder); return stack; } - + MaterialStack ret = tryPourStack(world, acc, mop, stack, impactPosHolder); - + if(ret != null) { return ret; } @@ -43,94 +42,94 @@ public class CrucibleUtil { spill(mop, safe, stack, quanta, impactPosHolder); return stack; } - + /** * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the materialStack that has been removed. * The method doesn't make copies of the MaterialStacks in the list, so the materials being subtracted or outright removed will apply to the original list. * Pass an empty Vec3 instance in order to get the impact position of the stream. */ public static MaterialStack pourFullStack(World world, double x, double y, double z, double range, boolean safe, List stacks, int quanta, Vec3 impactPosHolder) { - + if(stacks.isEmpty()) return null; - + Vec3 start = Vec3.createVectorHelper(x, y, z); Vec3 end = Vec3.createVectorHelper(x, y - range, z); - + MovingObjectPosition[] mopHolder = new MovingObjectPosition[1]; ICrucibleAcceptor acc = getPouringTarget(world, start, end, mopHolder); MovingObjectPosition mop = mopHolder[0]; - + if(acc == null) { return spill(mop, safe, stacks, quanta, impactPosHolder); } - + for(MaterialStack stack : stacks) { - + int amountToPour = Math.min(stack.amount, quanta); MaterialStack toPour = new MaterialStack(stack.material, amountToPour); MaterialStack left = tryPourStack(world, acc, mop, toPour, impactPosHolder); - + if(left != null) { stack.amount -= (amountToPour - left.amount); return new MaterialStack(stack.material, stack.amount - left.amount); } } - + return spill(mop, safe, stacks, quanta, impactPosHolder); } - + /** * Tries to pour the stack onto the supplied crucible acceptor instance. Also features our friend the Vec3 dummy, which will be filled with the stream's impact position. * Returns whatever is left of the stack when successful or null when unsuccessful (potential spillage). */ public static MaterialStack tryPourStack(World world, ICrucibleAcceptor acc, MovingObjectPosition mop, MaterialStack stack, Vec3 impactPosHolder) { Vec3 hit = mop.hitVec; - + if(stack.material.smeltable != SmeltingBehavior.SMELTABLE) { return null; } - + if(acc.canAcceptPartialPour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack)) { MaterialStack left = acc.pour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack); if(left == null) { left = new MaterialStack(stack.material, 0); } - + impactPosHolder.xCoord = hit.xCoord; impactPosHolder.yCoord = hit.yCoord; impactPosHolder.zCoord = hit.zCoord; - + return left; } - + return null; } - + /** * Uses hitscan to find the target of the pour, from start (the top) to end (the bottom). Pass a single cell MOP array to get the reference of the MOP for later use. * Now we're thinking with reference types. */ public static ICrucibleAcceptor getPouringTarget(World world, Vec3 start, Vec3 end, MovingObjectPosition[] mopHolder) { - + MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true); - + if(mopHolder != null) { mopHolder[0] = mop; } - + if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) { return null; } - + Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); - + if(!(b instanceof ICrucibleAcceptor)) { return null; } - + return (ICrucibleAcceptor) b; } - + /** * Regular spillage routine but accepts a stack list instead of a stack. simply uses the first available stack from the list. Assumes list is not empty. */ @@ -140,30 +139,30 @@ public class CrucibleUtil { MaterialStack ret = spill(mop, safe, top, quanta, impactPos); //remove all stacks with no content stacks.removeIf(o -> o.amount <= 0); - + return ret; } - + /** * The routine used for then there is no valid crucible acceptor found. Will NOP with safe mode on. Returns the MaterialStack that was lost. */ public static MaterialStack spill(MovingObjectPosition mop, boolean safe, MaterialStack stack, int quanta, Vec3 impactPos) { - + //do nothing if safe mode is on if(safe) { return null; } - + MaterialStack toWaste = new MaterialStack(stack.material, Math.min(stack.amount, quanta)); stack.amount -= toWaste.amount; - + //if there is a vec3 reference, set the impact coordinates if(impactPos != null && mop != null) { impactPos.xCoord = mop.hitVec.xCoord; impactPos.yCoord = mop.hitVec.yCoord; impactPos.zCoord = mop.hitVec.zCoord; } - + return toWaste; } } diff --git a/src/main/java/com/hbm/util/EntityDamageUtil.java b/src/main/java/com/hbm/util/EntityDamageUtil.java index ada2a10c8..71e794668 100644 --- a/src/main/java/com/hbm/util/EntityDamageUtil.java +++ b/src/main/java/com/hbm/util/EntityDamageUtil.java @@ -1,7 +1,5 @@ package com.hbm.util; -import java.lang.reflect.Method; - import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; @@ -13,36 +11,38 @@ import net.minecraft.potion.Potion; import net.minecraft.util.DamageSource; import net.minecraftforge.common.ForgeHooks; +import java.lang.reflect.Method; + public class EntityDamageUtil { - + /** * Attacks the given entity twice, based on a piecring percentage. The second hit sets the damage source to bypass armor. * The damage source is modified, so you can't reuse damage source instances. */ public static boolean attackEntityFromArmorPiercing(Entity victim, DamageSource src, float damage, float piercing) { - + if(src.isUnblockable() || piercing == 0) return victim.attackEntityFrom(src, damage); - + if(piercing == 1) { src.setDamageBypassesArmor(); return victim.attackEntityFrom(src, damage); } - + boolean ret = false; - + ret |= victim.attackEntityFrom(src, damage * (1F - piercing)); src.setDamageBypassesArmor(); ret |= victim.attackEntityFrom(src, damage * piercing); return ret; } - + public static boolean attackEntityFromIgnoreIFrame(Entity victim, DamageSource src, float damage) { if(!victim.attackEntityFrom(src, damage)) { - + if(victim instanceof EntityLivingBase) { EntityLivingBase living = (EntityLivingBase) victim; - + if(living.hurtResistantTime > living.maxHurtResistantTime / 2.0F) { damage += living.lastDamage; } @@ -52,14 +52,14 @@ public class EntityDamageUtil { return true; } } - + public static float getDamageAfterTax(EntityLivingBase living, DamageSource source, float amount) { amount = ForgeHooks.onLivingHurt(living, source, amount); if(amount <= 0) return 0; amount = applyArmorCalculations(living, source, amount); return amount; } - + public static boolean attackArmorPiercing(EntityLivingBase living, DamageSource sourceDamageCalc, DamageSource sourceArmorPiercing, float amount, float piercing) { if(piercing <= 0) return living.attackEntityFrom(sourceDamageCalc, amount); //damage intended to pass the armor @@ -68,12 +68,12 @@ public class EntityDamageUtil { float reduced = Math.max(amount - afterTax, 0F); //damage that would pass + damage tthat wouldn't pass * AP percentage return attackEntityFromIgnoreIFrame(living, sourceArmorPiercing, Math.max(afterTax + (reduced * piercing), 0F)); - + } - + /** Currently just a copy of the vanilla damage code */ public static boolean attackEntityFromNT(EntityLivingBase living, DamageSource source, float amount) { - + if(ForgeHooks.onLivingAttack(living, source, amount)) return false; if(living.isEntityInvulnerable()) { @@ -177,23 +177,23 @@ public class EntityDamageUtil { } } } - + // in this household we drink gasoline and sniff glue public static String getDeathSound(EntityLivingBase living) { Method m = ReflectionHelper.findMethod(EntityLivingBase.class, living, new String[] {"func_70673_aS", "getDeathSound"}); try { return (String) m.invoke(living); } catch(Exception e) { } return "game.neutral.die"; } - + public static String getHurtSound(EntityLivingBase living) { Method m = ReflectionHelper.findMethod(EntityLivingBase.class, living, new String[] {"func_70621_aR", "getHurtSound"}); try { return (String) m.invoke(living); } catch(Exception e) { } return "game.neutral.hurt"; } - + public static float getSoundVolume(EntityLivingBase living) { Method m = ReflectionHelper.findMethod(EntityLivingBase.class, living, new String[] {"func_70599_aP", "getSoundVolume"}); try { return (float) m.invoke(living); } catch(Exception e) { } return 1F; } - + public static float getSoundPitch(EntityLivingBase living) { Method m = ReflectionHelper.findMethod(EntityLivingBase.class, living, new String[] {"func_70647_i", "getSoundPitch"}); try { return (float) m.invoke(living); } catch(Exception e) { } return 1F; @@ -229,7 +229,7 @@ public class EntityDamageUtil { return amount; } - + public static float applyPotionDamageCalculations(EntityLivingBase living, DamageSource source, float amount) { if(source.isDamageAbsolute()) { return amount; @@ -249,7 +249,7 @@ public class EntityDamageUtil { if(amount <= 0.0F) { return 0.0F; } else { - + resistance = EnchantmentHelper.getEnchantmentModifierDamage(living.getLastActiveItems(), source); if(resistance > 20) { diff --git a/src/main/java/com/hbm/util/HashedSet.java b/src/main/java/com/hbm/util/HashedSet.java index 6a45c952b..72ab2c102 100644 --- a/src/main/java/com/hbm/util/HashedSet.java +++ b/src/main/java/com/hbm/util/HashedSet.java @@ -1,34 +1,34 @@ package com.hbm.util; +import org.apache.commons.lang3.NotImplementedException; + import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; -import org.apache.commons.lang3.NotImplementedException; - /** * A crude implementation of the HashSet with a few key differences: * - instead of being stored as the key, the objects are stored as values in the underlying HashMap with the hash being the key * - consequently, things with matching hash are considered the same, skipping the equals check * - no equals check means that collisions are possible, so be careful * - the underlying HashMap is accessible, which means that the instances can be grabbed out of the HashedSet if a hash is supplied - * + * * This sack of crap was only intended for the drone request network code - * + * * @author hbm * * @param */ public class HashedSet implements Set { - + HashMap map = new HashMap(); - + public static class HashedIterator implements Iterator { - + private Iterator> iterator; - + public HashedIterator(HashedSet set) { this.iterator = set.map.entrySet().iterator(); } @@ -54,7 +54,7 @@ public class HashedSet implements Set { public HashedSet(Set reachableNodes) { this.addAll(reachableNodes); } - + public HashMap getMap() { return this.map; } @@ -85,11 +85,11 @@ public class HashedSet implements Set { @Override public boolean containsAll(Collection c) { - + for(Object o : c) { if(!this.contains(o)) return false; } - + return true; } @@ -107,12 +107,12 @@ public class HashedSet implements Set { public boolean remove(Object o) { T obj = this.map.get(o.hashCode()); boolean rem = false; - + if(obj != null) { rem = true; this.map.remove(o.hashCode()); } - + return rem; } diff --git a/src/main/java/com/hbm/util/I18nUtil.java b/src/main/java/com/hbm/util/I18nUtil.java index a4460f6d9..13d4a2d36 100644 --- a/src/main/java/com/hbm/util/I18nUtil.java +++ b/src/main/java/com/hbm/util/I18nUtil.java @@ -1,13 +1,13 @@ package com.hbm.util; -import java.util.ArrayList; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; +import java.util.ArrayList; +import java.util.List; + @SideOnly(Side.CLIENT) public class I18nUtil { @@ -32,7 +32,7 @@ public class I18nUtil { public static String[] resolveKeyArray(String s, Object... args) { return resolveKey(s, args).split("\\$"); } - + /** * The same as autoBreak, but it also respects NTM's break character ($) for manual line breaking in addition to the automatic ones * @param fontRenderer @@ -45,14 +45,14 @@ public class I18nUtil { String[] paragraphs = text.split("\\$"); List lines = new ArrayList(); - + for(String paragraph : paragraphs) { lines.addAll(autoBreak(fontRenderer, paragraph, width)); } - + return lines; } - + /** * Turns one string into a list of strings, cutting sentences up to fit within the defined width if they were rendered in a GUI * @param fontRenderer @@ -66,17 +66,17 @@ public class I18nUtil { List lines = new ArrayList(); //split the text by all spaces String[] words = text.split(" "); - + //add the first word to the first line, no matter what lines.add(words[0]); //starting indent is the width of the first word int indent = fontRenderer.getStringWidth(words[0]); - + for(int w = 1; w < words.length; w++) { - + //increment the indent by the width of the next word + leading space indent += fontRenderer.getStringWidth(" " + words[w]); - + //if the indent is within bounds if(indent <= width) { //add the next word to the last line (i.e. the one in question) @@ -88,7 +88,7 @@ public class I18nUtil { indent = fontRenderer.getStringWidth(words[w]); } } - + return lines; } } diff --git a/src/main/java/com/hbm/util/InventoryUtil.java b/src/main/java/com/hbm/util/InventoryUtil.java index 97cc2bfe7..3a8135f62 100644 --- a/src/main/java/com/hbm/util/InventoryUtil.java +++ b/src/main/java/com/hbm/util/InventoryUtil.java @@ -1,11 +1,8 @@ package com.hbm.util; -import java.util.List; - import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.recipes.anvil.AnvilRecipes.AnvilOutput; import com.hbm.tileentity.machine.TileEntityFurnaceBrick; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -14,6 +11,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraftforge.oredict.OreDictionary; +import java.util.List; + //'t was about time public class InventoryUtil { @@ -21,7 +20,7 @@ public class InventoryUtil { if(sided instanceof TileEntityFurnace) return new int[] {1, 0}; if(sided instanceof TileEntityFurnaceBrick) return new int[] {1, 0, 3}; - + return sided.getAccessibleSlotsFromSide(side); } @@ -35,24 +34,24 @@ public class InventoryUtil { * @return the remainder of the stack that could not have been added, can return null */ public static ItemStack tryAddItemToInventory(ItemStack[] inv, int start, int end, ItemStack stack) { - + ItemStack rem = tryAddItemToExistingStack(inv, start, end, stack); - + if(rem == null) return null; - + boolean didAdd = tryAddItemToNewSlot(inv, start, end, rem); - + if(didAdd) return null; else return rem; } - + public static ItemStack tryAddItemToInventory(ItemStack[] inv, ItemStack stack) { return tryAddItemToInventory(inv, 0, inv.length - 1, stack); } - + /** * Functionally equal to tryAddItemToInventory, but will not try to create new stacks in empty slots * @param inv @@ -62,29 +61,29 @@ public class InventoryUtil { * @return */ public static ItemStack tryAddItemToExistingStack(ItemStack[] inv, int start, int end, ItemStack stack) { - + if(stack == null || stack.stackSize == 0) return null; - + for(int i = start; i <= end; i++) { if(doesStackDataMatch(inv[i], stack)) { - + int transfer = Math.min(stack.stackSize, inv[i].getMaxStackSize() - inv[i].stackSize); - + if(transfer > 0) { inv[i].stackSize += transfer; stack.stackSize -= transfer; - + if(stack.stackSize == 0) return null; } } } - + return stack; } - + /** * Will place the stack in the first empty slot * @param inv @@ -94,21 +93,21 @@ public class InventoryUtil { * @return whether the stack could be added or not */ public static boolean tryAddItemToNewSlot(ItemStack[] inv, int start, int end, ItemStack stack) { - + if(stack == null || stack.stackSize == 0) return true; - + for(int i = start; i <= end; i++) { - + if(inv[i] == null) { inv[i] = stack; return true; } } - + return false; } - + /** * Much of the same but with an ISidedInventory instance instead of a slot array * @param inv @@ -118,86 +117,86 @@ public class InventoryUtil { * @return */ public static ItemStack tryAddItemToInventory(IInventory inv, int start, int end, ItemStack stack) { - + ItemStack rem = tryAddItemToExistingStack(inv, start, end, stack); - + if(rem == null) return null; - + boolean didAdd = tryAddItemToNewSlot(inv, start, end, rem); - + if(didAdd) return null; else return rem; } - + public static ItemStack tryAddItemToExistingStack(IInventory inv, int start, int end, ItemStack stack) { - + if(stack == null || stack.stackSize == 0) return null; - + for(int i = start; i <= end; i++) { if(doesStackDataMatch(inv.getStackInSlot(i), stack)) { - + int transfer = Math.min(stack.stackSize, inv.getStackInSlot(i).getMaxStackSize() - inv.getStackInSlot(i).stackSize); - + if(transfer > 0) { inv.getStackInSlot(i).stackSize += transfer; stack.stackSize -= transfer; - + if(stack.stackSize == 0) return null; } } } - + return stack; } - + public static boolean tryAddItemToNewSlot(IInventory inv, int start, int end, ItemStack stack) { - + if(stack == null || stack.stackSize == 0) return true; - + for(int i = start; i <= end; i++) { - + if(inv.getStackInSlot(i) == null) { inv.setInventorySlotContents(i, stack); return true; } } - + return false; } - + public static boolean tryConsumeAStack(ItemStack[] inv, int start, int end, AStack stack) { - + if(stack == null) return true; - + AStack copy = stack.copy(); - + for(int i = start; i <= end; i++) { ItemStack in = inv[i]; - + if(stack.matchesRecipe(in, true)) { int size = Math.min(copy.stacksize, in.stackSize); - + in.stackSize -= size; copy.stacksize -= size; - + if(in.stackSize == 0) inv[i] = null; if(copy.stacksize == 0) return true; } } - + return false; } - + /** * Compares item, metadata and NBT data of two stacks. Also handles null values! * @param stack1 @@ -205,7 +204,7 @@ public class InventoryUtil { * @return */ public static boolean doesStackDataMatch(ItemStack stack1, ItemStack stack2) { - + if(stack1 == null && stack2 == null) return true; if(stack1 == null && stack2 != null) return false; if(stack1 != null && stack2 == null) return false; @@ -214,10 +213,10 @@ public class InventoryUtil { if(!stack1.hasTagCompound() && !stack2.hasTagCompound()) return true; if(stack1.hasTagCompound() && !stack2.hasTagCompound()) return false; if(!stack1.hasTagCompound() && stack2.hasTagCompound()) return false; - + return stack1.getTagCompound().equals(stack2.getTagCompound()); } - + /** * Checks if a player has matching item stacks in his inventory and removes them if so desired * @param player @@ -226,34 +225,34 @@ public class InventoryUtil { * @return whether the player has the required item stacks or not */ public static boolean doesPlayerHaveAStacks(EntityPlayer player, List stacks, boolean shouldRemove) { - + ItemStack[] original = player.inventory.mainInventory; ItemStack[] inventory = new ItemStack[original.length]; boolean[] modified = new boolean[original.length]; AStack[] input = new AStack[stacks.size()]; - + //first we copy the inputs into an array because 1. it's easier to deal with and 2. we can dick around with the stack sized with no repercussions for(int i = 0; i < input.length; i++) { input[i] = stacks.get(i).copy(); } - + //then we copy the inventory so we can dick around with it as well without making actual modifications to the player's inventory for(int i = 0; i < original.length; i++) { if(original[i] != null) { inventory[i] = original[i].copy(); } } - + //now we go through every ingredient... for(int i = 0; i < input.length; i++) { - + AStack stack = input[i]; - + //...and compare each ingredient to every stack in the inventory for(int j = 0; j < inventory.length; j++) { - + ItemStack inv = inventory[j]; - + //we check if it matches but ignore stack size for now if(stack.matchesRecipe(inv, true)) { //and NOW we care about the stack size @@ -261,29 +260,29 @@ public class InventoryUtil { stack.stacksize -= size; inv.stackSize -= size; modified[j] = true; - + //spent stacks are removed from the equation so that we don't cross ourselves later on if(stack.stacksize <= 0) { input[i] = null; break; } - + if(inv.stackSize <= 0) { inventory[j] = null; } } } } - + for(AStack stack : input) { if(stack != null) { return false; } } - + if(shouldRemove) { for(int i = 0; i < original.length; i++) { - + if(inventory[i] != null && inventory[i].stackSize <= 0) { original[i] = null; } else { @@ -291,12 +290,12 @@ public class InventoryUtil { } } } - + return true; } - + public static void giveChanceStacksToPlayer(EntityPlayer player, List stacks) { - + for(AnvilOutput out : stacks) { if(out.chance == 1.0F || player.getRNG().nextFloat() < out.chance) { if(!player.inventory.addItemStackToInventory(out.stack.copy())) { @@ -305,23 +304,23 @@ public class InventoryUtil { } } } - + public static boolean hasOreDictMatches(EntityPlayer player, String dict, int count) { return countOreDictMatches(player, dict) >= count; } - + public static int countOreDictMatches(EntityPlayer player, String dict) { - + int count = 0; - + for(int i = 0; i < player.inventory.mainInventory.length; i++) { - + ItemStack stack = player.inventory.mainInventory[i]; - + if(stack != null) { - + int[] ids = OreDictionary.getOreIDs(stack); - + for(int id : ids) { if(OreDictionary.getOreName(id).equals(dict)) { count += stack.stackSize; @@ -330,23 +329,23 @@ public class InventoryUtil { } } } - + return count; } - + public static void consumeOreDictMatches(EntityPlayer player, String dict, int count) { - + for(int i = 0; i < player.inventory.mainInventory.length; i++) { - + ItemStack stack = player.inventory.mainInventory[i]; - + if(stack != null) { - + int[] ids = OreDictionary.getOreIDs(stack); - + for(int id : ids) { if(OreDictionary.getOreName(id).equals(dict)) { - + int toConsume = Math.min(count, stack.stackSize); player.inventory.decrStackSize(i, toConsume); count -= toConsume; @@ -356,7 +355,7 @@ public class InventoryUtil { } } } - + /** * Turns objects into 2D ItemStack arrays. Index 1: Ingredient slot, index 2: variation (ore dict) * Handles:
@@ -370,13 +369,13 @@ public class InventoryUtil { * @return */ public static ItemStack[][] extractObject(Object o) { - + if(o instanceof ItemStack) { ItemStack[][] stacks = new ItemStack[1][1]; stacks[0][0] = ((ItemStack)o).copy(); return stacks; } - + if(o instanceof ItemStack[]) { ItemStack[] ingredients = (ItemStack[]) o; ItemStack[][] stacks = new ItemStack[ingredients.length][1]; @@ -385,11 +384,11 @@ public class InventoryUtil { } return stacks; } - + if(o instanceof ItemStack[][]) { return (ItemStack[][]) o; } - + if(o instanceof AStack) { AStack astack = (AStack) o; ItemStack[] ext = astack.extractForNEI().toArray(new ItemStack[0]); @@ -397,23 +396,23 @@ public class InventoryUtil { stacks[0] = ext; //untested, do java arrays allow that? the capacity set is 0 after all return stacks; } - + if(o instanceof AStack[]) { AStack[] ingredients = (AStack[]) o; ItemStack[][] stacks = new ItemStack[ingredients.length][0]; - + for(int i = 0; i < ingredients.length; i++) { stacks[i] = ingredients[i].extractForNEI().toArray(new ItemStack[0]); } - + return stacks; } - + /* in emergency situations with mixed types where AStacks coexist with NBT dependent ItemStacks, such as for fluid icons */ if(o instanceof Object[]) { Object[] ingredients = (Object[]) o; ItemStack[][] stacks = new ItemStack[ingredients.length][0]; - + for(int i = 0; i < ingredients.length; i++) { Object ingredient = ingredients[i]; @@ -425,67 +424,67 @@ public class InventoryUtil { stacks[i][0] = ((ItemStack) ingredient).copy(); } } - + return stacks; } - + return new ItemStack[0][0]; } - + public static boolean doesArrayHaveIngredients(ItemStack[] array, int start, int end, AStack... ingredients) { ItemStack[] copy = ItemStackUtil.carefulCopyArrayTruncate(array, start, end); - + AStack[] req = new AStack[ingredients.length]; for(int i = 0; i < req.length; i++) { req[i] = ingredients[i] == null ? null : ingredients[i].copy(); } - + for(AStack ingredient : req) { - + if(ingredient == null) continue; - + for(ItemStack input : copy) { - + if(input == null) continue; - + if(ingredient.matchesRecipe(input, true)) { int size = Math.min(input.stackSize, ingredient.stacksize); - + ingredient.stacksize -= size; input.stackSize -= size; - + if(ingredient.stacksize == 0) break; } } - + //we have iterated over the entire input array and removed all matching entries, yet the ingredient is still not exhausted, meaning the input wasn't enough if(ingredient.stacksize > 0) return false; } - + return true; } - + public static boolean doesArrayHaveSpace(ItemStack[] array, int start, int end, ItemStack[] items) { ItemStack[] copy = ItemStackUtil.carefulCopyArrayTruncate(array, start, end); - + for(ItemStack item : items) { - + if(item == null) continue; - + ItemStack remainder = tryAddItemToInventory(copy, item.copy()); if(remainder != null) { return false; } } - + return true; } - + /** * A fixed re-implementation of the original Container.mergeItemStack that repects stack size and slot restrictions. * @param slots @@ -496,7 +495,7 @@ public class InventoryUtil { * @return */ public static boolean mergeItemStack(List slots, ItemStack stack, int start, int end, boolean reverse) { - + boolean success = false; int index = start; @@ -508,7 +507,7 @@ public class InventoryUtil { ItemStack current; if(stack.isStackable()) { - + while(stack.stackSize > 0 && (!reverse && index < end || reverse && index >= start)) { slot = slots.get(index); current = slot.getStack(); @@ -516,10 +515,10 @@ public class InventoryUtil { if(current != null) { int max = Math.min(stack.getMaxStackSize(), slot.getSlotStackLimit()); int toRemove = Math.min(stack.stackSize, max); - + if(slot.isItemValid(ItemStackUtil.carefulCopyWithSize(stack, toRemove)) && current.getItem() == stack.getItem() && (!stack.getHasSubtypes() || stack.getItemDamage() == current.getItemDamage()) && ItemStack.areItemStackTagsEqual(stack, current)) { - + int currentSize = current.stackSize + stack.stackSize; if(currentSize <= max) { stack.stackSize = 0; @@ -555,10 +554,10 @@ public class InventoryUtil { current = slot.getStack(); if(current == null) { - + int max = Math.min(stack.getMaxStackSize(), slot.getSlotStackLimit()); int toRemove = Math.min(stack.stackSize, max); - + if(slot.isItemValid(ItemStackUtil.carefulCopyWithSize(stack, toRemove))) { current = stack.splitStack(toRemove); slot.putStack(current); @@ -576,10 +575,10 @@ public class InventoryUtil { return success; } - + public static int countAStackMatches(ItemStack[] inventory, AStack stack, boolean ignoreSize) { int count = 0; - + for(ItemStack itemStack : inventory) { if(itemStack != null) { if(stack.matchesRecipe(itemStack, true)) { diff --git a/src/main/java/com/hbm/util/ItemStackUtil.java b/src/main/java/com/hbm/util/ItemStackUtil.java index 1ab7af389..c5cb6abd7 100644 --- a/src/main/java/com/hbm/util/ItemStackUtil.java +++ b/src/main/java/com/hbm/util/ItemStackUtil.java @@ -1,9 +1,5 @@ package com.hbm.util; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.IInventory; @@ -15,22 +11,26 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class ItemStackUtil { - + public static ItemStack carefulCopy(ItemStack stack) { if(stack == null) return null; return stack.copy(); } - + public static ItemStack carefulCopyWithSize(ItemStack stack, int size) { if(stack == null) return null; - + ItemStack copy = stack.copy(); copy.stackSize = size; return copy; } - + /** * Runs carefulCopy over the entire ItemStack array. * @param array @@ -39,7 +39,7 @@ public class ItemStackUtil { public static ItemStack[] carefulCopyArray(ItemStack[] array) { return carefulCopyArray(array, 0, array.length - 1); } - + /** * Recreates the ItemStack array and only runs carefulCopy over the supplied range. All other fields remain null. * @param array @@ -50,16 +50,16 @@ public class ItemStackUtil { public static ItemStack[] carefulCopyArray(ItemStack[] array, int start, int end) { if(array == null) return null; - + ItemStack[] copy = new ItemStack[array.length]; - + for(int i = start; i <= end; i++) { copy[i] = carefulCopy(array[i]); } - + return copy; } - + /** * Creates a new array that only contains the copied range. * @param array @@ -70,14 +70,14 @@ public class ItemStackUtil { public static ItemStack[] carefulCopyArrayTruncate(ItemStack[] array, int start, int end) { if(array == null) return null; - + int length = end - start + 1; ItemStack[] copy = new ItemStack[length]; - + for(int i = 0; i < length; i++) { copy[i] = carefulCopy(array[start + i]); } - + return copy; } @@ -88,28 +88,28 @@ public class ItemStackUtil { * @param lines */ public static ItemStack addTooltipToStack(ItemStack stack, String... lines) { - + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); - + NBTTagCompound display = new NBTTagCompound(); NBTTagList lore = new NBTTagList(); - + for(String line : lines) { lore.appendTag(new NBTTagString(EnumChatFormatting.RESET + "" + EnumChatFormatting.GRAY + line)); } - + display.setTag("Lore", lore); stack.stackTagCompound.setTag("display", display); - + return stack; } - + public static void addStacksToNBT(ItemStack stack, ItemStack... stacks) { - + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); - + NBTTagList tags = new NBTTagList(); for(int i = 0; i < stacks.length; i++) { @@ -122,7 +122,7 @@ public class ItemStackUtil { } stack.stackTagCompound.setTag("items", tags); } - + public static ItemStack[] readStacksFromNBT(ItemStack stack, int count) { if(!stack.hasTagCompound()) @@ -143,14 +143,14 @@ public class ItemStackUtil { stacks[slot] = loadedStack; } } - + return stacks; } - + public static ItemStack[] readStacksFromNBT(ItemStack stack) { return readStacksFromNBT(stack, 0); } - + /** * Returns a List of all ore dict names for this stack. Stack cannot be null, list is empty when there are no ore dict entries. * @param stack @@ -158,15 +158,15 @@ public class ItemStackUtil { */ public static List getOreDictNames(ItemStack stack) { List list = new ArrayList(); - + int ids[] = OreDictionary.getOreIDs(stack); for(int i : ids) { list.add(OreDictionary.getOreName(i)); } - + return list; } - + public static void spillItems(World world, int x, int y, int z, Block block, Random rand) { IInventory tileentityfurnace = (IInventory) world.getTileEntity(x, y, z); @@ -183,7 +183,7 @@ public class ItemStackUtil { int j1 = rand.nextInt(21) + 10; if(j1 > itemstack.stackSize) j1 = itemstack.stackSize; itemstack.stackSize -= j1; - + EntityItem entityitem = new EntityItem(world, x + oX, y + oY, z + oZ, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); if(itemstack.hasTagCompound()) entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index ee4f64899..371c72773 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -1,44 +1,43 @@ package com.hbm.util; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.itempool.ItemPool; import com.hbm.itempool.ItemPoolsPile; +import com.hbm.items.ItemAmmoEnums.AmmoFatman; import com.hbm.items.ModItems; import com.hbm.items.special.ItemBookLore; -import com.hbm.items.ItemAmmoEnums.AmmoFatman; - import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import java.util.Random; + public class LootGenerator { public static void setBlock(World world, int x, int y, int z) { world.setBlock(x, y, z, ModBlocks.deco_loot); } - + public static void addItemWithDeviation(TileEntityLoot loot, Random rand, ItemStack stack, double x, double y, double z) { loot.addItem(stack, x + rand.nextGaussian() * 0.02, y, z + rand.nextGaussian() * 0.02); } - + public static void lootBooklet(World world, int x, int y, int z) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { loot.addItem(ItemBookLore.createBook("beacon", 12, 0x404040, 0xD637B3), 0, 0, 0);; } } - + public static void lootCapNuke(World world, int x, int y, int z) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { - + if(world.rand.nextInt(5) == 0) loot.addItem(ModItems.ammo_nuke.stackFromEnum(AmmoFatman.LOW), -0.25, 0, -0.125); else @@ -49,27 +48,27 @@ public class LootGenerator { for(int i = 0; i < 6; i++) addItemWithDeviation(loot, world.rand, new ItemStack(ModItems.cap_nuka, 2), 0.125, i * 0.03125, -0.25); } } - + public static void lootMedicine(World world, int x, int y, int z) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { for(int i = 0; i < 4; i++) addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPoolsPile.POOL_PILE_MED_SYRINGE, world.rand), 0.125, i * 0.03125, 0.25); addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPoolsPile.POOL_PILE_MED_PILLS, world.rand), -0.25, 0, -0.125); } } - + public static void lootCapStash(World world, int x, int y, int z) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { - + for(int i = -1; i <= 1; i++) { for(int j = -1; j <= 1; j++) { - + int count = world.rand.nextInt(5) + 3; for(int k = 0; k < count; k++) { addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPoolsPile.POOL_PILE_CAPS, world.rand), i * 0.3125, k * 0.03125, j * 0.3125); @@ -78,35 +77,35 @@ public class LootGenerator { } } } - + public static void lootMakeshiftGun(World world, int x, int y, int z) { TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { - + boolean r = world.rand.nextBoolean(); if(r) addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPoolsPile.POOL_PILE_MAKESHIFT_GUN, world.rand), 0.125, 0.025, 0.25); - + if(!r || world.rand.nextBoolean()) addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPoolsPile.POOL_PILE_MAKESHIFT_WRENCH, world.rand), -0.25, 0, -0.28125); - + int count = world.rand.nextInt(2) + 1; for(int i = 0; i < count; i++) addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPoolsPile.POOL_PILE_MAKESHIFT_PLATES, world.rand), -0.25, i * 0.03125, 0.3125); - + count = world.rand.nextInt(2) + 2; for(int i = 0; i < count; i++) addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPoolsPile.POOL_PILE_MAKESHIFT_WIRE, world.rand), 0.25, i * 0.03125, 0.1875); } } - + public static void lootNukeStorage(World world, int x, int y, int z) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { - + for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { - + if(world.rand.nextBoolean()) { loot.addItem(ItemPool.getStack(ItemPoolsPile.POOL_PILE_NUKE_STORAGE, world.rand), -0.375 + i * 0.25, 0, -0.375 + j * 0.25); } @@ -114,46 +113,46 @@ public class LootGenerator { } } } - + public static void lootBones(World world, int x, int y, int z) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { - + int limit = world.rand.nextInt(3) + 3; for(int i = 0; i < limit; i++) { addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_BONES), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); } } } - + public static void lootGlyphidHive(World world, int x, int y, int z) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { - + int limit = world.rand.nextInt(3) + 3; for(int i = 0; i < limit; i++) { addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_HIVE), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); } } } - + public static void lootBookLore(World world, int x, int y, int z, ItemStack book) { - + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); - + if(loot != null && loot.items.isEmpty()) { addItemWithDeviation(loot, world.rand, book, 0, 0, -0.25); - + int count = world.rand.nextInt(3) + 2; for(int k = 0; k < count; k++) addItemWithDeviation(loot, world.rand, new ItemStack(Items.book), -0.25, k * 0.03125, 0.25); - + count = world.rand.nextInt(2) + 1; for(int k = 0; k < count; k++) addItemWithDeviation(loot, world.rand, new ItemStack(Items.paper), 0.25, k * 0.03125, 0.125); } } - + } diff --git a/src/main/java/com/hbm/util/ParticleUtil.java b/src/main/java/com/hbm/util/ParticleUtil.java index 2c654de56..b4eca3ac1 100644 --- a/src/main/java/com/hbm/util/ParticleUtil.java +++ b/src/main/java/com/hbm/util/ParticleUtil.java @@ -3,7 +3,6 @@ package com.hbm.util; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; - import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; @@ -17,7 +16,7 @@ public class ParticleUtil { data.setDouble("mX", mX); data.setDouble("mY", mY); data.setDouble("mZ", mZ); - + if(world.isRemote) { data.setDouble("posX", x); data.setDouble("posY", y); @@ -27,7 +26,7 @@ public class ParticleUtil { PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 150)); } } - + public static void spawnDroneLine(World world, double x, double y, double z, double x0, double y0, double z0, int color) { NBTTagCompound data = new NBTTagCompound(); diff --git a/src/main/java/com/hbm/util/RTGUtil.java b/src/main/java/com/hbm/util/RTGUtil.java index dfa9ce0b0..3d35e1e8b 100644 --- a/src/main/java/com/hbm/util/RTGUtil.java +++ b/src/main/java/com/hbm/util/RTGUtil.java @@ -3,47 +3,46 @@ package com.hbm.util; import com.hbm.config.VersatileConfig; import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType; import com.hbm.items.machine.ItemRTGPellet; - import net.minecraft.item.ItemStack; public class RTGUtil { - + public static short getPower(ItemRTGPellet fuel, ItemStack stack) { return VersatileConfig.scaleRTGPower() ? ItemRTGPellet.getScaledPower(fuel, stack) : fuel.getHeat(); } - + public static boolean hasHeat(ItemStack[] inventory, int[] rtgSlots) { for(int slot : rtgSlots) { - + if(inventory[slot] == null) continue; - + if(inventory[slot].getItem() instanceof ItemRTGPellet) return true; } - + return false; } - + public static int updateRTGs(ItemStack[] inventory, int[] rtgSlots) { int newHeat = 0; for(int slot : rtgSlots) { - + if(inventory[slot] == null) continue; - + if(!(inventory[slot].getItem() instanceof ItemRTGPellet)) continue; - + final ItemRTGPellet pellet = (ItemRTGPellet) inventory[slot].getItem(); newHeat += getPower(pellet, inventory[slot]); inventory[slot] = ItemRTGPellet.handleDecay(inventory[slot], pellet); } - + return newHeat; - + } - + /** * Gets the lifespan of an RTG based on half-life * @author UFFR diff --git a/src/main/java/com/hbm/util/ShadyUtil.java b/src/main/java/com/hbm/util/ShadyUtil.java index df3fd7f8c..2c4c1c1f6 100644 --- a/src/main/java/com/hbm/util/ShadyUtil.java +++ b/src/main/java/com/hbm/util/ShadyUtil.java @@ -1,5 +1,10 @@ package com.hbm.util; +import com.google.common.collect.Sets; +import com.hbm.config.GeneralConfig; +import com.hbm.main.ModEventHandler; +import cpw.mods.fml.relauncher.ReflectionHelper; + import java.lang.reflect.Field; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -8,12 +13,6 @@ import java.util.HashSet; import java.util.Random; import java.util.Set; -import com.google.common.collect.Sets; -import com.hbm.config.GeneralConfig; -import com.hbm.main.ModEventHandler; - -import cpw.mods.fml.relauncher.ReflectionHelper; - /** * Handles anything regarding hashes, base64 encoding, etc. Shady looking stuff, that is * @author hbm @@ -54,13 +53,13 @@ public class ShadyUtil { public static String Alcater = "0b399a4a-8545-45a1-be3d-ece70d7d48e9"; public static String ege444 = "42ee978c-442a-4cd8-95b6-29e469b6df10"; public static String LePeeperSauvage = "433c2bb7-018c-4d51-acfe-27f907432b5e"; - + public static final Set hashes = new HashSet(); static { hashes.add("41de5c372b0589bbdb80571e87efa95ea9e34b0d74c6005b8eab495b7afd9994"); hashes.add("31da6223a100ed348ceb3254ceab67c9cc102cb2a04ac24de0df3ef3479b1036"); } - + public static final int c = 0x3d; public static String initializer = "Ur bp7mN-@UFZKXBx9N[/>M'k\\7\\9m3b"; public static String signature = "dYPq\\YzrNpfn[ZDxdk7PS2jhTY72cZT7SoH|\\WL3dIznfC"; @@ -74,11 +73,11 @@ public class ShadyUtil { "5bf069bc-5b46-4179-aafe-35c0a07dee8b", //JMF781 "ccd9aa1c-26b9-4dde-8f37-b96f8d99de22", //kakseao }); - + // simple cryptographic utils public static String encode(String msg) { return Base64.getEncoder().encodeToString(msg.getBytes()); } public static String decode(String msg) { return new String(Base64.getDecoder().decode(msg)); } - + public static String offset(String msg, int o) { byte[] bytes = msg.getBytes(); for(int i = 0; i < bytes.length; i++) { @@ -86,10 +85,10 @@ public class ShadyUtil { } return new String(bytes); } - + /** Encryptor for the h-cat answer strings */ public static String smoosh(String s1, String s2, String s3, String s4) { - + Random rand = new Random(); String s = ""; @@ -97,9 +96,9 @@ public class ShadyUtil { byte[] b2 = s2.getBytes(); byte[] b3 = s3.getBytes(); byte[] b4 = s4.getBytes(); - + if(b1.length == 0 || b2.length == 0 || b3.length == 0 || b4.length == 0) return ""; - + s += s1; rand.setSeed(b1[0]); s += rand.nextInt(0xffffff); @@ -117,7 +116,7 @@ public class ShadyUtil { s += rand.nextInt(0xffffff); return getHash(s); } - + /** Simple SHA256 call */ public static String getHash(String inp) { try { @@ -129,10 +128,10 @@ public class ShadyUtil { } catch(NoSuchAlgorithmException e) { } return ""; } - + public static void test() { if(!GeneralConfig.enableDebugMode) return; //only run in debug mode - + try { Class test = Class.forName(decode(offset(signature, -2))); Field field = ReflectionHelper.findField(test, decode(offset(checksum, -2))); diff --git a/src/main/java/com/hbm/util/StatHelper.java b/src/main/java/com/hbm/util/StatHelper.java index fbd7fec34..116a0d301 100644 --- a/src/main/java/com/hbm/util/StatHelper.java +++ b/src/main/java/com/hbm/util/StatHelper.java @@ -1,10 +1,6 @@ package com.hbm.util; -import java.util.Iterator; -import java.util.Map; - import com.hbm.interfaces.NotableComments; - import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.block.Block; import net.minecraft.init.Blocks; @@ -16,14 +12,17 @@ import net.minecraft.stats.StatCrafting; import net.minecraft.stats.StatList; import net.minecraft.util.ChatComponentTranslation; +import java.util.Iterator; +import java.util.Map; + @NotableComments public class StatHelper { - + /* * God is dead and we are pissing on his grave */ public static Map publicReferenceToOneshotStatListPleaseAllPointAndLaugh; - + /** * This is probably the worst fucking way of doing this, but it's the only one I could think of that works. * In short: stats are hilariously broken. @@ -32,22 +31,22 @@ public class StatHelper { * the system would break because modded items have dynamic IDs and the stats register fixed IDs instead of item instances. * What did forge do to solve this issue? Well nothing, of course! The injected bits comment on that in vanilla's stat * registering code, but instead of fixing anything it just slaps a fat "TODO" onto it. Wow! Really helpful! - * + * * So what do we do? Every time the world starts and we know the IDs are now correct, we smack that fucker up nice and good. * All ID-bound stats get deep-cleaned out of this mess and registered 1:1 again. Is this terrible and prone to breaking with * mods that do their own stat handling? Hard to say, but the possibility is there. */ public static void resetStatShitFuck() { - + publicReferenceToOneshotStatListPleaseAllPointAndLaugh = ReflectionHelper.getPrivateValue(StatList.class, null, "field_75942_a", "oneShotStats"); - + for(int i = 0; i < StatList.objectCraftStats.length; i++) StatList.objectCraftStats[i] = null; for(int i = 0; i < StatList.mineBlockStatArray.length; i++) StatList.mineBlockStatArray[i] = null; for(int i = 0; i < StatList.objectUseStats.length; i++) StatList.objectUseStats[i] = null; for(int i = 0; i < StatList.objectBreakStats.length; i++) StatList.objectBreakStats[i] = null; StatList.objectMineStats.clear(); StatList.itemStats.clear(); - + try { initCraftItemStats(); initBlockMineStats(); @@ -55,7 +54,7 @@ public class StatHelper { initItemBreakStats(); } catch(Throwable ex) { } // just to be sure } - + /** * For reasons beyond human comprehension, this bit originally only registered items that are the result * of an IRecipe instead of just all items outright like the item usage stats. The logical consequence of this is: @@ -168,12 +167,12 @@ public class StatHelper { stats[i] = stats[j]; } } - + private static StatBase registerStat(StatBase stat) { if(publicReferenceToOneshotStatListPleaseAllPointAndLaugh.containsKey(stat.statId)) { publicReferenceToOneshotStatListPleaseAllPointAndLaugh.remove(stat.statId); } - + StatList.allStats.add(stat); publicReferenceToOneshotStatListPleaseAllPointAndLaugh.put(stat.statId, stat); return stat; diff --git a/src/main/java/com/hbm/util/TimeAnalyzer.java b/src/main/java/com/hbm/util/TimeAnalyzer.java index ec856e301..8bbfba1d1 100644 --- a/src/main/java/com/hbm/util/TimeAnalyzer.java +++ b/src/main/java/com/hbm/util/TimeAnalyzer.java @@ -1,13 +1,13 @@ package com.hbm.util; +import com.hbm.util.Tuple.Pair; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map.Entry; -import com.hbm.util.Tuple.Pair; - /** A more lightweight, punctual version of the dreadfully slow vanilla profiler. */ public class TimeAnalyzer { @@ -15,34 +15,34 @@ public class TimeAnalyzer { private static List> deltas = new ArrayList(); private static String currentSection = ""; private static long sectionStartTime = 0; - + public static void startCount(String section) { currentSection = section; sectionStartTime = System.nanoTime(); } - + public static void endCount() { long delta = System.nanoTime() - sectionStartTime; deltas.add(new Pair(currentSection, delta)); } - + public static void startEndCount(String section) { endCount(); startCount(section); } - + public static void dump() { HashMap milliTime = new HashMap(); - + for(Pair delta : deltas) { Long total = milliTime.get(delta.getKey()); if(total == null) total = new Long(0); total += delta.getValue(); milliTime.put(delta.getKey(), total); } - + long total = 0; - + for(Entry entry : milliTime.entrySet()) { total += entry.getValue(); String time = String.format(Locale.US, "%,d", entry.getValue()); @@ -50,7 +50,7 @@ public class TimeAnalyzer { } System.out.println("Total time passed: " + String.format(Locale.US, "%,d", total) + "ns (" + (total / 1_000_000_000) + "s)"); - + currentSection = ""; sectionStartTime = 0; deltas.clear(); diff --git a/src/main/java/com/hbm/util/TrackerUtil.java b/src/main/java/com/hbm/util/TrackerUtil.java index 09577505a..5b9b7289f 100644 --- a/src/main/java/com/hbm/util/TrackerUtil.java +++ b/src/main/java/com/hbm/util/TrackerUtil.java @@ -1,7 +1,6 @@ package com.hbm.util; import com.hbm.interfaces.NotableComments; - import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityTracker; @@ -14,7 +13,7 @@ import net.minecraft.world.WorldServer; /** * This absolute fucking mess of a class is the direct consequence of mojank's terrible entity tracker that allows for 0 flexibility with how entities are synced. - * + * * @author hbm */ @NotableComments @@ -27,10 +26,10 @@ public class TrackerUtil { EntityTrackerEntry entry = (EntityTrackerEntry) map.lookup(entityId); return entry; } - + /** Force-teleports the given entity using the tracker, resetting the tick count to 0 to prevent movement during this tick */ public static void sendTeleport(World world, Entity e) { - + if(world instanceof WorldServer) { WorldServer server = (WorldServer) world; EntityTrackerEntry entry = getTrackerEntry(server, e.getEntityId()); @@ -44,9 +43,9 @@ public class TrackerUtil { entry.ticks = 0; } } - + public static void setTrackingRange(World world, Entity e, int range) { - + if(world instanceof WorldServer) { WorldServer server = (WorldServer) world; EntityTrackerEntry entry = getTrackerEntry(server, e.getEntityId()); diff --git a/src/main/java/com/hbm/util/fauxpointtwelve/Rotation.java b/src/main/java/com/hbm/util/fauxpointtwelve/Rotation.java index 7bbfa95a9..6b85cae68 100644 --- a/src/main/java/com/hbm/util/fauxpointtwelve/Rotation.java +++ b/src/main/java/com/hbm/util/fauxpointtwelve/Rotation.java @@ -1,7 +1,6 @@ package com.hbm.util.fauxpointtwelve; import com.hbm.interfaces.Spaghetti; - import net.minecraftforge.common.util.ForgeDirection; public enum Rotation { @@ -43,7 +42,7 @@ public enum Rotation { default: return this; } } - + /** * Adjusted code from NTM 1.12 (com.hbm.lib.ForgeDirection) * @param dir diff --git a/src/main/java/com/hbm/util/function/Function.java b/src/main/java/com/hbm/util/function/Function.java index 9dd32272c..a3b8162cc 100644 --- a/src/main/java/com/hbm/util/function/Function.java +++ b/src/main/java/com/hbm/util/function/Function.java @@ -1,19 +1,18 @@ package com.hbm.util.function; -import java.util.Locale; - import com.hbm.util.BobMathUtil; - import net.minecraft.util.EnumChatFormatting; +import java.util.Locale; + /** * A simple class for defining function types (linear, log, sqrt, etc.) for things like fuel reactivity. * Unlike current RBMK functions, constants used in the calculations have been removed - * + * * @author hbm */ public abstract class Function { - + protected double div = 1D; protected double off = 0; @@ -21,10 +20,10 @@ public abstract class Function { public abstract double effonix(double x); public abstract String getLabelForFuel(); public abstract String getDangerFromFuel(); - + public Function withDiv(double div) { this.div = div; return this; }; public Function withOff(double off) { this.off = off; return this; }; - + public double getX(double x) { return x / div + off; } public String getXName() { return getXName(true); } public String getXName(boolean brackets) { @@ -35,52 +34,52 @@ public abstract class Function { if(mod && brackets) x = "(" + x + ")"; return x; } - + public static abstract class FunctionSingleArg extends Function { protected double level; public FunctionSingleArg(double level) { this.level = level; } } - + public static abstract class FunctionDoubleArg extends Function { protected double level, vOff; public FunctionDoubleArg(double level, double vOff) { this.level = level; this.vOff = vOff; } } - + public static class FunctionLogarithmic extends FunctionSingleArg { public FunctionLogarithmic(double level) { super(level); this.withOff(1D); } @Override public double effonix(double x) { return Math.log10(getX(x)) * level; } @Override public String getLabelForFuel() { return "log10(" + getXName(false) + ") * " + String.format(Locale.US, "%,.1f", this.level); } @Override public String getDangerFromFuel() { return EnumChatFormatting.YELLOW + "MEDIUM / LOGARITHMIC"; } } - + public static class FunctionPassive extends FunctionSingleArg { public FunctionPassive(double level) { super(level); } @Override public double effonix(double x) { return this.level; } @Override public String getLabelForFuel() { return "" + String.format(Locale.US, "%,.1f", this.level); } @Override public String getDangerFromFuel() { return EnumChatFormatting.DARK_GREEN + "SAFE / PASSIVE"; } } - + public static class FunctionSqrt extends FunctionSingleArg { public FunctionSqrt(double level) { super(level); } @Override public double effonix(double x) { return BobMathUtil.squirt(getX(x)) * this.level; } @Override public String getLabelForFuel() { return "sqrt(" + getXName(false) + ") * " + String.format(Locale.US, "%,.3f", this.level); } //not entirely correct but good enough @Override public String getDangerFromFuel() { return EnumChatFormatting.YELLOW + "MEDIUM / SQUARE ROOT"; } } - + public static class FunctionSqrtFalling extends FunctionSqrt { public FunctionSqrtFalling(double fallFactor) { super(1D / fallFactor); this.withOff(fallFactor * fallFactor); } } - + public static class FunctionLinear extends FunctionSingleArg { public FunctionLinear(double level) { super(level); } @Override public double effonix(double x) { return getX(x) * this.level; } @Override public String getLabelForFuel() { return getXName(true) + " * " + String.format(Locale.US, "%,.1f", this.level); } @Override public String getDangerFromFuel() { return EnumChatFormatting.RED + "DANGEROUS / LINEAR"; } } - + public static class FunctionQuadratic extends FunctionDoubleArg { public FunctionQuadratic(double level) { super(level, 0D); } public FunctionQuadratic(double level, double vOff) { super(level, vOff); } diff --git a/src/main/java/com/hbm/wiaj/actors/ActorVillager.java b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java index 9eabd8e67..58e8e8dc3 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorVillager.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java @@ -1,22 +1,20 @@ package com.hbm.wiaj.actors; -import org.lwjgl.opengl.GL11; - import com.hbm.wiaj.JarScene; import com.hbm.wiaj.WorldInAJar; - import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.nbt.NBTTagCompound; +import org.lwjgl.opengl.GL11; public class ActorVillager implements ISpecialActor { - + EntityVillager villager = new EntityVillager(Minecraft.getMinecraft().theWorld); NBTTagCompound data = new NBTTagCompound(); - + public ActorVillager() { } - + public ActorVillager(NBTTagCompound data) { this.data = data; } @@ -43,11 +41,11 @@ public class ActorVillager implements ISpecialActor { @Override public void setActorData(NBTTagCompound data) { - + } @Override public void setDataPoint(String tag, Object o) { - + } } From 6e39abcb1a065cd760f3caeab43f182532a69cd5 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 9 Nov 2024 18:48:49 -0600 Subject: [PATCH 49/70] oops, bugfixes! - Pooled buffers removed due to issues with releasing the memory. - ExtProps fixed for players/entities; improper deserialization. --- src/main/java/com/hbm/packet/toclient/ExtPropPacket.java | 2 ++ .../com/hbm/tileentity/machine/TileEntityHeatBoiler.java | 5 ++--- .../tileentity/machine/TileEntityHeatBoilerIndustrial.java | 5 ++--- .../hbm/tileentity/machine/TileEntityMachineHephaestus.java | 5 ++--- .../com/hbm/tileentity/machine/TileEntitySteamEngine.java | 5 ++--- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java index 87c620ca7..4e7eae7b7 100644 --- a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java @@ -54,6 +54,8 @@ public class ExtPropPacket implements IMessage { ByteBuf buf = Unpooled.buffer(); + m.toBytes(buf); + HbmLivingProps props = HbmLivingProps.getData(Minecraft.getMinecraft().thePlayer); HbmPlayerProps pprps = HbmPlayerProps.getData(Minecraft.getMinecraft().thePlayer); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index f3c74ce7c..da159e603 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -29,7 +29,7 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -65,7 +65,7 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa if(!worldObj.isRemote) { - this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + this.buf = Unpooled.buffer(); buf.writeBoolean(this.hasExploded); @@ -151,7 +151,6 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf.release(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java index 1f37f1d14..a47863886 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java @@ -24,7 +24,7 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -57,7 +57,7 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme if(!worldObj.isRemote) { - this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + this.buf = Unpooled.buffer(); this.setupTanks(); this.updateConnections(); @@ -140,7 +140,6 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf.release(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java index e227b2dbf..e40faa953 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java @@ -19,7 +19,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; @@ -52,7 +52,7 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements if(!worldObj.isRemote) { - this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + this.buf = Unpooled.buffer(); setupTanks(); @@ -190,7 +190,6 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf.release(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java index 381e81c39..c518fc36b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java @@ -20,7 +20,7 @@ import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.Unpooled; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -77,7 +77,7 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner if(!worldObj.isRemote) { - this.buf = PooledByteBufAllocator.DEFAULT.buffer(); + this.buf = Unpooled.buffer(); this.powerBuffer = 0; @@ -215,7 +215,6 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner @Override public void serialize(ByteBuf buf) { buf.writeBytes(this.buf); - this.buf.release(); } @Override From e3e306b24f10cc7ab334d797d4298667f8e7bd32 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 9 Nov 2024 23:33:50 -0600 Subject: [PATCH 50/70] small flixes --- .../java/com/hbm/handler/CompatHandler.java | 24 +++++++++---------- .../hbm/handler/neutron/NeutronHandler.java | 8 ++++++- .../java/com/hbm/main/ModEventHandler.java | 5 +--- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/hbm/handler/CompatHandler.java b/src/main/java/com/hbm/handler/CompatHandler.java index fe0b08ca0..2a59c92fe 100644 --- a/src/main/java/com/hbm/handler/CompatHandler.java +++ b/src/main/java/com/hbm/handler/CompatHandler.java @@ -39,14 +39,14 @@ public class CompatHandler { */ public static Object[] steamTypeToInt(FluidType type) { switch(type.getID()) { - default: - return new Object[] {0}; case(4): // Fluids.HOTSTEAM return new Object[] {1}; case(5): // Fluids.SUPERHOTSTEAM return new Object[] {2}; case(6): // Fluids.ULTRAHOTSTEAM return new Object[] {3}; + default: + return new Object[] {0}; } } @@ -57,14 +57,14 @@ public class CompatHandler { */ public static FluidType intToSteamType(int arg) { switch(arg) { - default: - return Fluids.STEAM; case(1): return Fluids.HOTSTEAM; case(2): return Fluids.SUPERHOTSTEAM; case(3): return Fluids.ULTRAHOTSTEAM; + default: + return Fluids.STEAM; } } @@ -72,7 +72,7 @@ public class CompatHandler { * Allows for easy creation of read-only filesystems. Primarily for floppy disks. * (Though maybe reading directly from VOTV drives as filesystems could be implemented. :3) **/ - private static class ReadOnlyFileSystem implements Callable { + protected static class ReadOnlyFileSystem implements Callable { private final String name; @@ -90,7 +90,7 @@ public class CompatHandler { // Floppy disk class. public static class FloppyDisk { // Specifies the callable ReadOnlyFileSystem to allow OC to access the floppy. - public final ReadOnlyFileSystem fs; + protected final ReadOnlyFileSystem fs; // Specifies the color of the floppy disk (0-16 colors defined by OC). public final Byte color; // Set after loading the disk; allows for adding a recipe to the item. @@ -103,7 +103,7 @@ public class CompatHandler { // Disk names will be sanitized before the FileSystem is created. // This only affects the location/directory, not the display name. - // (Prevents filesystems from breaking/crashing due to having file separators, wildcards, etc. + // (Prevents filesystems from breaking/crashing due to having file separators, wildcards, etc.) public static String sanitizeName(String input) { return input.toLowerCase().replaceAll("\\W", ""); } @@ -152,7 +152,7 @@ public class CompatHandler { // begin registering disks Logger logger = LogManager.getLogger("HBM"); logger.info("Loading OpenComputers disks..."); - if(disks.size() == 0) { + if(disks.isEmpty()) { logger.info("No disks registered; see com.hbm.handler.CompatHandler.disks"); return; } @@ -163,13 +163,13 @@ public class CompatHandler { if (fs == null) { // Disk path does NOT exist, and it should not be loaded. - logger.error("Error loading disk: " + s + " at /assets/" + RefStrings.MODID + "/disks/" + disk.fs.name); + logger.error("Error loading disk: {} at /assets/" + RefStrings.MODID + "/disks/{}", s, disk.fs.name); logger.error("This is likely due to the path to the disk being non-existent."); } else { // Disk path DOES exist, and it should be loaded. disk.item = Items.registerFloppy(s, disk.color, disk.fs); // The big part, actually registering the floppies! - logger.info("Registered disk: " + s + " at /assets/" + RefStrings.MODID + "/disks/" + disk.fs.name); + logger.info("Registered disk: {} at /assets/" + RefStrings.MODID + "/disks/{}", s, disk.fs.name); } }); @@ -178,10 +178,10 @@ public class CompatHandler { // OC disk recipes! List floppyDisks = new RecipesCommon.OreDictStack("oc:floppy").toStacks(); - if(floppyDisks.size() > 0) { //check that floppy disks even exist in oredict. + if(!floppyDisks.isEmpty()) { //check that floppy disks even exist in oredict. // Recipes must be initialized here, since if they were initialized in `CraftingManager` then the disk item would not be created yet. - addShapelessAuto(disks.get("PWRangler").item, new Object[] {"oc:floppy", new ItemStack(ModBlocks.pwr_casing)}); + addShapelessAuto(disks.get("PWRangler").item, "oc:floppy", new ItemStack(ModBlocks.pwr_casing)); logger.info("OpenComputers disk recipe added for PWRangler."); } else { diff --git a/src/main/java/com/hbm/handler/neutron/NeutronHandler.java b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java index a6bd17f4f..967ddc90e 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java @@ -2,6 +2,8 @@ package com.hbm.handler.neutron; import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.util.fauxpointtwelve.BlockPos; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; import net.minecraft.world.World; import java.util.ArrayList; @@ -14,7 +16,11 @@ public class NeutronHandler { private static int ticks = 0; - public static void onWorldTick() { + @SubscribeEvent + public static void onServerTick(TickEvent.ServerTickEvent event) { + if(event.phase != TickEvent.Phase.START) + return; + // Remove `StreamWorld` objects if they have no streams. { // aflghdkljghlkbhfjkghgilurbhlkfjghkffdjgn List toRemove = new ArrayList<>(); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index b30c9bfdf..fda12006a 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -18,7 +18,6 @@ import com.hbm.extprop.HbmLivingProps; import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.*; import com.hbm.handler.HbmKeybinds.EnumKeybind; -import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.neutron.NeutronNodeWorld; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; @@ -1176,8 +1175,6 @@ public class ModEventHandler { TileEntityMachineRadarNT.updateSystem(); Nodespace.updateNodespace(); // bob i beg of you i need fluid nodespace :pray: - - NeutronHandler.onWorldTick(); // All neutron interactions } // There is an issue here somewhere... @@ -1205,7 +1202,7 @@ public class ModEventHandler { if(command instanceof CommandGameRule) { if(command.canCommandSenderUseCommand(sender)) { command.processCommand(sender,event.parameters); - RBMKDials.refresh(sender.getEntityWorld()); + RBMKDials.refresh(sender.getEntityWorld()); // Refresh RBMK gamerules. event.setCanceled(true); } } From 3d1ff54dd77c10e057df66fc08c3c8fa1f99bb42 Mon Sep 17 00:00:00 2001 From: BallOfEnergy1 Date: Tue, 19 Nov 2024 14:43:49 -0600 Subject: [PATCH 51/70] uh oh --- src/main/java/com/hbm/main/ModEventHandlerClient.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 0dbc6226d..7a9c5bdaf 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -100,6 +100,7 @@ import net.minecraft.world.WorldProviderSurface; import net.minecraftforge.client.GuiIngameForge; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.client.IRenderHandler; +import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.client.event.*; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.sound.PlaySoundEvent17; From 85743e85f4c5fca27b45fe807df7af73275975dd Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 18 Dec 2024 08:32:30 -0600 Subject: [PATCH 52/70] More RAM optimizations with buffer releasing. Also fix a bug in RBMK processing and a few merge-related errors. --- .../com/hbm/handler/EntityEffectHandler.java | 4 +- .../hbm/handler/neutron/NeutronHandler.java | 2 +- .../handler/threading/PacketThreading.java | 10 +++-- src/main/java/com/hbm/main/ClientProxy.java | 5 +-- src/main/java/com/hbm/main/MainRegistry.java | 5 +++ .../java/com/hbm/main/ModEventHandler.java | 4 +- .../com/hbm/main/ModEventHandlerClient.java | 6 +-- .../com/hbm/packet/PrecompiledPacket.java | 4 ++ .../packet/toclient/AuxParticlePacketNT.java | 2 + .../com/hbm/packet/toclient/BufPacket.java | 2 + .../hbm/packet/toclient/ExtPropPacket.java | 10 ++--- .../hbm/packet/toclient/PermaSyncPacket.java | 14 ++++--- .../hbm/packet/toclient/SatPanelPacket.java | 24 ++++++----- .../hbm/packet/toserver/NBTControlPacket.java | 40 ++++++++++--------- .../packet/toserver/NBTItemControlPacket.java | 28 +++++++------ .../machine/TileEntityHeatBoiler.java | 2 + .../TileEntityHeatBoilerIndustrial.java | 2 + .../machine/TileEntityMachineHephaestus.java | 2 + .../machine/TileEntitySteamEngine.java | 2 + 19 files changed, 97 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 399af77cf..d7252bcd1 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -37,6 +37,7 @@ import com.hbm.world.biome.BiomeGenCraterBase; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import io.netty.buffer.ByteBuf; +import io.netty.buffer.PooledByteBufAllocator; import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -80,7 +81,7 @@ public class EntityEffectHandler { if(entity instanceof EntityPlayerMP) { HbmLivingProps props = HbmLivingProps.getData(entity); HbmPlayerProps pprps = HbmPlayerProps.getData((EntityPlayerMP) entity); - ByteBuf buf = Unpooled.buffer(); + ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer(); if(pprps.shield < pprps.getEffectiveMaxShield() && entity.ticksExisted > pprps.lastDamage + 60) { int tsd = entity.ticksExisted - (pprps.lastDamage + 60); @@ -93,6 +94,7 @@ public class EntityEffectHandler { props.serialize(buf); pprps.serialize(buf); PacketDispatcher.wrapper.sendTo(new ExtPropPacket(buf), (EntityPlayerMP) entity); + buf.release(); } if(!entity.worldObj.isRemote) { diff --git a/src/main/java/com/hbm/handler/neutron/NeutronHandler.java b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java index 967ddc90e..4d5e10672 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java @@ -17,7 +17,7 @@ public class NeutronHandler { private static int ticks = 0; @SubscribeEvent - public static void onServerTick(TickEvent.ServerTickEvent event) { + public void onServerTick(TickEvent.ServerTickEvent event) { if(event.phase != TickEvent.Phase.START) return; diff --git a/src/main/java/com/hbm/handler/threading/PacketThreading.java b/src/main/java/com/hbm/handler/threading/PacketThreading.java index cb6cbb877..99b8ee69b 100644 --- a/src/main/java/com/hbm/handler/threading/PacketThreading.java +++ b/src/main/java/com/hbm/handler/threading/PacketThreading.java @@ -48,18 +48,20 @@ public class PacketThreading { */ public static void waitUntilThreadFinished() { try { - for(Future future : futureList) { - future.get(50, TimeUnit.MILLISECONDS); // I HATE EVERYTHING + if (!(processedCnt >= totalCnt)) { + for (Future future : futureList) { + future.get(50, TimeUnit.MILLISECONDS); // I HATE EVERYTHING + } } - futureList.clear(); } catch (ExecutionException ignored) { // impossible } catch (TimeoutException e) { - MainRegistry.logger.warn("A packet has taken >50ms to process, discarding {}/{} packets to prevent pausing of main thread.", totalCnt-processedCnt, totalCnt); + MainRegistry.logger.warn("A packet has taken >50ms to process, discarding {}/{} packets to prevent pausing of main thread ({} total futures).", totalCnt-processedCnt, totalCnt, futureList.size()); threadPool.getQueue().clear(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // maybe not the best thing but it's gotta be here } finally { + futureList.clear(); processedCnt = 0; totalCnt = 0; } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index c5e05c5c5..61421d0c2 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -17,10 +17,7 @@ import com.hbm.entity.effect.*; import com.hbm.entity.grenade.*; import com.hbm.entity.item.*; - import com.hbm.entity.logic.EntityBomber; - import com.hbm.entity.logic.EntityDeathBlast; - import com.hbm.entity.logic.EntityEMP; - import com.hbm.entity.logic.EntityWaypoint; + import com.hbm.entity.logic.*; import com.hbm.entity.missile.*; import com.hbm.entity.missile.EntityMissileTier0.*; import com.hbm.entity.missile.EntityMissileTier1.*; diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 3db8986db..81be175c9 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -17,6 +17,7 @@ import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.handler.imc.IMCCentrifuge; import com.hbm.handler.imc.IMCCrystallizer; import com.hbm.handler.imc.IMCHandler; +import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.hazard.HazardRegistry; @@ -909,6 +910,10 @@ public class MainRegistry { PacketDispatcher.registerPackets(); + NeutronHandler neutronHandler = new NeutronHandler(); + MinecraftForge.EVENT_BUS.register(neutronHandler); + FMLCommonHandler.instance().bus().register(neutronHandler); + ChunkRadiationManager radiationSystem = new ChunkRadiationManager(); MinecraftForge.EVENT_BUS.register(radiationSystem); FMLCommonHandler.instance().bus().register(radiationSystem); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index fda12006a..072eda55a 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -55,6 +55,7 @@ import cpw.mods.fml.common.gameevent.TickEvent.Phase; import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; import cpw.mods.fml.relauncher.ReflectionHelper; import io.netty.buffer.ByteBuf; +import io.netty.buffer.PooledByteBufAllocator; import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.command.CommandGameRule; @@ -1223,9 +1224,10 @@ public class ModEventHandler { @SubscribeEvent public void onPlayerClone(net.minecraftforge.event.entity.player.PlayerEvent.Clone event) { - ByteBuf buf = Unpooled.buffer(); + ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer(); HbmPlayerProps.getData(event.original).serialize(buf); HbmPlayerProps.getData(event.entityPlayer).deserialize(buf); + buf.release(); } @SubscribeEvent diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 0d6fd2e9e..79ea907c7 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -66,7 +66,6 @@ import com.hbm.wiaj.cannery.Jars; import com.hbm.util.ArmorRegistry; import com.hbm.util.ArmorUtil; import com.hbm.util.DamageResistanceHandler; -import com.hbm.util.ArmorRegistry.HazardClass; import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.FMLCommonHandler; @@ -112,10 +111,7 @@ import net.minecraftforge.client.GuiIngameForge; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.client.MinecraftForgeClient; -import net.minecraftforge.client.event.FOVUpdateEvent; -import net.minecraftforge.client.event.GuiOpenEvent; -import net.minecraftforge.client.event.MouseEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.*; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.sound.PlaySoundEvent17; import net.minecraftforge.common.ForgeHooks; diff --git a/src/main/java/com/hbm/packet/PrecompiledPacket.java b/src/main/java/com/hbm/packet/PrecompiledPacket.java index 5e0131fbc..30d4c456d 100644 --- a/src/main/java/com/hbm/packet/PrecompiledPacket.java +++ b/src/main/java/com/hbm/packet/PrecompiledPacket.java @@ -25,7 +25,11 @@ public abstract class PrecompiledPacket implements IMessage { * Forcefully creates the precompiled buffer, use `getPreBuf()` whenever possible. */ public void makePreBuf() { + if(preCompiledBuf != null) + preCompiledBuf.release(); + preCompiledBuf = Unpooled.buffer(); + this.toBytes(preCompiledBuf); // Create buffer and read data to it. } } diff --git a/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java index 8637a3611..a9d44e0b7 100644 --- a/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java +++ b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java @@ -71,6 +71,8 @@ public class AuxParticlePacketNT implements IMessage { } catch (IOException e) { e.printStackTrace(); + } finally { + m.buffer.release(); } return null; diff --git a/src/main/java/com/hbm/packet/toclient/BufPacket.java b/src/main/java/com/hbm/packet/toclient/BufPacket.java index ffad60456..2cc78b657 100644 --- a/src/main/java/com/hbm/packet/toclient/BufPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BufPacket.java @@ -61,6 +61,8 @@ public class BufPacket extends PrecompiledPacket { MainRegistry.logger.warn("A ByteBuf packet failed to be read and has thrown an error. This normally means that there was a buffer underflow and more data was read than was actually in the packet."); MainRegistry.logger.warn("Tile: {}", te.getBlockType().getUnlocalizedName()); MainRegistry.logger.warn(e.getMessage()); + } finally { + m.buf.release(); } } diff --git a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java index 4e7eae7b7..70ab279ba 100644 --- a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java @@ -52,15 +52,13 @@ public class ExtPropPacket implements IMessage { if(Minecraft.getMinecraft().theWorld == null) return null; - ByteBuf buf = Unpooled.buffer(); - - m.toBytes(buf); - HbmLivingProps props = HbmLivingProps.getData(Minecraft.getMinecraft().thePlayer); HbmPlayerProps pprps = HbmPlayerProps.getData(Minecraft.getMinecraft().thePlayer); - props.deserialize(buf); - pprps.deserialize(buf); + props.deserialize(m.buffer); + pprps.deserialize(m.buffer); + + m.buffer.release(); return null; } diff --git a/src/main/java/com/hbm/packet/toclient/PermaSyncPacket.java b/src/main/java/com/hbm/packet/toclient/PermaSyncPacket.java index dcf7ee365..f756d9f3e 100644 --- a/src/main/java/com/hbm/packet/toclient/PermaSyncPacket.java +++ b/src/main/java/com/hbm/packet/toclient/PermaSyncPacket.java @@ -13,7 +13,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; public class PermaSyncPacket implements IMessage { - + EntityPlayerMP player; //server only, for writing ByteBuf out; //client only, for reading @@ -34,18 +34,20 @@ public class PermaSyncPacket implements IMessage { } public static class Handler implements IMessageHandler { - + @Override @SideOnly(Side.CLIENT) public IMessage onMessage(PermaSyncPacket m, MessageContext ctx) { - + try { EntityPlayer player = Minecraft.getMinecraft().thePlayer; if(player != null) PermaSyncHandler.readPacket(m.out, player.worldObj, player); - - } catch(Exception x) { } - + + } catch(Exception x) { } finally { + m.out.release(); + } + return null; } } diff --git a/src/main/java/com/hbm/packet/toclient/SatPanelPacket.java b/src/main/java/com/hbm/packet/toclient/SatPanelPacket.java index 3a1a343d3..e3b815808 100644 --- a/src/main/java/com/hbm/packet/toclient/SatPanelPacket.java +++ b/src/main/java/com/hbm/packet/toclient/SatPanelPacket.java @@ -17,7 +17,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; public class SatPanelPacket implements IMessage { - + PacketBuffer buffer; int type; @@ -31,10 +31,10 @@ public class SatPanelPacket implements IMessage { this.buffer = new PacketBuffer(Unpooled.buffer()); NBTTagCompound nbt = new NBTTagCompound(); sat.writeToNBT(nbt); - + try { buffer.writeNBTTagCompoundToBuffer(nbt); - + } catch (IOException e) { e.printStackTrace(); } @@ -42,9 +42,9 @@ public class SatPanelPacket implements IMessage { @Override public void fromBytes(ByteBuf buf) { - + type = buf.readInt(); - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -53,9 +53,9 @@ public class SatPanelPacket implements IMessage { @Override public void toBytes(ByteBuf buf) { - + buf.writeInt(type); - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -67,18 +67,20 @@ public class SatPanelPacket implements IMessage { @Override @SideOnly(Side.CLIENT) public IMessage onMessage(SatPanelPacket m, MessageContext ctx) { - + Minecraft.getMinecraft(); try { - + NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); ItemSatInterface.currentSat = Satellite.create(m.type); - + if(nbt != null) ItemSatInterface.currentSat.readFromNBT(nbt); - + } catch (Exception x) { + } finally { + m.buffer.release(); } return null; } diff --git a/src/main/java/com/hbm/packet/toserver/NBTControlPacket.java b/src/main/java/com/hbm/packet/toserver/NBTControlPacket.java index 52ca6261c..6a2a58c16 100644 --- a/src/main/java/com/hbm/packet/toserver/NBTControlPacket.java +++ b/src/main/java/com/hbm/packet/toserver/NBTControlPacket.java @@ -15,7 +15,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; public class NBTControlPacket implements IMessage { - + PacketBuffer buffer; int x; int y; @@ -24,12 +24,12 @@ public class NBTControlPacket implements IMessage { public NBTControlPacket() { } public NBTControlPacket(NBTTagCompound nbt, int x, int y, int z) { - + this.buffer = new PacketBuffer(Unpooled.buffer()); this.x = x; this.y = y; this.z = z; - + try { buffer.writeNBTTagCompoundToBuffer(nbt); } catch (IOException e) { @@ -39,60 +39,62 @@ public class NBTControlPacket implements IMessage { @Override public void fromBytes(ByteBuf buf) { - + x = buf.readInt(); y = buf.readInt(); z = buf.readInt(); - + if(buffer == null) buffer = new PacketBuffer(Unpooled.buffer()); - + buffer.writeBytes(buf); } @Override public void toBytes(ByteBuf buf) { - + buf.writeInt(x); buf.writeInt(y); buf.writeInt(z); - + if (buffer == null) buffer = new PacketBuffer(Unpooled.buffer()); - + buf.writeBytes(buffer); } public static class Handler implements IMessageHandler { - + @Override public IMessage onMessage(NBTControlPacket m, MessageContext ctx) { EntityPlayer p = ctx.getServerHandler().playerEntity; - + if(p.worldObj == null) return null; - + TileEntity te = p.worldObj.getTileEntity(m.x, m.y, m.z); - + try { - + NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); - + if(nbt != null) { if(te instanceof IControlReceiver) { - + IControlReceiver tile = (IControlReceiver)te; - + if(tile.hasPermission(p)) { tile.receiveControl(p, nbt); tile.receiveControl(nbt); } } } - + } catch (IOException e) { e.printStackTrace(); + } finally { + m.buffer.release(); } - + return null; } } diff --git a/src/main/java/com/hbm/packet/toserver/NBTItemControlPacket.java b/src/main/java/com/hbm/packet/toserver/NBTItemControlPacket.java index 3bae1121a..499617bac 100644 --- a/src/main/java/com/hbm/packet/toserver/NBTItemControlPacket.java +++ b/src/main/java/com/hbm/packet/toserver/NBTItemControlPacket.java @@ -15,18 +15,18 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; public class NBTItemControlPacket implements IMessage { - + PacketBuffer buffer; public NBTItemControlPacket() { } public NBTItemControlPacket(NBTTagCompound nbt) { - + this.buffer = new PacketBuffer(Unpooled.buffer()); - + try { buffer.writeNBTTagCompoundToBuffer(nbt); - + } catch (IOException e) { e.printStackTrace(); } @@ -34,7 +34,7 @@ public class NBTItemControlPacket implements IMessage { @Override public void fromBytes(ByteBuf buf) { - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -43,7 +43,7 @@ public class NBTItemControlPacket implements IMessage { @Override public void toBytes(ByteBuf buf) { - + if (buffer == null) { buffer = new PacketBuffer(Unpooled.buffer()); } @@ -51,28 +51,30 @@ public class NBTItemControlPacket implements IMessage { } public static class Handler implements IMessageHandler { - + @Override public IMessage onMessage(NBTItemControlPacket m, MessageContext ctx) { EntityPlayer p = ctx.getServerHandler().playerEntity; - + try { - + NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); - + if(nbt != null) { ItemStack held = p.getHeldItem(); - + if(held != null && held.getItem() instanceof IItemControlReceiver) { ((IItemControlReceiver) held.getItem()).receiveControl(held, nbt); } } - + } catch (IOException e) { e.printStackTrace(); + } finally { + m.buffer.release(); } - + return null; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java index da159e603..e6aef59a0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -65,6 +65,8 @@ public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IBufPa if(!worldObj.isRemote) { + if(this.buf != null) + this.buf.release(); this.buf = Unpooled.buffer(); buf.writeBoolean(this.hasExploded); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java index a47863886..21d273973 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoilerIndustrial.java @@ -57,6 +57,8 @@ public class TileEntityHeatBoilerIndustrial extends TileEntityLoadedBase impleme if(!worldObj.isRemote) { + if(this.buf != null) + this.buf.release(); this.buf = Unpooled.buffer(); this.setupTanks(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java index e40faa953..3453ef320 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineHephaestus.java @@ -52,6 +52,8 @@ public class TileEntityMachineHephaestus extends TileEntityLoadedBase implements if(!worldObj.isRemote) { + if(this.buf != null) + this.buf.release(); this.buf = Unpooled.buffer(); setupTanks(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java index c518fc36b..d0297d2f8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java @@ -77,6 +77,8 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEner if(!worldObj.isRemote) { + if(this.buf != null) + this.buf.release(); this.buf = Unpooled.buffer(); this.powerBuffer = 0; From 4f06914c39b93368c89fa23a87c41702f5a7da89 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:52:33 -0600 Subject: [PATCH 53/70] Packet threading debug command!! (Also packet threading config option) --- .../com/hbm/commands/CommandPacketInfo.java | 78 +++++++++++++++++++ .../java/com/hbm/config/GeneralConfig.java | 23 +++--- .../handler/threading/PacketThreading.java | 35 ++++++--- src/main/java/com/hbm/main/MainRegistry.java | 6 +- .../machine/TileEntityMachineExcavator.java | 1 + 5 files changed, 123 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/hbm/commands/CommandPacketInfo.java diff --git a/src/main/java/com/hbm/commands/CommandPacketInfo.java b/src/main/java/com/hbm/commands/CommandPacketInfo.java new file mode 100644 index 000000000..97d465f0c --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandPacketInfo.java @@ -0,0 +1,78 @@ +package com.hbm.commands; + +import com.hbm.config.GeneralConfig; +import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.threading.PacketThreading; +import com.hbm.util.BobMathUtil; +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +import static com.hbm.handler.threading.PacketThreading.processedCnt; +import static com.hbm.handler.threading.PacketThreading.totalCnt; + +public class CommandPacketInfo extends CommandBase { + @Override + public String getCommandName() { + return "ntmpackets"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/ntmpackets "; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(args.length == 1 && "infoall".equals(args[0])) { + sender.addChatMessage(new ChatComponentText("NTM Packet Debugger")); + + if(GeneralConfig.enablePacketThreading) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); + else + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); + + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread Pool Info")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool size: " + PacketThreading.threadPool.getPoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool queue: " + PacketThreading.threadPool.getQueue().size())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Packet Info: " + PacketThreading.threadPool.getPoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Processed: " + processedCnt)); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Remaining: " + totalCnt)); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Processed: " + BobMathUtil.roundDecimal(((double) processedCnt / totalCnt) * 100, 2))); + return; + } + + if(args.length == 1 && "threadpool".equals(args[0])) { + sender.addChatMessage(new ChatComponentText("NTM Packet Debugger")); + + if(GeneralConfig.enablePacketThreading) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); + else + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); + + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread Pool Info")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool size: " + PacketThreading.threadPool.getPoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool queue: " + PacketThreading.threadPool.getQueue().size())); + return; + } + + if(args.length == 1 && "packets".equals(args[0])) { + sender.addChatMessage(new ChatComponentText("NTM Packet Debugger")); + + if(GeneralConfig.enablePacketThreading) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); + else + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); + + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Packet Info: " + PacketThreading.threadPool.getPoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Processed: " + processedCnt)); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Remaining: " + totalCnt)); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Processed: " + BobMathUtil.roundDecimal(((double) processedCnt / totalCnt) * 100, 2))); + + return; + } + + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + getCommandUsage(sender))); + } +} diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 643ca8a9a..41ad6735e 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -5,7 +5,9 @@ import net.minecraftforge.common.config.Configuration; public class GeneralConfig { public static boolean enableThermosPreventer = true; - + + public static boolean enablePacketThreading = true; + public static boolean enableDebugMode = true; public static boolean enableMycelium = false; public static boolean enablePlutoniumOre = false; @@ -40,7 +42,7 @@ public class GeneralConfig { public static int hintPos = 0; public static boolean enableExpensiveMode = false; - + public static boolean enable528 = false; public static boolean enable528ReasimBoilers = true; public static boolean enable528ColtanDeposit = true; @@ -68,11 +70,14 @@ public class GeneralConfig { public static boolean enableLBSMSafeMEDrives = true; public static boolean enableLBSMIGen = true; public static int schrabRate = 20; - + public static void loadFromConfig(Configuration config) { final String CATEGORY_GENERAL = CommonConfig.CATEGORY_GENERAL; enableThermosPreventer = config.get(CATEGORY_GENERAL, "0.00_crashOnThermos", true, "When set to true, will prevent the mod to launch on Thermos servers. Only disable this if you understand what \"tileentities.yml\" is, and how it severely cripples the mod.").getBoolean(true); + + enablePacketThreading = config.get(CATEGORY_GENERAL, "0.01_enablePacketThreading", true, "Enables creation of a separate thread to increase packet processing speed on servers. Disable this if you are having anomalous crashes related to memory connections.").getBoolean(true); + enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false, "Enable debugging mode").getBoolean(false); enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows glowing mycelium to spread").getBoolean(false); enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false, "Enables plutonium ore generation in the nether").getBoolean(false); @@ -112,14 +117,14 @@ public class GeneralConfig { "Note that a value below 28 or above 200 can cause buggy sounds and issues with other mods running out of sound memory.", 100); enableExpensiveMode = config.get(CATEGORY_GENERAL, "1.99_enableExpensiveMode", false, "It does what the name implies.").getBoolean(false); - + final String CATEGORY_528 = CommonConfig.CATEGORY_528; config.addCustomCategoryComment(CATEGORY_528, "CAUTION\n" + "528 Mode: Please proceed with caution!\n" + "528-Modus: Lassen Sie Vorsicht walten!\n" + "способ-528: действовать с осторожностью!"); - + enable528 = CommonConfig.createConfigBool(config, CATEGORY_528, "enable528Mode", "The central toggle for 528 mode.", false); enable528ReasimBoilers = CommonConfig.createConfigBool(config, CATEGORY_528, "X528_forceReasimBoilers", "Keeps the RBMK dial for ReaSim boilers on, preventing use of non-ReaSim boiler columns and forcing the use of steam in-/outlets", true); enable528ColtanDeposit = CommonConfig.createConfigBool(config, CATEGORY_528, "X528_enableColtanDepsoit", "Enables the coltan deposit. A large amount of coltan will spawn around a single random location in the world.", true); @@ -131,15 +136,15 @@ public class GeneralConfig { enable528NetherBurn = CommonConfig.createConfigBool(config, CATEGORY_528, "X528_enable528NetherBurn", "Whether players burn in the nether", true); coltanRate = CommonConfig.createConfigInt(config, CATEGORY_528, "X528_oreColtanFrequency", "Determines how many coltan ore veins are to be expected in a chunk. These values do not affect the frequency in deposits, and only apply if random coltan spanwing is enabled.", 2); bedrockRate = CommonConfig.createConfigInt(config, CATEGORY_528, "X528_bedrockColtanFrequency", "Determines how often (1 in X) bedrock coltan ores spawn. Applies for both the bedrock ores in the coltan deposit (if applicable) and the random bedrock ores (if applicable)", 50); - - + + final String CATEGORY_LBSM = CommonConfig.CATEGORY_LBSM; config.addCustomCategoryComment(CATEGORY_LBSM, "Will most likely break standard progression!\n" + "However, the game gets generally easier and more enjoyable for casual players.\n" + "Progression-braking recipes are usually not too severe, so the mode is generally server-friendly!"); - + enableLBSM = CommonConfig.createConfigBool(config, CATEGORY_LBSM, "enableLessBullshitMode", "The central toggle for LBS mode. Forced OFF when 528 is enabled!", false); enableLBSMFullSchrab = CommonConfig.createConfigBool(config, CATEGORY_LBSM, "LBSM_fullSchrab", "When enabled, this will replace schraranium with full schrabidium ingots in the transmutator's output", true); enableLBSMShorterDecay = CommonConfig.createConfigBool(config, CATEGORY_LBSM, "LBSM_shortDecay", "When enabled, this will highly accelerate the speed at which nuclear waste disposal drums decay their contents. 60x faster than 528 mode and 5-12x faster than on normal mode.", true); @@ -155,7 +160,7 @@ public class GeneralConfig { enableLBSMSafeMEDrives = CommonConfig.createConfigBool(config, CATEGORY_LBSM, "LBSM_safeMEDrives", "When enabled, prevents ME Drives and Portable Cells from becoming radioactive", true); enableLBSMIGen = CommonConfig.createConfigBool(config, CATEGORY_LBSM, "LBSM_iGen", "When enabled, restores the industrial generator to pre-nerf power", true); schrabRate = CommonConfig.createConfigInt(config, CATEGORY_LBSM, "LBSM_schrabOreRate", "Changes the amount of uranium ore needed on average to create one schrabidium ore using nukes. Standard mode value is 100", 20); - + if(enable528) enableLBSM = false; } } diff --git a/src/main/java/com/hbm/handler/threading/PacketThreading.java b/src/main/java/com/hbm/handler/threading/PacketThreading.java index 99b8ee69b..9e2e4762a 100644 --- a/src/main/java/com/hbm/handler/threading/PacketThreading.java +++ b/src/main/java/com/hbm/handler/threading/PacketThreading.java @@ -1,6 +1,7 @@ package com.hbm.handler.threading; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.hbm.config.GeneralConfig; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.PrecompiledPacket; @@ -15,13 +16,21 @@ public class PacketThreading { private static final ThreadFactory packetThreadFactory = new ThreadFactoryBuilder().setNameFormat("NTM-Packet-Thread-%d").build(); - private static final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(1, packetThreadFactory); + public static final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(1, packetThreadFactory); - private static int totalCnt = 0; + public static int totalCnt = 0; - private static int processedCnt = 0; + public static int processedCnt = 0; - private static final List> futureList = new ArrayList<>(); + public static final List> futureList = new ArrayList<>(); + + /** + * Sets up thread pool settings during mod initialization. + */ + public static void init() { + threadPool.setKeepAliveTime(50, TimeUnit.MILLISECONDS); + threadPool.allowCoreThreadTimeOut(true); + } /** * Adds a packet to the thread pool to be processed in the future. This is only compatible with the `sendToAllAround` dispatch operation. @@ -35,12 +44,18 @@ public class PacketThreading { ((PrecompiledPacket) message).getPreBuf(); // Gets the precompiled buffer, doing nothing if it already exists. totalCnt++; - futureList.add(threadPool.submit(() -> { + + Runnable task = () -> { PacketDispatcher.wrapper.sendToAllAround(message, target); - if(message instanceof PrecompiledPacket) - ((PrecompiledPacket) message).getPreBuf().release(); - processedCnt++; - })); + if(message instanceof PrecompiledPacket) + ((PrecompiledPacket) message).getPreBuf().release(); + processedCnt++; + }; + + if(GeneralConfig.enablePacketThreading) + futureList.add(threadPool.submit(task)); // Thread it + else + task.run(); // no threading :( } /** @@ -48,7 +63,7 @@ public class PacketThreading { */ public static void waitUntilThreadFinished() { try { - if (!(processedCnt >= totalCnt)) { + if (!(processedCnt >= totalCnt) && !GeneralConfig.enablePacketThreading) { for (Future future : futureList) { future.get(50, TimeUnit.MILLISECONDS); // I HATE EVERYTHING } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 80c8a07cb..ddf7ce8a6 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -20,6 +20,7 @@ import com.hbm.handler.imc.IMCHandler; import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.threading.PacketThreading; import com.hbm.hazard.HazardRegistry; import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.OreDictManager; @@ -904,6 +905,8 @@ public class MainRegistry { PacketDispatcher.registerPackets(); + PacketThreading.init(); + NeutronHandler neutronHandler = new NeutronHandler(); MinecraftForge.EVENT_BUS.register(neutronHandler); FMLCommonHandler.instance().bus().register(neutronHandler); @@ -935,6 +938,7 @@ public class MainRegistry { event.registerServerCommand(new CommandDebugChunkLoad()); event.registerServerCommand(new CommandSatellites()); event.registerServerCommand(new CommandRadiation()); + event.registerServerCommand(new CommandPacketInfo()); } @EventHandler @@ -1496,7 +1500,7 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.statue_elb"); ignoreMappings.add("hbm:tile.statue_elb_g"); ignoreMappings.add("hbm:tile.statue_elb_w"); - + remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); remapItems.put("hbm:item.man_explosive8", ModItems.explosive_lenses); remapItems.put("hbm:item.briquette_lignite", ModItems.briquette); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java index eb111033b..0892fa27b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java @@ -877,6 +877,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements HashMap upgrades = new HashMap<>(); upgrades.put(UpgradeType.SPEED, 3); upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.EFFECT, 3); return upgrades; } From 90cfd37a31c1d34ee333a013b2cda7460a0ae8fa Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 19 Dec 2024 21:55:41 -0600 Subject: [PATCH 54/70] an absolutely goofy command I'd say (also yet another failsafe, this time for a ton of packet discarding.) --- .../com/hbm/commands/CommandPacketInfo.java | 75 +++++++---------- .../java/com/hbm/config/GeneralConfig.java | 7 ++ .../handler/threading/PacketThreading.java | 84 +++++++++++++++++-- src/main/java/com/hbm/main/MainRegistry.java | 4 +- .../hbm/tileentity/TileEntityLoadedBase.java | 2 +- 5 files changed, 117 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/hbm/commands/CommandPacketInfo.java b/src/main/java/com/hbm/commands/CommandPacketInfo.java index 97d465f0c..d4d3cb0f3 100644 --- a/src/main/java/com/hbm/commands/CommandPacketInfo.java +++ b/src/main/java/com/hbm/commands/CommandPacketInfo.java @@ -1,7 +1,6 @@ package com.hbm.commands; import com.hbm.config.GeneralConfig; -import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.handler.threading.PacketThreading; import com.hbm.util.BobMathUtil; import net.minecraft.command.CommandBase; @@ -9,7 +8,9 @@ import net.minecraft.command.ICommandSender; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -import static com.hbm.handler.threading.PacketThreading.processedCnt; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; + import static com.hbm.handler.threading.PacketThreading.totalCnt; public class CommandPacketInfo extends CommandBase { @@ -20,59 +21,45 @@ public class CommandPacketInfo extends CommandBase { @Override public String getCommandUsage(ICommandSender sender) { - return "/ntmpackets "; + return "/ntmpackets"; } @Override public void processCommand(ICommandSender sender, String[] args) { - if(args.length == 1 && "infoall".equals(args[0])) { - sender.addChatMessage(new ChatComponentText("NTM Packet Debugger")); - if(GeneralConfig.enablePacketThreading) - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); - else - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); - - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread Pool Info")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool size: " + PacketThreading.threadPool.getPoolSize())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool queue: " + PacketThreading.threadPool.getQueue().size())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Packet Info: " + PacketThreading.threadPool.getPoolSize())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Processed: " + processedCnt)); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Remaining: " + totalCnt)); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Processed: " + BobMathUtil.roundDecimal(((double) processedCnt / totalCnt) * 100, 2))); - return; + if(args.length > 0 && args[0].equals("resetState")) { + PacketThreading.hasTriggered = false; + PacketThreading.clearCnt = 0; } - if(args.length == 1 && "threadpool".equals(args[0])) { - sender.addChatMessage(new ChatComponentText("NTM Packet Debugger")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "NTM Packet Debugger v1.2")); - if(GeneralConfig.enablePacketThreading) - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); - else - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); + if(PacketThreading.isTriggered() && GeneralConfig.enablePacketThreading) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Errored, check log.")); + else if(GeneralConfig.enablePacketThreading) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); + else + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread Pool Info")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool size: " + PacketThreading.threadPool.getPoolSize())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread pool queue: " + PacketThreading.threadPool.getQueue().size())); - return; - } + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread Pool Info")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (total): " + PacketThreading.threadPool.getPoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (core): " + PacketThreading.threadPool.getCorePoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (idle): " + (PacketThreading.threadPool.getPoolSize() - PacketThreading.threadPool.getActiveCount()))); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (maximum): " + PacketThreading.threadPool.getMaximumPoolSize())); - if(args.length == 1 && "packets".equals(args[0])) { - sender.addChatMessage(new ChatComponentText("NTM Packet Debugger")); + for(ThreadInfo thread : ManagementFactory.getThreadMXBean().dumpAllThreads(false, false)) + if(thread.getThreadName().startsWith("NTM-Packet-Thread-")) { + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Thread Name: " + thread.getThreadName())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread ID: " + thread.getThreadId())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread state: " + thread.getThreadState())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Locked by: " + (thread.getLockOwnerName() == null ? "None" : thread.getLockName()))); + } - if(GeneralConfig.enablePacketThreading) - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); - else - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Packet Info: ")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount total: " + totalCnt)); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount remaining: " + PacketThreading.threadPool.getQueue().size())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Remaining to process: " + BobMathUtil.roundDecimal(((double) PacketThreading.threadPool.getQueue().size() / totalCnt) * 100, 2) + "%")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Time spent waiting on thread(s) last tick: " + BobMathUtil.roundDecimal(PacketThreading.nanoTimeWaited / 1000000d, 4) + "ms")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Packet Info: " + PacketThreading.threadPool.getPoolSize())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Processed: " + processedCnt)); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount Remaining: " + totalCnt)); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Processed: " + BobMathUtil.roundDecimal(((double) processedCnt / totalCnt) * 100, 2))); - - return; - } - - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + getCommandUsage(sender))); } } diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 41ad6735e..916bd9e9c 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -7,6 +7,9 @@ public class GeneralConfig { public static boolean enableThermosPreventer = true; public static boolean enablePacketThreading = true; + public static int packetThreadingCoreCount = 1; + public static int packetThreadingMaxCount = 1; + public static boolean packetThreadingErrorBypass = false; public static boolean enableDebugMode = true; public static boolean enableMycelium = false; @@ -78,6 +81,10 @@ public class GeneralConfig { enablePacketThreading = config.get(CATEGORY_GENERAL, "0.01_enablePacketThreading", true, "Enables creation of a separate thread to increase packet processing speed on servers. Disable this if you are having anomalous crashes related to memory connections.").getBoolean(true); + packetThreadingCoreCount = config.get(CATEGORY_GENERAL, "0.02_packetThreadingCoreCount", 1, "Number of core threads to create for packets (recommended 1).").getInt(1); + packetThreadingMaxCount = config.get(CATEGORY_GENERAL, "0.03_packetThreadingMaxCount", 1, "Maximum number of threads to create for packet threading. Must be greater than or equal to 0.02_packetThreadingCoreCount.").getInt(1); + packetThreadingErrorBypass = config.get(CATEGORY_GENERAL, "0.04_packetThreadingErrorBypass", false, "Forces the bypassing of most packet threading errors, only enable this if directed to or if you know what you're doing.").getBoolean(false); + enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false, "Enable debugging mode").getBoolean(false); enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows glowing mycelium to spread").getBoolean(false); enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false, "Enables plutonium ore generation in the nether").getBoolean(false); diff --git a/src/main/java/com/hbm/handler/threading/PacketThreading.java b/src/main/java/com/hbm/handler/threading/PacketThreading.java index 9e2e4762a..7392e59d8 100644 --- a/src/main/java/com/hbm/handler/threading/PacketThreading.java +++ b/src/main/java/com/hbm/handler/threading/PacketThreading.java @@ -20,7 +20,7 @@ public class PacketThreading { public static int totalCnt = 0; - public static int processedCnt = 0; + public static long nanoTimeWaited = 0; public static final List> futureList = new ArrayList<>(); @@ -29,7 +29,26 @@ public class PacketThreading { */ public static void init() { threadPool.setKeepAliveTime(50, TimeUnit.MILLISECONDS); - threadPool.allowCoreThreadTimeOut(true); + if(GeneralConfig.enablePacketThreading) { + if(GeneralConfig.packetThreadingCoreCount < 0 || GeneralConfig.packetThreadingMaxCount <= 0) { + MainRegistry.logger.error("0.02_packetThreadingCoreCount < 0 or 0.03_packetThreadingMaxCount is <= 0, defaulting to 1 each."); + threadPool.setCorePoolSize(1); // beugh + threadPool.setMaximumPoolSize(1); + } else if(GeneralConfig.packetThreadingMaxCount > GeneralConfig.packetThreadingCoreCount) { + MainRegistry.logger.error("0.03_packetThreadingMaxCount is > 0.02_packetThreadingCoreCount, defaulting to 1 each."); + threadPool.setCorePoolSize(1); + threadPool.setMaximumPoolSize(1); + } else { + threadPool.setCorePoolSize(GeneralConfig.packetThreadingCoreCount); + threadPool.setMaximumPoolSize(GeneralConfig.packetThreadingMaxCount); + } + threadPool.allowCoreThreadTimeOut(false); + } else { + threadPool.allowCoreThreadTimeOut(true); + for(Runnable task : threadPool.getQueue()) { + task.run(); // Run all tasks async just in-case there *are* tasks left to run. + } + } } /** @@ -49,10 +68,11 @@ public class PacketThreading { PacketDispatcher.wrapper.sendToAllAround(message, target); if(message instanceof PrecompiledPacket) ((PrecompiledPacket) message).getPreBuf().release(); - processedCnt++; }; - if(GeneralConfig.enablePacketThreading) + if(isTriggered()) + task.run(); + else if(GeneralConfig.enablePacketThreading) futureList.add(threadPool.submit(task)); // Thread it else task.run(); // no threading :( @@ -62,8 +82,9 @@ public class PacketThreading { * Wait until the packet thread is finished processing. */ public static void waitUntilThreadFinished() { + long startTime = System.nanoTime(); try { - if (!(processedCnt >= totalCnt) && !GeneralConfig.enablePacketThreading) { + if (GeneralConfig.enablePacketThreading && (!GeneralConfig.packetThreadingErrorBypass && !hasTriggered)) { for (Future future : futureList) { future.get(50, TimeUnit.MILLISECONDS); // I HATE EVERYTHING } @@ -71,14 +92,61 @@ public class PacketThreading { } catch (ExecutionException ignored) { // impossible } catch (TimeoutException e) { - MainRegistry.logger.warn("A packet has taken >50ms to process, discarding {}/{} packets to prevent pausing of main thread ({} total futures).", totalCnt-processedCnt, totalCnt, futureList.size()); - threadPool.getQueue().clear(); + if(!GeneralConfig.packetThreadingErrorBypass && !hasTriggered) + MainRegistry.logger.warn("A packet has taken >50ms to process, discarding {}/{} packets to prevent pausing of main thread ({} total futures).", threadPool.getQueue().size(), totalCnt, futureList.size()); + clearThreadPoolTasks(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // maybe not the best thing but it's gotta be here } finally { futureList.clear(); - processedCnt = 0; + nanoTimeWaited = System.nanoTime() - startTime; + if(!threadPool.getQueue().isEmpty()) { + if(!GeneralConfig.packetThreadingErrorBypass && !hasTriggered) + MainRegistry.logger.warn("Residual packets in packet threading queue detected, discarding {}/{} packets.", threadPool.getQueue().size(), totalCnt); + clearThreadPoolTasks(); // Just in case the thread somehow doesn't process all the tasks, we don't want this backing up too far. + } + totalCnt = 0; } } + + public static int clearCnt = 0; + + public static boolean hasTriggered = false; + + public static void clearThreadPoolTasks() { + + if(threadPool.getQueue().isEmpty()) { + clearCnt = 0; + return; + } + + threadPool.getQueue().clear(); + + if(!GeneralConfig.packetThreadingErrorBypass && !hasTriggered) + MainRegistry.logger.warn("Packet work queue cleared forcefully (clear count: {}).", clearCnt); + + clearCnt++; + + + if(clearCnt > 5 && !isTriggered()) { + // If it's been cleared 5 times in a row, something may have gone really wrong. + // Best case scenario here, the server is lagging terribly, has a bad CPU, or has a poor network connection + // Worst case scenario, the entire packet thread is dead. (very not good) + // So just log it with a special message and only once. + MainRegistry.logger.error( + "Something has gone wrong and the packet pool has cleared 5 times (or more) in a row. " + + "This can indicate that the thread has been killed, suspended, or is otherwise non-functioning. " + + "This message will only be logged once, further packet operations will continue on the main thread. " + + "If this message is a common occurrence and is *completely expected*, then it can be bypassed permanently by setting " + + "the \"0.04_packetThreadingErrorBypass\" config option to true. This can lead to adverse effects, so do this at your own risk. " + + "Running \"/ntmpacket resetState\" resets this trigger as a temporary fix." + ); + hasTriggered = true; + } + } + + public static boolean isTriggered() { + return hasTriggered && !GeneralConfig.packetThreadingErrorBypass; + } } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index ddf7ce8a6..06d07cb69 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -905,8 +905,6 @@ public class MainRegistry { PacketDispatcher.registerPackets(); - PacketThreading.init(); - NeutronHandler neutronHandler = new NeutronHandler(); MinecraftForge.EVENT_BUS.register(neutronHandler); FMLCommonHandler.instance().bus().register(neutronHandler); @@ -969,6 +967,8 @@ public class MainRegistry { config.save(); + PacketThreading.init(); + try { if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.ThermosClassTransformer") != null) { throw new IllegalStateException("The mod tried to start on a Thermos or its fork server and therefore stopped. To allow the server to start on Thermos, change the appropriate " diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index 583a3cb9d..c151824a9 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -84,7 +84,7 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu return; } - this.lastPackedBuf = preBuf; + this.lastPackedBuf = preBuf.copy(); PacketThreading.createThreadedPacket(packet, new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } From 88c1632481314c93480008c67de5964b314d0271 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:54:45 -0600 Subject: [PATCH 55/70] fix some stuff, also fix sending exactly 19x more packets than needed lmao --- src/main/java/com/hbm/commands/CommandPacketInfo.java | 5 ++++- src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/commands/CommandPacketInfo.java b/src/main/java/com/hbm/commands/CommandPacketInfo.java index d4d3cb0f3..dec1fbff7 100644 --- a/src/main/java/com/hbm/commands/CommandPacketInfo.java +++ b/src/main/java/com/hbm/commands/CommandPacketInfo.java @@ -58,7 +58,10 @@ public class CommandPacketInfo extends CommandBase { sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Packet Info: ")); sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount total: " + totalCnt)); sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount remaining: " + PacketThreading.threadPool.getQueue().size())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Remaining to process: " + BobMathUtil.roundDecimal(((double) PacketThreading.threadPool.getQueue().size() / totalCnt) * 100, 2) + "%")); + + if(totalCnt != 0) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Remaining to process: " + BobMathUtil.roundDecimal(((double) PacketThreading.threadPool.getQueue().size() / totalCnt) * 100, 2) + "%")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Time spent waiting on thread(s) last tick: " + BobMathUtil.roundDecimal(PacketThreading.nanoTimeWaited / 1000000d, 4) + "ms")); } diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index c151824a9..6658452b7 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -80,7 +80,7 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu // In my testing, this can be reliably reproduced with a full fluid barrel, for instance. // I think it might be fixable by doing something with getDescriptionPacket() and onDataPacket(), // but this sidesteps the problem for the mean time. - if (preBuf.equals(lastPackedBuf) && this.worldObj.getWorldTime() % 20 == 0) { + if (preBuf.equals(lastPackedBuf) && this.worldObj.getWorldTime() % 20 != 0) { return; } From 9d2aa86e417fc19011c24ec7c532f4f23b985ad3 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 21 Dec 2024 12:40:11 -0600 Subject: [PATCH 56/70] well crap this was an oops --- .../tileentity/machine/rbmk/RBMKDials.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 8b168d177..3723c8683 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -51,13 +51,17 @@ public class RBMKDials { public static HashMap>> gameRules = new HashMap<>(); public static void createDials(World world) { + createDials(world, false); + } + + public static void createDials(World world, boolean forceRecreate) { GameRules rules = world.getGameRules(); for(RBMKKeys key : RBMKKeys.values()) gameRules.put(key, new ArrayList<>()); refresh(world); - if(!rules.getGameRuleBooleanValue(RBMKKeys.KEY_SAVE_DIALS.keyString)) { + if(!rules.getGameRuleBooleanValue(RBMKKeys.KEY_SAVE_DIALS.keyString) || forceRecreate) { for(RBMKKeys key : RBMKKeys.values()) rules.setOrCreateGameRule(key.keyString, String.valueOf(key.defValue)); } @@ -113,6 +117,10 @@ public class RBMKDials { * @return The rule in an Object. */ public static Object getGameRule(World world, RBMKKeys rule) { + return getGameRule(world, rule, false); + } + + public static Object getGameRule(World world, RBMKKeys rule, boolean isIteration) { List> rulesList = new ArrayList<>(); for(Tuple.Pair rulePair : gameRules.get(rule)) { @@ -121,9 +129,14 @@ public class RBMKDials { } } - if(rulesList.isEmpty()) - throw new NullPointerException("No gamerule found for " + rule.keyString); - else if(rulesList.size() > 1) + if(rulesList.isEmpty()) { + if(isIteration) + throw new NullPointerException("Cannot find gamerule for dial " + rule.keyString + " after creation."); + else { + createDials(world, true); // fuck + return getGameRule(world, rule, true); + } + } else if(rulesList.size() > 1) // what??? why??? MainRegistry.logger.warn("Duplicate values for gamerules detected! Found {} rules for gamerule {}", rulesList.size(), rule.keyString); From 9d3a3b1fff7e266bad84aa29869fae1219facb08 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:27:31 -0600 Subject: [PATCH 57/70] fucky wucky (kms) --- src/main/java/com/hbm/handler/neutron/NeutronHandler.java | 2 +- .../java/com/hbm/handler/neutron/RBMKNeutronHandler.java | 6 ++++-- .../java/com/hbm/tileentity/machine/rbmk/RBMKDials.java | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/NeutronHandler.java b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java index 4d5e10672..efc536f2e 100644 --- a/src/main/java/com/hbm/handler/neutron/NeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/NeutronHandler.java @@ -64,7 +64,7 @@ public class NeutronHandler { RBMKNeutronHandler.RBMKNeutronNode node = (RBMKNeutronHandler.RBMKNeutronNode) cachedNode; toRemove.addAll(node.checkNode()); } - /* + /* TODO: actually do this and uncache pile nodes if (cachedNode.type == NeutronStream.NeutronType.PILE) { PileNeutronNode node = (PileNeutronNode) cachedNode; toRemove.addAll(node.checkNode()); diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index 8e8c5a466..d3f883589 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -268,9 +268,9 @@ public class RBMKNeutronHandler { if (fluxQuantity == 0D) // Whoops, used it all up! return; - RBMKNeutronNode node = (RBMKNeutronNode) NeutronNodeWorld.nodeCache.get(nodePos); + RBMKNeutronNode node; - if (node == null) { + if (!NeutronNodeWorld.nodeCache.containsKey(nodePos)) { TileEntity te = blockPosToTE(worldObj, nodePos); // ok, maybe it didn't get added to the list somehow?? if (te instanceof TileEntityRBMKBase) { node = makeNode((TileEntityRBMKBase) te); @@ -290,6 +290,8 @@ public class RBMKNeutronHandler { } } + node = (RBMKNeutronNode) NeutronNodeWorld.nodeCache.get(nodePos); + RBMKType type = (RBMKType) node.data.get("type"); if (type == RBMKType.OTHER) // pass right on by! diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 3723c8683..2833d6a55 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -133,7 +133,8 @@ public class RBMKDials { if(isIteration) throw new NullPointerException("Cannot find gamerule for dial " + rule.keyString + " after creation."); else { - createDials(world, true); // fuck + world.getGameRules().setOrCreateGameRule(rule.keyString, rule.defValue.toString()); // fuck + refresh(world); return getGameRule(world, rule, true); } } else if(rulesList.size() > 1) From 78aba275ce5262eef6ee1ea03b68f975f3b007f0 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 29 Dec 2024 05:41:53 -0600 Subject: [PATCH 58/70] fucky wucky pt. 2 --- src/main/java/com/hbm/main/MainRegistry.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 2a8a8b8d8..a368296a6 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -17,6 +17,7 @@ import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.handler.imc.IMCCentrifuge; import com.hbm.handler.imc.IMCCrystallizer; import com.hbm.handler.imc.IMCHandler; +import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.hazard.HazardRegistry; @@ -915,6 +916,10 @@ public class MainRegistry { DamageResistanceHandler dmgHandler = new DamageResistanceHandler(); MinecraftForge.EVENT_BUS.register(dmgHandler); + NeutronHandler neutronHandler = new NeutronHandler(); + MinecraftForge.EVENT_BUS.register(neutronHandler); + FMLCommonHandler.instance().bus().register(neutronHandler); + if(event.getSide() == Side.CLIENT) { HbmKeybinds.register(); HbmKeybinds keyHandler = new HbmKeybinds(); From fe23c67967808849f4c8d9b94be44f0dc8ba9bd9 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 29 Dec 2024 05:52:19 -0600 Subject: [PATCH 59/70] fucky wucky pt. 3 --- .../com/hbm/tileentity/machine/rbmk/RBMKDials.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 2833d6a55..ddefe0d77 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -5,6 +5,7 @@ import com.hbm.main.MainRegistry; import com.hbm.util.GameRuleHelper; import com.hbm.util.Tuple; +import com.sun.xml.internal.ws.developer.ServerSideException; import net.minecraft.world.GameRules; import net.minecraft.world.World; @@ -112,11 +113,17 @@ public class RBMKDials { /** * Gets a gamerule from the internal cache. + * This will not work if called on the client. * @param world World to get the gamerule for. * @param rule Rule to get. * @return The rule in an Object. */ public static Object getGameRule(World world, RBMKKeys rule) { + if(world.isRemote) { + MainRegistry.logger.error("Attempted to grab cached gamerules on client side, returning default value."); + MainRegistry.logger.error("Gamerule: {}, Default Value: {}.", rule.keyString, rule.defValue.toString()); + return rule.defValue; + } return getGameRule(world, rule, false); } @@ -240,6 +247,9 @@ public class RBMKDials { * @return >0 */ public static double getSurgeMod(World world) { + if(world.isRemote) { // The control rods use this gamerule for RBMK diag, which happens to be calculated on the client side. whoops! + return GameRuleHelper.getDoubleMinimum(world, RBMKKeys.KEY_PASSIVE_COOLING, 0.0D); + } return (double) getGameRule(world, RBMKKeys.KEY_SURGE_MOD); } From c941cb8717aa33aac2ea737a9ae01ad45f25bef9 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 29 Dec 2024 05:56:26 -0600 Subject: [PATCH 60/70] am i retarded fucky wucky pt. 4 --- src/main/java/com/hbm/lib/ModDamageSource.java | 1 - src/main/java/com/hbm/main/CraftingManager.java | 2 -- src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java | 1 - src/main/java/com/hbm/util/LootGenerator.java | 1 - 4 files changed, 5 deletions(-) diff --git a/src/main/java/com/hbm/lib/ModDamageSource.java b/src/main/java/com/hbm/lib/ModDamageSource.java index d5f7fda8b..deaeca1f7 100644 --- a/src/main/java/com/hbm/lib/ModDamageSource.java +++ b/src/main/java/com/hbm/lib/ModDamageSource.java @@ -1,7 +1,6 @@ package com.hbm.lib; import com.hbm.entity.projectile.EntityBullet; -import com.hbm.entity.projectile.EntityLN2; import com.hbm.entity.projectile.EntityLaserBeam; import com.hbm.entity.projectile.EntityMinerBeam; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index f0d40f9a2..c5eb93ed5 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -15,8 +15,6 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.NTMMaterial; -import com.hbm.items.ItemAmmoEnums.Ammo50BMG; -import com.hbm.items.ItemAmmoEnums.Ammo5mm; import static com.hbm.inventory.OreDictManager.*; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index ddefe0d77..98bf32af6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -5,7 +5,6 @@ import com.hbm.main.MainRegistry; import com.hbm.util.GameRuleHelper; import com.hbm.util.Tuple; -import com.sun.xml.internal.ws.developer.ServerSideException; import net.minecraft.world.GameRules; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index e790315c6..b55cc92c8 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -5,7 +5,6 @@ import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.itempool.ItemPool; import com.hbm.itempool.ItemPoolsPile; -import com.hbm.items.ItemAmmoEnums.AmmoFatman; import com.hbm.items.ModItems; import com.hbm.items.special.ItemBookLore; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; From 9a22c343c99d3cd8ff1880ac1243b4f7d616cc20 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Tue, 31 Dec 2024 17:18:04 -0600 Subject: [PATCH 61/70] Chicago Pile fix ClassCastException. --- .../com/hbm/blocks/generic/BlockBobble.java | 34 +++++++++---------- .../handler/neutron/PileNeutronHandler.java | 27 +++++++-------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockBobble.java b/src/main/java/com/hbm/blocks/generic/BlockBobble.java index d88c4ff23..5e5226e6f 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBobble.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBobble.java @@ -56,22 +56,22 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { public Item getItemDropped(int i, Random rand, int j) { return null; } - + @Override public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { - + TileEntityBobble entity = (TileEntityBobble) world.getTileEntity(x, y, z); - + if(entity != null) { return new ItemStack(this, 1, entity.type.ordinal()); } - + return super.getPickBlock(target, world, x, y, z, player); } @Override public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { - + if(!player.capabilities.isCreativeMode) { harvesters.set(player); if(!world.isRemote) { @@ -87,7 +87,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { harvesters.set(null); } } - + @Override public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); @@ -96,11 +96,11 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; - + } else { return true; } @@ -109,7 +109,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { @Override @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List list) { - + for(int i = 1; i < BobbleType.values().length; i++) list.add(new ItemStack(item, 1, i)); } @@ -118,12 +118,12 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int meta = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15; world.setBlockMetadataWithNotify(x, y, z, meta, 2); - + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(x, y, z); bobble.type = BobbleType.values()[Math.abs(stack.getItemDamage()) % BobbleType.values().length]; bobble.markDirty(); } - + @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { float f = 0.0625F; @@ -142,7 +142,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { } public static class TileEntityBobble extends TileEntity { - + public BobbleType type = BobbleType.NONE; @Override @@ -156,7 +156,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); @@ -174,9 +174,9 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { nbt.setByte("type", (byte) type.ordinal()); } } - + public static enum BobbleType { - + NONE( "null", "null", null, null, false, ScrapType.BOARD_BLANK), STRENGTH( "Strength", "Strength", null, "It's essential to give your arguments impact.", false, ScrapType.BRIDGE_BIOS), PERCEPTION( "Perception", "Perception", null, "Only through observation will you perceive weakness.", false, ScrapType.BRIDGE_NORTH), @@ -198,7 +198,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { NOS( "Dr Nostalgia", "Dr Nostalgia", "SSG and Vortex models", "Take a picture, I'ma pose, paparazzi$I've been drinking, moving like a zombie", true, ScrapType.BOARD_TRANSISTOR), DRILLGON( "Drillgon200", "Drillgon200", "1.12 Port", null, false, ScrapType.CPU_LOGIC), CIRNO( "Cirno", "Cirno", "the only multi layered skin i had", "No brain. Head empty.", true, ScrapType.BOARD_BLANK), - MICROWAVE( "Microwave", "Microwave", "OC Compatibility", "they call me the food heater", true, ScrapType.BOARD_CONVERTER), + MICROWAVE( "Microwave", "Microwave", "OC Compatibility and massive RBMK/packet optimizations", "they call me the food heater$john optimization", true, ScrapType.BOARD_CONVERTER), PEEP( "Peep", "LePeeperSauvage", "Coilgun, Leadburster and Congo Lake models, BDCL QC", "Fluffy ears can't hide in ash, nor snow.", true, ScrapType.CARD_BOARD), MELLOW( "MELLOWARPEGGIATION", "Mellow", "Industrial lighting, animation tools", "Make something cool now, ask for permission later.", true, ScrapType.CARD_PROCESSOR); @@ -208,7 +208,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { public String inscription; //the flavor text public boolean skinLayers; public ScrapType scrap; - + private BobbleType(String name, String label, String contribution, String inscription, boolean layers, ScrapType scrap) { this.name = name; this.label = label; diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 965f1ed0b..56913bc91 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -74,29 +74,28 @@ public class PileNeutronHandler { NeutronNodeWorld.addNode(new PileNeutronNode((TileEntityPileBase) tile)); } - TileEntityPileBase te = (TileEntityPileBase) tile; - Block block = te.getBlockType(); + Block block = tile.getBlockType(); + int meta = tile.getBlockMetadata(); + if(!(tile instanceof TileEntityPileBase)) { + // Return when a boron block is hit + if (block == ModBlocks.block_boron) + return; - // Return when a boron block is hit - if(block == ModBlocks.block_boron) - return; - - else if(block == ModBlocks.concrete || + else if (block == ModBlocks.concrete || block == ModBlocks.concrete_smooth || block == ModBlocks.concrete_asbestos || block == ModBlocks.concrete_colored || block == ModBlocks.brick_concrete) - fluxQuantity *= 0.25; + fluxQuantity *= 0.25; - int meta = te.getBlockMetadata(); + if (block == ModBlocks.block_graphite_rod && (meta & 8) == 0) + return; + } - if(block == ModBlocks.block_graphite_rod && (meta & 8) == 0) - return; + if(tile instanceof IPileNeutronReceiver) { - if(te instanceof IPileNeutronReceiver) { - - IPileNeutronReceiver rec = (IPileNeutronReceiver) te; + IPileNeutronReceiver rec = (IPileNeutronReceiver) tile; rec.receiveNeutrons((int) Math.floor(fluxQuantity)); if(block != ModBlocks.block_graphite_detector || (meta & 8) == 0) From 62116cfb324ce75c54ab1538da597f40a9d8af97 Mon Sep 17 00:00:00 2001 From: Agarmal Date: Thu, 2 Jan 2025 19:33:16 +0100 Subject: [PATCH 62/70] Added a check to fix M1TTY's Envsuit incompatibility with NVG goggles --- .../com/hbm/items/armor/ArmorEnvsuit.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java b/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java index e7ee41f79..f6fbe3875 100644 --- a/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java +++ b/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java @@ -41,14 +41,14 @@ public class ArmorEnvsuit extends ArmorFSBPowered { return models[armorSlot]; } - + private static final UUID speed = UUID.fromString("6ab858ba-d712-485c-bae9-e5e765fc555a"); @Override public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { super.onArmorTick(world, player, stack); - + if(this != ModItems.envsuit_plate) return; @@ -56,13 +56,13 @@ public class ArmorEnvsuit extends ArmorFSBPowered { Multimap multimap = super.getAttributeModifiers(stack); multimap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(speed, "SQUIRREL SPEED", 0.1, 0)); player.getAttributeMap().removeAttributeModifiers(multimap); - + if(this.hasFSBArmor(player)) { - + if(player.isSprinting()) player.getAttributeMap().applyAttributeModifiers(multimap); - + if(player.isInWater()) { - + if(!world.isRemote) { player.setAir(300); player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 15 * 20, 0)); @@ -78,7 +78,13 @@ public class ArmorEnvsuit extends ArmorFSBPowered { player.motionY += vec.yCoord; player.motionZ += vec.zCoord; } else { - if(!world.isRemote) { + boolean canRemoveNightVision = true; + ItemStack helmet = player.inventory.armorInventory[3]; + if (helmet.getItem() == ModItems.night_vision) { + canRemoveNightVision = false; + } + + if(!world.isRemote && canRemoveNightVision) { player.removePotionEffect(Potion.nightVision.id); } } From 8391255398c8b840e5490c3ae65e09227e58b8cb Mon Sep 17 00:00:00 2001 From: Agarmal Date: Thu, 2 Jan 2025 20:38:22 +0100 Subject: [PATCH 63/70] Fixed M1TTY Envsuit mod detection --- .../java/com/hbm/handler/ArmorModHandler.java | 102 +++++++++--------- .../com/hbm/items/armor/ArmorEnvsuit.java | 9 +- 2 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/hbm/handler/ArmorModHandler.java b/src/main/java/com/hbm/handler/ArmorModHandler.java index 04877a1df..9104d826b 100644 --- a/src/main/java/com/hbm/handler/ArmorModHandler.java +++ b/src/main/java/com/hbm/handler/ArmorModHandler.java @@ -1,13 +1,12 @@ package com.hbm.handler; -import java.util.UUID; - import com.hbm.items.armor.ItemArmorMod; - import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import java.util.UUID; + public class ArmorModHandler { public static final int helmet_only = 0; @@ -19,28 +18,28 @@ public class ArmorModHandler { public static final int kevlar = 6; public static final int extra = 7; public static final int battery = 8; - + public static final int MOD_SLOTS = 9; - + public static final UUID[] UUIDs = new UUID[] { UUID.fromString("8d6e5c77-133e-4056-9c80-a9e42a1a0b65"), UUID.fromString("b1b7ee0e-1d14-4400-8037-f7f2e02f21ca"), UUID.fromString("30b50d2a-4858-4e5b-88d4-3e3612224238"), UUID.fromString("426ee0d0-7587-4697-aaef-4772ab202e78") }; - + public static final UUID[] fixedUUIDs = new UUID[] { UUID.fromString("e572caf4-3e65-4152-bc79-c4d4048cbd29"), UUID.fromString("bed30902-8a6a-4769-9f65-2a9b67469fff"), UUID.fromString("baebf7b3-1eda-4a14-b233-068e2493e9a2"), UUID.fromString("28016c1b-d992-4324-9409-a9f9f0ffb85c") }; - + //The key for the NBTTagCompound that holds the armor mods public static final String MOD_COMPOUND_KEY = "ntm_armor_mods"; //The key for the specific slot inside the armor mod NBT Tag public static final String MOD_SLOT_KEY = "mod_slot_"; - + /** * Checks if a mod can be applied to an armor piece * Needs to be used to prevent people from inserting invalid items into the armor table @@ -49,23 +48,23 @@ public class ArmorModHandler { * @return */ public static boolean isApplicable(ItemStack armor, ItemStack mod) { - + if(armor == null || mod == null) return false; - + if(!(armor.getItem() instanceof ItemArmor)) return false; - + if(!(mod.getItem() instanceof ItemArmorMod)) return false; - + int type = ((ItemArmor)armor.getItem()).armorType; - + ItemArmorMod aMod = (ItemArmorMod)mod.getItem(); - + return (type == 0 && aMod.helmet) || (type == 1 && aMod.chestplate) || (type == 2 && aMod.leggings) || (type == 3 && aMod.boots); } - + /** * Applies an mod to the given armor piece * Make sure to check for applicability first @@ -74,119 +73,124 @@ public class ArmorModHandler { * @param mod */ public static void applyMod(ItemStack armor, ItemStack mod) { - + if(!armor.hasTagCompound()) armor.stackTagCompound = new NBTTagCompound(); - + NBTTagCompound nbt = armor.getTagCompound(); - + if(!nbt.hasKey(MOD_COMPOUND_KEY)) nbt.setTag(MOD_COMPOUND_KEY, new NBTTagCompound()); - + NBTTagCompound mods = nbt.getCompoundTag(MOD_COMPOUND_KEY); - + ItemArmorMod aMod = (ItemArmorMod)mod.getItem(); int slot = aMod.type; - + NBTTagCompound cmp = new NBTTagCompound(); mod.writeToNBT(cmp); - + mods.setTag(MOD_SLOT_KEY + slot, cmp); } - + /** * Removes the mod from the given slot * @param armor * @param slot */ public static void removeMod(ItemStack armor, int slot) { - + if(armor == null) return; - + if(!armor.hasTagCompound()) armor.stackTagCompound = new NBTTagCompound(); - + NBTTagCompound nbt = armor.getTagCompound(); - + if(!nbt.hasKey(MOD_COMPOUND_KEY)) nbt.setTag(MOD_COMPOUND_KEY, new NBTTagCompound()); - + NBTTagCompound mods = nbt.getCompoundTag(MOD_COMPOUND_KEY); mods.removeTag(MOD_SLOT_KEY + slot); - + if(mods.hasNoTags()) clearMods(armor); } - + /** * Removes ALL mods * Should be used when the armor piece is put in the armor table slot AFTER the armor pieces have been separated * @param armor */ public static void clearMods(ItemStack armor) { - + if(!armor.hasTagCompound()) return; - + NBTTagCompound nbt = armor.getTagCompound(); nbt.removeTag(MOD_COMPOUND_KEY); } - + /** * Does what the name implies. Returns true if the stack has NBT and that NBT has the MOD_COMPOUND_KEY tag. * @param armor * @return */ public static boolean hasMods(ItemStack armor) { - + if(!armor.hasTagCompound()) return false; - + NBTTagCompound nbt = armor.getTagCompound(); return nbt.hasKey(MOD_COMPOUND_KEY); } - + + /** + * Gets all the modifications in the provided armor + * @param armor + * @return + */ public static ItemStack[] pryMods(ItemStack armor) { - + ItemStack[] slots = new ItemStack[MOD_SLOTS]; if(!hasMods(armor)) return slots; - + NBTTagCompound nbt = armor.getTagCompound(); NBTTagCompound mods = nbt.getCompoundTag(MOD_COMPOUND_KEY); - + for(int i = 0; i < MOD_SLOTS; i++) { - + NBTTagCompound cmp = mods.getCompoundTag(MOD_SLOT_KEY + i); - + ItemStack stack = ItemStack.loadItemStackFromNBT(cmp); - + if(stack != null) slots[i] = stack; else // Any non-existing armor mods will be sorted out automatically removeMod(armor, i); } - + return slots; } - + public static ItemStack pryMod(ItemStack armor, int slot) { - + if(!hasMods(armor)) return null; - + NBTTagCompound nbt = armor.getTagCompound(); NBTTagCompound mods = nbt.getCompoundTag(MOD_COMPOUND_KEY); NBTTagCompound cmp = mods.getCompoundTag(MOD_SLOT_KEY + slot); ItemStack stack = ItemStack.loadItemStackFromNBT(cmp); - + if(stack != null) return stack; - + removeMod(armor, slot); - + return null; } } diff --git a/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java b/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java index f6fbe3875..940955329 100644 --- a/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java +++ b/src/main/java/com/hbm/items/armor/ArmorEnvsuit.java @@ -1,11 +1,9 @@ package com.hbm.items.armor; -import java.util.UUID; - import com.google.common.collect.Multimap; +import com.hbm.handler.ArmorModHandler; import com.hbm.items.ModItems; import com.hbm.render.model.ModelArmorEnvsuit; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.model.ModelBiped; @@ -19,6 +17,8 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import java.util.UUID; + public class ArmorEnvsuit extends ArmorFSBPowered { public ArmorEnvsuit(ArmorMaterial material, int slot, String texture, long maxPower, long chargeRate, long consumption, long drain) { @@ -80,7 +80,8 @@ public class ArmorEnvsuit extends ArmorFSBPowered { } else { boolean canRemoveNightVision = true; ItemStack helmet = player.inventory.armorInventory[3]; - if (helmet.getItem() == ModItems.night_vision) { + ItemStack helmetMod = ArmorModHandler.pryMod(helmet, ArmorModHandler.helmet_only); // Get the modification! + if (helmetMod != null && helmetMod.getItem() instanceof ItemModNightVision) { canRemoveNightVision = false; } From c25f4c8d6033355f22c433981d9dfb366b6100af Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Fri, 3 Jan 2025 20:29:17 -0600 Subject: [PATCH 64/70] Fix /ntmpackets command registration. Fix small race condition with a ReentrantLock. --- .../com/hbm/commands/CommandPacketInfo.java | 87 +++++++++++------- .../handler/threading/PacketThreading.java | 49 +++++++---- src/main/java/com/hbm/main/MainRegistry.java | 1 + .../java/com/hbm/main/NetworkHandler.java | 88 +++++++++++++++---- .../hbm/tileentity/TileEntityLoadedBase.java | 2 +- 5 files changed, 163 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/hbm/commands/CommandPacketInfo.java b/src/main/java/com/hbm/commands/CommandPacketInfo.java index dec1fbff7..4432e595f 100644 --- a/src/main/java/com/hbm/commands/CommandPacketInfo.java +++ b/src/main/java/com/hbm/commands/CommandPacketInfo.java @@ -2,6 +2,7 @@ package com.hbm.commands; import com.hbm.config.GeneralConfig; import com.hbm.handler.threading.PacketThreading; +import com.hbm.main.MainRegistry; import com.hbm.util.BobMathUtil; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; @@ -10,6 +11,7 @@ import net.minecraft.util.EnumChatFormatting; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; +import java.util.concurrent.TimeUnit; import static com.hbm.handler.threading.PacketThreading.totalCnt; @@ -21,48 +23,67 @@ public class CommandPacketInfo extends CommandBase { @Override public String getCommandUsage(ICommandSender sender) { - return "/ntmpackets"; + return EnumChatFormatting.RED + "/ntmpackets [info/resetState/toggleThreadingStatus/forceLock/forceUnlock]"; } @Override public void processCommand(ICommandSender sender, String[] args) { - if(args.length > 0 && args[0].equals("resetState")) { - PacketThreading.hasTriggered = false; - PacketThreading.clearCnt = 0; - } + if (args.length > 0) { + switch (args[0]) { + case "resetState": + PacketThreading.hasTriggered = false; + PacketThreading.clearCnt = 0; + return; + case "toggleThreadingStatus": + GeneralConfig.enablePacketThreading = !GeneralConfig.enablePacketThreading; // Force toggle. + PacketThreading.init(); // Reinit threads. + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet sending status toggled to " + GeneralConfig.enablePacketThreading + ".")); + return; + case "forceLock": + PacketThreading.lock.lock(); // oh my fucking god never do this please unless you really have to + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet thread lock acquired, this may freeze the main thread!")); + MainRegistry.logger.error("Packet thread lock acquired by {}, this may freeze the main thread!", sender.getCommandSenderName()); + return; + case "forceUnlock": + PacketThreading.lock.unlock(); + MainRegistry.logger.warn("Packet thread lock released by {}.", sender.getCommandSenderName()); + return; + case "info": + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "NTM Packet Debugger v1.2")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "NTM Packet Debugger v1.2")); + if (PacketThreading.isTriggered() && GeneralConfig.enablePacketThreading) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Errored, check log.")); + else if (GeneralConfig.enablePacketThreading) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); + else + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); - if(PacketThreading.isTriggered() && GeneralConfig.enablePacketThreading) - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Errored, check log.")); - else if(GeneralConfig.enablePacketThreading) - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Packet Threading Active")); - else - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Packet Threading Inactive")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread Pool Info")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (total): " + PacketThreading.threadPool.getPoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (core): " + PacketThreading.threadPool.getCorePoolSize())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (idle): " + (PacketThreading.threadPool.getPoolSize() - PacketThreading.threadPool.getActiveCount()))); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (maximum): " + PacketThreading.threadPool.getMaximumPoolSize())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread Pool Info")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (total): " + PacketThreading.threadPool.getPoolSize())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (core): " + PacketThreading.threadPool.getCorePoolSize())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (idle): " + (PacketThreading.threadPool.getPoolSize() - PacketThreading.threadPool.getActiveCount()))); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "# Threads (maximum): " + PacketThreading.threadPool.getMaximumPoolSize())); + for (ThreadInfo thread : ManagementFactory.getThreadMXBean().dumpAllThreads(false, false)) + if (thread.getThreadName().startsWith(PacketThreading.threadPrefix)) { + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Thread Name: " + thread.getThreadName())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread ID: " + thread.getThreadId())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread state: " + thread.getThreadState())); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Locked by: " + (thread.getLockOwnerName() == null ? "None" : thread.getLockName()))); + } - for(ThreadInfo thread : ManagementFactory.getThreadMXBean().dumpAllThreads(false, false)) - if(thread.getThreadName().startsWith("NTM-Packet-Thread-")) { - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Thread Name: " + thread.getThreadName())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread ID: " + thread.getThreadId())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Thread state: " + thread.getThreadState())); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Locked by: " + (thread.getLockOwnerName() == null ? "None" : thread.getLockName()))); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Packet Info: ")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount total: " + totalCnt)); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount remaining: " + PacketThreading.threadPool.getQueue().size())); + + if (totalCnt != 0) + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Remaining to process: " + BobMathUtil.roundDecimal(((double) PacketThreading.threadPool.getQueue().size() / totalCnt) * 100, 2) + "%")); + + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Time spent waiting on thread(s) last tick: " + BobMathUtil.roundDecimal(TimeUnit.NANOSECONDS.convert(PacketThreading.nanoTimeWaited, TimeUnit.MILLISECONDS), 4) + "ms")); + return; } - - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Packet Info: ")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount total: " + totalCnt)); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Amount remaining: " + PacketThreading.threadPool.getQueue().size())); - - if(totalCnt != 0) - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Remaining to process: " + BobMathUtil.roundDecimal(((double) PacketThreading.threadPool.getQueue().size() / totalCnt) * 100, 2) + "%")); - - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Time spent waiting on thread(s) last tick: " + BobMathUtil.roundDecimal(PacketThreading.nanoTimeWaited / 1000000d, 4) + "ms")); - + } + sender.addChatMessage(new ChatComponentText(getCommandUsage(sender))); } } diff --git a/src/main/java/com/hbm/handler/threading/PacketThreading.java b/src/main/java/com/hbm/handler/threading/PacketThreading.java index 7392e59d8..438481d52 100644 --- a/src/main/java/com/hbm/handler/threading/PacketThreading.java +++ b/src/main/java/com/hbm/handler/threading/PacketThreading.java @@ -11,10 +11,13 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; +import java.util.concurrent.locks.ReentrantLock; public class PacketThreading { - private static final ThreadFactory packetThreadFactory = new ThreadFactoryBuilder().setNameFormat("NTM-Packet-Thread-%d").build(); + public static final String threadPrefix = "NTM-Packet-Thread-"; + + public static final ThreadFactory packetThreadFactory = new ThreadFactoryBuilder().setNameFormat(threadPrefix + "%d").build(); public static final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(1, packetThreadFactory); @@ -24,17 +27,19 @@ public class PacketThreading { public static final List> futureList = new ArrayList<>(); + public static ReentrantLock lock = new ReentrantLock(); + /** * Sets up thread pool settings during mod initialization. */ public static void init() { threadPool.setKeepAliveTime(50, TimeUnit.MILLISECONDS); - if(GeneralConfig.enablePacketThreading) { - if(GeneralConfig.packetThreadingCoreCount < 0 || GeneralConfig.packetThreadingMaxCount <= 0) { + if (GeneralConfig.enablePacketThreading) { + if (GeneralConfig.packetThreadingCoreCount < 0 || GeneralConfig.packetThreadingMaxCount <= 0) { MainRegistry.logger.error("0.02_packetThreadingCoreCount < 0 or 0.03_packetThreadingMaxCount is <= 0, defaulting to 1 each."); threadPool.setCorePoolSize(1); // beugh threadPool.setMaximumPoolSize(1); - } else if(GeneralConfig.packetThreadingMaxCount > GeneralConfig.packetThreadingCoreCount) { + } else if (GeneralConfig.packetThreadingMaxCount > GeneralConfig.packetThreadingCoreCount) { MainRegistry.logger.error("0.03_packetThreadingMaxCount is > 0.02_packetThreadingCoreCount, defaulting to 1 each."); threadPool.setCorePoolSize(1); threadPool.setMaximumPoolSize(1); @@ -45,8 +50,14 @@ public class PacketThreading { threadPool.allowCoreThreadTimeOut(false); } else { threadPool.allowCoreThreadTimeOut(true); - for(Runnable task : threadPool.getQueue()) { - task.run(); // Run all tasks async just in-case there *are* tasks left to run. + try { + lock.lock(); + for (Runnable task : threadPool.getQueue()) { + task.run(); // Run all tasks async just in-case there *are* tasks left to run. + } + clearThreadPoolTasks(); + } finally { + lock.unlock(); } } } @@ -56,8 +67,7 @@ public class PacketThreading { * @param message Message to process. * @param target TargetPoint to send to. */ - public static void createThreadedPacket(IMessage message, TargetPoint target) { - + public static void createAllAroundThreadedPacket(IMessage message, TargetPoint target) { // `message` can be precompiled or not. if(message instanceof PrecompiledPacket) ((PrecompiledPacket) message).getPreBuf(); // Gets the precompiled buffer, doing nothing if it already exists. @@ -65,17 +75,26 @@ public class PacketThreading { totalCnt++; Runnable task = () -> { - PacketDispatcher.wrapper.sendToAllAround(message, target); - if(message instanceof PrecompiledPacket) - ((PrecompiledPacket) message).getPreBuf().release(); + try { + lock.lock(); + PacketDispatcher.wrapper.sendToAllAround(message, target); + if (message instanceof PrecompiledPacket) + ((PrecompiledPacket) message).getPreBuf().release(); + } finally { + lock.unlock(); + } }; + addTask(task); + } + + private static void addTask(Runnable task) { if(isTriggered()) task.run(); else if(GeneralConfig.enablePacketThreading) - futureList.add(threadPool.submit(task)); // Thread it + futureList.add(threadPool.submit(task)); else - task.run(); // no threading :( + task.run(); } /** @@ -86,7 +105,9 @@ public class PacketThreading { try { if (GeneralConfig.enablePacketThreading && (!GeneralConfig.packetThreadingErrorBypass && !hasTriggered)) { for (Future future : futureList) { + nanoTimeWaited = System.nanoTime() - startTime; future.get(50, TimeUnit.MILLISECONDS); // I HATE EVERYTHING + if(TimeUnit.NANOSECONDS.convert(nanoTimeWaited, TimeUnit.MILLISECONDS) > 50) throw new TimeoutException(); // >50ms total time? timeout? yes sir, ooh rah! } } } catch (ExecutionException ignored) { @@ -99,7 +120,6 @@ public class PacketThreading { Thread.currentThread().interrupt(); // maybe not the best thing but it's gotta be here } finally { futureList.clear(); - nanoTimeWaited = System.nanoTime() - startTime; if(!threadPool.getQueue().isEmpty()) { if(!GeneralConfig.packetThreadingErrorBypass && !hasTriggered) MainRegistry.logger.warn("Residual packets in packet threading queue detected, discarding {}/{} packets.", threadPool.getQueue().size(), totalCnt); @@ -128,7 +148,6 @@ public class PacketThreading { clearCnt++; - if(clearCnt > 5 && !isTriggered()) { // If it's been cleared 5 times in a row, something may have gone really wrong. // Best case scenario here, the server is lagging terribly, has a bad CPU, or has a poor network connection diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index a368296a6..8f818c9a0 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -936,6 +936,7 @@ public class MainRegistry { event.registerServerCommand(new CommandDebugChunkLoad()); event.registerServerCommand(new CommandSatellites()); event.registerServerCommand(new CommandRadiation()); + event.registerServerCommand(new CommandPacketInfo()); } @EventHandler diff --git a/src/main/java/com/hbm/main/NetworkHandler.java b/src/main/java/com/hbm/main/NetworkHandler.java index bd9caa725..e7dad9ced 100644 --- a/src/main/java/com/hbm/main/NetworkHandler.java +++ b/src/main/java/com/hbm/main/NetworkHandler.java @@ -1,5 +1,6 @@ package com.hbm.main; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.PrecompiledPacket; import cpw.mods.fml.common.network.FMLEmbeddedChannel; import cpw.mods.fml.common.network.FMLOutboundHandler; @@ -20,6 +21,9 @@ import io.netty.handler.codec.CodecException; import io.netty.handler.codec.MessageToMessageCodec; import net.minecraft.entity.player.EntityPlayerMP; +import javax.management.MXBean; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; import java.lang.ref.WeakReference; import java.util.EnumMap; import java.util.List; @@ -124,37 +128,91 @@ public class NetworkHandler { serverChannel.flush(); } - public void sendToServer(IMessage message) { + public void sendToServer(IMessage message) { // No thread protection needed here, since the client never threads packets to the server. clientChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER); clientChannel.write(message); } public void sendToDimension(IMessage message, int dimensionId) { - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION); - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId); - serverChannel.write(message); + if(!Thread.currentThread().getName().contains(PacketThreading.threadPrefix)) { + try { + PacketThreading.lock.lock(); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId); + serverChannel.write(message); + } finally { + PacketThreading.lock.unlock(); + } + } else { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId); + serverChannel.write(message); + } } public void sendToAllAround(IMessage message, NetworkRegistry.TargetPoint point) { - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); - serverChannel.write(message); + if(!Thread.currentThread().getName().contains(PacketThreading.threadPrefix)) { + try { + PacketThreading.lock.lock(); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + serverChannel.write(message); + } finally { + PacketThreading.lock.unlock(); + } + } else { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + serverChannel.write(message); + } } public void sendToAllAround(ByteBuf message, NetworkRegistry.TargetPoint point) { - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); - serverChannel.write(message); + if(!Thread.currentThread().getName().contains(PacketThreading.threadPrefix)) { + try { + PacketThreading.lock.lock(); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + serverChannel.write(message); + } finally { + PacketThreading.lock.unlock(); + } + } else { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + serverChannel.write(message); + } } public void sendTo(IMessage message, EntityPlayerMP player) { - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); - serverChannel.write(message); + if(!Thread.currentThread().getName().contains(PacketThreading.threadPrefix)) { + try { + PacketThreading.lock.lock(); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); + serverChannel.write(message); + } finally { + PacketThreading.lock.unlock(); + } + } else { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); + serverChannel.write(message); + } } public void sendToAll(IMessage message) { - serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); - serverChannel.write(message); + if(!Thread.currentThread().getName().contains(PacketThreading.threadPrefix)) { + try { + PacketThreading.lock.lock(); + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); + serverChannel.write(message); + } finally { + PacketThreading.lock.unlock(); + } + } else { + serverChannel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); + serverChannel.write(message); + } } } diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index 6658452b7..74b61d7b0 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -86,7 +86,7 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu this.lastPackedBuf = preBuf.copy(); - PacketThreading.createThreadedPacket(packet, new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + PacketThreading.createAllAroundThreadedPacket(packet, new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } } From ec6cd544d23a6702bcb47ff856d2c2dcc91ad781 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sat, 4 Jan 2025 01:04:57 -0600 Subject: [PATCH 65/70] An absolute ton of cleanup. --- .../com/hbm/commands/CommandPacketInfo.java | 2 +- .../missile/EntityMissileAntiBallistic.java | 53 +++-- .../entity/missile/EntityMissileCustom.java | 25 ++- .../projectile/EntityArtilleryRocket.java | 65 +++--- .../entity/projectile/EntityWaterSplash.java | 10 +- .../com/hbm/handler/EntityEffectHandler.java | 7 +- .../ChunkRadiationHandlerSimple.java | 103 +++++---- .../handler/threading/PacketThreading.java | 29 ++- src/main/java/com/hbm/main/ClientProxy.java | 132 +++++------ src/main/java/com/hbm/main/ServerProxy.java | 2 - .../java/com/hbm/packet/PacketDispatcher.java | 14 +- .../packet/toclient/AuxElectricityPacket.java | 67 ------ .../hbm/packet/toclient/AuxGaugePacket.java | 96 -------- .../packet/toclient/AuxParticlePacket.java | 60 ----- .../hbm/packet/toclient/ExtPropPacket.java | 35 ++- .../packet/toclient/LoopedSoundPacket.java | 122 ----------- .../com/hbm/sound/SoundLoopAssembler.java | 38 ---- .../com/hbm/sound/SoundLoopBroadcaster.java | 52 ----- .../com/hbm/sound/SoundLoopCentrifuge.java | 54 ----- .../java/com/hbm/sound/SoundLoopTurbofan.java | 39 ---- .../hbm/tileentity/TileEntityMachineBase.java | 8 - .../bomb/TileEntityCompactLauncher.java | 10 +- .../tileentity/bomb/TileEntityLaunchPad.java | 44 ++-- .../bomb/TileEntityLaunchPadLarge.java | 78 ++++--- .../bomb/TileEntityLaunchPadRusted.java | 57 +++-- .../bomb/TileEntityLaunchTable.java | 10 +- .../machine/TileEntityBlastDoor.java | 108 ++++----- .../machine/TileEntityBroadcaster.java | 74 +++++-- .../machine/TileEntityMachineArcFurnace.java | 127 ++++++----- .../machine/TileEntityMachineGasCent.java | 206 ++++++++++-------- .../machine/TileEntityMachineRTG.java | 62 +++--- .../machine/TileEntityMachineShredder.java | 150 +++++++------ 32 files changed, 789 insertions(+), 1150 deletions(-) delete mode 100644 src/main/java/com/hbm/packet/toclient/AuxElectricityPacket.java delete mode 100644 src/main/java/com/hbm/packet/toclient/AuxGaugePacket.java delete mode 100644 src/main/java/com/hbm/packet/toclient/AuxParticlePacket.java delete mode 100644 src/main/java/com/hbm/packet/toclient/LoopedSoundPacket.java delete mode 100644 src/main/java/com/hbm/sound/SoundLoopAssembler.java delete mode 100644 src/main/java/com/hbm/sound/SoundLoopBroadcaster.java delete mode 100644 src/main/java/com/hbm/sound/SoundLoopCentrifuge.java delete mode 100644 src/main/java/com/hbm/sound/SoundLoopTurbofan.java diff --git a/src/main/java/com/hbm/commands/CommandPacketInfo.java b/src/main/java/com/hbm/commands/CommandPacketInfo.java index 4432e595f..1affa486c 100644 --- a/src/main/java/com/hbm/commands/CommandPacketInfo.java +++ b/src/main/java/com/hbm/commands/CommandPacketInfo.java @@ -80,7 +80,7 @@ public class CommandPacketInfo extends CommandBase { if (totalCnt != 0) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "% Remaining to process: " + BobMathUtil.roundDecimal(((double) PacketThreading.threadPool.getQueue().size() / totalCnt) * 100, 2) + "%")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Time spent waiting on thread(s) last tick: " + BobMathUtil.roundDecimal(TimeUnit.NANOSECONDS.convert(PacketThreading.nanoTimeWaited, TimeUnit.MILLISECONDS), 4) + "ms")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Time spent waiting on thread(s) last tick: " + BobMathUtil.roundDecimal(TimeUnit.MILLISECONDS.convert(PacketThreading.nanoTimeWaited, TimeUnit.NANOSECONDS), 4) + "ms")); return; } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java index 3dbb048d8..296844b84 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java @@ -30,7 +30,7 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements public Entity tracking; public double velocity; protected int activationTimer; - + public static double baseSpeed = 1.5D; public EntityMissileAntiBallistic(World world) { @@ -60,21 +60,21 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements super.onUpdate(); if(!worldObj.isRemote) { - + if(velocity < 6) velocity += 0.1; - + if(activationTimer < 40) { activationTimer++; motionY = baseSpeed; } else { Entity prevTracking = this.tracking; - + if(this.tracking == null || this.tracking.isDead) this.targetMissile(); - + if(prevTracking == null && this.tracking != null) { ExplosionLarge.spawnShock(worldObj, posX, posY, posZ, 24, 3F); } - + if(this.tracking != null) { this.aimAtTarget(); } else { @@ -83,15 +83,20 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements } loadNeighboringChunks((int) Math.floor(posX / 16), (int) Math.floor(posZ / 16)); - + if(this.posY > 2000 && (this.tracking == null || this.tracking.isDead)) this.setDead(); - + } else { - + Vec3 vec = Vec3.createVectorHelper(motionX, motionY, motionZ).normalize(); - MainRegistry.proxy.particleControl(posX - vec.xCoord, posY - vec.yCoord, posZ - vec.zCoord, 2); + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "ABMContrail"); + data.setDouble("posX", posX - vec.xCoord); + data.setDouble("posY", posY - vec.yCoord); + data.setDouble("posZ", posZ - vec.zCoord); + MainRegistry.proxy.effectNT(data); } - + float f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); for(this.rotationPitch = (float) (Math.atan2(this.motionY, f2) * 180.0D / Math.PI) - 90; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F); @@ -102,33 +107,33 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements /** Detects and caches nearby EntityMissileBaseNT */ protected void targetMissile() { - + Entity closest = null; double dist = 1_000; - + for(Entity e : TileEntityMachineRadarNT.matchingEntities) { if(e.dimension != this.dimension) continue; if(!(e instanceof EntityMissileBaseNT)) continue; //can only lock onto missiles if(e instanceof EntityMissileStealth) continue; //cannot lack onto missiles with stealth coating - + Vec3 vec = Vec3.createVectorHelper(e.posX - posX, e.posY - posY, e.posZ - posZ); - + if(vec.lengthVector() < dist) { closest = e; } } - + this.tracking = closest; } - + /** Predictive targeting system */ protected void aimAtTarget() { - + Vec3 delta = Vec3.createVectorHelper(tracking.posX - posX, tracking.posY - posY, tracking.posZ - posZ); double intercept = delta.lengthVector() / (this.baseSpeed * this.velocity); Vec3 predicted = Vec3.createVectorHelper(tracking.posX + (tracking.posX - tracking.lastTickPosX) * intercept, tracking.posY + (tracking.posY - tracking.lastTickPosY) * intercept, tracking.posZ + (tracking.posZ - tracking.lastTickPosZ) * intercept); Vec3 motion = Vec3.createVectorHelper(predicted.xCoord - posX, predicted.yCoord - posY, predicted.zCoord - posZ).normalize(); - + if(delta.lengthVector() < 10 && activationTimer >= 40) { this.setDead(); ExplosionLarge.explode(worldObj, posX, posY, posZ, 15F, true, false, false); @@ -168,13 +173,13 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements super.readEntityFromNBT(nbt); this.velocity = nbt.getDouble("veloc"); } - + @Override public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); nbt.setDouble("veloc", this.velocity); } - + @Override public void init(Ticket ticket) { if(!worldObj.isRemote) { @@ -197,7 +202,7 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements public void loadNeighboringChunks(int newChunkX, int newChunkZ) { if(!worldObj.isRemote && loaderTicket != null) { - + clearChunkLoader(); loadedChunks.clear(); @@ -208,13 +213,13 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements } } } - + @Override public void setDead() { super.setDead(); this.clearChunkLoader(); } - + public void clearChunkLoader() { if(!worldObj.isRemote && loaderTicket != null) { for(ChunkCoordIntPair chunk : loadedChunks) { diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java index 3b171440f..0b6a51cf8 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java @@ -78,7 +78,7 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo ExplosionLarge.spawnShrapnelShower(worldObj, posX, posY, posZ, motionX, motionY, motionZ, 15, 0.075); } } - + @Override public void onUpdate() { @@ -87,11 +87,11 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo if(type != null && type.updateCustom != null) { type.updateCustom.accept(this); } - + if(!worldObj.isRemote) { if(this.hasPropulsion()) this.fuel -= this.consumption; } - + super.onUpdate(); } @@ -131,7 +131,7 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo nbt.setInteger("fins", this.dataWatcher.getWatchableObjectInt(11)); nbt.setInteger("thruster", this.dataWatcher.getWatchableObjectInt(12)); } - + @Override protected void spawnContrail() { @@ -148,7 +148,16 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo case XENON: break; } - if(!smoke.isEmpty()) for(int i = 0; i < velocity; i++) MainRegistry.proxy.spawnParticle(posX - v.xCoord * i, posY - v.yCoord * i, posZ - v.zCoord * i, smoke, null); + if(!smoke.isEmpty()) { + for (int i = 0; i < velocity; i++) { + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("posX", posX - v.xCoord * i); + data.setDouble("posY", posY - v.yCoord * i); + data.setDouble("posZ", posZ - v.zCoord * i); + data.setString("type", smoke); + MainRegistry.proxy.effectNT(data); + } + } } @Override @@ -158,7 +167,7 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo WarheadType type = (WarheadType) part.attributes[0]; float strength = (Float) part.attributes[1]; - + if(type.impactCustom != null) { type.impactCustom.accept(this); return; @@ -244,7 +253,7 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_15) return "radar.target.custom15"; if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_20) return "radar.target.custom1520"; if(top == PartSize.SIZE_20 && bottom == PartSize.SIZE_20) return "radar.target.custom20"; - + return "radar.target.custom"; } @@ -260,7 +269,7 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_15) return IRadarDetectableNT.TIER15; if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_20) return IRadarDetectableNT.TIER15_20; if(top == PartSize.SIZE_20 && bottom == PartSize.SIZE_20) return IRadarDetectableNT.TIER20; - + return IRadarDetectableNT.TIER1; } diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java index 1a04f5a2f..45cc42fb4 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -28,14 +28,14 @@ import net.minecraftforge.common.ForgeChunkManager.Type; public class EntityArtilleryRocket extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable { private Ticket loaderTicket; - + //TODO: find satisfying solution for when an entity is unloaded and reloaded, possibly a custom entity lookup using persistent UUIDs public Entity targetEntity = null; public Vec3 lastTargetPos; - + public IRocketTargetingBehavior targeting; public IRocketSteeringBehavior steering; - + public EntityArtilleryRocket(World world) { super(world); this.ignoreFrustumCheck = true; @@ -49,18 +49,18 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu init(ForgeChunkManager.requestTicket(MainRegistry.instance, worldObj, Type.ENTITY)); this.dataWatcher.addObject(10, new Integer(0)); } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) { return true; } - + public EntityArtilleryRocket setType(int type) { this.dataWatcher.updateObject(10, type); return this; } - + public HIMARSRocket getType() { try { return ItemAmmoHIMARS.itemTypes[this.dataWatcher.getWatchableObjectInt(10)]; @@ -68,35 +68,35 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu return ItemAmmoHIMARS.itemTypes[0]; } } - + public EntityArtilleryRocket setTarget(Entity target) { this.targetEntity = target; setTarget(target.posX, target.posY - target.yOffset + target.height / 2D, target.posZ); return this; } - + public EntityArtilleryRocket setTarget(double x, double y, double z) { this.lastTargetPos = Vec3.createVectorHelper(x, y, z); return this; } - + public Vec3 getLastTarget() { return this.lastTargetPos; } - + @Override public void onUpdate() { - + if(worldObj.isRemote) { this.lastTickPosX = this.posX; this.lastTickPosY = this.posY; this.lastTickPosZ = this.posZ; } - + super.onUpdate(); - + if(!worldObj.isRemote) { - + /*if(this.targetEntity == null) { Vec3 delta = Vec3.createVectorHelper(this.lastTargetPos.xCoord - this.posX, this.lastTargetPos.yCoord - this.posY, this.lastTargetPos.zCoord - this.posZ); if(delta.lengthVector() <= 15D) { @@ -104,26 +104,35 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu this.steering = null; } }*/ - + if(this.targeting != null && this.targetEntity != null) this.targeting.recalculateTargetPosition(this, this.targetEntity); if(this.steering != null) this.steering.adjustCourse(this, 25D, 15D); - + loadNeighboringChunks((int)Math.floor(posX / 16D), (int)Math.floor(posZ / 16D)); this.getType().onUpdate(this); } else { - + Vec3 v = Vec3.createVectorHelper(lastTickPosX - posX, lastTickPosY - posY, lastTickPosZ - posZ); double velocity = v.lengthVector(); v = v.normalize(); - + int offset = 6; - if(velocity > 1) for(int i = offset; i < velocity + offset; i++) MainRegistry.proxy.spawnParticle(posX + v.xCoord * i, posY + v.yCoord * i, posZ + v.zCoord * i, "exKerosene", null); + if(velocity > 1) { + for (int i = offset; i < velocity + offset; i++) { + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("posX", posX + v.xCoord * i); + data.setDouble("posY", posY + v.yCoord * i); + data.setDouble("posZ", posZ + v.zCoord * i); + data.setString("type", "exKerosene"); + MainRegistry.proxy.effectNT(data); + } + } } } @Override protected void onImpact(MovingObjectPosition mop) { - + if(!worldObj.isRemote) { this.getType().onImpact(this, mop); } @@ -145,7 +154,7 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu public void loadNeighboringChunks(int newChunkX, int newChunkZ) { if(!worldObj.isRemote && loaderTicket != null) { - + clearChunkLoader(); loadedChunks.clear(); @@ -157,12 +166,12 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu } } } - + public void killAndClear() { this.setDead(); this.clearChunkLoader(); } - + public void clearChunkLoader() { if(!worldObj.isRemote && loaderTicket != null) { for(ChunkCoordIntPair chunk : loadedChunks) { @@ -174,15 +183,15 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu @Override public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); - + if(this.lastTargetPos == null) { this.lastTargetPos = Vec3.createVectorHelper(posX, posY, posZ); } - + nbt.setDouble("targetX", this.lastTargetPos.xCoord); nbt.setDouble("targetY", this.lastTargetPos.yCoord); nbt.setDouble("targetZ", this.lastTargetPos.zCoord); - + nbt.setInteger("type", this.dataWatcher.getWatchableObjectInt(10)); } @@ -191,7 +200,7 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu super.readEntityFromNBT(nbt); this.lastTargetPos = Vec3.createVectorHelper(nbt.getDouble("targetX"), nbt.getDouble("targetY"), nbt.getDouble("targetZ")); - + this.dataWatcher.updateObject(10, nbt.getInteger("type")); } @@ -209,7 +218,7 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu public RadarTargetType getTargetType() { return RadarTargetType.ARTILLERY; } - + @Override public int approachNum() { return 0; // diff --git a/src/main/java/com/hbm/entity/projectile/EntityWaterSplash.java b/src/main/java/com/hbm/entity/projectile/EntityWaterSplash.java index 4eed4570b..49ea4ae20 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityWaterSplash.java +++ b/src/main/java/com/hbm/entity/projectile/EntityWaterSplash.java @@ -24,7 +24,7 @@ public class EntityWaterSplash extends EntityThrowable { public EntityWaterSplash(World p_i1775_1_, double p_i1775_2_, double p_i1775_4_, double p_i1775_6_) { super(p_i1775_1_, p_i1775_2_, p_i1775_4_, p_i1775_6_); } - + @Override public void onUpdate() { super.onUpdate(); @@ -35,8 +35,12 @@ public class EntityWaterSplash extends EntityThrowable { this.setDead(); } } else { - - MainRegistry.proxy.particleControl(posX, posY, posZ, 0); + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "waterSplash"); + data.setDouble("posX", posX); + data.setDouble("posY", posY); + data.setDouble("posZ", posZ); + MainRegistry.proxy.effectNT(data); } } diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index d7252bcd1..e32fb95ab 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -16,6 +16,7 @@ import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.IArmorModDash; import com.hbm.items.armor.ArmorFSB; import com.hbm.items.weapon.sedna.factory.ConfettiUtil; @@ -81,7 +82,6 @@ public class EntityEffectHandler { if(entity instanceof EntityPlayerMP) { HbmLivingProps props = HbmLivingProps.getData(entity); HbmPlayerProps pprps = HbmPlayerProps.getData((EntityPlayerMP) entity); - ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer(); if(pprps.shield < pprps.getEffectiveMaxShield() && entity.ticksExisted > pprps.lastDamage + 60) { int tsd = entity.ticksExisted - (pprps.lastDamage + 60); @@ -91,10 +91,7 @@ public class EntityEffectHandler { if(pprps.shield > pprps.getEffectiveMaxShield()) pprps.shield = pprps.getEffectiveMaxShield(); - props.serialize(buf); - pprps.serialize(buf); - PacketDispatcher.wrapper.sendTo(new ExtPropPacket(buf), (EntityPlayerMP) entity); - buf.release(); + PacketThreading.createSendToThreadedPacket(new ExtPropPacket(props, pprps), (EntityPlayerMP) entity); } if(!entity.worldObj.isRemote) { diff --git a/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java b/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java index e09d50209..b63c54b56 100644 --- a/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java +++ b/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java @@ -5,12 +5,14 @@ import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; import com.hbm.config.RadiationConfig; +import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.AuxParticlePacket; +import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; @@ -25,31 +27,31 @@ import net.minecraftforge.event.world.WorldEvent; * @author hbm */ public class ChunkRadiationHandlerSimple extends ChunkRadiationHandler { - + private HashMap perWorld = new HashMap(); private static final float maxRad = 100_000F; @Override public float getRadiation(World world, int x, int y, int z) { SimpleRadiationPerWorld radWorld = perWorld.get(world); - + if(radWorld != null) { ChunkCoordIntPair coords = new ChunkCoordIntPair(x >> 4, z >> 4); Float rad = radWorld.radiation.get(coords); return rad == null ? 0F : MathHelper.clamp_float(rad, 0, maxRad); } - + return 0; } @Override public void setRadiation(World world, int x, int y, int z, float rad) { SimpleRadiationPerWorld radWorld = perWorld.get(world); - + if(radWorld != null) { - + if(world.blockExists(x, 0, z)) { - + ChunkCoordIntPair coords = new ChunkCoordIntPair(x >> 4, z >> 4); radWorld.radiation.put(coords, MathHelper.clamp_float(rad, 0, maxRad)); world.getChunkFromBlockCoords(x, z).isModified = true; @@ -69,28 +71,28 @@ public class ChunkRadiationHandlerSimple extends ChunkRadiationHandler { @Override public void updateSystem() { - + for(Entry entry : perWorld.entrySet()) { - + HashMap radiation = entry.getValue().radiation; HashMap buff = new HashMap(radiation); radiation.clear(); World world = entry.getKey(); - + for(Entry chunk : buff.entrySet()) { - + if(chunk.getValue() == 0) continue; - + ChunkCoordIntPair coord = chunk.getKey(); - + for(int i = -1; i <= 1; i++) { for(int j = -1; j<= 1; j++) { - + int type = Math.abs(i) + Math.abs(j); float percent = type == 0 ? 0.6F : type == 1 ? 0.075F : 0.025F; ChunkCoordIntPair newCoord = new ChunkCoordIntPair(coord.chunkXPos + i, coord.chunkZPos + j); - + if(buff.containsKey(newCoord)) { Float val = radiation.get(newCoord); float rad = val == null ? 0 : val; @@ -100,15 +102,20 @@ public class ChunkRadiationHandlerSimple extends ChunkRadiationHandler { } else { radiation.put(newCoord, chunk.getValue() * percent); } - + float rad = radiation.get(newCoord); if(rad > RadiationConfig.fogRad && world != null && world.rand.nextInt(RadiationConfig.fogCh) == 0 && world.getChunkProvider().chunkExists(coord.chunkXPos, coord.chunkZPos)) { - + int x = coord.chunkXPos * 16 + world.rand.nextInt(16); int z = coord.chunkZPos * 16 + world.rand.nextInt(16); int y = world.getHeightValue(x, z) + world.rand.nextInt(5); - - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacket(x, y, z, 3), new TargetPoint(world.provider.dimensionId, x, y, z, 100)); + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "radFog"); + data.setDouble("posX", x); + data.setDouble("posY", y); + data.setDouble("posZ", z); + MainRegistry.proxy.effectNT(data); } } } @@ -119,7 +126,7 @@ public class ChunkRadiationHandlerSimple extends ChunkRadiationHandler { @Override public void clearSystem(World world) { SimpleRadiationPerWorld radWorld = perWorld.get(world); - + if(radWorld != null) { radWorld.radiation.clear(); } @@ -136,15 +143,15 @@ public class ChunkRadiationHandlerSimple extends ChunkRadiationHandler { if(!event.world.isRemote) perWorld.remove(event.world); } - + private static final String NBT_KEY_CHUNK_RADIATION = "hfr_simple_radiation"; @Override public void receiveChunkLoad(ChunkDataEvent.Load event) { - + if(!event.world.isRemote) { SimpleRadiationPerWorld radWorld = perWorld.get(event.world); - + if(radWorld != null) { radWorld.radiation.put(event.getChunk().getChunkCoordIntPair(), event.getData().getFloat(NBT_KEY_CHUNK_RADIATION)); } @@ -153,10 +160,10 @@ public class ChunkRadiationHandlerSimple extends ChunkRadiationHandler { @Override public void receiveChunkSave(ChunkDataEvent.Save event) { - + if(!event.world.isRemote) { SimpleRadiationPerWorld radWorld = perWorld.get(event.world); - + if(radWorld != null) { Float val = radWorld.radiation.get(event.getChunk().getChunkCoordIntPair()); float rad = val == null ? 0F : val; @@ -167,74 +174,74 @@ public class ChunkRadiationHandlerSimple extends ChunkRadiationHandler { @Override public void receiveChunkUnload(ChunkEvent.Unload event) { - + if(!event.world.isRemote) { SimpleRadiationPerWorld radWorld = perWorld.get(event.world); - + if(radWorld != null) { radWorld.radiation.remove(event.getChunk()); } } } - + public static class SimpleRadiationPerWorld { - + public HashMap radiation = new HashMap(); } - + @Override public void handleWorldDestruction() { - + int count = 10; int threshold = 10; int chunks = 5; - + //for all worlds for(Entry per : perWorld.entrySet()) { - + World world = per.getKey(); SimpleRadiationPerWorld list = per.getValue(); - + Object[] entries = list.radiation.entrySet().toArray(); - + if(entries.length == 0) continue; - + //chose this many random chunks for(int c = 0; c < chunks; c++) { - + Entry randEnt = (Entry) entries[world.rand.nextInt(entries.length)]; - + ChunkCoordIntPair coords = randEnt.getKey(); WorldServer serv = (WorldServer) world; ChunkProviderServer provider = (ChunkProviderServer) serv.getChunkProvider(); - + //choose this many random locations within the chunk for(int i = 0; i < count; i++) { - + if(randEnt == null || randEnt.getValue() < threshold) continue; - + if(provider.chunkExists(coords.chunkXPos, coords.chunkZPos)) { - + for(int a = 0; a < 16; a++) { for(int b = 0; b < 16; b++) { - + if(world.rand.nextInt(3) != 0) continue; - + int x = coords.getCenterXPos() - 8 + a; int z = coords.getCenterZPosition() - 8 + b; int y = world.getHeightValue(x, z) - world.rand.nextInt(2); - + if(world.getBlock(x, y, z) == Blocks.grass) { world.setBlock(x, y, z, ModBlocks.waste_earth); - + } else if(world.getBlock(x, y, z) == Blocks.tallgrass) { world.setBlock(x, y, z, Blocks.air); - + } else if(world.getBlock(x, y, z).getMaterial() == Material.leaves && !(world.getBlock(x, y, z) == ModBlocks.waste_leaves)) { - + if(world.rand.nextInt(7) <= 5) { world.setBlock(x, y, z, ModBlocks.waste_leaves); } else { diff --git a/src/main/java/com/hbm/handler/threading/PacketThreading.java b/src/main/java/com/hbm/handler/threading/PacketThreading.java index 438481d52..18c5fda01 100644 --- a/src/main/java/com/hbm/handler/threading/PacketThreading.java +++ b/src/main/java/com/hbm/handler/threading/PacketThreading.java @@ -7,6 +7,7 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.packet.PrecompiledPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.simpleimpl.IMessage; +import net.minecraft.entity.player.EntityPlayerMP; import java.util.ArrayList; import java.util.List; @@ -71,7 +72,6 @@ public class PacketThreading { // `message` can be precompiled or not. if(message instanceof PrecompiledPacket) ((PrecompiledPacket) message).getPreBuf(); // Gets the precompiled buffer, doing nothing if it already exists. - totalCnt++; Runnable task = () -> { @@ -88,6 +88,31 @@ public class PacketThreading { addTask(task); } + /** + * Adds a packet to the thread pool to be processed in the future. This is only compatible with the `sendTo` dispatch operation. + * + * @param message Message to process. + * @param player PlayerMP to send to. + */ + public static void createSendToThreadedPacket(IMessage message, EntityPlayerMP player) { + if(message instanceof PrecompiledPacket) + ((PrecompiledPacket) message).getPreBuf(); + totalCnt++; + + Runnable task = () -> { + try { + lock.lock(); + PacketDispatcher.wrapper.sendTo(message, player); + if (message instanceof PrecompiledPacket) + ((PrecompiledPacket) message).getPreBuf().release(); + } finally { + lock.unlock(); + } + }; + + addTask(task); + } + private static void addTask(Runnable task) { if(isTriggered()) task.run(); @@ -107,7 +132,7 @@ public class PacketThreading { for (Future future : futureList) { nanoTimeWaited = System.nanoTime() - startTime; future.get(50, TimeUnit.MILLISECONDS); // I HATE EVERYTHING - if(TimeUnit.NANOSECONDS.convert(nanoTimeWaited, TimeUnit.MILLISECONDS) > 50) throw new TimeoutException(); // >50ms total time? timeout? yes sir, ooh rah! + if(TimeUnit.MILLISECONDS.convert(nanoTimeWaited, TimeUnit.NANOSECONDS) > 50) throw new TimeoutException(); // >50ms total time? timeout? yes sir, ooh rah! } } } catch (ExecutionException ignored) { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 351b1376f..592722535 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -836,80 +836,6 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.missile_custom, new ItemRenderMissile()); } - @Deprecated - @Override - public void particleControl(double x, double y, double z, int type) { - - - World world = Minecraft.getMinecraft().theWorld; - TextureManager man = Minecraft.getMinecraft().renderEngine; - - switch(type) { - case 0: - - for(int i = 0; i < 10; i++) { - EntityCloudFX smoke = new EntityCloudFX(world, x + world.rand.nextGaussian(), y + world.rand.nextGaussian(), z + world.rand.nextGaussian(), 0.0, 0.0, 0.0); - Minecraft.getMinecraft().effectRenderer.addEffect(smoke); - } - break; - - case 1: - - EntityCloudFX smoke = new EntityCloudFX(world, x, y, z, 0.0, 0.1, 0.0); - Minecraft.getMinecraft().effectRenderer.addEffect(smoke); - break; - - case 2: - - ParticleContrail contrail = new ParticleContrail(man, world, x, y, z); - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); - break; - - case 3: - - ParticleRadiationFog fog = new ParticleRadiationFog(man, world, x, y, z); - Minecraft.getMinecraft().effectRenderer.addEffect(fog); - break; - } - } - - //version 2, now with strings! - @Deprecated - @Override - public void spawnParticle(double x, double y, double z, String type, float args[]) { - - World world = Minecraft.getMinecraft().theWorld; - TextureManager man = Minecraft.getMinecraft().renderEngine; - - if("launchsmoke".equals(type) && args.length == 3) { - ParticleSmokePlume contrail = new ParticleSmokePlume(man, world, x, y, z); - contrail.motionX = args[0]; - contrail.motionY = args[1]; - contrail.motionZ = args[2]; - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); - } - if("exKerosene".equals(type)) { - ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0F, 0F, 0F, 1F); - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); - } - if("exSolid".equals(type)) { - ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0.3F, 0.2F, 0.05F, 1F); - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); - } - if("exHydrogen".equals(type)) { - ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0.7F, 0.7F, 0.7F, 1F); - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); - } - if("exBalefire".equals(type)) { - ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0.2F, 0.7F, 0.2F, 1F); - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); - } - if("radSmoke".equals(type)) { - ParticleRadiationFog contrail = new ParticleRadiationFog(man, world, x, y, z); - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); - } - } - //mk3, only use this one @Override public void effectNT(NBTTagCompound data) { @@ -933,6 +859,64 @@ public class ClientProxy extends ServerProxy { return; } + // Old MK1 system ported to MK3: + + if("waterSplash".equals(type)) { + for (int i = 0; i < 10; i++) { + EntityCloudFX smoke = new EntityCloudFX(world, x + world.rand.nextGaussian(), y + world.rand.nextGaussian(), z + world.rand.nextGaussian(), 0.0, 0.0, 0.0); + Minecraft.getMinecraft().effectRenderer.addEffect(smoke); + } + } + + if("cloudFX2".equals(type)) { // i have genuinely no idea what used this + EntityCloudFX smoke = new EntityCloudFX(world, x, y, z, 0.0, 0.1, 0.0); + Minecraft.getMinecraft().effectRenderer.addEffect(smoke); + } + + if("ABMContrail".equals(type)) { + ParticleContrail contrail = new ParticleContrail(man, world, x, y, z); + Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + } + + // End MK1 porting. + + // Old MK2 system ported to MK3: + + if("launchSmoke".equals(type)) { + ParticleSmokePlume contrail = new ParticleSmokePlume(man, world, x, y, z); + contrail.motionX = data.getDouble("moX"); + contrail.motionY = data.getDouble("moY"); + contrail.motionZ = data.getDouble("moZ"); + Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + } + + if("exKerosene".equals(type)) { + ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0F, 0F, 0F, 1F); + Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + } + + if("exSolid".equals(type)) { + ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0.3F, 0.2F, 0.05F, 1F); + Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + } + + if("exHydrogen".equals(type)) { + ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0.7F, 0.7F, 0.7F, 1F); + Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + } + + if("exBalefire".equals(type)) { + ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0.2F, 0.7F, 0.2F, 1F); + Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + } + + if("radFog".equals(type)) { + ParticleRadiationFog contrail = new ParticleRadiationFog(man, world, x, y, z); + Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + } + + // End MK2 porting. + if("missileContrail".equals(type)) { if(Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector() > 350) return; diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index 829e46a7a..25f965437 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -37,8 +37,6 @@ public class ServerProxy { public void registerGunCfg() { } public void handleNHNEICompat() { } - public void particleControl(double x, double y, double z, int type) { } - public void spawnParticle(double x, double y, double z, String type, float[] args) { } public void effectNT(NBTTagCompound data) { } diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 762d5482f..7509d411d 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -18,12 +18,8 @@ public class PacketDispatcher { public static void registerPackets() { int i = 0; - //Sound packet that keeps client and server separated - wrapper.registerMessage(LoopedSoundPacket.Handler.class, LoopedSoundPacket.class, i++, Side.CLIENT); //Signals server to consume items and create template wrapper.registerMessage(ItemFolderPacket.Handler.class, ItemFolderPacket.class, i++, Side.SERVER); - //Electricity gauge for GUI rendering - wrapper.registerMessage(AuxElectricityPacket.Handler.class, AuxElectricityPacket.class, i++, Side.CLIENT); //Siren packet for looped sounds wrapper.registerMessage(TESirenPacket.Handler.class, TESirenPacket.class, i++, Side.CLIENT); //Signals server to change ItemStacks @@ -44,8 +40,6 @@ public class PacketDispatcher { wrapper.registerMessage(TEFFPacket.Handler.class, TEFFPacket.class, i++, Side.CLIENT); //Sends button information for ItemGunBase wrapper.registerMessage(GunButtonPacket.Handler.class, GunButtonPacket.class, i++, Side.SERVER); - //Packet to send block break particles - wrapper.registerMessage(AuxParticlePacket.Handler.class, AuxParticlePacket.class, i++, Side.CLIENT); //Signals server to buy offer from bobmazon wrapper.registerMessage(ItemBobmazonPacket.Handler.class, ItemBobmazonPacket.class, i++, Side.SERVER); //Packet to send missile multipart information to TEs @@ -76,12 +70,8 @@ public class PacketDispatcher { wrapper.registerMessage(PermaSyncPacket.Handler.class, PermaSyncPacket.class, i++, Side.CLIENT); //Syncs biome information for single positions or entire chunks wrapper.registerMessage(BiomeSyncPacket.Handler.class, BiomeSyncPacket.class, i++, Side.CLIENT); - - //Tile sync - wrapper.registerMessage(AuxGaugePacket.Handler.class, AuxGaugePacket.class, i++, Side.CLIENT); //The horrid one - // fucking DIE - //wrapper.registerMessage(NBTPacket.Handler.class, NBTPacket.class, i++, Side.CLIENT); //The convenient but laggy one - wrapper.registerMessage(BufPacket.Handler.class, BufPacket.class, i++, Side.CLIENT); //The not-so-convenient but not laggy one + //The not-so-convenient but not laggy one + wrapper.registerMessage(BufPacket.Handler.class, BufPacket.class, i++, Side.CLIENT); } } diff --git a/src/main/java/com/hbm/packet/toclient/AuxElectricityPacket.java b/src/main/java/com/hbm/packet/toclient/AuxElectricityPacket.java deleted file mode 100644 index 571f925ce..000000000 --- a/src/main/java/com/hbm/packet/toclient/AuxElectricityPacket.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.hbm.packet.toclient; - -import api.hbm.energymk2.IEnergyHandlerMK2; -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; - -@Deprecated //use the NBT packet instead -public class AuxElectricityPacket implements IMessage { - - int x; - int y; - int z; - long charge; - - public AuxElectricityPacket() - { - - } - - public AuxElectricityPacket(int x, int y, int z, long charge) - { - this.x = x; - this.y = y; - this.z = z; - this.charge = charge; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - charge = buf.readLong(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeLong(charge); - } - - public static class Handler implements IMessageHandler { - - @Override - @SideOnly(Side.CLIENT) - public IMessage onMessage(AuxElectricityPacket m, MessageContext ctx) { - try { - TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - - if (te instanceof IEnergyHandlerMK2) { - - IEnergyHandlerMK2 gen = (IEnergyHandlerMK2) te; - gen.setPower(m.charge); - } - } catch (Exception x) { } - return null; - } - } -} diff --git a/src/main/java/com/hbm/packet/toclient/AuxGaugePacket.java b/src/main/java/com/hbm/packet/toclient/AuxGaugePacket.java deleted file mode 100644 index 190a7f4b4..000000000 --- a/src/main/java/com/hbm/packet/toclient/AuxGaugePacket.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.hbm.packet.toclient; - -import com.hbm.interfaces.Spaghetti; -import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; -import com.hbm.tileentity.TileEntityMachineBase; -import com.hbm.tileentity.bomb.TileEntityCompactLauncher; -import com.hbm.tileentity.bomb.TileEntityLaunchTable; -import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; - -@Spaghetti("Changing all machines to use TileEntityMachineBase will reduce the total chaos in this class") -@Deprecated //use the NBT packet instead -public class AuxGaugePacket implements IMessage { - - int x; - int y; - int z; - int value; - int id; - - public AuxGaugePacket() - { - - } - - public AuxGaugePacket(int x, int y, int z, int value, int id) - { - this.x = x; - this.y = y; - this.z = z; - this.value = value; - this.id = id; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - value = buf.readInt(); - id = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeInt(value); - buf.writeInt(id); - } - - public static class Handler implements IMessageHandler { - - @Override - @SideOnly(Side.CLIENT) - public IMessage onMessage(AuxGaugePacket m, MessageContext ctx) { - try { - TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - if (te instanceof TileEntityMachineArcFurnace) { - TileEntityMachineArcFurnace furn = (TileEntityMachineArcFurnace)te; - - if(m.id == 0) - furn.dualCookTime = m.value; - } - if (te instanceof TileEntityCompactLauncher) { - TileEntityCompactLauncher launcher = (TileEntityCompactLauncher)te; - - launcher.solid = m.value; - } - if (te instanceof TileEntityLaunchTable) { - TileEntityLaunchTable launcher = (TileEntityLaunchTable)te; - - if(m.id == 0) - launcher.solid = m.value; - if(m.id == 1) - launcher.padSize = PartSize.values()[m.value]; - } - - if(te instanceof TileEntityMachineBase) { - ((TileEntityMachineBase)te).processGauge(m.value, m.id); - } - - } catch (Exception x) {} - return null; - } - } -} diff --git a/src/main/java/com/hbm/packet/toclient/AuxParticlePacket.java b/src/main/java/com/hbm/packet/toclient/AuxParticlePacket.java deleted file mode 100644 index 317e121c0..000000000 --- a/src/main/java/com/hbm/packet/toclient/AuxParticlePacket.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.hbm.packet.toclient; - -import com.hbm.main.MainRegistry; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import io.netty.buffer.ByteBuf; - -public class AuxParticlePacket implements IMessage { - - double x; - double y; - double z; - int type; - - public AuxParticlePacket() - { - - } - - public AuxParticlePacket(double x, double y, double z, int type) - { - this.x = x; - this.y = y; - this.z = z; - this.type = type; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readDouble(); - y = buf.readDouble(); - z = buf.readDouble(); - type = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeDouble(x); - buf.writeDouble(y); - buf.writeDouble(z); - buf.writeInt(type); - } - - public static class Handler implements IMessageHandler { - - @Override - public IMessage onMessage(AuxParticlePacket m, MessageContext ctx) { - - try { - - MainRegistry.proxy.particleControl(m.x, m.y, m.z, m.type); - - } catch(Exception x) { } - - return null; - } - } -} diff --git a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java index 70ab279ba..97ac8016a 100644 --- a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java @@ -3,44 +3,37 @@ package com.hbm.packet.toclient; import com.hbm.extprop.HbmLivingProps; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.packet.PrecompiledPacket; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; -import net.minecraft.network.PacketBuffer; -public class ExtPropPacket implements IMessage { +public class ExtPropPacket extends PrecompiledPacket { - ByteBuf buffer; + HbmLivingProps props; + HbmPlayerProps pprps; + ByteBuf buf; public ExtPropPacket() { } - public ExtPropPacket(ByteBuf buf) { - - this.buffer = Unpooled.buffer(); - buffer.writeBytes(buf); + public ExtPropPacket(HbmLivingProps props, HbmPlayerProps pprps) { + this.props = props; + this.pprps = pprps; } @Override public void fromBytes(ByteBuf buf) { - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buffer.writeBytes(buf); + this.buf = buf; } @Override public void toBytes(ByteBuf buf) { - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buf.writeBytes(buffer); + props.serialize(buf); + pprps.serialize(buf); } public static class Handler implements IMessageHandler { @@ -55,10 +48,10 @@ public class ExtPropPacket implements IMessage { HbmLivingProps props = HbmLivingProps.getData(Minecraft.getMinecraft().thePlayer); HbmPlayerProps pprps = HbmPlayerProps.getData(Minecraft.getMinecraft().thePlayer); - props.deserialize(m.buffer); - pprps.deserialize(m.buffer); + props.deserialize(m.buf); + pprps.deserialize(m.buf); - m.buffer.release(); + m.buf.release(); return null; } diff --git a/src/main/java/com/hbm/packet/toclient/LoopedSoundPacket.java b/src/main/java/com/hbm/packet/toclient/LoopedSoundPacket.java deleted file mode 100644 index 5533245d1..000000000 --- a/src/main/java/com/hbm/packet/toclient/LoopedSoundPacket.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.hbm.packet.toclient; - -import com.hbm.interfaces.Spaghetti; -import com.hbm.sound.*; -import com.hbm.tileentity.machine.*; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -@Spaghetti("this class should be destroyed") -public class LoopedSoundPacket implements IMessage { - - int x; - int y; - int z; - - public LoopedSoundPacket() - { - - } - - public LoopedSoundPacket(int x, int y, int z) - { - this.x = x; - this.y = y; - this.z = z; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - } - - public static class Handler implements IMessageHandler { - - @Override - //Tamaized, I love you! - @SideOnly(Side.CLIENT) - public IMessage onMessage(LoopedSoundPacket m, MessageContext ctx) { - TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - - if (te != null && te instanceof TileEntityMachineAssembler) { - - boolean flag = true; - for(int i = 0; i < SoundLoopAssembler.list.size(); i++) { - if(SoundLoopAssembler.list.get(i).getTE() == te && !SoundLoopAssembler.list.get(i).isDonePlaying()) - flag = false; - } - - if(flag && te.getWorldObj().isRemote && ((TileEntityMachineAssembler)te).isProgressing) - Minecraft.getMinecraft().getSoundHandler().playSound(new SoundLoopAssembler(new ResourceLocation("hbm:block.assemblerOperate"), te)); - } - - if (te != null && te instanceof TileEntityMachineTurbofan) { - - boolean flag = true; - for(int i = 0; i < SoundLoopTurbofan.list.size(); i++) { - if(SoundLoopTurbofan.list.get(i).getTE() == te && !SoundLoopTurbofan.list.get(i).isDonePlaying()) - flag = false; - } - - if(flag && te.getWorldObj().isRemote && ((TileEntityMachineTurbofan)te).wasOn) - Minecraft.getMinecraft().getSoundHandler().playSound(new SoundLoopTurbofan(new ResourceLocation("hbm:block.turbofanOperate"), te)); - } - - if (te != null && te instanceof TileEntityBroadcaster) { - - boolean flag = true; - for(int i = 0; i < SoundLoopBroadcaster.list.size(); i++) { - if(SoundLoopBroadcaster.list.get(i).getTE() == te && !SoundLoopBroadcaster.list.get(i).isDonePlaying()) - flag = false; - } - - int j = te.xCoord + te.zCoord + te.yCoord; - - if(flag && te.getWorldObj().isRemote) - Minecraft.getMinecraft().getSoundHandler().playSound(new SoundLoopBroadcaster(new ResourceLocation("hbm:block.broadcast" + (Math.abs(j) % 3 + 1)), te)); - } - - if (te != null && te instanceof TileEntityMachineCentrifuge) { - - boolean flag = true; - for(int i = 0; i < SoundLoopCentrifuge.list.size(); i++) { - if(SoundLoopCentrifuge.list.get(i).getTE() == te && !SoundLoopCentrifuge.list.get(i).isDonePlaying()) - flag = false; - } - - if(flag && te.getWorldObj().isRemote && ((TileEntityMachineCentrifuge)te).isProgressing) - Minecraft.getMinecraft().getSoundHandler().playSound(new SoundLoopCentrifuge(new ResourceLocation("hbm:block.centrifugeOperate"), te)); - } - - if (te != null && te instanceof TileEntityMachineGasCent) { - - boolean flag = true; - for(int i = 0; i < SoundLoopCentrifuge.list.size(); i++) { - if(SoundLoopCentrifuge.list.get(i).getTE() == te && !SoundLoopCentrifuge.list.get(i).isDonePlaying()) - flag = false; - } - - if(flag && te.getWorldObj().isRemote && ((TileEntityMachineGasCent)te).isProgressing) - Minecraft.getMinecraft().getSoundHandler().playSound(new SoundLoopCentrifuge(new ResourceLocation("hbm:block.centrifugeOperate"), te)); - } - return null; - } - } -} diff --git a/src/main/java/com/hbm/sound/SoundLoopAssembler.java b/src/main/java/com/hbm/sound/SoundLoopAssembler.java deleted file mode 100644 index c69ea40c6..000000000 --- a/src/main/java/com/hbm/sound/SoundLoopAssembler.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.hbm.sound; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.tileentity.machine.TileEntityMachineAssembler; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -public class SoundLoopAssembler extends SoundLoopMachine { - - public static List list = new ArrayList(); - - public SoundLoopAssembler(ResourceLocation path, TileEntity te) { - super(path, te); - list.add(this); - } - - @Override - public void update() { - super.update(); - - if(te instanceof TileEntityMachineAssembler) { - TileEntityMachineAssembler drill = (TileEntityMachineAssembler)te; - - if(this.volume != 3) - volume = 3; - - if(!drill.isProgressing) - this.donePlaying = true; - } - } - - public TileEntity getTE() { - return te; - } - -} diff --git a/src/main/java/com/hbm/sound/SoundLoopBroadcaster.java b/src/main/java/com/hbm/sound/SoundLoopBroadcaster.java deleted file mode 100644 index 3b00039a5..000000000 --- a/src/main/java/com/hbm/sound/SoundLoopBroadcaster.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.hbm.sound; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.tileentity.machine.TileEntityBroadcaster; -import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.ISound; -import net.minecraft.client.entity.EntityClientPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -public class SoundLoopBroadcaster extends SoundLoopMachine { - - public static List list = new ArrayList(); - public float intendedVolume = 25.0F; - - public SoundLoopBroadcaster(ResourceLocation path, TileEntity te) { - super(path, te); - list.add(this); - this.field_147666_i = ISound.AttenuationType.NONE; - } - - @Override - public void update() { - super.update(); - - EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; - float f = 0; - - if(player != null) { - f = (float)Math.sqrt(Math.pow(xPosF - player.posX, 2) + Math.pow(yPosF - player.posY, 2) + Math.pow(zPosF - player.posZ, 2)); - volume = func(f, intendedVolume); - - if(!(player.worldObj.getTileEntity((int)xPosF, (int)yPosF, (int)zPosF) instanceof TileEntityBroadcaster)) { - this.donePlaying = true; - volume = 0; - } - } else { - volume = intendedVolume; - } - } - - public TileEntity getTE() { - return te; - } - - public float func(float f, float v) { - return (f / v) * -2 + 2; - } - -} diff --git a/src/main/java/com/hbm/sound/SoundLoopCentrifuge.java b/src/main/java/com/hbm/sound/SoundLoopCentrifuge.java deleted file mode 100644 index 2989ddf9c..000000000 --- a/src/main/java/com/hbm/sound/SoundLoopCentrifuge.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hbm.sound; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.tileentity.machine.TileEntityMachineCentrifuge; -import com.hbm.tileentity.machine.TileEntityMachineGasCent; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -public class SoundLoopCentrifuge extends SoundLoopMachine { - - public static List list = new ArrayList(); - - public SoundLoopCentrifuge(ResourceLocation path, TileEntity te) { - super(path, te); - list.add(this); - } - - @Override - public void update() { - super.update(); - - if(te instanceof TileEntityMachineCentrifuge) { - TileEntityMachineCentrifuge plant = (TileEntityMachineCentrifuge)te; - - if(this.volume != 1) - volume = 1; - - if(!plant.isProgressing) - this.donePlaying = true; - } - - if(te instanceof TileEntityMachineGasCent) { - TileEntityMachineGasCent plant = (TileEntityMachineGasCent)te; - - if(this.volume != 1) - volume = 1; - - if(!plant.isProgressing) - this.donePlaying = true; - } - - if(!Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(this)) { - stop(); - } - } - - public TileEntity getTE() { - return te; - } - -} diff --git a/src/main/java/com/hbm/sound/SoundLoopTurbofan.java b/src/main/java/com/hbm/sound/SoundLoopTurbofan.java deleted file mode 100644 index 4b08d0471..000000000 --- a/src/main/java/com/hbm/sound/SoundLoopTurbofan.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.hbm.sound; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.tileentity.machine.TileEntityMachineTurbofan; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -public class SoundLoopTurbofan extends SoundLoopMachine { - - public static List list = new ArrayList(); - - public SoundLoopTurbofan(ResourceLocation path, TileEntity te) { - super(path, te); - list.add(this); - } - - @Override - public void update() { - super.update(); - - if(te instanceof TileEntityMachineTurbofan) { - TileEntityMachineTurbofan drill = (TileEntityMachineTurbofan)te; - - if(this.volume != 10) - volume = 10; - - if(!drill.wasOn) - this.donePlaying = true; - } - } - - public TileEntity getTE() { - return te; - } - -} diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 7fecf29d5..e38bf2f63 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -1,10 +1,7 @@ package com.hbm.tileentity; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.AuxGaugePacket; import com.hbm.util.fauxpointtwelve.DirPos; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; @@ -147,11 +144,6 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme @Override public abstract void updateEntity(); - @Deprecated public void updateGauge(int val, int id, int range) { - if(!worldObj.isRemote) PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, val, id), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } - @Deprecated public void processGauge(int val, int id) { } - @Deprecated public void handleButtonPacket(int value, int meta) { } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index d724c833e..12dd8bab2 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -220,7 +220,15 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I float moX = (float) (dir ? 0 : worldObj.rand.nextGaussian() * 0.5F); float moZ = (float) (!dir ? 0 : worldObj.rand.nextGaussian() * 0.5F); - MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("posX", xCoord + 0.5); + data.setDouble("posY", yCoord + 0.25); + data.setDouble("posZ", zCoord + 0.5); + data.setString("type", "launchSmoke"); + data.setDouble("moX", moX); + data.setDouble("moY", 0); + data.setDouble("moZ", moZ); + MainRegistry.proxy.effectNT(data); } break; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java index 0adf91ab8..11650a3ff 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java @@ -18,16 +18,16 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase { @Override public boolean isReadyForLaunch() { return delay <= 0; } @Override public double getLaunchOffset() { return 1D; } - + public int delay = 0; @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(this.delay > 0) delay--; - + if(!this.isMissileValid() || !this.hasFuel()) { this.delay = 100; } @@ -41,11 +41,11 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase { this.state = this.STATE_READY; } } - + } else { - + List entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); - + if(!entities.isEmpty()) { for(int i = 0; i < 15; i++) { @@ -54,12 +54,20 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase { if(worldObj.rand.nextBoolean()) dir = dir.getRotation(ForgeDirection.UP); float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX; float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ; - - MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("posX", xCoord + 0.5); + data.setDouble("posY", yCoord + 0.25); + data.setDouble("posZ", zCoord + 0.5); + data.setString("type", "launchSmoke"); + data.setDouble("moX", moX); + data.setDouble("moY", 0); + data.setDouble("moZ", moZ); + MainRegistry.proxy.effectNT(data); } } } - + super.updateEntity(); } @@ -68,7 +76,7 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase { super.finalizeLaunch(missile); this.delay = 100; } - + @Override public DirPos[] getConPos() { return new DirPos[] { @@ -82,24 +90,24 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase { new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.delay = nbt.getInteger("delay"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("delay", delay); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -110,10 +118,10 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase { zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java index 55a9dac77..ef3868d79 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java @@ -37,10 +37,10 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { private int sync; /** Delay between erector movements */ public int delay = 20; - + private AudioWrapper audioLift; private AudioWrapper audioErector; - + protected boolean liftMoving = false; protected boolean erectorMoving = false; @@ -49,26 +49,26 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.prevLift = this.lift; this.prevErector = this.erector; - + float erectorSpeed = 1.5F; float liftSpeed = 0.025F; - + if(this.isMissileValid()) { if(slots[0].getItem() instanceof ItemMissile) { ItemMissile missile = (ItemMissile) slots[0].getItem(); this.formFactor = missile.formFactor.ordinal(); - + if(missile.formFactor == MissileFormFactor.ATLAS || missile.formFactor == MissileFormFactor.HUGE) { erectorSpeed /= 2F; liftSpeed /= 2F; } } - + if(this.erector == 90F && this.lift == 1F) { this.readyToLoad = true; } @@ -77,16 +77,16 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { erected = false; delay = 20; } - + if(this.power >= 75_000) { if(delay > 0) { delay--; - + if(delay < 10 && scheduleErect) { this.erected = true; this.scheduleErect = false; } - + // if there is no missile or the missile isn't ready (i.e. the erector hasn't returned to zero position yet), retract if(slots[0] == null || !readyToLoad) { //fold back erector @@ -103,13 +103,13 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { } } } - + } else { - + //only extend if the erector isn't up yet and the missile can be loaded if(!erected && readyToLoad) { this.state = this.STATE_LOADING; - + //first, rotate the erector if(erector != 0F) { erector = Math.max(erector - erectorSpeed, 0F); @@ -140,7 +140,7 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { } } } - + if(!this.hasFuel() || !this.isMissileValid()) this.state = this.STATE_MISSING; if(this.erected && this.canLaunch()) this.state = this.STATE_READY; @@ -153,11 +153,11 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { if(prevLiftMoving && !this.liftMoving) worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:door.wgh_stop", 2F, 1F); if(prevErectorMoving && !this.erectorMoving) worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:door.garage_stop", 2F, 1F); - + } else { this.prevLift = this.lift; this.prevErector = this.erector; - + if(this.sync > 0) { this.lift = this.lift + ((this.syncLift - this.lift) / (float) this.sync); this.erector = this.erector + ((this.syncErector - this.erector) / (float) this.sync); @@ -166,7 +166,7 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { this.lift = this.syncLift; this.erector = this.syncErector; } - + if(this.liftMoving) { if(this.audioLift == null || !this.audioLift.isPlaying()) { this.audioLift = MainRegistry.proxy.getLoopedSound("hbm:door.wgh_start", xCoord, yCoord, zCoord, 0.75F, 25F, 1.0F, 5); @@ -179,7 +179,7 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { this.audioLift = null; } } - + if(this.erectorMoving) { if(this.audioErector == null || !this.audioErector.isPlaying()) { this.audioErector = MainRegistry.proxy.getLoopedSound("hbm:door.garage_move", xCoord, yCoord, zCoord, 1.5F, 25F, 1.0F, 5); @@ -192,7 +192,7 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { this.audioErector = null; } } - + if(this.erected && (this.formFactor == MissileFormFactor.HUGE.ordinal() || this.formFactor == MissileFormFactor.ATLAS.ordinal()) && this.tanks[1].getFill() > 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -208,9 +208,9 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { data.setFloat("strafe", 0.05F); for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); } - + List entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); - + if(!entities.isEmpty()) { for(int i = 0; i < 15; i++) { @@ -218,19 +218,27 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { if(worldObj.rand.nextBoolean()) dir = dir.getOpposite(); float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX; float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ; - - MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("posX", xCoord + 0.5); + data.setDouble("posY", yCoord + 0.25); + data.setDouble("posZ", zCoord + 0.5); + data.setString("type", "launchSmoke"); + data.setDouble("moX", moX); + data.setDouble("moY", 0); + data.setDouble("moZ", moZ); + MainRegistry.proxy.effectNT(data); } } } - + super.updateEntity(); } @Override public void serialize(ByteBuf buf) { super.serialize(buf); - + buf.writeBoolean(this.liftMoving); buf.writeBoolean(this.erectorMoving); buf.writeBoolean(this.erected); @@ -239,7 +247,7 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { buf.writeFloat(this.lift); buf.writeFloat(this.erector); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -251,12 +259,12 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { this.formFactor = buf.readByte(); this.syncLift = buf.readFloat(); this.syncErector = buf.readFloat(); - + if(this.lift != this.syncLift || this.erector != this.syncErector) { this.sync = 3; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -267,7 +275,7 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { this.erector = nbt.getFloat("erector"); this.formFactor = nbt.getInteger("formFactor"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -284,7 +292,7 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { super.finalizeLaunch(missile); this.erected = false; } - + @Override public DirPos[] getConPos() { return new DirPos[] { @@ -298,12 +306,12 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { new DirPos(xCoord + 2, yCoord, zCoord - 5, Library.NEG_Z) }; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 10, @@ -314,10 +322,10 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { zCoord + 11 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java index 8137fa469..973a078da 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java @@ -35,9 +35,9 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements public int prevRedstonePower; public int redstonePower; public Set activatedBlocks = new HashSet<>(4); - + public boolean missileLoaded; - + public TileEntityLaunchPadRusted() { super(4); } @@ -49,19 +49,19 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(this.redstonePower > 0 && this.prevRedstonePower <= 0) { this.launch(); } - + this.prevRedstonePower = this.redstonePower; this.networkPackNT(250); } else { - + List entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); - + if(!entities.isEmpty()) { for(int i = 0; i < 15; i++) { @@ -70,8 +70,17 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements if(worldObj.rand.nextBoolean()) dir = dir.getRotation(ForgeDirection.UP); float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX; float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ; - - MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("posX", xCoord + 0.5); + data.setDouble("posY", yCoord + 0.25); + data.setDouble("posZ", zCoord + 0.5); + data.setString("type", "launchSmoke"); + data.setDouble("moX", moX); + data.setDouble("moY", 0); + data.setDouble("moZ", moZ); + MainRegistry.proxy.effectNT(data); + } } } @@ -82,7 +91,7 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements super.serialize(buf); buf.writeBoolean(this.missileLoaded); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -90,18 +99,18 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements } public BombReturnCode launch() { - + if(slots[1] != null && slots[2] != null && slots[3] != null && this.missileLoaded) { if(slots[1].getItem() == ModItems.launch_code && slots[2].getItem() == ModItems.launch_key) { if(slots[3] != null && slots[3].getItem() instanceof IDesignatorItem) { IDesignatorItem designator = (IDesignatorItem) slots[3].getItem(); - + if(!designator.isReady(worldObj, slots[3], xCoord, yCoord, zCoord)) return BombReturnCode.ERROR_MISSING_COMPONENT; - + Vec3 coords = designator.getCoords(worldObj, slots[3], xCoord, yCoord, zCoord); int targetX = (int) Math.floor(coords.xCoord); int targetZ = (int) Math.floor(coords.zCoord); - + EntityMissileDoomsdayRusted missile = new EntityMissileDoomsdayRusted(worldObj, xCoord + 0.5F, yCoord + 1F, zCoord + 0.5F, targetX, targetZ); worldObj.spawnEntityInWorld(missile); TrackerUtil.setTrackingRange(worldObj, missile, 500); @@ -109,19 +118,19 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements this.missileLoaded = false; this.decrStackSize(1, 1); this.markDirty(); - + return BombReturnCode.LAUNCHED; } } } - + return BombReturnCode.ERROR_MISSING_COMPONENT; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.missileLoaded = nbt.getBoolean("missileLoaded"); this.redstonePower = nbt.getInteger("redstonePower"); @@ -132,11 +141,11 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements this.activatedBlocks.add(new BlockPos(activatedBlocks.getInteger("x" + i), activatedBlocks.getInteger("y" + i), activatedBlocks.getInteger("z" + i))); } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setBoolean("missileLoaded", missileLoaded); nbt.setInteger("redstonePower", redstonePower); @@ -172,10 +181,10 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements } AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -186,10 +195,10 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index 053ae6eff..a5e49a870 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -226,7 +226,15 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide float moX = (float) (dir ? 0 : worldObj.rand.nextGaussian() * 0.65F); float moZ = (float) (!dir ? 0 : worldObj.rand.nextGaussian() * 0.65F); - MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("posX", xCoord + 0.5); + data.setDouble("posY", yCoord + 0.25); + data.setDouble("posZ", zCoord + 0.5); + data.setString("type", "launchSmoke"); + data.setDouble("moX", moX); + data.setDouble("moY", 0); + data.setDouble("moZ", moZ); + MainRegistry.proxy.effectNT(data); } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java index d22bd4150..5d52acb62 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityBlastDoor.java @@ -14,19 +14,19 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; public class TileEntityBlastDoor extends TileEntityLockableBase { - + public boolean isOpening = false; //0: closed, 1: opening/closing, 2:open public int state = 0; public long sysTime; private int timer = 0; public boolean redstoned = false; - + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() @@ -36,25 +36,25 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(!isLocked() && worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) || worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord + 6, zCoord)) { - + if(!redstoned) { this.tryToggle(); } redstoned = true; - + } else { redstoned = false; } - + if(state != 1) { timer = 0; } else { timer++; - + if(isOpening) { if(timer >= 0) { removeDummy(xCoord, yCoord + 1, zCoord); @@ -88,20 +88,20 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { placeDummy(xCoord, yCoord + 1, zCoord); } } - + if(timer >= 100) { - + if(isOpening) finishOpen(); else finishClose(); } } - + PacketDispatcher.wrapper.sendToAllAround(new TEVaultPacket(xCoord, yCoord, zCoord, isOpening, state, 0, 0), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); } } - + public void open() { if(state == 0) { PacketDispatcher.wrapper.sendToAllAround(new TEVaultPacket(xCoord, yCoord, zCoord, isOpening, state, 1, 0), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); @@ -112,17 +112,17 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { 0.75F); } } - + public void finishOpen() { state = 2; this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.reactorStop", 0.5F, 1.0F); } - + public void close() { if(state == 2) { - PacketDispatcher.wrapper.sendToAll(new TEVaultPacket(xCoord, yCoord, zCoord, isOpening, state, 1, 0)); + PacketDispatcher.wrapper.sendToAllAround(new TEVaultPacket(xCoord, yCoord, zCoord, isOpening, state, 1, 0), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); isOpening = false; state = 1; @@ -130,116 +130,116 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { 0.75F); } } - + public void finishClose() { state = 0; this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.reactorStop", 0.5F, 1.0F); } - + public void openNeigh() { TileEntity te0 = worldObj.getTileEntity(xCoord + 1, yCoord, zCoord); TileEntity te1 = worldObj.getTileEntity(xCoord - 1, yCoord, zCoord); TileEntity te2 = worldObj.getTileEntity(xCoord, yCoord, zCoord + 1); TileEntity te3 = worldObj.getTileEntity(xCoord, yCoord, zCoord - 1); - + if(te0 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te0).canOpen() && (!((TileEntityBlastDoor)te0).isLocked() || ((TileEntityBlastDoor)te0).lock == lock)) { ((TileEntityBlastDoor)te0).open(); ((TileEntityBlastDoor)te0).openNeigh(); } } - + if(te1 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te1).canOpen() && (!((TileEntityBlastDoor)te1).isLocked() || ((TileEntityBlastDoor)te1).lock == lock)) { ((TileEntityBlastDoor)te1).open(); ((TileEntityBlastDoor)te1).openNeigh(); } } - + if(te2 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te2).canOpen() && (!((TileEntityBlastDoor)te2).isLocked() || ((TileEntityBlastDoor)te2).lock == lock)) { ((TileEntityBlastDoor)te2).open(); ((TileEntityBlastDoor)te2).openNeigh(); } } - + if(te3 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te3).canOpen() && (!((TileEntityBlastDoor)te3).isLocked() || ((TileEntityBlastDoor)te3).lock == lock)) { ((TileEntityBlastDoor)te3).open(); ((TileEntityBlastDoor)te3).openNeigh(); } } } - + @Override public void lock() { super.lock(); lockNeigh(); } - + public void closeNeigh() { TileEntity te0 = worldObj.getTileEntity(xCoord + 1, yCoord, zCoord); TileEntity te1 = worldObj.getTileEntity(xCoord - 1, yCoord, zCoord); TileEntity te2 = worldObj.getTileEntity(xCoord, yCoord, zCoord + 1); TileEntity te3 = worldObj.getTileEntity(xCoord, yCoord, zCoord - 1); - + if(te0 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te0).canClose() && (!((TileEntityBlastDoor)te0).isLocked() || ((TileEntityBlastDoor)te0).lock == lock)) { ((TileEntityBlastDoor)te0).close(); ((TileEntityBlastDoor)te0).closeNeigh(); } } - + if(te1 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te1).canClose() && (!((TileEntityBlastDoor)te1).isLocked() || ((TileEntityBlastDoor)te1).lock == lock)) { ((TileEntityBlastDoor)te1).close(); ((TileEntityBlastDoor)te1).closeNeigh(); } } - + if(te2 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te2).canClose() && (!((TileEntityBlastDoor)te2).isLocked() || ((TileEntityBlastDoor)te2).lock == lock)) { ((TileEntityBlastDoor)te2).close(); ((TileEntityBlastDoor)te2).closeNeigh(); } } - + if(te3 instanceof TileEntityBlastDoor) { - + if(((TileEntityBlastDoor)te3).canClose() && (!((TileEntityBlastDoor)te3).isLocked() || ((TileEntityBlastDoor)te3).lock == lock)) { ((TileEntityBlastDoor)te3).close(); ((TileEntityBlastDoor)te3).closeNeigh(); } } } - + public void lockNeigh() { TileEntity te0 = worldObj.getTileEntity(xCoord + 1, yCoord, zCoord); TileEntity te1 = worldObj.getTileEntity(xCoord - 1, yCoord, zCoord); TileEntity te2 = worldObj.getTileEntity(xCoord, yCoord, zCoord + 1); TileEntity te3 = worldObj.getTileEntity(xCoord, yCoord, zCoord - 1); - + if(te0 instanceof TileEntityBlastDoor) { - + if(!((TileEntityBlastDoor)te0).isLocked()) { ((TileEntityBlastDoor)te0).setPins(this.lock); ((TileEntityBlastDoor)te0).lock(); ((TileEntityBlastDoor)te0).setMod(lockMod); } } - + if(te1 instanceof TileEntityBlastDoor) { if(!((TileEntityBlastDoor)te1).isLocked()) { @@ -248,7 +248,7 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { ((TileEntityBlastDoor)te1).setMod(lockMod); } } - + if(te2 instanceof TileEntityBlastDoor) { if(!((TileEntityBlastDoor)te2).isLocked()) { @@ -257,7 +257,7 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { ((TileEntityBlastDoor)te2).setMod(lockMod); } } - + if(te3 instanceof TileEntityBlastDoor) { if(!((TileEntityBlastDoor)te3).isLocked()) { @@ -267,15 +267,15 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { } } } - + public boolean canOpen() { return state == 0; } - + public boolean canClose() { return state == 2; } - + public void tryToggle() { if(canOpen()) { @@ -286,28 +286,28 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { closeNeigh(); } } - + public boolean placeDummy(int x, int y, int z) { - + if(!worldObj.getBlock(x, y, z).isReplaceable(worldObj, x, y, z)) return false; - + worldObj.setBlock(x, y, z, ModBlocks.dummy_block_blast); - + TileEntity te = worldObj.getTileEntity(x, y, z); - + if(te instanceof TileEntityDummy) { TileEntityDummy dummy = (TileEntityDummy)te; dummy.targetX = xCoord; dummy.targetY = yCoord; dummy.targetZ = zCoord; } - + return true; } - + public void removeDummy(int x, int y, int z) { - + if(worldObj.getBlock(x, y, z) == ModBlocks.dummy_block_blast) { DummyBlockBlast.safeBreak = true; worldObj.setBlock(x, y, z, Blocks.air); @@ -317,7 +317,7 @@ public class TileEntityBlastDoor extends TileEntityLockableBase { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + isOpening = nbt.getBoolean("isOpening"); state = nbt.getInteger("state"); sysTime = nbt.getLong("sysTime"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java index 744e3bab9..4cebc8174 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java @@ -1,14 +1,17 @@ package com.hbm.tileentity.machine; import java.util.List; +import java.util.Random; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.LoopedSoundPacket; +import com.hbm.main.MainRegistry; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.potion.Potion; @@ -16,23 +19,25 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -public class TileEntityBroadcaster extends TileEntity { - +public class TileEntityBroadcaster extends TileEntityLoadedBase { + + private AudioWrapper audio; + @Override public void updateEntity() { - + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, AxisAlignedBB.getBoundingBox(xCoord + 0.5 - 25, yCoord + 0.5 - 25, zCoord + 0.5 - 25, xCoord + 0.5 + 25, yCoord + 0.5 + 25, zCoord + 0.5 + 25)); - + for(int i = 0; i < list.size(); i++) { if(list.get(i) instanceof EntityLivingBase) { EntityLivingBase e = (EntityLivingBase)list.get(i); double d = Math.sqrt(Math.pow(e.posX - (xCoord + 0.5), 2) + Math.pow(e.posY - (yCoord + 0.5), 2) + Math.pow(e.posZ - (zCoord + 0.5), 2)); - + if(d <= 25) { if(e.getActivePotionEffect(Potion.confusion) == null || e.getActivePotionEffect(Potion.confusion).getDuration() < 100) e.addPotionEffect(new PotionEffect(Potion.confusion.id, 300, 0)); } - + if(d <= 15) { double t = (15 - d) / 15 * 10; e.attackEntityFrom(ModDamageSource.broadcast, (float) t); @@ -40,16 +45,59 @@ public class TileEntityBroadcaster extends TileEntity { } } - if(!worldObj.isRemote) { - PacketDispatcher.wrapper.sendToAllAround(new LoopedSoundPacket(xCoord, yCoord, zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + if (worldObj.isRemote) { + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + + int intendedVolume = 25; + + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + float volume; + if(player != null) { + float f = (float)Math.sqrt(Math.pow(xCoord - player.posX, 2) + Math.pow(yCoord - player.posY, 2) + Math.pow(zCoord - player.posZ, 2)); + volume = (f / intendedVolume) * -2 + 2; + } else { + volume = intendedVolume; + } + + audio.updateVolume(getVolume(volume)); + audio.keepAlive(); } } - + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + super.invalidate(); + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public AudioWrapper createAudioLoop() { + Random rand = new Random(xCoord + yCoord + zCoord); + return MainRegistry.proxy.getLoopedSound("hbm:block.broadcast" + (rand.nextInt(3) + 1), xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + } + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java index e2090764d..15a099436 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java @@ -6,18 +6,15 @@ import com.hbm.inventory.container.ContainerMachineArcFurnace; import com.hbm.inventory.gui.GUIMachineArcFurnace; import com.hbm.items.ModItems; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.AuxElectricityPacket; -import com.hbm.packet.toclient.AuxGaugePacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IInfoProviderEC; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ISidedInventory; @@ -31,12 +28,12 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements ISidedInventory, IEnergyReceiverMK2, IGUIProvider, IInfoProviderEC { private ItemStack slots[]; - + public int dualCookTime; public long power; public static final long maxPower = 50000; public static final int processingSpeed = 20; - + //0: i //1: o //2: 1 @@ -44,9 +41,9 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements //4: 3 //5: b private static final int[] slots_io = new int[] {0, 1, 2, 3, 4, 5}; - + private String customName; - + public TileEntityMachineArcFurnace() { slots = new ItemStack[6]; } @@ -91,7 +88,7 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @@ -110,7 +107,7 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; } } - + //You scrubs aren't needed for anything (right now) @Override public void openInventory() {} @@ -119,16 +116,16 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - + if(i == 2 || i == 3 || i == 4) return itemStack.getItem() == ModItems.arc_electrode; - + if(i == 0) return FurnaceRecipes.smelting().getSmeltingResult(itemStack) != null; - + return false; } - + @Override public ItemStack decrStackSize(int i, int j) { if(slots[i] != null) @@ -144,22 +141,22 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements { slots[i] = null; } - + return itemStack1; } else { return null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList list = nbt.getTagList("items", 10); - + this.power = nbt.getLong("powerTime"); this.dualCookTime = nbt.getInteger("cookTime"); slots = new ItemStack[getSizeInventory()]; - + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); @@ -170,14 +167,14 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements } } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setLong("powerTime", power); nbt.setInteger("cookTime", dualCookTime); NBTTagList list = new NBTTagList(); - + for(int i = 0; i < slots.length; i++) { if(slots[i] != null) @@ -190,7 +187,7 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements } nbt.setTag("items", list); } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return slots_io; @@ -203,87 +200,87 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { - + if(i == 1) return true; - + if(i == 2 || i == 3 || i == 4) return itemStack.getItem() == ModItems.arc_electrode_burnt; - + return false; } - + public int getDiFurnaceProgressScaled(int i) { return (dualCookTime * i) / processingSpeed; } - + public long getPowerRemainingScaled(long i) { return (power * i) / maxPower; } - + public boolean hasPower() { return power >= 250; } - + public boolean isProcessing() { return this.dualCookTime > 0; } - + private boolean hasElectrodes() { - + if(slots[2] != null && slots[3] != null && slots[4] != null) { if((slots[2].getItem() == ModItems.arc_electrode) && (slots[3].getItem() == ModItems.arc_electrode) && (slots[4].getItem() == ModItems.arc_electrode)) return true; } - + return false; } - + public boolean canProcess() { - + if(!hasElectrodes()) return false; - + if(slots[0] == null) { return false; } ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]); - + if(itemStack == null) { return false; } - + if(slots[1] == null) { return true; } - + if(!slots[1].isItemEqual(itemStack)) { return false; } - + if(slots[1].stackSize < getInventoryStackLimit() && slots[1].stackSize < slots[1].getMaxStackSize()) { return true; }else{ return slots[1].stackSize < itemStack.getMaxStackSize(); } } - + private void processItem() { if(canProcess()) { ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]); - + if(slots[1] == null) { slots[1] = itemStack.copy(); }else if(slots[1].isItemEqual(itemStack)) { slots[1].stackSize += itemStack.stackSize; } - + for(int i = 0; i < 1; i++) { if(slots[i].stackSize <= 0) @@ -299,26 +296,26 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements } } } - + //TODO: fix this punjabi trash @Override public void updateEntity() { boolean flag1 = false; - + if(!worldObj.isRemote) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - + if(hasPower() && canProcess()) { dualCookTime++; - + power -= 250; - + if(power < 0) power = 0; - + if(this.dualCookTime == processingSpeed) { this.dualCookTime = 0; @@ -328,22 +325,22 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements }else{ dualCookTime = 0; } - + boolean trigger = true; - + if(hasPower() && canProcess() && this.dualCookTime == 0) { trigger = false; } - + if(trigger) { flag1 = true; MachineArcFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); } - + if(worldObj.getBlock(xCoord, yCoord, zCoord) == ModBlocks.machine_arc_furnace_off) { - + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); if(hasElectrodes() && meta <= 5) { @@ -353,30 +350,42 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta - 4, 2); } } - + power = Library.chargeTEFromItems(slots, 5, power, maxPower); - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, dualCookTime, 0), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + networkPackNT(50); // it makes no sense to refactor this to some, but I want to delete the AuxElectricityPacket already } - - + if(flag1) { this.markDirty(); } } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + buf.writeInt(dualCookTime); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + power = buf.readLong(); + dualCookTime = buf.readInt(); + } + @Override public void setPower(long i) { power = i; - + } @Override public long getPower() { return power; - + } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index 384e252c7..62e76ae0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -11,8 +11,8 @@ import com.hbm.inventory.recipes.GasCentrifugeRecipes.PseudoFluidType; import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.LoopedSoundPacket; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.BufferUtil; @@ -23,7 +23,6 @@ import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -33,57 +32,61 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; //epic! public class TileEntityMachineGasCent extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IGUIProvider, IInfoProviderEC { - + public long power; public int progress; public boolean isProgressing; public static final int maxPower = 100000; public static final int processingSpeed = 150; - + public FluidTank tank; public PseudoFluidTank inputTank; public PseudoFluidTank outputTank; - + + private int audioDuration = 0; + private AudioWrapper audio; + private static final int[] slots_io = new int[] { 0, 1, 2, 3 }; - + public TileEntityMachineGasCent() { - super(7); + super(7); tank = new FluidTank(Fluids.UF6, 2000); inputTank = new PseudoFluidTank(PseudoFluidType.NUF6, 8000); outputTank = new PseudoFluidTank(PseudoFluidType.LEUF6, 8000); } - + @Override public String getName() { return "container.gasCentrifuge"; } - + @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { return i < 4; } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return slots_io; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + power = nbt.getLong("power"); progress = nbt.getShort("progress"); tank.readFromNBT(nbt, "tank"); inputTank.readFromNBT(nbt, "inputTank"); outputTank.readFromNBT(nbt, "outputTank"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -93,127 +96,127 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I inputTank.writeToNBT(nbt, "inputTank"); outputTank.writeToNBT(nbt, "outputTank"); } - + public int getCentrifugeProgressScaled(int i) { return (progress * i) / getProcessingSpeed(); } - + public long getPowerRemainingScaled(int i) { return (power * i) / maxPower; } - + private boolean canEnrich() { if(power > 0 && this.inputTank.getFill() >= inputTank.getTankType().getFluidConsumed() && this.outputTank.getFill() + this.inputTank.getTankType().getFluidProduced() <= outputTank.getMaxFill()) { - + ItemStack[] list = inputTank.getTankType().getOutput(); - + if(this.inputTank.getTankType().getIfHighSpeed()) if(!(slots[6] != null && slots[6].getItem() == ModItems.upgrade_gc_speed)) return false; - + if(list == null) return false; - + if(list.length < 1) return false; - + if(InventoryUtil.doesArrayHaveSpace(slots, 0, 3, list)) return true; } - + return false; } - + private void enrich() { ItemStack[] output = inputTank.getTankType().getOutput(); - + this.progress = 0; - inputTank.setFill(inputTank.getFill() - inputTank.getTankType().getFluidConsumed()); - outputTank.setFill(outputTank.getFill() + inputTank.getTankType().getFluidProduced()); - + inputTank.setFill(inputTank.getFill() - inputTank.getTankType().getFluidConsumed()); + outputTank.setFill(outputTank.getFill() + inputTank.getTankType().getFluidProduced()); + for(byte i = 0; i < output.length; i++) InventoryUtil.tryAddItemToInventory(slots, 0, 3, output[i].copy()); //reference types almost got me again } - + private void attemptConversion() { if(inputTank.getFill() < inputTank.getMaxFill() && tank.getFill() > 0) { int fill = Math.min(inputTank.getMaxFill() - inputTank.getFill(), tank.getFill()); - + tank.setFill(tank.getFill() - fill); inputTank.setFill(inputTank.getFill() + fill); } } - + private boolean attemptTransfer(TileEntity te) { if(te instanceof TileEntityMachineGasCent) { TileEntityMachineGasCent cent = (TileEntityMachineGasCent) te; - + if(cent.tank.getFill() == 0 && cent.tank.getTankType() == tank.getTankType()) { if(cent.inputTank.getTankType() != outputTank.getTankType() && outputTank.getTankType() != PseudoFluidType.NONE) { cent.inputTank.setTankType(outputTank.getTankType()); cent.outputTank.setTankType(outputTank.getTankType().getOutputType()); } - + //God, why did I forget about the entirety of the fucking math library? if(cent.inputTank.getFill() < cent.inputTank.getMaxFill() && outputTank.getFill() > 0) { int fill = Math.min(cent.inputTank.getMaxFill() - cent.inputTank.getFill(), outputTank.getFill()); - + outputTank.setFill(outputTank.getFill() - fill); cent.inputTank.setFill(cent.inputTank.getFill() + fill); } - + return true; } } - + return false; } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + updateConnections(); power = Library.chargeTEFromItems(slots, 4, power, maxPower); setTankType(5); - + if(GasCentrifugeRecipes.fluidConversions.containsValue(inputTank.getTankType())) { attemptConversion(); } - + if(canEnrich()) { - + isProgressing = true; this.progress++; - + if(slots[6] != null && slots[6].getItem() == ModItems.upgrade_gc_speed) this.power -= 300; else this.power -= 200; - + if(this.power < 0) { power = 0; this.progress = 0; } - + if(progress >= getProcessingSpeed()) enrich(); - + } else { isProgressing = false; this.progress = 0; } - + if(worldObj.getTotalWorldTime() % 10 == 0) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); TileEntity te = worldObj.getTileEntity(this.xCoord - dir.offsetX, this.yCoord, this.zCoord - dir.offsetZ); - + //*AT THE MOMENT*, there's not really any need for a dedicated method for this. Yet. if(!attemptTransfer(te) && this.inputTank.getTankType() == PseudoFluidType.LEUF6) { ItemStack[] converted = new ItemStack[] { new ItemStack(ModItems.nugget_uranium_fuel, 6), new ItemStack(ModItems.fluorite) }; - + if(this.outputTank.getFill() >= 600 && InventoryUtil.doesArrayHaveSpace(slots, 0, 3, converted)) { this.outputTank.setFill(this.outputTank.getFill() - 600); for(ItemStack stack : converted) @@ -221,13 +224,46 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I } } } - + this.networkPackNT(50); - PacketDispatcher.wrapper.sendToAllAround(new LoopedSoundPacket(xCoord, yCoord, zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + } else { + + if(isProgressing) { + audioDuration += 2; + } else { + audioDuration -= 3; + } + + audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); + + if(audioDuration > 10) { + + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + + audio.updateVolume(getVolume(1F)); + audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + + } else { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } } } - + + @Override + public AudioWrapper createAudioLoop() { + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + } + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -239,35 +275,35 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I buf.writeInt(outputTank.getFill()); BufferUtil.writeString(buf, inputTank.getTankType().name); //cough cough BufferUtil.writeString(buf, outputTank.getTankType().name); - + tank.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); power = buf.readLong(); progress = buf.readInt(); isProgressing = buf.readBoolean(); - + inputTank.setFill(buf.readInt()); outputTank.setFill(buf.readInt()); inputTank.setTankType(PseudoFluidType.types.get(BufferUtil.readString(buf))); outputTank.setTankType(PseudoFluidType.types.get(BufferUtil.readString(buf))); - + tank.deserialize(buf); } - + private void updateConnections() { for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - + if(GasCentrifugeRecipes.fluidConversions.containsValue(inputTank.getTankType())) { this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } } - + private DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord, yCoord - 1, zCoord, Library.NEG_Y), @@ -286,40 +322,40 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I @Override public long getPower() { return power; - + } @Override public long getMaxPower() { return maxPower; } - + public int getProcessingSpeed() { if(slots[6] != null && slots[6].getItem() == ModItems.upgrade_gc_speed) { return processingSpeed - 70; } return processingSpeed; } - + public void setTankType(int in) { - + if(slots[in] != null && slots[in].getItem() instanceof IItemFluidIdentifier) { IItemFluidIdentifier id = (IItemFluidIdentifier) slots[in].getItem(); FluidType newType = id.getType(worldObj, xCoord, yCoord, zCoord, slots[in]); - + if(tank.getTankType() != newType) { PseudoFluidType pseudo = GasCentrifugeRecipes.fluidConversions.get(newType); - + if(pseudo != null) { inputTank.setTankType(pseudo); outputTank.setTankType(pseudo.getOutputType()); tank.setTankType(newType); } } - + } } - + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; @@ -329,71 +365,71 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I public FluidTank[] getAllTanks() { return new FluidTank[] { tank }; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 5, zCoord + 1); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } - + public class PseudoFluidTank { PseudoFluidType type; int fluid; int maxFluid; - + public PseudoFluidTank(PseudoFluidType type, int maxFluid) { this.type = type; this.maxFluid = maxFluid; } - + public void setFill(int i) { fluid = i; } - + public void setTankType(PseudoFluidType type) { - + if(this.type.equals(type)) return; - + if(type == null) this.type = PseudoFluidType.NONE; else this.type = type; - + this.setFill(0); } - + public PseudoFluidType getTankType() { return type; } - + public int getFill() { return fluid; } - + public int getMaxFill() { return maxFluid; } - + //Called by TE to save fillstate public void writeToNBT(NBTTagCompound nbt, String s) { nbt.setInteger(s, fluid); nbt.setInteger(s + "_max", maxFluid); nbt.setString(s + "_type", type.name); } - + //Called by TE to load fillstate public void readFromNBT(NBTTagCompound nbt, String s) { fluid = nbt.getInteger(s); @@ -402,7 +438,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I type = PseudoFluidType.types.get(nbt.getString(s + "_type")); if(type == null) type = PseudoFluidType.NONE; } - + /* ______ ______ * _I____I_ _I____I_ * / \\\ / \\\ diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java index 0ce599eea..e5a502f0c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java @@ -4,8 +4,6 @@ import com.hbm.config.VersatileConfig; import com.hbm.inventory.container.ContainerMachineRTG; import com.hbm.inventory.gui.GUIMachineRTG; import com.hbm.items.machine.ItemRTGPellet; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.AuxElectricityPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; @@ -13,9 +11,9 @@ import com.hbm.util.RTGUtil; import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ISidedInventory; @@ -28,16 +26,16 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISidedInventory, IEnergyProviderMK2, IGUIProvider, IInfoProviderEC { private ItemStack slots[]; - + public int heat; public final int heatMax = VersatileConfig.rtgDecay() ? 600 : 200; public long power; public final long powerMax = 100000; - + public static final int[] slot_io = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; - + private String customName; - + public TileEntityMachineRTG() { slots = new ItemStack[15]; } @@ -82,7 +80,7 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @@ -101,7 +99,7 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; } } - + //You scrubs aren't needed for anything (right now) @Override public void openInventory() {} @@ -112,7 +110,7 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided public boolean isItemValidForSlot(int i, ItemStack itemStack) { return itemStack.getItem() instanceof ItemRTGPellet; } - + @Override public ItemStack decrStackSize(int i, int j) { if(slots[i] != null) @@ -128,13 +126,13 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided { slots[i] = null; } - + return itemStack1; } else { return null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -143,7 +141,7 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided power = nbt.getLong("power"); heat = nbt.getInteger("heat"); slots = new ItemStack[getSizeInventory()]; - + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); @@ -154,14 +152,14 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided } } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setLong("power", power); nbt.setInteger("heat", heat); NBTTagList list = new NBTTagList(); - + for(int i = 0; i < slots.length; i++) { if(slots[i] != null) { NBTTagCompound nbt1 = new NBTTagCompound(); @@ -172,7 +170,7 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided } nbt.setTag("items", list); } - + @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { return slot_io; @@ -187,19 +185,19 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided public boolean canExtractItem(int i, ItemStack itemStack, int j) { return false; } - + public long getPowerScaled(long i) { return (power * i) / powerMax; } - + public int getHeatScaled(int i) { return (heat * i) / heatMax; } - + public boolean hasPower() { return power > 0; } - + public boolean hasHeat() { return RTGUtil.hasHeat(slots, slot_io); } @@ -208,23 +206,35 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided public void updateEntity() { if(!worldObj.isRemote) { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - + heat = RTGUtil.updateRTGs(slots, slot_io); - + if(heat > heatMax) heat = heatMax; - + power += heat * 5; if(power > powerMax) power = powerMax; - - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + + networkPackNT(50); } } + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + power = buf.readLong(); + } + @Override public long getPower() { return power; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java index 67ad5583c..f948a67f4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java @@ -5,16 +5,14 @@ import com.hbm.inventory.gui.GUIMachineShredder; import com.hbm.inventory.recipes.ShredderRecipes; import com.hbm.items.machine.ItemBlades; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.AuxElectricityPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IEnergyReceiverMK2; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ISidedInventory; @@ -33,11 +31,11 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public int soundCycle = 0; public static final long maxPower = 10000; public static final int processingSpeed = 60; - + private static final int[] slots_io = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}; - + private String customName; - + public TileEntityMachineShredder() { slots = new ItemStack[30]; } @@ -82,7 +80,7 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @@ -101,7 +99,7 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; } } - + //You scrubs aren't needed for anything (right now) @Override public void openInventory() {} @@ -113,10 +111,10 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I if(i < 9) return ShredderRecipes.getShredderResult(stack) != null && !(stack.getItem() instanceof ItemBlades); if(i == 29) return stack.getItem() instanceof IBatteryItem; if(i == 27 || i == 28) return stack.getItem() instanceof ItemBlades; - + return false; } - + @Override public ItemStack decrStackSize(int i, int j) { if(slots[i] != null) @@ -132,21 +130,21 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I { slots[i] = null; } - + return itemStack1; } else { return null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList list = nbt.getTagList("items", 10); - + this.power = nbt.getLong("powerTime"); slots = new ItemStack[getSizeInventory()]; - + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); @@ -157,13 +155,13 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I } } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setLong("powerTime", power); NBTTagList list = new NBTTagList(); - + for(int i = 0; i < slots.length; i++) { if(slots[i] != null) @@ -176,7 +174,7 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I } nbt.setTag("items", list); } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return slots_io; @@ -186,20 +184,20 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public boolean canInsertItem(int slot, ItemStack itemStack, int side) { if((slot >= 9 && slot != 27 && slot != 28) || !this.isItemValidForSlot(slot, itemStack)) return false; - + if(slots[slot] == null) return true; - + int size = slots[slot].stackSize; - + for(int k = 0; k < 9; k++) { if(slots[k] == null) return false; - + if(slots[k].getItem() == itemStack.getItem() && slots[k].getItemDamage() == itemStack.getItemDamage() && slots[k].stackSize < size) return false; } - + return true; } @@ -207,42 +205,42 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public boolean canExtractItem(int i, ItemStack itemStack, int j) { if(i >= 9 && i <= 26) return true; if(i >= 27 && i <= 28) if(itemStack.getItemDamage() == itemStack.getMaxDamage() && itemStack.getMaxDamage() > 0) return true; - + return false; } - + public int getDiFurnaceProgressScaled(int i) { return (progress * i) / processingSpeed; } - + public boolean hasPower() { return power > 0; } - + public boolean isProcessing() { return this.progress > 0; } - + @Override public void updateEntity() { boolean flag1 = false; - + if(!worldObj.isRemote) { - + this.updateConnections(); - + if(hasPower() && canProcess()) { progress++; - + power -= 5; - + if(this.progress == TileEntityMachineShredder.processingSpeed) { for(int i = 27; i <= 28; i++) if(slots[i].getMaxDamage() > 0) this.slots[i].setItemDamage(this.slots[i].getItemDamage() + 1); - + this.progress = 0; this.processItem(); flag1 = true; @@ -250,66 +248,78 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I if(soundCycle == 0) this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "minecart.base", getVolume(1.0F), 0.75F); soundCycle++; - + if(soundCycle >= 50) soundCycle = 0; }else{ progress = 0; } - + boolean trigger = true; - + if(hasPower() && canProcess() && this.progress == 0) { trigger = false; } - + if(trigger) { flag1 = true; } - + power = Library.chargeTEFromItems(slots, 29, power, maxPower); - - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + + networkPackNT(50); } - + if(flag1) { this.markDirty(); } } - + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(power); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + power = buf.readLong(); + } + private void updateConnections() { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - + public void processItem() { - + for(int inpSlot = 0; inpSlot < 9; inpSlot++) { if(slots[inpSlot] != null && hasSpace(slots[inpSlot])) { ItemStack inp = slots[inpSlot]; ItemStack outp = ShredderRecipes.getShredderResult(inp); - + boolean flag = false; - + for (int outSlot = 9; outSlot < 27; outSlot++) { - if (slots[outSlot] != null && slots[outSlot].getItem() == outp.getItem() && + if (slots[outSlot] != null && slots[outSlot].getItem() == outp.getItem() && slots[outSlot].getItemDamage() == outp.getItemDamage() && slots[outSlot].stackSize + outp.stackSize <= outp.getMaxStackSize()) { - + slots[outSlot].stackSize += outp.stackSize; slots[inpSlot].stackSize -= 1; flag = true; break; } } - + if(!flag) for (int outSlot = 9; outSlot < 27; outSlot++) { @@ -319,18 +329,18 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I break; } } - + if(slots[inpSlot].stackSize <= 0) slots[inpSlot] = null; } } } - + public boolean canProcess() { - if(slots[27] != null && slots[28] != null && - this.getGearLeft() > 0 && this.getGearLeft() < 3 && + if(slots[27] != null && slots[28] != null && + this.getGearLeft() > 0 && this.getGearLeft() < 3 && this.getGearRight() > 0 && this.getGearRight() < 3) { - + for(int i = 0; i < 9; i++) { if(slots[i] != null && slots[i].stackSize > 0 && hasSpace(slots[i])) @@ -339,14 +349,14 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I } } } - + return false; } - + public boolean hasSpace(ItemStack stack) { - + ItemStack result = ShredderRecipes.getShredderResult(stack); - + if (result != null) for (int i = 9; i < 27; i++) { if (slots[i] == null) { @@ -358,16 +368,16 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I return true; } } - + return false; } @Override public void setPower(long i) { this.power = i; - + } - + public long getPowerScaled(long i) { return (power * i) / maxPower; } @@ -381,14 +391,14 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public long getMaxPower() { return TileEntityMachineShredder.maxPower; } - + public int getGearLeft() { - + if(slots[27] != null && slots[27].getItem() instanceof ItemBlades) { if(slots[27].getMaxDamage() == 0) return 1; - + if(slots[27].getItemDamage() < slots[27].getItem().getMaxDamage()/2) { return 1; @@ -398,17 +408,17 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I return 3; } } - + return 0; } - + public int getGearRight() { - + if(slots[28] != null && slots[28].getItem() instanceof ItemBlades) { if(slots[28].getMaxDamage() == 0) return 1; - + if(slots[28].getItemDamage() < slots[28].getItem().getMaxDamage()/2) { return 1; @@ -418,7 +428,7 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I return 3; } } - + return 0; } From ba12143cc82d069f9609a56e6a9f1f260b62eee4 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 5 Jan 2025 22:37:16 +0100 Subject: [PATCH 66/70] :b:alls --- README.md | 5 +- changelog | 42 +- .../com/hbm/blocks/generic/BlockPedestal.java | 2 +- .../java/com/hbm/config/ClientConfig.java | 2 +- .../java/com/hbm/crafting/WeaponRecipes.java | 12 +- .../missile/EntityMissileAntiBallistic.java | 2 +- .../projectile/EntityArtilleryRocket.java | 8 +- .../projectile/EntityBulletBaseMK4.java | 26 +- .../java/com/hbm/interfaces/IOrderedEnum.java | 6 + .../inventory/recipes/AmmoPressRecipes.java | 5 + .../java/com/hbm/items/ItemEnumMulti.java | 9 +- src/main/java/com/hbm/items/ModItems.java | 2 + .../hbm/items/weapon/sedna/BulletConfig.java | 6 + .../weapon/sedna/factory/GunFactory.java | 35 +- .../sedna/factory/GunFactoryClient.java | 13 +- .../weapon/sedna/factory/LegoClient.java | 6 +- .../weapon/sedna/factory/XFactory10ga.java | 4 +- .../weapon/sedna/factory/XFactory12ga.java | 220 +- .../weapon/sedna/factory/XFactory357.java | 2 +- .../weapon/sedna/factory/XFactory40mm.java | 3 +- .../weapon/sedna/factory/XFactory44.java | 2 +- .../weapon/sedna/factory/XFactory556mm.java | 3 +- .../sedna/factory/XFactoryBlackPowder.java | 8 +- .../java/com/hbm/main/ResourceManager.java | 1 + .../com/hbm/particle/ParticlePlasmaBlast.java | 8 +- .../item/weapon/sedna/ItemRenderG3.java | 10 +- .../com/hbm/render/model/ModelT45Chest.java | 6 +- .../TileEntityMachineRotaryFurnace.java | 3 +- src/main/resources/assets/hbm/lang/de_DE.lang | 6 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../assets/hbm/models/weapons/g3.obj | 11459 ++++++++-------- .../assets/hbm/textures/items/ammo_folly.png | Bin 562 -> 0 bytes .../hbm/textures/items/ammo_folly_du.png | Bin 435 -> 0 bytes .../hbm/textures/items/ammo_folly_nuclear.png | Bin 576 -> 0 bytes .../assets/hbm/textures/items/ammo_fuel.png | Bin 302 -> 0 bytes .../hbm/textures/items/ammo_fuel_gas.png | Bin 281 -> 0 bytes .../hbm/textures/items/ammo_fuel_napalm.png | Bin 296 -> 0 bytes .../textures/items/ammo_fuel_phosphorus.png | Bin 413 -> 0 bytes .../textures/items/ammo_fuel_vaporizer.png | Bin 280 -> 0 bytes .../hbm/textures/items/ammo_grenade.png | Bin 363 -> 0 bytes .../hbm/textures/items/ammo_grenade_FG.png | Bin 358 -> 0 bytes .../items/ammo_grenade_concussion.png | Bin 340 -> 0 bytes .../textures/items/ammo_grenade_finned.png | Bin 357 -> 0 bytes .../hbm/textures/items/ammo_grenade_he.png | Bin 359 -> 0 bytes .../items/ammo_grenade_incendiary.png | Bin 369 -> 0 bytes .../textures/items/ammo_grenade_nuclear.png | Bin 336 -> 0 bytes .../items/ammo_grenade_phosphorus.png | Bin 392 -> 0 bytes .../hbm/textures/items/ammo_grenade_sleek.png | Bin 327 -> 0 bytes .../hbm/textures/items/ammo_grenade_toxic.png | Bin 352 -> 0 bytes .../textures/items/ammo_grenade_tracer.png | Bin 349 -> 0 bytes .../assets/hbm/textures/items/ammo_luna.png | Bin 1967 -> 0 bytes .../textures/items/ammo_luna_explosive.png | Bin 5457 -> 0 bytes .../textures/items/ammo_luna_incendiary.png | Bin 5394 -> 0 bytes .../assets/hbm/textures/items/ammo_mirv.png | Bin 311 -> 0 bytes .../hbm/textures/items/ammo_mirv_high.png | Bin 321 -> 0 bytes .../hbm/textures/items/ammo_mirv_low.png | Bin 326 -> 0 bytes .../hbm/textures/items/ammo_mirv_safe.png | Bin 323 -> 0 bytes .../hbm/textures/items/ammo_mirv_special.png | Bin 322 -> 0 bytes .../assets/hbm/textures/items/ammo_nuke.png | Bin 346 -> 0 bytes .../hbm/textures/items/ammo_nuke_barrel.png | Bin 423 -> 0 bytes .../hbm/textures/items/ammo_nuke_high.png | Bin 360 -> 0 bytes .../hbm/textures/items/ammo_nuke_hive.png | Bin 315 -> 0 bytes .../hbm/textures/items/ammo_nuke_low.png | Bin 362 -> 0 bytes .../hbm/textures/items/ammo_nuke_pumpkin.png | Bin 347 -> 0 bytes .../hbm/textures/items/ammo_nuke_safe.png | Bin 364 -> 0 bytes .../hbm/textures/items/ammo_nuke_tots.png | Bin 311 -> 0 bytes .../assets/hbm/textures/items/ammo_rocket.png | Bin 317 -> 0 bytes .../textures/items/ammo_rocket_balefire.png | Bin 299 -> 0 bytes .../textures/items/ammo_rocket_canister.png | Bin 277 -> 0 bytes .../textures/items/ammo_rocket_digamma.png | Bin 193 -> 0 bytes .../hbm/textures/items/ammo_rocket_emp.png | Bin 325 -> 0 bytes .../hbm/textures/items/ammo_rocket_glare.png | Bin 319 -> 0 bytes .../hbm/textures/items/ammo_rocket_he.png | Bin 333 -> 0 bytes .../textures/items/ammo_rocket_incendiary.png | Bin 331 -> 0 bytes .../textures/items/ammo_rocket_nuclear.png | Bin 346 -> 0 bytes .../textures/items/ammo_rocket_phosphorus.png | Bin 321 -> 0 bytes .../hbm/textures/items/ammo_rocket_rpc.png | Bin 377 -> 0 bytes .../textures/items/ammo_rocket_shrapnel.png | Bin 327 -> 0 bytes .../hbm/textures/items/ammo_rocket_sleek.png | Bin 286 -> 0 bytes .../hbm/textures/items/ammo_rocket_toxic.png | Bin 340 -> 0 bytes .../textures/items/ammo_standard.g10_slug.png | Bin 0 -> 252 bytes .../textures/models/weapons/shredder_orig.png | Bin 0 -> 7877 bytes 82 files changed, 6134 insertions(+), 5784 deletions(-) create mode 100644 src/main/java/com/hbm/interfaces/IOrderedEnum.java delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_folly.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_folly_du.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_folly_nuclear.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_fuel.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_fuel_gas.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_fuel_napalm.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_fuel_phosphorus.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_fuel_vaporizer.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_FG.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_concussion.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_finned.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_he.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_incendiary.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_nuclear.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_phosphorus.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_sleek.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_toxic.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_grenade_tracer.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_luna.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_luna_explosive.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_luna_incendiary.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_mirv.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_mirv_high.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_mirv_low.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_mirv_safe.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_mirv_special.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke_barrel.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke_high.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke_hive.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke_low.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke_pumpkin.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke_safe.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_nuke_tots.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_balefire.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_canister.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_digamma.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_emp.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_glare.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_he.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_incendiary.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_nuclear.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_phosphorus.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_rpc.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_shrapnel.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_sleek.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ammo_rocket_toxic.png create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_standard.g10_slug.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/shredder_orig.png diff --git a/README.md b/README.md index 4eddaf461..68e85a68e 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,9 @@ NTM has certain behaviors intended to fix vanilla code or to increase compatibil ### Thermos Thermos servers (along with its forks such as Crucible) have a "performance" feature that causes all tile entity ticking to slow down if there's no player present in the same chunk. For obvious reasons, this will heavily impact machines and cause phantom issues that, not having knowledge of this "performance" feature, are near impossible to diagnose. By default, NTM will crash on servers running the Thermos base code and print a lengthy message informing server owners about this "performance" feature as well as how to fix the issues it causes. The error message is printed in plain English on the top of the crash log, failure to read (as well as understand) it will leave the server inoperable. +### Shaders +Shaders (loaded by either Optifine, Iris or otherwise) will in all likelihood break when a gun is held. This is because guns need to skip vanilla's first person item setup for the rendering, however shaders apparently use the setup step for setting certain GL states, and skipping that will break rendering. [Shader Fixer](https://modrinth.com/mod/shader-fixer) is a mod with various fixes, among which is explicit compatibility for NTM's guns. + ### Optifine One of the most common "performance" mods on 1.7.10, Optifine, achieves an increase in performance by breaking small things in spots that are usually hard to notice, although this can cause severe issues with NTM. A short list of problems, along with some solutions, follows: * Get rid of Optifine and use one of the many [other, less intrusive performance mods](https://gist.github.com/makamys/7cb74cd71d93a4332d2891db2624e17c). @@ -113,7 +116,7 @@ One of the most common "performance" mods on 1.7.10, Optifine, achieves an incre ### Angelica In older versions, Angelica caused issues regarding model rendering, often times making 3D models transparent. Ever since the switch to VBOs, models work fine. Another issue was blocks with connected textures not rendering at all, but this too was fixed, meaning as of time of writing there are no major incompatibilities known with Angelica. However there a few minor issues that persist, but those can be fixed: * Often times when making a new world, all items appear as white squares. Somehow, scrolling though the NEI pages fixes this permanently -* Reeds will render weirdly, this is an incompatibility with the "Compact Vertex Format" feature. Disabling it will make reeds look normal +* Reeds will render weirdly, this is an incompatibility with the "Compact Vertex Format" feature. Disabling it will make reeds look normal. Alternatively, reed rendering can be disabled by using `/ntmclient set RENDER_REEDS false`, which works around the issue by not rendering the underwater portion of reeds at all. ### Skybox chainloader NTM adds a few small things to the skybox using a custom skybox renderer. Minecraft can only have a single skybox renderer loaded, so setting the skybox to the NTM custom one would break compatibility with other mods' skyboxes. To mend this, NTM employs a **chainloader**. This chainloader will detect if a different skybox is loaded, save a reference to that skybox and then use NTM's skybox, which when used will also make sure to run the previous modded skybox renderer. In the event that NTM's skybox were to cause trouble, it can be disabled with the config option `1.31_enableSkyboxes`. diff --git a/changelog b/changelog index 79cd7c3fe..d0f049ef9 100644 --- a/changelog +++ b/changelog @@ -1,25 +1,27 @@ ## Added -* Double barrel shotgun - * Special weapon, spawns as part of certain loot pools - * Uses the new 10 gauge caliber - * Will reload after each shot, however it is not belt-fed, if ammo is depleted, the next reload must be triggered manually +* 10 gauge slug +* Shredder + * A b-side for the autoshotgun + * Fires 12 gauge, accelerated by plasma, which bursts on impact + * Fragments move slowly and have damaging ricochet effects + * Fragments keep the effects of the original shell (e.g. explosive shell will spawn a single explosive fragment) ## Changed -* Removed the old casing items -* Reduced the flicker on the autoshotgun's holo sights +* Black powder bullets now have 75% base damage instead of 50% +* Ball and powder type rounds no longer have a bonus on headshot +* Shot and powder now does way less damage +* Some secret ammo types are now craftable +* Updated the assault rifle's texture +* Shooting at old CRT screens now breaks them ## Fixed -* Fixed the bullet casing molds being unobtainable -* Fixed instant crash caused by smelting certain things in the crucible -* Fixed the SPAS' alt fire having a delay of only 10 ticks instead of 20 -* Fixed 240mm nuclear shells not triggering properly if they hit their target within 3 ticks of being spawned -* Fixed some items that are supposed to be hidden in NEI being visible -* Fixed dual lever action shotguns having inconsistent damage -* Fixed entities (especially players) not being affected at all by their own explosions (rockets, 40mm grenades, etc) - * To keep rocket jumping at least somewhat viable, self-damage from explosions is reduced by 50%, the knockback remains the same -* Fixed missing localization for the casing molds -* Fixed the broken CIWS turret crashing instantly -* Added safeguards to prevent any unnamed casing config from crashing -* Fixed one of the break action revolver's faces having incorrect normals, making it invisible -* Fixed the fluid trait config not loading correctly - * Fluids are now subject to the /ntmreload command \ No newline at end of file +* Fixed `ITEM_TOOLTIP_SHOW_CUSTOM_NUKE` client config overriding `ITEM_TOOLTIP_SHOW_OREDICT` due to name overlap +* Fixed certain secret weapon creation condition not working properly +* Fixed artillery rockets getting stuck in the air when their target is not set to a block +* Fixed potential issue of ABMs getting stuck mid-flight when their target is destroyed prematurely +* Fixed mistakes in the fragment names for de_DE +* Fixed nitra rocket duplication only yielding one rocket +* Fixed rotary furnace not always properly showing the metal pouring effect +* Fixed T45 model not lifting its arms when a new gun is held + * Like previously, due to the archaic nature of the model, the rotations are not very precise, and will most likely break when holding an akimbo gun +* Potentially fixed an issue where cargo planes do not successfully spawn on lower render distances \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java index 6ca0a2586..c6c865f3c 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java @@ -143,7 +143,7 @@ public class BlockPedestal extends BlockContainer { } if(recipe.extra == recipe.extra.SUN) { - if(world.getCelestialAngle(0) > 0.15 || world.getCelestialAngle(0) < 0.85) continue; + if(world.getCelestialAngle(0) > 0.15 && world.getCelestialAngle(0) < 0.85) continue; } for(int i = 0; i < 9; i++) { diff --git a/src/main/java/com/hbm/config/ClientConfig.java b/src/main/java/com/hbm/config/ClientConfig.java index d0f2165c2..6958d77a8 100644 --- a/src/main/java/com/hbm/config/ClientConfig.java +++ b/src/main/java/com/hbm/config/ClientConfig.java @@ -51,7 +51,7 @@ public class ClientConfig { configMap.put("GUN_MODEL_FOV", GUN_MODEL_FOV); configMap.put("GUN_VISUAL_RECOIL", GUN_VISUAL_RECOIL); configMap.put("ITEM_TOOLTIP_SHOW_OREDICT", ITEM_TOOLTIP_SHOW_OREDICT); - configMap.put("ITEM_TOOLTIP_SHOW_OREDICT", ITEM_TOOLTIP_SHOW_CUSTOM_NUKE); + configMap.put("ITEM_TOOLTIP_SHOW_CUSTOM_NUKE", ITEM_TOOLTIP_SHOW_CUSTOM_NUKE); configMap.put("MAIN_MENU_WACKY_SPLASHES", MAIN_MENU_WACKY_SPLASHES); configMap.put("DODD_RBMK_DIAGNOSTIC", DODD_RBMK_DIAGNOSTIC); configMap.put("RENDER_CABLE_HANG", RENDER_CABLE_HANG); diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index f4939f6dd..669a39f54 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -10,10 +10,12 @@ import static com.hbm.inventory.OreDictManager.*; import com.hbm.items.ItemAmmoEnums.*; import com.hbm.items.ItemEnums.EnumCasingType; +import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.ModItems; import com.hbm.items.weapon.GunB92Cell; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.main.CraftingManager; import net.minecraft.init.Blocks; @@ -72,6 +74,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_chemthrower, 1), new Object[] { "MHW", "PSS", 'M', WEAPONSTEEL.mechanism(), 'H', RUBBER.pipe(), 'W', ModItems.wrench, 'P', WEAPONSTEEL.heavyBarrel(), 'S', WEAPONSTEEL.shell() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_m2, 1), new Object[] { " G", "BRM", " G", 'G', WOOD.grip(), 'B', FERRO.heavyBarrel(), 'R', FERRO.heavyReceiver(), 'M', WEAPONSTEEL.mechanism() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_autoshotgun, 1), new Object[] { "BRM", "G G", 'B', FERRO.heavyBarrel(), 'R', FERRO.heavyReceiver(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_autoshotgun_shredder, 1), new Object[] { " M ", "MSM", " M ", 'M', BIGMT.mechanism(), 'A', ModItems.gun_autoshotgun }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_quadro, 1), new Object[] { "BCB", "BMB", "GG ", 'B', FERRO.heavyBarrel(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_lag, 1), new Object[] { "BRM", " G", 'B', ANY_RESISTANTALLOY.lightBarrel(), 'R', ANY_RESISTANTALLOY.lightReceiver(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_minigun, 1), new Object[] { "BMG", "BRE", "BGM", 'B', ANY_RESISTANTALLOY.lightBarrel(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip(), 'R', ANY_RESISTANTALLOY.heavyReceiver(), 'E', ModItems.motor_desh }); @@ -96,8 +99,13 @@ public class WeaponRecipes { CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_SP, 8), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_SP), ModItems.nitra }); CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_SP, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_SP), ModItems.nitra }); CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_SP, 4), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_SP), ModItems.nitra }); - CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G40_HE, 2), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G40_HE), ModItems.nitra }); - CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HE, 1), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HE), ModItems.nitra }); + CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G40_HE, 3), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G40_HE), ModItems.nitra }); + CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HE, 2), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HE), ModItems.nitra }); + + //secrets! + CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_secret, EnumAmmoSecret.M44_EQUESTRIAN, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_JHP), DictFrame.fromOne(ModItems.item_secret, EnumSecretType.SELENIUM_STEEL) }); + CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_secret, EnumAmmoSecret.G12_EQUESTRIAN, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G12), DictFrame.fromOne(ModItems.item_secret, EnumSecretType.SELENIUM_STEEL) }); + CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_secret, EnumAmmoSecret.BMG50_EQUESTRIAN, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_FMJ), DictFrame.fromOne(ModItems.item_secret, EnumSecretType.SELENIUM_STEEL) }); //Missiles CraftingManager.addShapelessAuto(new ItemStack(ModItems.missile_taint, 1), new Object[] { ModItems.missile_assembly, ModItems.bucket_mud, ModItems.powder_spark_mix, ModItems.powder_magic }); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java index 3dbb048d8..30f02d74a 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java @@ -75,7 +75,7 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements ExplosionLarge.spawnShock(worldObj, posX, posY, posZ, 24, 3F); } - if(this.tracking != null) { + if(this.tracking != null && !this.tracking.isDead) { this.aimAtTarget(); } else { if(this.ticksExisted > 600) this.setDead(); diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java index 1a04f5a2f..9cf26f3ae 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -96,14 +96,18 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu super.onUpdate(); if(!worldObj.isRemote) { + + //shitty hack, figure out what's happening here + if(this.targeting == null) this.targeting = new RocketTargetingPredictive(); + if(this.steering == null) this.steering = new RocketSteeringBallisticArc(); - /*if(this.targetEntity == null) { + if(this.targetEntity == null) { Vec3 delta = Vec3.createVectorHelper(this.lastTargetPos.xCoord - this.posX, this.lastTargetPos.yCoord - this.posY, this.lastTargetPos.zCoord - this.posZ); if(delta.lengthVector() <= 15D) { this.targeting = null; this.steering = null; } - }*/ + } if(this.targeting != null && this.targetEntity != null) this.targeting.recalculateTargetPosition(this, this.targetEntity); if(this.steering != null) this.steering.adjustCourse(this, 25D, 15D); diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java index 0d9161b98..29b0ce553 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java @@ -34,6 +34,26 @@ public class EntityBulletBaseMK4 extends EntityThrowableInterp { this.isImmuneToFire = true; } + /** For submunitions! */ + public EntityBulletBaseMK4(World world, EntityLivingBase entity, BulletConfig config, float damage, float gunSpread, double posX, double posY, double posZ, double motionX, double motionY, double motionZ) { + this(world); + + this.thrower = entity; + this.setBulletConfig(config); + + this.damage = damage; + + this.setLocationAndAngles(posX, posY, posZ, 0, 0); + this.setPosition(this.posX, this.posY, this.posZ); + + this.motionX = motionX; + this.motionY = motionY; + this.motionZ = motionZ; + + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, 1.0F, this.config.spread + gunSpread); + } + + /** For standard guns */ public EntityBulletBaseMK4(EntityLivingBase entity, BulletConfig config, float baseDamage, float gunSpread, double sideOffset, double heightOffset, double frontOffset) { this(entity.worldObj); @@ -57,15 +77,11 @@ public class EntityBulletBaseMK4 extends EntityThrowableInterp { this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)); - - /*motionX += entity.motionX; - motionY += entity.motionY; - motionZ += entity.motionZ;*/ this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, 1.0F, this.config.spread + gunSpread); } - /** For turrets - angles are in radians, andp itch is negative! */ + /** For turrets - angles are in radians, and pitch is negative! */ public EntityBulletBaseMK4(World world, BulletConfig config, float baseDamage, float gunSpread, float yaw, float pitch) { this(world); diff --git a/src/main/java/com/hbm/interfaces/IOrderedEnum.java b/src/main/java/com/hbm/interfaces/IOrderedEnum.java new file mode 100644 index 000000000..59f00f84d --- /dev/null +++ b/src/main/java/com/hbm/interfaces/IOrderedEnum.java @@ -0,0 +1,6 @@ +package com.hbm.interfaces; + +public interface IOrderedEnum { + + public Enum[] getOrder(); +} diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index 57278443c..08c98125d 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -247,6 +247,11 @@ public class AmmoPressRecipes extends SerializableRecipe { null, uranium, null, null, smokeless.copy(2), null, null, sShell, null)); + + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_SLUG, 4), + null, lead, null, + null, smokeless.copy(2), null, + null, sShell, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G26_FLARE, 4), null, rp, null, diff --git a/src/main/java/com/hbm/items/ItemEnumMulti.java b/src/main/java/com/hbm/items/ItemEnumMulti.java index 8085625d1..3d677b7ff 100644 --- a/src/main/java/com/hbm/items/ItemEnumMulti.java +++ b/src/main/java/com/hbm/items/ItemEnumMulti.java @@ -3,6 +3,7 @@ package com.hbm.items; import java.util.List; import java.util.Locale; +import com.hbm.interfaces.IOrderedEnum; import com.hbm.lib.RefStrings; import com.hbm.util.EnumUtil; @@ -31,8 +32,12 @@ public class ItemEnumMulti extends Item { @Override @SideOnly(Side.CLIENT) public void getSubItems(Item item, CreativeTabs tab, List list) { - for(int i = 0; i < theEnum.getEnumConstants().length; i++) { - list.add(new ItemStack(item, 1, i)); + + Enum[] order = theEnum.getEnumConstants(); + if(order[0] instanceof IOrderedEnum) order = ((IOrderedEnum) order[0]).getOrder(); + + for(int i = 0; i < order.length; i++) { + list.add(new ItemStack(item, 1, order[i].ordinal())); } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index ecaadac18..728a81938 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1501,6 +1501,7 @@ public class ModItems { public static Item gun_chemthrower; public static Item gun_m2; public static Item gun_autoshotgun; + public static Item gun_autoshotgun_shredder; public static Item gun_autoshotgun_sexy; public static Item gun_quadro; public static Item gun_lag; @@ -6512,6 +6513,7 @@ public class ModItems { GameRegistry.registerItem(gun_chemthrower, gun_chemthrower.getUnlocalizedName()); GameRegistry.registerItem(gun_m2, gun_m2.getUnlocalizedName()); GameRegistry.registerItem(gun_autoshotgun, gun_autoshotgun.getUnlocalizedName()); + GameRegistry.registerItem(gun_autoshotgun_shredder, gun_autoshotgun_shredder.getUnlocalizedName()); GameRegistry.registerItem(gun_autoshotgun_sexy, gun_autoshotgun_sexy.getUnlocalizedName()); GameRegistry.registerItem(gun_quadro, gun_quadro.getUnlocalizedName()); GameRegistry.registerItem(gun_lag, gun_lag.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java b/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java index 865b4e598..4e916200c 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java +++ b/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; +import com.hbm.blocks.ModBlocks; import com.hbm.blocks.bomb.BlockDetonatable; import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.entity.projectile.EntityBulletBeamBase; @@ -99,6 +100,7 @@ public class BulletConfig implements Cloneable { public BulletConfig setChunkloading() { this.pType = ProjectileType.BULLET_CHUNKLOADING; return this; } public BulletConfig setItem(Item ammo) { this.ammo = new ComparableStack(ammo); return this; } public BulletConfig setItem(ItemStack ammo) { this.ammo = new ComparableStack(ammo); return this; } + public BulletConfig setItem(ComparableStack ammo) { this.ammo = ammo; return this; } public BulletConfig setItem(EnumAmmo ammo) { this.ammo = new ComparableStack(ModItems.ammo_standard, 1, ammo.ordinal()); return this; } public BulletConfig setItem(EnumAmmoSecret ammo) { this.ammo = new ComparableStack(ModItems.ammo_secret, 1, ammo.ordinal()); return this; } public BulletConfig setReloadCount(int ammoReloadCount) { this.ammoReloadCount = ammoReloadCount; return this; } @@ -174,6 +176,10 @@ public class BulletConfig implements Cloneable { if(b instanceof BlockDetonatable) { ((BlockDetonatable) b).onShot(bullet.worldObj, mop.blockX, mop.blockY, mop.blockZ); } + if(b == ModBlocks.deco_crt) { + int meta = bullet.worldObj.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); + bullet.worldObj.setBlockMetadataWithNotify(mop.blockX, mop.blockY, mop.blockZ, meta % 4 + 4, 3); + } ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); Vec3 face = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index 49b7e1ef7..afd0b437a 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -1,5 +1,6 @@ package com.hbm.items.weapon.sedna.factory; +import com.hbm.interfaces.IOrderedEnum; import com.hbm.items.ItemEnumMulti; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; @@ -69,7 +70,7 @@ public class GunFactory { MainRegistry.proxy.registerGunCfg(); } - public static enum EnumAmmo { + public static enum EnumAmmo implements IOrderedEnum { STONE, STONE_AP, STONE_IRON, STONE_SHOT, M357_BP, M357_SP, M357_FMJ, M357_JHP, M357_AP, M357_EXPRESS, M44_BP, M44_SP, M44_FMJ, M44_JHP, M44_AP, M44_EXPRESS, @@ -88,7 +89,37 @@ public class GunFactory { TAU_URANIUM, COIL_TUNGSTEN, COIL_FERROURANIUM, NUKE_STANDARD, NUKE_DEMO, NUKE_HIGH, NUKE_TOTS, NUKE_HIVE, - G10, G10_SHRAPNEL, G10_DU + G10, G10_SHRAPNEL, G10_DU, G10_SLUG, + + //ONLY ADD NEW ENTRIES AT THE BOTTOM TO AVOID SHIFTING! + ; + + /** used for creative tab order */ + public static EnumAmmo[] order = new EnumAmmo[] { + STONE, STONE_AP, STONE_IRON, STONE_SHOT, + M357_BP, M357_SP, M357_FMJ, M357_JHP, M357_AP, M357_EXPRESS, + M44_BP, M44_SP, M44_FMJ, M44_JHP, M44_AP, M44_EXPRESS, + P22_SP, P22_FMJ, P22_JHP, P22_AP, + P9_SP, P9_FMJ, P9_JHP, P9_AP, + R556_SP, R556_FMJ, R556_JHP, R556_AP, + R762_SP, R762_FMJ, R762_JHP, R762_AP, R762_DU, + BMG50_SP, BMG50_FMJ, BMG50_JHP, BMG50_AP, BMG50_DU, + B75, B75_INC, B75_EXP, + G12_BP, G12_BP_MAGNUM, G12_BP_SLUG, G12, G12_SLUG, G12_FLECHETTE, G12_MAGNUM, G12_EXPLOSIVE, G12_PHOSPHORUS, + G10, G10_SHRAPNEL, G10_DU, G10_SLUG, + G26_FLARE, G26_FLARE_SUPPLY, G26_FLARE_WEAPON, + G40_HE, G40_HEAT, G40_DEMO, G40_INC, G40_PHOSPHORUS, + ROCKET_HE, ROCKET_HEAT, ROCKET_DEMO, ROCKET_INC, ROCKET_PHOSPHORUS, + FLAME_DIESEL, FLAME_GAS, FLAME_NAPALM, FLAME_BALEFIRE, + CAPACITOR, CAPACITOR_OVERCHARGE, CAPACITOR_IR, + TAU_URANIUM, + COIL_TUNGSTEN, COIL_FERROURANIUM, + NUKE_STANDARD, NUKE_DEMO, NUKE_HIGH, NUKE_TOTS, NUKE_HIVE, + }; + + public Enum[] getOrder() { + return order; + } } public static enum EnumAmmoSecret { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index 7ad7d2f6a..fddf948c1 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -67,6 +67,7 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_chemthrower, new ItemRenderChemthrower()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_m2, new ItemRenderM2()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun, new ItemRenderShredder(ResourceManager.shredder_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_shredder, new ItemRenderShredder(ResourceManager.shredder_orig_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_sexy, new ItemRenderShredder(ResourceManager.sexy_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_quadro, new ItemRenderQuadro()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun, new ItemRenderMinigun(ResourceManager.minigun_tex)); @@ -146,13 +147,22 @@ public class GunFactoryClient { g12_magnum.setRenderer(LegoClient.RENDER_STANDARD_BULLET); g12_explosive.setRenderer(LegoClient.RENDER_EXPRESS_BULLET); g12_phosphorus.setRenderer(LegoClient.RENDER_AP_BULLET); - //g12_anthrax.setRenderer(LegoClient.RENDER_STANDARD_BULLET); g12_equestrian_bj.setRenderer(LegoClient.RENDER_LEGENDARY_BULLET); g12_equestrian_tkr.setRenderer(LegoClient.RENDER_LEGENDARY_BULLET); + g12_sub.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + g12_sub_slug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + g12_sub_flechette.setRenderer(LegoClient.RENDER_FLECHETTE_BULLET); + g12_sub_magnum.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + g12_sub_explosive.setRenderer(LegoClient.RENDER_EXPRESS_BULLET); + g12_sub_phosphorus.setRenderer(LegoClient.RENDER_AP_BULLET); + + setRendererBulkBeam(LegoClient.RENDER_LASER_CYAN, g12_shredder, g12_shredder_slug, g12_shredder_flechette, g12_shredder_magnum, g12_shredder_explosive, g12_shredder_phosphorus); + g10.setRenderer(LegoClient.RENDER_STANDARD_BULLET); g10_shrapnel.setRenderer(LegoClient.RENDER_STANDARD_BULLET); g10_du.setRenderer(LegoClient.RENDER_DU_BULLET); + g10_slug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); g26_flare.setRenderer(LegoClient.RENDER_FLARE); g26_flare_supply.setRenderer(LegoClient.RENDER_FLARE_SUPPLY); @@ -209,6 +219,7 @@ public class GunFactoryClient { ((ItemGunBaseNT) ModItems.gun_chemthrower) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_m2) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_autoshotgun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_autoshotgun_shredder) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_autoshotgun_sexy) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_quadro) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_lag) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index a0a2c8bbb..10f124031 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -318,11 +318,13 @@ public class LegoClient { GL11.glPopMatrix(); RenderArcFurnace.fullbright(false); }; - + public static BiConsumer RENDER_LASER_RED = (bullet, interp) -> { renderStandardLaser(bullet, interp, 0x80, 0x15, 0x15); }; - + public static BiConsumer RENDER_LASER_CYAN = (bullet, interp) -> { + renderStandardLaser(bullet, interp, 0x15, 0x15, 0x80); + }; public static BiConsumer RENDER_LASER_PURPLE = (bullet, interp) -> { renderStandardLaser(bullet, interp, 0x60, 0x15, 0x80); }; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java index 60130b5ff..08fa1c34a 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java @@ -27,18 +27,20 @@ public class XFactory10ga { public static BulletConfig g10; public static BulletConfig g10_shrapnel; public static BulletConfig g10_du; + public static BulletConfig g10_slug; public static void init() { g10 = new BulletConfig().setItem(EnumAmmo.G10).setProjectiles(10).setDamage(1F/10F).setSpread(0.05F).setRicochetAngle(15).setThresholdNegation(5F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0xB52B2B, SpentCasing.COLOR_CASE_12GA).setScale(1F).register("10GA")); g10_shrapnel = new BulletConfig().setItem(EnumAmmo.G10_SHRAPNEL).setProjectiles(10).setDamage(1F/10F).setSpread(0.05F).setRicochetAngle(90).setRicochetCount(15).setThresholdNegation(5F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0xE5DD00, SpentCasing.COLOR_CASE_12GA).setScale(1F).register("10GAShrapnel")); g10_du = new BulletConfig().setItem(EnumAmmo.G10_DU).setProjectiles(10).setDamage(1F/4F).setSpread(0.05F).setRicochetAngle(15).setThresholdNegation(10F).setArmorPiercing(0.2F).setDoesPenetrate(true).setDamageFalloutByPen(false).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x538D53, SpentCasing.COLOR_CASE_12GA).setScale(1F).register("10GADU")); + g10_slug = new BulletConfig().setItem(EnumAmmo.G10_SLUG).setRicochetAngle(15).setThresholdNegation(10F).setArmorPiercing(0.1F).setDoesPenetrate(true).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x808080, SpentCasing.COLOR_CASE_12GA).setScale(1F).register("10GASlug")); ModItems.gun_double_barrel = new ItemGunBaseNT(WeaponQuality.SPECIAL, new GunConfig() .dura(1000).draw(10).inspect(39).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(30F).rounds(2).delay(10).reload(41).reloadOnEmpty(true).sound("hbm:weapon.fire.shotgun", 1.0F, 0.9F) - .mag(new MagazineFullReload(0, 2).addConfigs(g10, g10_shrapnel, g10_du)) + .mag(new MagazineFullReload(0, 2).addConfigs(g10, g10_shrapnel, g10_du, g10_slug)) .offset(0.75, -0.0625, -0.1875) .setupStandardFire().recoil(LAMBDA_RECOIL_DOUBLE_BARREL)) .setupStandardConfiguration() diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java index 748262005..d62c65262 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java @@ -1,8 +1,11 @@ package com.hbm.items.weapon.sedna.factory; +import java.util.List; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.bomb.BlockDetonatable; import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.entity.projectile.EntityDuchessGambit; import com.hbm.extprop.HbmLivingProps; @@ -17,21 +20,40 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import com.hbm.items.weapon.sedna.mags.MagazineBelt; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.util.BobMathUtil; +import com.hbm.util.TrackerUtil; +import com.hbm.util.Vec3NT; +import com.hbm.util.DamageResistanceHandler.DamageClass; +import com.hbm.util.EntityDamageUtil; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.ForgeDirection; public class XFactory12ga { @@ -47,6 +69,20 @@ public class XFactory12ga { public static BulletConfig g12_anthrax; public static BulletConfig g12_equestrian_bj; public static BulletConfig g12_equestrian_tkr; + + public static BulletConfig g12_shredder; + public static BulletConfig g12_shredder_slug; + public static BulletConfig g12_shredder_flechette; + public static BulletConfig g12_shredder_magnum; + public static BulletConfig g12_shredder_explosive; + public static BulletConfig g12_shredder_phosphorus; + + public static BulletConfig g12_sub; + public static BulletConfig g12_sub_slug; + public static BulletConfig g12_sub_flechette; + public static BulletConfig g12_sub_magnum; + public static BulletConfig g12_sub_explosive; + public static BulletConfig g12_sub_phosphorus; public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { Lego.standardExplode(bullet, mop, 2F); bullet.setDead(); @@ -62,11 +98,166 @@ public class XFactory12ga { bullet.setDead(); }; + public static BulletConfig makeShredderConfig(BulletConfig original, BulletConfig submunition) { + BulletConfig cfg = new BulletConfig().setBeam().setRenderRotations(false).setLife(5).setDamage(original.damageMult * original.projectilesMax).setupDamageClass(DamageClass.LASER); + cfg.setItem(original.ammo); + cfg.setCasing(original.casing); + cfg.setOnBeamImpact((beam, mop) -> { + + int projectiles = submunition.projectilesMin; + if(submunition.projectilesMax > submunition.projectilesMin) projectiles += beam.worldObj.rand.nextInt(submunition.projectilesMax - submunition.projectilesMin + 1); + + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + + ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); + + mop.hitVec.xCoord += dir.offsetX * 0.1; + mop.hitVec.yCoord += dir.offsetY * 0.1; + mop.hitVec.zCoord += dir.offsetZ * 0.1; + + spawnPulse(beam.worldObj, mop, beam.rotationYaw, beam.rotationPitch); + + List blast = beam.worldObj.getEntitiesWithinAABBExcludingEntity(beam, AxisAlignedBB.getBoundingBox(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord).expand(0.75, 0.75, 0.75)); + DamageSource source = BulletConfig.getDamage(beam, beam.getThrower(), DamageClass.LASER); + + for(Entity e : blast) { + if(!e.isEntityAlive()) continue; + if(e instanceof EntityLivingBase) { + EntityDamageUtil.attackEntityFromNT((EntityLivingBase) e, source, beam.damage, true, false, 0D, 0F, 0F); + if(!e.isEntityAlive()) ConfettiUtil.decideConfetti((EntityLivingBase) e, source); + } else { + e.attackEntityFrom(source, beam.damage); + } + } + + for(int i = 0; i < projectiles; i++) { + EntityBulletBaseMK4 bullet = new EntityBulletBaseMK4(beam.worldObj, beam.thrower, submunition, beam.damage * submunition.damageMult, 0.2F, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, dir.offsetX, dir.offsetY, dir.offsetZ); + bullet.worldObj.spawnEntityInWorld(bullet); + } + } + + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { + + spawnPulse(beam.worldObj, mop, beam.rotationYaw, beam.rotationPitch); + + for(int i = 0; i < projectiles; i++) { + Vec3NT vec = new Vec3NT(beam.worldObj.rand.nextGaussian(), beam.worldObj.rand.nextGaussian(), beam.worldObj.rand.nextGaussian()).normalizeSelf(); + EntityBulletBaseMK4 bullet = new EntityBulletBaseMK4(beam.worldObj, beam.thrower, submunition, beam.damage * submunition.damageMult, 0.2F, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, vec.xCoord, vec.yCoord, vec.zCoord); + bullet.worldObj.spawnEntityInWorld(bullet); + } + } + }); + return cfg; + } + + public static BulletConfig makeShredderSubmunition(BulletConfig original) { + BulletConfig cfg = original.clone(); + cfg.setRicochetAngle(90).setRicochetCount(3).setVel(0.5F).setLife(50).setupDamageClass(DamageClass.LASER).setOnRicochet(LAMBDA_SHREDDER_RICOCHET); + return cfg; + } + + //this sucks + public static BiConsumer LAMBDA_SHREDDER_RICOCHET = (bullet, mop) -> { + + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + + Block b = bullet.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ); + if(b.getMaterial() == Material.glass) { + bullet.worldObj.func_147480_a(mop.blockX, mop.blockY, mop.blockZ, false); + bullet.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + return; + } + if(b instanceof BlockDetonatable) { + ((BlockDetonatable) b).onShot(bullet.worldObj, mop.blockX, mop.blockY, mop.blockZ); + } + if(b == ModBlocks.deco_crt) { + int meta = bullet.worldObj.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); + bullet.worldObj.setBlockMetadataWithNotify(mop.blockX, mop.blockY, mop.blockZ, meta % 4 + 4, 3); + } + + ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); + Vec3 face = Vec3.createVectorHelper(dir.offsetX, dir.offsetY, dir.offsetZ); + Vec3 vel = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ).normalize(); + + double angle = Math.abs(BobMathUtil.getCrossAngle(vel, face) - 90); + + if(angle <= bullet.config.ricochetAngle) { + + spawnPulse(bullet.worldObj, mop, bullet.rotationYaw, bullet.rotationPitch); + + List blast = bullet.worldObj.getEntitiesWithinAABBExcludingEntity(bullet, AxisAlignedBB.getBoundingBox(bullet.posX, bullet.posY, bullet.posZ, bullet.posX, bullet.posY, bullet.posZ).expand(0.5, 0.5, 0.5)); + DamageSource source = BulletConfig.getDamage(bullet, bullet.getThrower(), DamageClass.LASER); + + for(Entity e : blast) { + if(!e.isEntityAlive()) continue; + if(e instanceof EntityLivingBase) { + EntityDamageUtil.attackEntityFromNT((EntityLivingBase) e, source, bullet.damage, true, false, 0D, 0F, 0F); + if(!e.isEntityAlive()) ConfettiUtil.decideConfetti((EntityLivingBase) e, source); + } else { + e.attackEntityFrom(source, bullet.damage); + } + } + + bullet.ricochets++; + if(bullet.ricochets > bullet.config.maxRicochetCount) { + bullet.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + bullet.setDead(); + } + + switch(mop.sideHit) { + case 0: case 1: bullet.motionY *= -1; break; + case 2: case 3: bullet.motionZ *= -1; break; + case 4: case 5: bullet.motionX *= -1; break; + } + bullet.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + //send a teleport so the ricochet is more accurate instead of the interp smoothing fucking everything up + if(bullet.worldObj instanceof WorldServer) TrackerUtil.sendTeleport((WorldServer) bullet.worldObj, bullet); + return; + + } else { + bullet.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + bullet.setDead(); + } + } + }; + + public static void spawnPulse(World world, MovingObjectPosition mop, float yaw, float pitch) { + + double x = mop.hitVec.xCoord; + double y = mop.hitVec.yCoord; + double z = mop.hitVec.zCoord; + + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + if(mop.sideHit == ForgeDirection.UP.ordinal()) { yaw = 0F; pitch = 0F; } + if(mop.sideHit == ForgeDirection.DOWN.ordinal()) { yaw = 0F; pitch = 0F; } + if(mop.sideHit == ForgeDirection.NORTH.ordinal()) { yaw = 0F; pitch = 90F; } + if(mop.sideHit == ForgeDirection.SOUTH.ordinal()) { yaw = 180F; pitch = 90F; } + if(mop.sideHit == ForgeDirection.EAST.ordinal()) { yaw = 90F; pitch = 90F; } + if(mop.sideHit == ForgeDirection.WEST.ordinal()) { yaw = 270F; pitch = 90F; } + + ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); + + x += dir.offsetX * 0.05; + y += dir.offsetY * 0.05; + z += dir.offsetZ * 0.05; + } + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "plasmablast"); + data.setFloat("r", 0.5F); + data.setFloat("g", 0.5F); + data.setFloat("b", 1.0F); + data.setFloat("pitch", pitch); + data.setFloat("yaw", yaw); + data.setFloat("scale", 0.75F); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 100)); + } + public static void init() { - g12_bp = new BulletConfig().setItem(EnumAmmo.G12_BP).setBlackPowder(true).setProjectiles(8).setDamage(0.5F/8F).setSpread(0.05F).setRicochetAngle(15).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_BRASS, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_BP")); - g12_bp_magnum = new BulletConfig().setItem(EnumAmmo.G12_BP_MAGNUM).setBlackPowder(true).setProjectiles(4).setDamage(0.5F/4F).setSpread(0.05F).setRicochetAngle(25).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_BRASS, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_BP_MAGNUM")); - g12_bp_slug = new BulletConfig().setItem(EnumAmmo.G12_BP_SLUG).setBlackPowder(true).setDamage(0.5F).setSpread(0.01F).setRicochetAngle(5).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_BRASS, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_BP_SLUG")); + g12_bp = new BulletConfig().setItem(EnumAmmo.G12_BP).setBlackPowder(true).setProjectiles(8).setDamage(0.75F/8F).setSpread(0.05F).setRicochetAngle(15).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_BRASS, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_BP")); + g12_bp_magnum = new BulletConfig().setItem(EnumAmmo.G12_BP_MAGNUM).setBlackPowder(true).setProjectiles(4).setDamage(0.75F/4F).setSpread(0.05F).setRicochetAngle(25).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_BRASS, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_BP_MAGNUM")); + g12_bp_slug = new BulletConfig().setItem(EnumAmmo.G12_BP_SLUG).setBlackPowder(true).setDamage(0.75F).setSpread(0.01F).setRicochetAngle(5).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_BRASS, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_BP_SLUG")); g12 = new BulletConfig().setItem(EnumAmmo.G12).setProjectiles(8).setDamage(1F/8F).setSpread(0.05F).setRicochetAngle(15).setThresholdNegation(2F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0xB52B2B, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA")); g12_slug = new BulletConfig().setItem(EnumAmmo.G12_SLUG).setHeadshot(1.5F).setSpread(0.0F).setRicochetAngle(25).setThresholdNegation(4F).setArmorPiercing(0.15F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x393939, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_SLUG")); g12_flechette = new BulletConfig().setItem(EnumAmmo.G12_FLECHETTE).setProjectiles(8).setDamage(1F/8F).setThresholdNegation(5F).setThresholdNegation(3F).setArmorPiercing(0.2F).setSpread(0.025F).setRicochetAngle(5).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x3C80F0, SpentCasing.COLOR_CASE_BRASS).setScale(0.75F).register("12GA_FLECHETTE")); @@ -79,6 +270,19 @@ public class XFactory12ga { g12_equestrian_tkr = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_EQUESTRIAN, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12gaEquestrianTKR")); BulletConfig[] all = new BulletConfig[] {g12_bp, g12_bp_magnum, g12_bp_slug, g12, g12_slug, g12_flechette, g12_magnum, g12_explosive, g12_phosphorus}; + + g12_sub = makeShredderSubmunition(g12); + g12_sub_slug = makeShredderSubmunition(g12_slug); + g12_sub_flechette = makeShredderSubmunition(g12_flechette); + g12_sub_magnum = makeShredderSubmunition(g12_magnum); + g12_sub_explosive = makeShredderSubmunition(g12_explosive); + g12_sub_phosphorus = makeShredderSubmunition(g12_phosphorus); + g12_shredder = makeShredderConfig(g12, g12_sub); + g12_shredder_slug = makeShredderConfig(g12_slug, g12_sub_slug); + g12_shredder_flechette = makeShredderConfig(g12_flechette, g12_sub_flechette); + g12_shredder_magnum = makeShredderConfig(g12_magnum, g12_sub_magnum); + g12_shredder_explosive = makeShredderConfig(g12_explosive, g12_sub_explosive); + g12_shredder_phosphorus = makeShredderConfig(g12_phosphorus, g12_sub_phosphorus); ModItems.gun_maresleg = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(600).draw(10).inspect(39).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) @@ -153,6 +357,16 @@ public class XFactory12ga { .setupStandardConfiguration() .anim(LAMBDA_SHREDDER_ANIMS).orchestra(Orchestras.ORCHESTRA_SHREDDER) ).setUnlocalizedName("gun_autoshotgun"); + ModItems.gun_autoshotgun_shredder = new ItemGunBaseNT(WeaponQuality.B_SIDE, new GunConfig() + .dura(2_000).draw(10).inspect(33).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .rec(new Receiver(0) + .dmg(50F).delay(10).auto(true).autoAfterDry(true).dryfireAfterAuto(true).reload(44).jam(19).sound("hbm:weapon.fire.shotgunAuto", 1.0F, 1.0F) + .mag(new MagazineBelt().addConfigs(g12_shredder, g12_shredder_slug, g12_shredder_flechette, g12_shredder_magnum, g12_shredder_explosive, g12_shredder_phosphorus)) + .offset(0.75, -0.125, -0.25) + .setupStandardFire().recoil(LAMBDA_RECOIL_AUTOSHOTGUN)) + .setupStandardConfiguration() + .anim(LAMBDA_SHREDDER_ANIMS).orchestra(Orchestras.ORCHESTRA_SHREDDER) + ).setUnlocalizedName("gun_autoshotgun_shredder"); ModItems.gun_autoshotgun_sexy = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig() .dura(5_000).draw(10).inspect(33).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java index ee5846c7a..e99c6d6a4 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java @@ -30,7 +30,7 @@ public class XFactory357 { public static BulletConfig m357_express; public static void init() { - m357_bp = new BulletConfig().setItem(EnumAmmo.M357_BP).setDamage(0.5F).setBlackPowder(true); + m357_bp = new BulletConfig().setItem(EnumAmmo.M357_BP).setDamage(0.75F).setBlackPowder(true); m357_sp = new BulletConfig().setItem(EnumAmmo.M357_SP); m357_fmj = new BulletConfig().setItem(EnumAmmo.M357_FMJ).setDamage(0.8F).setThresholdNegation(2F).setArmorPiercing(0.1F); m357_jhp = new BulletConfig().setItem(EnumAmmo.M357_JHP).setDamage(1.5F).setHeadshot(1.5F).setArmorPiercing(-0.25F); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java index b814c14c4..e85ba975f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java @@ -36,6 +36,7 @@ import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.util.EntityDamageUtil; import com.hbm.util.TrackerUtil; import com.hbm.util.DamageResistanceHandler.DamageClass; +import com.hbm.world.WorldUtil; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -133,7 +134,7 @@ public class XFactory40mm { int z = (int) Math.floor(bullet.posZ); int y = bullet.worldObj.getHeightValue(x, z); c130.fac(bullet.worldObj, x, y, z, payload); - bullet.worldObj.spawnEntityInWorld(c130); + WorldUtil.loadAndSpawnEntityInWorld(c130); TrackerUtil.setTrackingRange(bullet.worldObj, c130, 250); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java index c7ca8f24a..a86c9f699 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java @@ -66,7 +66,7 @@ public class XFactory44 { public static void init() { SpentCasing casing44 = new SpentCasing(CasingType.STRAIGHT).setColor(SpentCasing.COLOR_CASE_BRASS).setupSmoke(1F, 0.5D, 60, 20); - m44_bp = new BulletConfig().setItem(EnumAmmo.M44_BP).setDamage(0.5F).setBlackPowder(true) + m44_bp = new BulletConfig().setItem(EnumAmmo.M44_BP).setDamage(0.75F).setBlackPowder(true) .setCasing(casing44.clone().register("m44bp")); m44_sp = new BulletConfig().setItem(EnumAmmo.M44_SP) .setCasing(casing44.clone().register("m44")); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java index c87554f38..c86790f7a 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java @@ -99,7 +99,8 @@ public class XFactory556mm { case CYCLE: return new BusAnimation() .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, ItemGunBaseNT.getIsAiming(stack) ? -0.5 : -0.75, 25, IType.SIN_DOWN).addPos(0, 0, 0, 75, IType.SIN_FULL)); case CYCLE_DRY: return new BusAnimation() - .addBus("BOLT", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -3.25, 150).addPos(0, 0, 0, 100)); + .addBus("BOLT", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -3.25, 150).addPos(0, 0, 0, 100)) + .addBus("LIFT", new BusAnimationSequence().addPos(0, 0, 0, 400).addPos(-1, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 100, IType.SIN_FULL)); case RELOAD: return new BusAnimation() .addBus("MAG", new BusAnimationSequence() diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java index 203770f37..e3366bca2 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java @@ -22,10 +22,10 @@ import net.minecraft.item.ItemStack; public class XFactoryBlackPowder { - public static BulletConfig stone = new BulletConfig().setItem(EnumAmmo.STONE).setBlackPowder(true).setSpread(0.025F).setRicochetAngle(15); - public static BulletConfig flint = new BulletConfig().setItem(EnumAmmo.STONE_AP).setBlackPowder(true).setSpread(0.01F).setRicochetAngle(5).setDoesPenetrate(true).setDamage(1.75F); - public static BulletConfig iron = new BulletConfig().setItem(EnumAmmo.STONE_IRON).setBlackPowder(true).setSpread(0F).setRicochetAngle(90).setRicochetCount(5).setDoesPenetrate(true).setDamageFalloutByPen(false).setDamage(2F); - public static BulletConfig shot = new BulletConfig().setItem(EnumAmmo.STONE_SHOT).setBlackPowder(true).setSpread(0.1F).setRicochetAngle(45).setProjectiles(6, 6).setDamage(0.5F); + public static BulletConfig stone = new BulletConfig().setItem(EnumAmmo.STONE).setBlackPowder(true).setHeadshot(1F).setSpread(0.025F).setRicochetAngle(15); + public static BulletConfig flint = new BulletConfig().setItem(EnumAmmo.STONE_AP).setBlackPowder(true).setHeadshot(1F).setSpread(0.01F).setRicochetAngle(5).setDoesPenetrate(true).setDamage(1.5F); + public static BulletConfig iron = new BulletConfig().setItem(EnumAmmo.STONE_IRON).setBlackPowder(true).setHeadshot(1F).setSpread(0F).setRicochetAngle(90).setRicochetCount(5).setDoesPenetrate(true).setDamageFalloutByPen(false).setDamage(1.5F); + public static BulletConfig shot = new BulletConfig().setItem(EnumAmmo.STONE_SHOT).setBlackPowder(true).setHeadshot(1F).setSpread(0.1F).setRicochetAngle(45).setProjectiles(6, 6).setDamage(1F/6F); public static void init() { diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 6138868ef..f1ff99ef9 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1002,6 +1002,7 @@ public class ResourceManager { public static final ResourceLocation panzerschreck_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/panzerschreck.png"); public static final ResourceLocation g3_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3.png"); public static final ResourceLocation shredder_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder.png"); + public static final ResourceLocation shredder_orig_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder_orig.png"); public static final ResourceLocation sexy_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/sexy.png"); public static final ResourceLocation quadro_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/quadro.png"); public static final ResourceLocation quadro_rocket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/quadro_rocket.png"); diff --git a/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java b/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java index 413dd35b9..7031aafa5 100644 --- a/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java +++ b/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java @@ -77,10 +77,10 @@ public class ParticlePlasmaBlast extends EntityFX { tess.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha); - tess.addVertexWithUV((double)(- 1 * scale), (double)(- 0.25), (double)(- 1 * scale), 1, 1); - tess.addVertexWithUV((double)(- 1 * scale), (double)(- 0.25), (double)(+ 1 * scale), 1, 0); - tess.addVertexWithUV((double)(+ 1 * scale), (double)(- 0.25), (double)(+ 1 * scale), 0, 0); - tess.addVertexWithUV((double)(+ 1 * scale), (double)(- 0.25), (double)(- 1 * scale), 0, 1); + tess.addVertexWithUV((double)(- 1 * scale), 0, (double)(- 1 * scale), 1, 1); + tess.addVertexWithUV((double)(- 1 * scale), 0, (double)(+ 1 * scale), 1, 0); + tess.addVertexWithUV((double)(+ 1 * scale), 0, (double)(+ 1 * scale), 0, 0); + tess.addVertexWithUV((double)(+ 1 * scale), 0, (double)(- 1 * scale), 0, 1); tess.draw(); if(fog) GL11.glEnable(GL11.GL_FOG); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java index c647d6f2c..82d881174 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java @@ -61,7 +61,8 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { ResourceManager.g3.renderPart("Rifle"); ResourceManager.g3.renderPart("Stock"); - ResourceManager.g3.renderPart("FlashHider"); + ResourceManager.g3.renderPart("Flash_Hider"); + ResourceManager.g3.renderPart("Trigger_Rifle.002"); GL11.glPushMatrix(); GL11.glTranslated(mag[0], mag[1], mag[2]); @@ -86,7 +87,7 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { GL11.glTranslated(0, -0.875, -3.5); GL11.glRotated(-30 * (1 - ItemGunBaseNT.getMode(stack, 0)), 1, 0, 0); GL11.glTranslated(0, 0.875, 3.5); - ResourceManager.g3.renderPart("Selector"); + ResourceManager.g3.renderPart("Selector_Rifle.001"); GL11.glPopMatrix(); double smokeScale = 0.75; @@ -137,15 +138,16 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { ResourceManager.g3.renderPart("Rifle"); ResourceManager.g3.renderPart("Stock"); ResourceManager.g3.renderPart("Magazine"); - ResourceManager.g3.renderPart("FlashHider"); + ResourceManager.g3.renderPart("Flash_Hider"); ResourceManager.g3.renderPart("Bolt"); ResourceManager.g3.renderPart("Handle"); + ResourceManager.g3.renderPart("Trigger_Rifle.002"); GL11.glPushMatrix(); GL11.glTranslated(0, -0.875, -3.5); GL11.glRotated(-30, 1, 0, 0); GL11.glTranslated(0, 0.875, 3.5); - ResourceManager.g3.renderPart("Selector"); + ResourceManager.g3.renderPart("Selector_Rifle.001"); GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); } diff --git a/src/main/java/com/hbm/render/model/ModelT45Chest.java b/src/main/java/com/hbm/render/model/ModelT45Chest.java index 07f4cda1f..8f341f412 100644 --- a/src/main/java/com/hbm/render/model/ModelT45Chest.java +++ b/src/main/java/com/hbm/render/model/ModelT45Chest.java @@ -9,6 +9,7 @@ package com.hbm.render.model; import org.lwjgl.opengl.GL11; import com.hbm.interfaces.IHoldableWeapon; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; @@ -207,6 +208,7 @@ public class ModelT45Chest extends ModelBiped { @Override public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) { + if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; if (player.isSneaking()) { @@ -227,8 +229,8 @@ public class ModelT45Chest extends ModelBiped { } } - if(itemstack != null && player.getHeldItem().getItem() instanceof IHoldableWeapon) - this.aimedBow = true; + if(itemstack != null && player.getHeldItem().getItem() instanceof IHoldableWeapon) this.aimedBow = true; + if(itemstack != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT) this.aimedBow = true; } super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); this.chest.rotationPointX = this.bipedBody.rotationPointX; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java index ba54dee6f..a63acd692 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java @@ -90,10 +90,11 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i if(this.output != null) { + int prev = this.output.amount; Vec3 impact = Vec3.createVectorHelper(0, 0, 0); MaterialStack leftover = CrucibleUtil.pourSingleStack(worldObj, xCoord + 0.5D + rot.offsetX * 2.875D, yCoord + 1.25D, zCoord + 0.5D + rot.offsetZ * 2.875D, 6, true, this.output, MaterialShapes.INGOT.q(1), impact); - if(leftover.amount != this.output.amount) { + if(prev != this.output.amount) { this.output = leftover; NBTTagCompound data = new NBTTagCompound(); data.setString("type", "foundry"); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index fe0c76277..4e4cd8b34 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1206,6 +1206,7 @@ item.ammo_standard.flame_napalm.name=Flammenwerferbrennstoff, Napalm item.ammo_standard.g10.name=Kaliber 10 Schrot item.ammo_standard.g10_du.name=Kaliber 10 Uranschrot item.ammo_standard.g10_shrapnel.name=Kaliber 10 Schrapnell-Schrot +item.ammo_standard.g10_slug.name=Kaliber 10 Laufgeschoss item.ammo_standard.g12.name=Kaliber 12 Schrot item.ammo_standard.g12_anthrax.name=Kaliber 12 Anthrax item.ammo_standard.g12_bp.name=Kaliber 12 Schwarzpulver @@ -2080,13 +2081,13 @@ item.folly_shell.name=Silberne Kanonenhülse item.fooditem.name=lebensmittel item.fragment_actinium.name=Actiniumfragment item.fragment_boron.name=Borfragment -item.fragment_cerium.name=Cerium Ffragment +item.fragment_cerium.name=Cerfragment item.fragment_cobalt.name=Cobaltfragment item.fragment_coltan.name=Coltan item.fragment_lanthanium.name=Lanthanfragment item.fragment_meteorite.name=Meteoritenfragment item.fragment_neodymium.name=Neodymfragment -item.fragment_niobium.name=Niobium Ffragment +item.fragment_niobium.name=Niobfragment item.fuel_additive.antiknock.name=Tetraethyblei-Antiklopfmittel item.fuel_additive.deicer.name=Enteisungsmittel item.fuel_tank_large.name=Großer Treibstofftank @@ -2181,6 +2182,7 @@ item.gun_am180.name=Schallgedämpfte Maschinenpistole item.gun_ar15.name=Josh item.gun_autoshotgun.name=Auto-Flinte item.gun_autoshotgun_sexy.name=Sexy +item.gun_autoshotgun_shredder.name=Shredder item.gun_avenger.name=CZ57 Avenger-Minigun item.gun_b92.name=§9B92 Energiepistole§r item.gun_b92_ammo.name=§9B92-Energiezelle§r diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 6948039bf..218b03ef1 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1929,6 +1929,7 @@ item.ammo_standard.flame_napalm.name=Flamer Fuel, Napalm item.ammo_standard.g10.name=10 Gauge Buckshot item.ammo_standard.g10_du.name=10 Gauge Uranium Buckshot item.ammo_standard.g10_shrapnel.name=10 Gauge Shrapnel Buckshot +item.ammo_standard.g10_slug.name=10 Gauge Slug item.ammo_standard.g12.name=12 Gauge Buckshot item.ammo_standard.g12_anthrax.name=12 Gauge Anthrax Shell item.ammo_standard.g12_bp.name=12 Gauge Black Powder Buckshot @@ -2987,6 +2988,7 @@ item.gun_am180.name=Silenced Submachine Gun item.gun_ar15.name=Josh item.gun_autoshotgun.name=Auto Shotgun item.gun_autoshotgun_sexy.name=Sexy +item.gun_autoshotgun_shredder.name=Shredder item.gun_avenger.name=CZ57 Avenger Minigun item.gun_b92.name=§9B92 Energy Pistol§r item.gun_b92_ammo.name=§9B92 Energy Cell§r diff --git a/src/main/resources/assets/hbm/models/weapons/g3.obj b/src/main/resources/assets/hbm/models/weapons/g3.obj index b081699fc..3c68f4ea0 100644 --- a/src/main/resources/assets/hbm/models/weapons/g3.obj +++ b/src/main/resources/assets/hbm/models/weapons/g3.obj @@ -1,587 +1,4507 @@ -# Blender v3.2.0 OBJ File: 'g3.blend' +# Blender v2.79 (sub 0) OBJ File: '' # www.blender.org +mtllib g3.mtl +o Trigger_Rifle.002 +v 0.125000 -2.093750 -3.062500 +v 0.125000 -1.968750 -3.125000 +v 0.125000 -2.093750 -3.000000 +v 0.125000 -1.781250 -3.187500 +v 0.125000 -1.968750 -3.250000 +v 0.125000 -1.781250 -3.312500 +v 0.125000 -1.593750 -3.187500 +v 0.125000 -1.406250 -3.312500 +v 0.125000 -1.218750 -3.000000 +v 0.125000 -1.343750 -3.375000 +v -0.125000 -1.968750 -3.125000 +v -0.125000 -2.093750 -3.062500 +v -0.125000 -2.093750 -3.000000 +v -0.125000 -1.781250 -3.187500 +v -0.125000 -1.968750 -3.250000 +v -0.125000 -1.593750 -3.187500 +v -0.125000 -1.781250 -3.312500 +v -0.125000 -1.218750 -3.000000 +v -0.125000 -1.406250 -3.312500 +v -0.125000 -1.343750 -3.375000 +vt 0.656371 0.559846 +vt 0.667954 0.563707 +vt 0.656371 0.563707 +vt 0.629344 0.555985 +vt 0.640927 0.563707 +vt 0.629344 0.563707 +vt 0.617761 0.555985 +vt 0.606178 0.563707 +vt 0.691120 0.563707 +vt 0.698842 0.552124 +vt 0.718147 0.563707 +vt 0.602317 0.563707 +vt 0.606178 0.540541 +vt 0.667954 0.579151 +vt 0.656371 0.583012 +vt 0.656371 0.579151 +vt 0.629344 0.586873 +vt 0.640927 0.579151 +vt 0.640927 0.586873 +vt 0.617761 0.586873 +vt 0.629344 0.579151 +vt 0.691120 0.579151 +vt 0.718147 0.579151 +vt 0.698842 0.590734 +vt 0.606178 0.579151 +vt 0.606178 0.602317 +vt 0.602317 0.579151 +vt 0.667954 0.555985 +vt 0.640927 0.555985 +vt 0.667954 0.586873 +vt 0.652510 0.579151 +vt 0.652510 0.563707 +vt 0.679537 0.579151 +vt 0.679537 0.563707 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.4472 0.8944 +vn 0.0000 -0.2298 0.9732 +vn 0.0000 -0.1602 -0.9871 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 -0.9571 -0.2898 +vn 0.0000 0.1602 0.9871 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -0.6070 -0.7947 +vn 0.0000 0.5257 0.8507 +usemtl None +s off +f 1/1/1 2/2/1 3/3/1 +f 4/4/1 5/5/1 6/6/1 +f 7/7/1 6/6/1 8/8/1 +f 7/9/1 8/10/1 9/11/1 +f 8/8/1 10/12/1 9/13/1 +f 11/14/2 12/15/2 13/16/2 +f 14/17/2 15/18/2 11/19/2 +f 16/20/2 17/21/2 14/17/2 +f 16/22/2 18/23/2 19/24/2 +f 19/25/2 18/26/2 20/27/2 +f 1/1/1 5/28/1 2/2/1 +f 4/4/1 2/29/1 5/5/1 +f 7/7/1 4/4/1 6/6/1 +f 11/14/2 15/30/2 12/15/2 +f 14/17/2 17/21/2 15/18/2 +f 16/20/2 19/25/2 17/21/2 +s 1 +f 9/11/3 16/22/4 7/9/4 +f 6/6/5 19/25/6 8/8/6 +f 3/3/7 12/31/8 1/32/8 +f 7/9/4 14/33/9 4/34/9 +f 8/8/6 20/27/10 10/12/10 +f 1/32/8 15/18/11 5/5/11 +f 4/34/9 11/14/12 2/2/12 +f 5/5/11 17/21/5 6/6/5 +f 2/2/12 13/16/7 3/3/7 +f 9/11/3 18/23/3 16/22/4 +f 6/6/5 17/21/5 19/25/6 +f 3/3/7 13/16/7 12/31/8 +f 7/9/4 16/22/4 14/33/9 +f 8/8/6 19/25/6 20/27/10 +f 1/32/8 12/31/8 15/18/11 +f 4/34/9 14/33/9 11/14/12 +f 5/5/11 15/18/11 17/21/5 +f 2/2/12 11/14/12 13/16/7 +o Selector_Rifle.001 +v 0.343750 -0.755365 -3.411612 +v 0.406250 -0.718753 -3.500000 +v 0.343750 -0.718753 -3.500000 +v 0.343750 -0.932141 -3.411612 +v 0.406250 -0.843753 -3.375000 +v 0.343750 -0.843753 -3.375000 +v 0.406250 -0.755365 -3.411612 +v 0.343750 -0.968753 -3.500000 +v 0.406250 -0.932141 -3.411612 +v 0.343750 -0.937503 -4.187500 +v 0.468750 -1.000003 -4.125000 +v 0.343750 -1.000003 -4.125000 +v 0.468750 -0.937503 -4.187500 +v 0.343750 -0.718753 -4.062500 +v 0.468750 -0.718753 -4.062500 +v 0.468750 -0.843753 -4.000000 +v 0.468750 -0.718753 -3.750000 +v 0.468750 -0.906253 -3.750000 +v 0.406250 -0.968753 -3.500000 +v 0.343750 -0.843753 -4.000000 +vt 0.725869 0.474903 +vt 0.722008 0.471042 +vt 0.725869 0.471042 +vt 0.725869 0.482625 +vt 0.722008 0.478764 +vt 0.725869 0.478764 +vt 0.722008 0.474903 +vt 0.725869 0.486486 +vt 0.722008 0.482625 +vt 0.725869 0.420849 +vt 0.718147 0.416988 +vt 0.725869 0.416988 +vt 0.718147 0.420849 +vt 0.725869 0.436293 +vt 0.718147 0.436293 +vt 0.718147 0.405405 +vt 0.710425 0.432432 +vt 0.712686 0.420849 +vt 0.718147 0.455598 +vt 0.718147 0.389961 +vt 0.722008 0.374517 +vt 0.725869 0.374517 +vt 0.710425 0.440154 +vt 0.706564 0.455598 +vt 0.718147 0.471042 +vt 0.715885 0.476503 +vt 0.710425 0.478764 +vt 0.722008 0.486486 +vt 0.725869 0.405405 +vt 0.704964 0.476503 +vt 0.702703 0.471042 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.9835 0.1810 +vn 0.0000 0.9808 0.1951 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.9973 0.0738 +vn 0.0000 -0.7071 -0.7071 +vn -0.0000 -0.9985 0.0553 +vn 0.0000 0.4961 -0.8682 +vn 0.0000 0.8649 -0.5019 +vn 0.0000 -0.6247 0.7809 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.9701 -0.2425 +vn 0.0000 -0.9987 0.0506 +vn 0.9925 0.0000 0.1222 +vn 0.9900 0.0000 0.1410 +vn 0.9902 0.0000 0.1396 +vn 0.9916 0.0000 0.1297 +usemtl None +s 1 +f 21/35/13 22/36/14 23/37/15 +f 24/38/16 25/39/17 26/40/17 +f 26/40/17 27/41/13 21/35/13 +f 28/42/18 29/43/16 24/38/16 +f 30/44/19 31/45/20 32/46/20 +f 33/47/21 34/48/22 35/49/22 +f 36/50/23 32/46/20 31/45/20 +f 33/47/24 36/51/24 31/52/24 +f 23/37/15 22/36/14 37/53/25 +f 38/54/26 39/55/27 28/56/18 +f 36/57/24 37/53/28 38/58/29 +f 22/59/30 27/60/24 25/61/24 +f 22/59/30 38/58/29 37/53/28 +f 21/35/13 27/41/13 22/36/14 +f 24/38/16 29/43/16 25/39/17 +f 26/40/17 25/39/17 27/41/13 +f 28/42/18 39/62/27 29/43/16 +f 30/44/19 33/47/19 31/45/20 +f 33/47/21 30/44/21 34/48/22 +f 36/50/23 40/63/23 32/46/20 +f 33/47/24 35/49/24 36/51/24 +f 35/49/22 34/48/22 37/53/25 +f 34/48/22 23/37/15 37/53/25 +f 28/56/18 40/63/26 38/54/26 +f 40/63/26 36/50/26 38/54/26 +f 36/57/24 35/49/24 37/53/28 +f 25/61/24 29/64/24 39/65/31 +f 39/65/31 22/59/30 25/61/24 +f 22/59/30 39/65/31 38/58/29 +o Silencer +v -0.220972 0.220971 11.250000 +v -0.000001 0.312500 11.250000 +v -0.000000 -0.312500 11.250000 +v 0.312499 0.000000 11.250000 +v 0.220971 -0.220971 11.562500 +v 0.220971 -0.220971 11.250000 +v -0.220971 -0.220971 11.250000 +v -0.000000 -0.312500 11.562500 +v -0.220971 -0.220971 11.562500 +v -0.312501 -0.000000 11.562500 +v -0.220972 0.220971 11.562500 +v 0.220970 0.220971 11.562500 +v 0.220970 0.220971 11.250000 +v -0.312501 -0.000000 11.250000 +v -0.000001 0.312500 11.562500 +v 0.312499 0.000000 11.562500 +v 0.353552 -0.353553 15.312500 +v -0.000000 -0.500000 11.562500 +v 0.353553 -0.353553 11.562500 +v -0.353554 -0.353553 15.312500 +v -0.500000 -0.000000 11.562500 +v -0.353553 -0.353553 11.562500 +v -0.353554 0.353554 15.312500 +v -0.000001 0.500000 11.562500 +v -0.353554 0.353554 11.562500 +v 0.353552 0.353554 15.312500 +v 0.499999 0.000000 11.562500 +v 0.353552 0.353554 11.562500 +v 0.499999 0.000000 15.312500 +v -0.000001 -0.500000 15.312500 +v -0.500001 -0.000000 15.312500 +v -0.000001 0.500000 15.312500 +v 0.093749 0.000000 15.312500 +v 0.066290 0.066292 15.312500 +v -0.066292 0.066292 15.312500 +v -0.000001 0.093750 15.312500 +v -0.093751 -0.000000 15.312500 +v -0.066292 -0.066291 15.312500 +v -0.000001 -0.093750 15.312500 +v 0.066290 -0.066291 15.312500 +v -0.066292 -0.066291 14.812500 +v -0.066292 0.066292 14.812500 +v 0.066290 0.066292 14.812500 +v -0.000001 -0.093750 14.812500 +v -0.093751 -0.000000 14.812500 +v -0.000001 0.093750 14.812500 +v 0.093749 0.000000 14.812500 +v 0.066290 -0.066291 14.812500 +vt 0.865111 0.565111 +vt 0.853846 0.592308 +vt 0.930769 0.592308 +vt 1.000000 0.715385 +vt 0.961538 0.684615 +vt 1.000000 0.684615 +vt 1.000000 0.961538 +vt 0.961538 0.992308 +vt 0.961538 0.961538 +vt 1.000000 0.869231 +vt 0.961538 0.900000 +vt 0.961538 0.869231 +vt 1.000000 0.807692 +vt 0.961538 0.776923 +vt 1.000000 0.776923 +vt 1.000000 0.669231 +vt 0.961538 0.638462 +vt 1.000000 0.638462 +vt 1.000000 0.915385 +vt 0.961538 0.946154 +vt 0.961538 0.915385 +vt 1.000000 0.823077 +vt 0.961538 0.853846 +vt 0.961538 0.823077 +vt 1.000000 0.761538 +vt 0.961538 0.730769 +vt 1.000000 0.730769 +vt 0.476923 0.676923 +vt 0.938462 0.630769 +vt 0.938462 0.676923 +vt 0.476923 0.953846 +vt 0.938462 0.907692 +vt 0.938462 0.953846 +vt 0.476923 0.861538 +vt 0.938462 0.815385 +vt 0.938462 0.861538 +vt 0.476923 0.769231 +vt 0.938462 0.723077 +vt 0.938462 0.769231 +vt 0.476923 0.723077 +vt 0.476923 1.000000 +vt 0.938462 1.000000 +vt 0.476923 0.907692 +vt 0.476923 0.815385 +vt 0.961538 0.807692 +vt 0.430769 0.742308 +vt 0.430769 0.788462 +vt 0.430769 0.842308 +vt 0.430769 0.834615 +vt 0.430769 0.880769 +vt 0.430769 0.926923 +vt 0.430769 0.973077 +vt 0.430769 0.650000 +vt 0.476923 0.630769 +vt 0.430769 0.696154 +vt 0.930769 0.569231 +vt 0.992308 0.576923 +vt 0.930769 0.576923 +vt 0.930769 0.584615 +vt 0.992308 0.592308 +vt 0.930769 0.592308 +vt 0.930769 0.600000 +vt 0.992308 0.607692 +vt 0.930769 0.607692 +vt 0.930769 0.623077 +vt 0.992308 0.630769 +vt 0.930769 0.630769 +vt 0.992308 0.584615 +vt 0.992308 0.600000 +vt 0.992308 0.615385 +vt 0.930769 0.615385 +vt 0.992308 0.623077 +vt 0.980769 0.546154 +vt 0.992308 0.557692 +vt 0.980769 0.569231 +vt 0.865111 0.619504 +vt 0.892308 0.630769 +vt 0.919504 0.619504 +vt 0.919504 0.565111 +vt 0.892308 0.553846 +vt 0.961538 0.715385 +vt 1.000000 0.992308 +vt 1.000000 0.900000 +vt 0.961538 0.669231 +vt 1.000000 0.946154 +vt 1.000000 0.853846 +vt 0.961538 0.761538 +vt 0.430769 0.750000 +vt 0.430769 0.796154 +vt 0.430769 0.888462 +vt 0.430769 0.934615 +vt 0.430769 0.980769 +vt 0.430769 0.657692 +vt 0.430769 0.703846 +vt 0.992308 0.569231 +vt 0.972610 0.565851 +vt 0.969231 0.557692 +vt 0.972610 0.549533 +vt 0.988928 0.549533 +vt 0.988928 0.565851 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 -0.0000 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 -0.7071 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.7071 0.7071 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.0000 0.0000 1.0000 +usemtl None +s 1 +f 41/66/32 42/67/32 43/68/32 +f 44/69/33 45/70/34 46/71/34 +f 47/72/35 48/73/36 49/74/35 +f 41/75/37 50/76/38 51/77/37 +f 42/78/39 52/79/40 53/80/40 +f 46/81/34 48/82/36 43/83/36 +f 54/84/38 49/85/35 50/86/38 +f 42/87/39 51/88/37 55/89/39 +f 53/90/40 56/91/33 44/92/33 +f 57/93/34 58/94/36 59/95/34 +f 60/96/35 61/97/38 62/98/35 +f 63/99/37 64/100/39 65/101/37 +f 66/102/40 67/103/33 68/104/40 +f 69/105/33 59/95/34 67/103/33 +f 70/106/36 62/98/35 58/107/36 +f 71/108/38 65/101/37 61/97/38 +f 72/109/39 68/104/40 64/100/39 +f 48/82/32 59/95/32 58/94/32 +f 45/70/32 67/103/32 59/95/32 +f 56/91/32 68/104/32 67/103/32 +f 55/110/32 68/104/32 52/79/32 +f 51/88/32 64/100/32 55/89/32 +f 50/76/32 65/101/32 51/77/32 +f 49/85/32 61/97/32 50/86/32 +f 48/73/32 62/98/32 49/74/32 +f 66/102/41 73/111/41 69/105/41 +f 72/109/41 74/112/41 66/102/41 +f 72/109/41 75/113/41 76/114/41 +f 71/108/41 75/115/41 63/99/41 +f 60/96/41 77/116/41 71/108/41 +f 70/106/41 78/117/41 60/96/41 +f 57/93/41 79/118/41 70/119/41 +f 69/105/41 80/120/41 57/93/41 +f 79/121/39 81/122/40 78/123/40 +f 77/124/33 82/125/34 75/126/34 +f 76/127/36 83/128/35 74/129/35 +f 80/130/37 84/131/39 79/132/39 +f 78/123/40 85/133/33 77/124/33 +f 75/126/34 86/134/36 76/127/36 +f 74/129/35 87/135/38 73/136/38 +f 73/136/38 88/137/37 80/130/37 +f 85/138/41 84/139/41 87/140/41 +f 42/67/32 53/141/32 43/68/32 +f 53/141/32 44/142/32 43/68/32 +f 44/142/32 46/143/32 43/68/32 +f 43/68/32 47/144/32 54/145/32 +f 54/145/32 41/66/32 43/68/32 +f 44/69/33 56/146/33 45/70/34 +f 47/72/35 43/147/36 48/73/36 +f 41/75/37 54/148/38 50/76/38 +f 42/78/39 55/110/39 52/79/40 +f 46/81/34 45/149/34 48/82/36 +f 54/84/38 47/150/35 49/85/35 +f 42/87/39 41/151/37 51/88/37 +f 53/90/40 52/152/40 56/91/33 +f 57/93/34 70/119/36 58/94/36 +f 60/96/35 71/108/38 61/97/38 +f 63/99/37 72/109/39 64/100/39 +f 66/102/40 69/105/33 67/103/33 +f 69/105/33 57/93/34 59/95/34 +f 70/106/36 60/96/35 62/98/35 +f 71/108/38 63/99/37 65/101/37 +f 72/109/39 66/102/40 68/104/40 +f 48/82/32 45/149/32 59/95/32 +f 45/70/32 56/146/32 67/103/32 +f 56/91/32 52/152/32 68/104/32 +f 55/110/32 64/100/32 68/104/32 +f 51/88/32 65/101/32 64/100/32 +f 50/76/32 61/97/32 65/101/32 +f 49/85/32 62/98/32 61/97/32 +f 48/73/32 58/107/32 62/98/32 +f 66/102/41 74/153/41 73/111/41 +f 72/109/41 76/154/41 74/112/41 +f 72/109/41 63/99/41 75/113/41 +f 71/108/41 77/155/41 75/115/41 +f 60/96/41 78/156/41 77/116/41 +f 70/106/41 79/157/41 78/117/41 +f 57/93/41 80/158/41 79/118/41 +f 69/105/41 73/159/41 80/120/41 +f 79/121/39 84/160/39 81/122/40 +f 77/124/33 85/133/33 82/125/34 +f 76/127/36 86/134/36 83/128/35 +f 80/130/37 88/137/37 84/131/39 +f 78/123/40 81/122/40 85/133/33 +f 75/126/34 82/125/34 86/134/36 +f 74/129/35 83/128/35 87/135/38 +f 73/136/38 87/135/38 88/137/37 +f 87/140/41 83/161/41 86/162/41 +f 86/162/41 82/163/41 87/140/41 +f 82/163/41 85/138/41 87/140/41 +f 85/138/41 81/164/41 84/139/41 +f 84/139/41 88/165/41 87/140/41 +o Scope_Scope.001 +v 0.312500 2.156250 -3.312500 +v 0.312500 1.531250 -2.687500 +v 0.312500 1.531250 -3.312500 +v -0.312500 2.156250 -2.687500 +v -0.312500 1.531250 -3.312500 +v -0.312500 1.531250 -2.687500 +v 0.312500 2.156250 -2.687500 +v -0.250000 2.093750 -3.437500 +v -0.312500 2.156250 -3.312500 +v 0.250000 1.593750 -3.437500 +v 0.250000 2.093750 -3.437500 +v -0.250000 1.593750 -3.437500 +v 0.250000 2.093750 -2.562500 +v -0.250000 1.593750 -2.562500 +v 0.250000 1.593750 -2.562500 +v -0.250000 2.093750 -2.562500 +v -0.093750 1.468750 -1.875000 +v 0.093750 1.656250 -1.875000 +v -0.093750 1.656250 -1.875000 +v -0.093750 1.281250 -2.500000 +v 0.093750 1.281250 -4.000000 +v -0.093750 1.281250 -4.000000 +v -0.093750 1.468750 -2.000000 +v 0.093750 1.468750 -1.875000 +v 0.093750 1.281250 -2.187500 +v 0.093750 1.468750 -2.312500 +v 0.093750 1.468750 -2.000000 +v -0.093750 1.281250 -2.187500 +v -0.093750 1.468750 -2.312500 +v 0.093750 1.468750 -4.125000 +v 0.093750 1.281250 -4.312500 +v -0.093750 1.468750 -4.125000 +v -0.093750 1.281250 -4.312500 +v -0.093750 1.656250 -2.312500 +v 0.093750 1.281250 -4.875000 +v -0.156250 0.531250 -4.750000 +v -0.281250 0.531250 -5.062500 +v -0.156250 0.531250 -5.062500 +v -0.093750 1.093750 -5.062500 +v -0.093750 1.281250 -4.875000 +v 0.343750 0.531250 -2.500000 +v 0.343750 0.781250 -2.187500 +v 0.343750 0.531250 -2.187500 +v -0.156250 0.531250 -2.187500 +v -0.281250 0.531250 -2.500000 +v -0.156250 0.531250 -2.500000 +v 0.156250 0.531250 -5.062500 +v 0.343750 0.531250 -4.750000 +v 0.156250 0.531250 -4.750000 +v -0.093750 0.906250 -4.750000 +v -0.093750 1.031250 -4.562500 +v -0.093750 1.093750 -4.750000 +v 0.093750 0.906250 -4.750000 +v 0.093750 1.093750 -4.750000 +v 0.093750 1.031250 -4.562500 +v -0.093750 0.906250 -2.500000 +v -0.093750 1.093750 -2.500000 +v -0.093750 1.031250 -2.687500 +v 0.093750 0.906250 -2.500000 +v 0.093750 1.031250 -2.687500 +v 0.093750 1.093750 -2.500000 +v -0.281250 0.781250 -4.750000 +v -0.156250 0.718750 -4.750000 +v 0.093750 1.281250 -2.500000 +v 0.093750 1.093750 -5.062500 +v 0.406250 0.593750 -4.906250 +v 0.406250 0.612056 -4.950444 +v 0.406250 0.656250 -4.968750 +v 0.406250 0.656250 -2.406250 +v 0.406250 0.718750 -2.343750 +v 0.406250 0.656250 -2.281250 +v -0.156250 0.718750 -5.062500 +v -0.281250 0.781250 -5.062500 +v 0.343750 0.781250 -5.062500 +v 0.343750 0.531250 -5.062500 +v 0.281250 0.781250 -2.500000 +v 0.156250 0.718750 -2.500000 +v -0.156250 0.718750 -2.187500 +v 0.156250 0.718750 -2.187500 +v -0.093750 1.093750 -2.187500 +v 0.156250 0.531250 -2.187500 +v 0.093750 1.656250 -4.125000 +v -0.093750 1.656250 -4.125000 +v 0.093750 1.656250 -3.687500 +v 0.093750 1.468750 -3.687500 +v 0.093750 1.468750 -3.812500 +v -0.093750 1.656250 -3.687500 +v -0.093750 1.468750 -3.812500 +v -0.093750 1.468750 -3.687500 +v 0.093750 1.656250 -2.312500 +v -0.281250 0.531250 -4.750000 +v 0.343750 0.781250 -2.500000 +v -0.281250 0.531250 -2.187500 +v 0.281250 0.781250 -4.750000 +v 0.156250 0.718750 -4.750000 +v 0.343750 0.781250 -4.750000 +v 0.093750 1.093750 -2.187500 +v 0.406250 0.700444 -4.950444 +v 0.406250 0.718750 -4.906250 +v 0.406250 0.700444 -4.862056 +v 0.406250 0.656250 -4.843750 +v 0.406250 0.612056 -4.862056 +v 0.406250 0.700444 -2.387945 +v 0.406250 0.700444 -2.299556 +v 0.406250 0.612056 -2.299556 +v 0.406250 0.593750 -2.343750 +v 0.406250 0.612056 -2.387945 +v 0.281250 0.781250 -5.062500 +v 0.156250 0.718750 -5.062500 +v -0.281250 0.781250 -2.500000 +v -0.156250 0.718750 -2.500000 +v 0.156250 0.531250 -2.500000 +v 0.281250 0.781250 -2.187500 +v -0.281250 0.781250 -2.187500 +v 0.270633 1.687500 -5.750000 +v 0.312500 1.843750 -5.625000 +v 0.312500 1.843750 -5.750000 +v 0.270633 2.000000 -5.750000 +v 0.156250 2.114383 -5.625000 +v 0.156250 2.114383 -5.750000 +v -0.156250 1.573117 -5.750000 +v 0.000000 1.531250 -5.625000 +v 0.000000 1.531250 -5.750000 +v -0.270633 2.000000 -5.750000 +v -0.312500 1.843750 -5.625000 +v -0.312500 1.843750 -5.750000 +v 0.000000 2.156250 -5.625000 +v 0.000000 2.156250 -5.750000 +v 0.156250 1.573117 -5.625000 +v 0.156250 1.573117 -5.750000 +v -0.270633 1.687500 -5.625000 +v -0.270633 1.687500 -5.750000 +v -0.156250 2.114383 -5.625000 +v -0.156250 2.114383 -5.750000 +v 0.270633 1.687500 -5.625000 +v 0.270633 2.000000 -5.625000 +v -0.156250 1.573117 -5.625000 +v -0.270633 2.000000 -5.625000 +v 0.000000 2.218750 -5.750000 +v -0.324760 2.031250 -5.750000 +v -0.187500 2.168509 -5.750000 +v -0.324760 1.656250 -5.750000 +v -0.375000 1.843750 -5.750000 +v 0.000000 1.468750 -5.750000 +v -0.187500 1.518990 -5.750000 +v 0.187500 1.518990 -5.750000 +v 0.324759 1.656250 -5.750000 +v 0.324759 2.031250 -5.750000 +v 0.375000 1.843750 -5.750000 +v 0.187500 2.168509 -5.750000 +v 0.187500 1.518990 -4.500000 +v 0.375000 1.843750 -4.500000 +v -0.324760 1.656250 -4.500000 +v -0.187500 2.168509 -4.500000 +v 0.324759 1.656250 -4.500000 +v 0.324759 2.031250 -4.500000 +v -0.187500 1.518990 -4.500000 +v -0.324760 2.031250 -4.500000 +v 0.187500 2.168509 -4.500000 +v 0.000000 1.468750 -4.500000 +v -0.375000 1.843750 -4.500000 +v 0.000000 2.218750 -4.500000 +v 0.125000 2.060256 -4.312500 +v 0.216506 1.968750 -4.312500 +v 0.250000 1.843750 -4.312500 +v 0.216506 1.718750 -4.312500 +v 0.125000 1.627244 -4.312500 +v 0.000000 1.593750 -4.312500 +v -0.125000 1.627244 -4.312500 +v -0.216506 1.718750 -4.312500 +v -0.250000 1.843750 -4.312500 +v -0.216506 1.968750 -4.312500 +v -0.125000 2.060256 -4.312500 +v 0.000000 2.093750 -4.312500 +v 0.216506 1.968750 -1.687500 +v -0.125000 1.627244 -1.687500 +v -0.216506 1.968750 -1.687500 +v 0.125000 2.060256 -1.687500 +v 0.000000 1.593750 -1.687500 +v -0.250000 1.843750 -1.687500 +v -0.000000 2.093750 -1.687500 +v 0.125000 1.627244 -1.687500 +v 0.250000 1.843750 -1.687500 +v -0.216506 1.718750 -1.687500 +v -0.125000 2.060256 -1.687500 +v 0.216506 1.718750 -1.687500 +v -0.000000 2.468750 -0.187500 +v 0.312500 2.385015 -0.187500 +v 0.541266 2.156250 -0.187500 +v 0.625000 1.843750 -0.187500 +v 0.541266 1.531250 -0.187500 +v 0.312500 1.302484 -0.187500 +v -0.000000 1.218750 -0.187500 +v -0.312500 1.302484 -0.187500 +v -0.541266 1.531250 -0.187500 +v -0.625000 1.843750 -0.187500 +v -0.541266 2.156250 -0.187500 +v -0.312500 2.385015 -0.187500 +v 0.541266 2.156250 1.312500 +v -0.312500 1.302484 1.312500 +v -0.541266 2.156250 1.312500 +v 0.312500 2.385015 1.312500 +v -0.000000 1.218750 1.312500 +v -0.625000 1.843750 1.312500 +v -0.000000 2.468750 1.312500 +v 0.312500 1.302484 1.312500 +v 0.625000 1.843750 1.312500 +v -0.541266 1.531250 1.312500 +v -0.312500 2.385015 1.312500 +v 0.541266 1.531250 1.312500 +v -0.562500 1.843750 1.312500 +v -0.487139 2.125000 1.312500 +v -0.281250 2.330889 1.312500 +v -0.000000 2.406250 1.312500 +v 0.281250 2.330889 1.312500 +v 0.487139 2.125000 1.312500 +v 0.562500 1.843750 1.312500 +v 0.487139 1.562500 1.312500 +v 0.281250 1.356611 1.312500 +v -0.000000 1.281250 1.312500 +v -0.281250 1.356611 1.312500 +v -0.487139 1.562500 1.312500 +v 0.281250 2.330889 1.062500 +v -0.000000 1.281250 1.062500 +v -0.562500 1.843750 1.062500 +v -0.000000 2.406250 1.062500 +v 0.281250 1.356611 1.062500 +v 0.562500 1.843750 1.062500 +v -0.487139 1.562500 1.062500 +v -0.281250 2.330889 1.062500 +v 0.487139 1.562500 1.062500 +v 0.487139 2.125000 1.062500 +v -0.281250 1.356611 1.062500 +v -0.487139 2.125000 1.062500 +v 0.125000 2.218750 -3.216506 +v 0.216506 2.156250 -3.125000 +v 0.125000 2.156250 -3.216506 +v 0.000000 2.218750 -2.750000 +v -0.125000 2.156250 -2.783494 +v 0.000000 2.156250 -2.750000 +v -0.250000 2.218750 -3.000000 +v -0.216506 2.156250 -3.125000 +v -0.250000 2.156250 -3.000000 +v 0.000000 2.218750 -3.250000 +v 0.000000 2.156250 -3.250000 +v 0.125000 2.218750 -2.783494 +v 0.125000 2.156250 -2.783494 +v -0.216506 2.218750 -2.875000 +v -0.216506 2.156250 -2.875000 +v -0.125000 2.218750 -3.216506 +v -0.125000 2.156250 -3.216506 +v 0.216506 2.218750 -2.875000 +v 0.216506 2.156250 -2.875000 +v 0.216506 2.218750 -3.125000 +v 0.250000 2.156250 -3.000000 +v -0.125000 2.218750 -2.783494 +v -0.216506 2.218750 -3.125000 +v 0.250000 2.218750 -3.000000 +v -0.270633 2.406250 -3.156250 +v -0.156250 2.218750 -3.270633 +v -0.270633 2.218750 -3.156250 +v 0.312500 2.406250 -3.000000 +v 0.270633 2.218750 -2.843750 +v 0.312500 2.218750 -3.000000 +v 0.156250 2.406250 -3.270633 +v 0.270633 2.218750 -3.156250 +v 0.156250 2.218750 -3.270633 +v 0.000000 2.406250 -2.687500 +v -0.156250 2.218750 -2.729367 +v 0.000000 2.218750 -2.687500 +v -0.312500 2.406250 -3.000000 +v -0.312500 2.218750 -3.000000 +v 0.000000 2.406250 -3.312500 +v 0.000000 2.218750 -3.312500 +v 0.156250 2.406250 -2.729367 +v 0.156250 2.218750 -2.729367 +v -0.270633 2.406250 -2.843750 +v -0.270633 2.218750 -2.843750 +v -0.156250 2.406250 -3.270633 +v 0.270633 2.406250 -2.843750 +v 0.270633 2.406250 -3.156250 +v -0.156250 2.406250 -2.729367 +v -0.375000 1.627243 -3.125000 +v -0.312500 1.718750 -3.216506 +v -0.312500 1.627243 -3.125000 +v -0.375000 2.093750 -3.000000 +v -0.312500 2.060256 -2.875000 +v -0.312500 2.093750 -3.000000 +v -0.375000 1.968750 -3.216506 +v -0.312500 2.060256 -3.125000 +v -0.312500 1.968750 -3.216506 +v -0.375000 1.843750 -2.750000 +v -0.312500 1.718750 -2.783494 +v -0.312500 1.843750 -2.750000 +v -0.375000 1.593750 -3.000000 +v -0.312500 1.593750 -3.000000 +v -0.375000 1.843750 -3.250000 +v -0.312500 1.843750 -3.250000 +v -0.375000 1.968750 -2.783494 +v -0.312500 1.968750 -2.783494 +v -0.375000 1.627243 -2.875000 +v -0.312500 1.627243 -2.875000 +v -0.375000 1.718750 -3.216506 +v -0.375000 2.060256 -2.875000 +v -0.375000 2.060256 -3.125000 +v -0.375000 1.718750 -2.783494 +v -0.375000 2.114383 -3.156250 +v -0.375000 2.156250 -3.000000 +v -0.375000 2.000000 -3.270633 +v -0.375000 1.843750 -3.312500 +v -0.375000 1.687500 -3.270633 +v -0.375000 1.573117 -3.156250 +v -0.375000 1.531250 -3.000000 +v -0.375000 1.687500 -2.729367 +v -0.375000 1.573117 -2.843750 +v -0.375000 1.843750 -2.687500 +v -0.375000 2.000000 -2.729367 +v -0.375000 2.114383 -2.843750 +v -0.562500 1.531250 -3.000000 +v -0.562500 1.843750 -3.312500 +v -0.562500 2.000000 -2.729367 +v -0.562500 1.573117 -2.843750 +v -0.562500 1.687500 -3.270633 +v -0.562500 2.114383 -2.843750 +v -0.562500 2.114383 -3.156250 +v -0.562500 1.687500 -2.729367 +v -0.562500 1.573117 -3.156250 +v -0.562500 2.156250 -3.000000 +v -0.562500 2.000000 -3.270633 +v -0.562500 1.843750 -2.687500 +v 0.312500 1.968750 -3.216506 +v 0.375000 1.843750 -3.250000 +v 0.312500 1.843750 -3.250000 +v 0.312500 1.843750 -2.750000 +v 0.375000 1.968750 -2.783494 +v 0.312500 1.968750 -2.783494 +v 0.312500 1.593750 -3.000000 +v 0.375000 1.627243 -2.875000 +v 0.312500 1.627243 -2.875000 +v 0.375000 1.718750 -3.216506 +v 0.312500 1.718750 -3.216506 +v 0.375000 2.060256 -2.875000 +v 0.312500 2.060256 -2.875000 +v 0.312500 2.093750 -3.000000 +v 0.375000 2.060256 -3.125000 +v 0.312500 2.060256 -3.125000 +v 0.375000 1.718750 -2.783494 +v 0.312500 1.718750 -2.783494 +v 0.375000 1.627243 -3.125000 +v 0.312500 1.627243 -3.125000 +v 0.375000 2.093750 -3.000000 +v 0.375000 1.968750 -3.216506 +v 0.375000 1.843750 -2.750000 +v 0.375000 1.593750 -3.000000 +v 0.375000 2.000000 -3.270633 +v 0.500000 1.843750 -3.312500 +v 0.375000 1.843750 -3.312500 +v 0.375000 1.843750 -2.687500 +v 0.500000 2.000000 -2.729367 +v 0.375000 2.000000 -2.729367 +v 0.375000 1.531250 -3.000000 +v 0.500000 1.573117 -2.843750 +v 0.375000 1.573117 -2.843750 +v 0.500000 1.687500 -3.270633 +v 0.375000 1.687500 -3.270633 +v 0.500000 2.114383 -2.843750 +v 0.375000 2.114383 -2.843750 +v 0.375000 2.156250 -3.000000 +v 0.500000 2.114383 -3.156250 +v 0.375000 2.114383 -3.156250 +v 0.500000 1.687500 -2.729367 +v 0.375000 1.687500 -2.729367 +v 0.500000 1.573117 -3.156250 +v 0.375000 1.573117 -3.156250 +v 0.500000 2.156250 -3.000000 +v 0.500000 2.000000 -3.270633 +v 0.500000 1.843750 -2.687500 +v 0.500000 1.531250 -3.000000 +v 0.625000 1.843750 -3.250000 +v 0.625000 1.968750 -3.216506 +v 0.625000 2.060256 -3.125000 +v 0.625000 2.060256 -2.875000 +v 0.625000 1.968750 -2.783494 +v 0.625000 1.843750 -2.750000 +v 0.625000 1.718750 -2.783494 +v 0.625000 1.627244 -2.875000 +v 0.625000 1.593750 -3.000000 +v 0.625000 1.718750 -3.216506 +v 0.625000 1.627244 -3.125000 +v 0.625000 2.093750 -3.000000 +v 0.343750 0.700444 -4.862056 +v 0.343750 0.718750 -4.906250 +v 0.343750 0.612056 -4.862056 +v 0.343750 0.656250 -4.843750 +v 0.343750 0.612056 -4.950444 +v 0.343750 0.593750 -4.906250 +v 0.343750 0.700444 -4.950444 +v 0.343750 0.656250 -4.968750 +v 0.343750 0.700444 -2.299556 +v 0.343750 0.718750 -2.343750 +v 0.343750 0.612056 -2.299556 +v 0.343750 0.656250 -2.281250 +v 0.343750 0.612056 -2.387945 +v 0.343750 0.593750 -2.343750 +v 0.343750 0.700444 -2.387945 +v 0.343750 0.656250 -2.406250 +vt 0.815385 0.353846 +vt 0.738462 0.276923 +vt 0.815385 0.276923 +vt 0.738462 0.123077 +vt 0.815385 0.200000 +vt 0.738462 0.200000 +vt 0.815385 0.046154 +vt 0.738462 0.046154 +vt 0.830769 0.115385 +vt 0.815385 0.123077 +vt 0.830769 0.269231 +vt 0.830769 0.346154 +vt 0.830769 0.192308 +vt 0.830769 0.207692 +vt 0.892308 0.269231 +vt 0.661538 0.269231 +vt 0.723077 0.207692 +vt 0.723077 0.269231 +vt 0.738462 0.353846 +vt 0.723077 0.284615 +vt 0.723077 0.053846 +vt 0.723077 0.130769 +vt 0.938462 0.476923 +vt 0.961538 0.453846 +vt 0.961538 0.476923 +vt 0.923077 0.084615 +vt 0.946154 0.269231 +vt 0.923077 0.269231 +vt 0.923077 0.476923 +vt 0.938462 0.453846 +vt 0.192308 0.384615 +vt 0.215385 0.407692 +vt 0.169231 0.407692 +vt 0.115385 0.376923 +vt 0.100000 0.400000 +vt 0.076923 0.376923 +vt 0.900000 0.400000 +vt 0.876923 0.415385 +vt 0.876923 0.376923 +vt 0.876923 0.515385 +vt 0.900000 0.530769 +vt 0.876923 0.553846 +vt 0.946154 0.284615 +vt 0.923077 0.307692 +vt 0.923077 0.284615 +vt 0.961538 0.530769 +vt 0.938462 0.530769 +vt 0.938462 0.492308 +vt 0.938462 0.438462 +vt 0.946154 0.376923 +vt 0.946154 0.307692 +vt 0.115385 0.153846 +vt 0.076923 0.169231 +vt 0.076923 0.153846 +vt 0.030769 0.261538 +vt 0.053846 0.238462 +vt 0.053846 0.261538 +vt 0.230769 0.276923 +vt 0.192308 0.307692 +vt 0.192308 0.276923 +vt 0.115385 0.261538 +vt 0.076923 0.276923 +vt 0.076923 0.261538 +vt 0.230769 0.146154 +vt 0.192308 0.169231 +vt 0.192308 0.146154 +vt 0.876923 0.361538 +vt 0.892308 0.338462 +vt 0.900000 0.361538 +vt 0.992308 0.361538 +vt 0.969231 0.361538 +vt 0.976923 0.338462 +vt 0.876923 0.084615 +vt 0.900000 0.084615 +vt 0.892308 0.107692 +vt 0.992308 0.084615 +vt 0.976923 0.107692 +vt 0.969231 0.084615 +vt 0.138462 0.215385 +vt 0.115385 0.200000 +vt 0.130769 0.192308 +vt 0.230769 0.361538 +vt 0.230769 0.384615 +vt 0.969231 0.400000 +vt 0.900000 0.400000 +vt 0.923077 0.376923 +vt 0.076923 0.353846 +vt 0.423077 0.584615 +vt 0.420824 0.579176 +vt 0.415385 0.576923 +vt 0.415385 0.600000 +vt 0.407692 0.607692 +vt 0.415385 0.615385 +vt 0.061538 0.192308 +vt 0.076923 0.200000 +vt 0.230769 0.200000 +vt 0.230769 0.169231 +vt 0.030769 0.323077 +vt 0.007692 0.307692 +vt 0.023077 0.300000 +vt 0.130769 0.300000 +vt 0.169231 0.300000 +vt 0.138462 0.346154 +vt 0.192308 0.253846 +vt 0.923077 0.553846 +vt 0.923077 0.530769 +vt 0.923077 0.453846 +vt 0.900000 0.453846 +vt 0.900000 0.438462 +vt 0.923077 0.476923 +vt 0.900000 0.492308 +vt 0.900000 0.476923 +vt 0.830769 0.053846 +vt 0.830769 0.284615 +vt 0.830769 0.130769 +vt 0.892308 0.207692 +vt 0.661538 0.207692 +vt 0.723077 0.346154 +vt 0.723077 0.115385 +vt 0.723077 0.192308 +vt 0.946154 0.084615 +vt 0.923077 0.453846 +vt 0.138462 0.400000 +vt 0.938462 0.400000 +vt 0.961538 0.400000 +vt 0.115385 0.169231 +vt 0.030769 0.238462 +vt 0.230769 0.307692 +vt 0.115385 0.276923 +vt 0.184615 0.200000 +vt 0.161538 0.238462 +vt 0.161538 0.215385 +vt 0.138462 0.238462 +vt 0.169231 0.192308 +vt 0.192308 0.200000 +vt 0.169231 0.169231 +vt 0.130769 0.169231 +vt 0.192308 0.361538 +vt 0.115385 0.353846 +vt 0.409945 0.579176 +vt 0.407692 0.584615 +vt 0.409945 0.590055 +vt 0.415385 0.592308 +vt 0.420824 0.590055 +vt 0.409945 0.602253 +vt 0.409945 0.613132 +vt 0.420824 0.613132 +vt 0.423077 0.607692 +vt 0.420824 0.602253 +vt 0.007692 0.200000 +vt 0.000000 0.200000 +vt 0.000000 0.169231 +vt 0.023077 0.169231 +vt 0.023077 0.192308 +vt 0.061538 0.169231 +vt 0.076923 0.307692 +vt 0.061538 0.300000 +vt 0.053846 0.346154 +vt 0.053846 0.323077 +vt 0.061538 0.276923 +vt -0.000000 0.276923 +vt 0.023077 0.276923 +vt -0.000000 0.307692 +vt 0.030769 0.346154 +vt 0.169231 0.276923 +vt 0.184615 0.307692 +vt 0.161538 0.346154 +vt 0.115385 0.307692 +vt 0.130769 0.276923 +vt 0.230769 0.253846 +vt 0.900000 0.553846 +vt 0.923077 0.400000 +vt 0.300000 0.523077 +vt 0.323077 0.538462 +vt 0.323077 0.523077 +vt 0.346154 0.523077 +vt 0.369231 0.538462 +vt 0.369231 0.523077 +vt 0.507692 0.523077 +vt 0.530769 0.538462 +vt 0.530769 0.523077 +vt 0.438462 0.523077 +vt 0.461538 0.538462 +vt 0.461538 0.523077 +vt 0.392308 0.538462 +vt 0.392308 0.523077 +vt 0.253846 0.523077 +vt 0.276923 0.538462 +vt 0.276923 0.523077 +vt 0.484615 0.538462 +vt 0.484615 0.523077 +vt 0.415385 0.538462 +vt 0.415385 0.523077 +vt 0.300000 0.538462 +vt 0.346154 0.538462 +vt 0.507692 0.538462 +vt 0.438462 0.538462 +vt 0.248693 0.519231 +vt 0.215385 0.461538 +vt 0.182076 0.519231 +vt 0.413462 0.523077 +vt 0.392308 0.515385 +vt 0.394231 0.523077 +vt 0.417308 0.523077 +vt 0.438462 0.515385 +vt 0.415385 0.515385 +vt 0.459615 0.523077 +vt 0.440385 0.523077 +vt 0.463462 0.523077 +vt 0.484615 0.515385 +vt 0.461538 0.515385 +vt 0.505769 0.523077 +vt 0.486538 0.523077 +vt 0.509615 0.523077 +vt 0.530769 0.515385 +vt 0.507692 0.515385 +vt 0.275000 0.523077 +vt 0.253846 0.515385 +vt 0.255769 0.523077 +vt 0.298077 0.523077 +vt 0.276923 0.515385 +vt 0.278846 0.523077 +vt 0.321154 0.523077 +vt 0.300000 0.515385 +vt 0.301923 0.523077 +vt 0.325000 0.523077 +vt 0.346154 0.515385 +vt 0.323077 0.515385 +vt 0.390385 0.523077 +vt 0.369231 0.515385 +vt 0.371154 0.523077 +vt 0.367308 0.523077 +vt 0.348077 0.523077 +vt 0.276923 0.361538 +vt 0.323077 0.361538 +vt 0.484615 0.361538 +vt 0.415385 0.361538 +vt 0.300000 0.361538 +vt 0.346154 0.361538 +vt 0.507692 0.361538 +vt 0.438462 0.361538 +vt 0.369231 0.361538 +vt 0.253846 0.361538 +vt 0.461538 0.361538 +vt 0.392308 0.361538 +vt 0.373077 0.330769 +vt 0.365385 0.330769 +vt 0.350000 0.330769 +vt 0.342308 0.330769 +vt 0.326923 0.330769 +vt 0.303846 0.330769 +vt 0.280769 0.330769 +vt 0.257692 0.330769 +vt 0.530769 0.361538 +vt 0.511539 0.330769 +vt 0.503846 0.330769 +vt 0.488462 0.330769 +vt 0.480769 0.330769 +vt 0.465385 0.330769 +vt 0.442308 0.330769 +vt 0.419231 0.330769 +vt 0.411538 0.330769 +vt 0.396154 0.330769 +vt 0.853846 0.469231 +vt 0.530769 0.446154 +vt 0.853846 0.446154 +vt 0.853846 0.630769 +vt 0.530769 0.607692 +vt 0.853846 0.607692 +vt 0.853846 0.561538 +vt 0.530769 0.538462 +vt 0.853846 0.538462 +vt 0.853846 0.492308 +vt 0.530769 0.469231 +vt 0.853846 0.376923 +vt 0.530769 0.353846 +vt 0.853846 0.353846 +vt 0.853846 0.584615 +vt 0.530769 0.561538 +vt 0.853846 0.515385 +vt 0.530769 0.492308 +vt 0.853846 0.400000 +vt 0.530769 0.376923 +vt 0.530769 0.423077 +vt 0.853846 0.423077 +vt 0.530769 0.584615 +vt 0.530769 0.515385 +vt 0.530769 0.400000 +vt 0.407692 0.738462 +vt 0.223077 0.769231 +vt 0.223077 0.730769 +vt 0.407692 0.723077 +vt 0.223077 0.692308 +vt 0.407692 0.700000 +vt 0.407692 0.684615 +vt 0.223077 0.653846 +vt 0.407692 0.661538 +vt 0.407692 0.646154 +vt 0.223077 0.615385 +vt 0.407692 0.623077 +vt 0.407692 0.607692 +vt 0.223077 0.576923 +vt 0.407692 0.584615 +vt 0.407692 0.569231 +vt 0.223077 0.538462 +vt 0.407692 0.546154 +vt 0.407692 0.969231 +vt 0.223077 1.000000 +vt 0.223077 0.961538 +vt 0.407692 0.953846 +vt 0.223077 0.923077 +vt 0.407692 0.930769 +vt 0.407692 0.915385 +vt 0.223077 0.884615 +vt 0.407692 0.892308 +vt 0.407692 0.876923 +vt 0.223077 0.846154 +vt 0.407692 0.853846 +vt 0.407692 0.800000 +vt 0.407692 0.776923 +vt 0.407692 0.838462 +vt 0.223077 0.807692 +vt 0.407692 0.815385 +vt 0.038462 0.692308 +vt 0.038462 0.961538 +vt 0.038462 0.846154 +vt 0.038462 0.730769 +vt 0.038462 0.538462 +vt 0.038462 0.884615 +vt 0.038462 0.769231 +vt 0.038462 0.576923 +vt 0.038462 0.653846 +vt 0.038462 0.923077 +vt 0.038462 0.807692 +vt 0.038462 0.615385 +vt 0.030769 0.882692 +vt 0.030769 0.848077 +vt 0.030769 0.844231 +vt 0.030769 0.809615 +vt 0.030769 0.805769 +vt 0.030769 0.771154 +vt 0.030769 0.732692 +vt 0.030769 0.694231 +vt 0.030769 0.655769 +vt 0.030769 0.651923 +vt 0.030769 0.617308 +vt 0.030769 0.613461 +vt 0.030769 0.578846 +vt 0.030769 0.540385 +vt 0.038462 1.000000 +vt 0.030769 0.963462 +vt 0.030769 0.925000 +vt 0.030769 0.886539 +vt 0.030769 0.769231 +vt 0.000000 0.730769 +vt 0.030769 0.730769 +vt 0.030769 0.576923 +vt -0.000000 0.538462 +vt 0.030769 0.538462 +vt 0.030769 0.923077 +vt 0.000000 0.884615 +vt 0.030769 0.884615 +vt 0.030769 0.807692 +vt -0.000000 0.769231 +vt 0.030769 0.615385 +vt 0.000000 0.576923 +vt 0.030769 0.692308 +vt 0.000000 0.653846 +vt 0.030769 0.653846 +vt 0.030769 0.961538 +vt -0.000000 0.923077 +vt 0.030769 0.846154 +vt -0.000000 0.807692 +vt 0.000000 0.615385 +vt 0.000000 0.692308 +vt 0.030769 1.000000 +vt -0.000000 0.961538 +vt -0.000000 0.846154 +vt 0.009275 0.434615 +vt 0.129186 0.434615 +vt 0.069231 0.538462 +vt 0.515385 0.300000 +vt 0.500000 0.292308 +vt 0.515385 0.292308 +vt 0.438462 0.300000 +vt 0.423077 0.292308 +vt 0.438462 0.292308 +vt 0.392308 0.300000 +vt 0.376923 0.292308 +vt 0.392308 0.292308 +vt 0.530769 0.300000 +vt 0.530769 0.292308 +vt 0.453846 0.300000 +vt 0.453846 0.292308 +vt 0.407692 0.300000 +vt 0.407692 0.292308 +vt 0.361538 0.300000 +vt 0.346154 0.292308 +vt 0.361538 0.292308 +vt 0.469231 0.300000 +vt 0.469231 0.292308 +vt 0.500000 0.300000 +vt 0.484615 0.292308 +vt 0.423077 0.300000 +vt 0.376923 0.300000 +vt 0.484615 0.300000 +vt 0.376923 0.330769 +vt 0.361538 0.307692 +vt 0.376923 0.307692 +vt 0.484615 0.330769 +vt 0.469231 0.307692 +vt 0.484615 0.307692 +vt 0.515385 0.330769 +vt 0.500000 0.307692 +vt 0.515385 0.307692 +vt 0.438462 0.330769 +vt 0.423077 0.307692 +vt 0.438462 0.307692 +vt 0.392308 0.330769 +vt 0.392308 0.307692 +vt 0.530769 0.330769 +vt 0.530769 0.307692 +vt 0.453846 0.330769 +vt 0.453846 0.307692 +vt 0.407692 0.330769 +vt 0.407692 0.307692 +vt 0.361538 0.330769 +vt 0.346154 0.307692 +vt 0.469231 0.330769 +vt 0.500000 0.330769 +vt 0.423077 0.330769 +vt 0.550000 0.348693 +vt 0.588462 0.348693 +vt 0.607692 0.315385 +vt 0.452308 0.300000 +vt 0.440000 0.300000 +vt 0.467692 0.300000 +vt 0.455385 0.300000 +vt 0.483077 0.300000 +vt 0.470769 0.300000 +vt 0.498462 0.300000 +vt 0.486154 0.300000 +vt 0.501539 0.300000 +vt 0.516923 0.300000 +vt 0.360000 0.300000 +vt 0.347692 0.300000 +vt 0.375385 0.300000 +vt 0.363077 0.300000 +vt 0.390769 0.300000 +vt 0.378462 0.300000 +vt 0.406154 0.300000 +vt 0.393846 0.300000 +vt 0.424615 0.300000 +vt 0.409231 0.300000 +vt 0.615385 0.323077 +vt 0.607692 0.338462 +vt 0.607692 0.323077 +vt 0.615385 0.215385 +vt 0.607692 0.230769 +vt 0.607692 0.215385 +vt 0.615385 0.184615 +vt 0.607692 0.200000 +vt 0.607692 0.184615 +vt 0.615385 0.261538 +vt 0.607692 0.276923 +vt 0.607692 0.261538 +vt 0.615385 0.307692 +vt 0.607692 0.307692 +vt 0.615385 0.169231 +vt 0.607692 0.169231 +vt 0.615385 0.246154 +vt 0.607692 0.246154 +vt 0.615385 0.292308 +vt 0.607692 0.292308 +vt 0.615385 0.338462 +vt 0.607692 0.353846 +vt 0.615385 0.230769 +vt 0.615385 0.200000 +vt 0.615385 0.276923 +vt 0.615385 0.213846 +vt 0.623077 0.200000 +vt 0.623077 0.215385 +vt 0.615385 0.198462 +vt 0.623077 0.184615 +vt 0.615385 0.183077 +vt 0.623077 0.169231 +vt 0.615385 0.340000 +vt 0.623077 0.353846 +vt 0.615385 0.352308 +vt 0.615385 0.324615 +vt 0.623077 0.338462 +vt 0.615385 0.336923 +vt 0.615385 0.309231 +vt 0.623077 0.323077 +vt 0.615385 0.321538 +vt 0.615385 0.293846 +vt 0.623077 0.307692 +vt 0.615385 0.306154 +vt 0.615385 0.290769 +vt 0.623077 0.276923 +vt 0.623077 0.292308 +vt 0.615385 0.275385 +vt 0.623077 0.261538 +vt 0.615385 0.247692 +vt 0.615385 0.260000 +vt 0.615385 0.232308 +vt 0.623077 0.246154 +vt 0.615385 0.244615 +vt 0.615385 0.216923 +vt 0.623077 0.230769 +vt 0.615385 0.229231 +vt 0.646154 0.307692 +vt 0.646154 0.169231 +vt 0.646154 0.246154 +vt 0.646154 0.292308 +vt 0.646154 0.338462 +vt 0.646154 0.230769 +vt 0.646154 0.200000 +vt 0.646154 0.276923 +vt 0.646154 0.323077 +vt 0.646154 0.215385 +vt 0.646154 0.184615 +vt 0.646154 0.261538 +vt 0.703846 0.348693 +vt 0.665385 0.348693 +vt 0.646154 0.315385 +vt 0.676923 -0.000000 +vt 0.661538 0.007692 +vt 0.661538 -0.000000 +vt 0.753846 -0.000000 +vt 0.738462 0.007692 +vt 0.738462 0.000000 +vt 0.800000 0.000000 +vt 0.784615 0.007692 +vt 0.784615 -0.000000 +vt 0.846154 -0.000000 +vt 0.830769 0.007692 +vt 0.830769 -0.000000 +vt 0.723077 0.007692 +vt 0.723077 -0.000000 +vt 0.707692 -0.000000 +vt 0.692308 0.007692 +vt 0.692308 -0.000000 +vt 0.769231 0.007692 +vt 0.769231 -0.000000 +vt 0.815385 0.007692 +vt 0.815385 -0.000000 +vt 0.707692 0.007692 +vt 0.676923 0.007692 +vt 0.753846 0.007692 +vt 0.800000 0.007692 +vt 0.676923 0.015385 +vt 0.661538 0.030769 +vt 0.661538 0.015385 +vt 0.753846 0.015385 +vt 0.738462 0.030769 +vt 0.738462 0.015385 +vt 0.800000 0.015385 +vt 0.784615 0.030769 +vt 0.784615 0.015385 +vt 0.846154 0.015385 +vt 0.830769 0.030769 +vt 0.830769 0.015385 +vt 0.723077 0.030769 +vt 0.723077 0.015385 +vt 0.707692 0.015385 +vt 0.692308 0.030769 +vt 0.692308 0.015385 +vt 0.769231 0.030769 +vt 0.769231 0.015385 +vt 0.815385 0.030769 +vt 0.815385 0.015385 +vt 0.707692 0.030769 +vt 0.676923 0.030769 +vt 0.753846 0.030769 +vt 0.800000 0.030769 +vt 0.661538 0.046154 +vt 0.676923 0.046154 +vt 0.692308 0.046154 +vt 0.723077 0.046154 +vt 0.738462 0.046154 +vt 0.753846 0.046154 +vt 0.769231 0.046154 +vt 0.784615 0.046154 +vt 0.800000 0.046154 +vt 0.846154 0.030769 +vt 0.830769 0.046154 +vt 0.815385 0.046154 +vt 0.661538 0.076923 +vt 0.676923 0.103570 +vt 0.723077 0.076923 +vt 0.709231 0.007692 +vt 0.721538 0.007692 +vt 0.724615 0.007692 +vt 0.736923 0.007692 +vt 0.740000 0.007692 +vt 0.752308 0.007692 +vt 0.767692 0.007692 +vt 0.755385 0.007692 +vt 0.783077 0.007692 +vt 0.770769 0.007692 +vt 0.786154 0.007692 +vt 0.798462 0.007692 +vt 0.801538 0.007692 +vt 0.813846 0.007692 +vt 0.816923 0.007692 +vt 0.829231 0.007692 +vt 0.832308 0.007692 +vt 0.844615 0.007692 +vt 0.675385 0.007692 +vt 0.663077 0.007692 +vt 0.690769 0.007692 +vt 0.678462 0.007692 +vt 0.706154 0.007692 +vt 0.693846 0.007692 +vt 0.938462 0.553846 +vt 0.961538 0.553846 +vt 0.846154 0.476923 +vt 0.884615 0.453846 +vt 0.884615 0.476923 +vt 0.923077 0.061538 +vt 0.946154 0.061538 +vt 0.161538 0.392308 +vt 0.138462 0.369231 +vt 0.161538 0.369231 +vt 0.192308 0.253846 +vt 0.230769 0.207692 +vt 0.230769 0.253846 +vt 0.076923 0.246154 +vt 0.115385 0.246154 +vt 0.192308 0.315385 +vt 0.230769 0.315385 +vt 0.138462 0.246154 +vt 0.030769 0.353846 +vt 0.053846 0.353846 +vt 1.000000 0.338462 +vt 0.430769 0.576923 +vt 0.438462 0.569231 +vt 0.438462 0.576923 +vt 0.415385 0.576923 +vt 0.423077 0.569231 +vt 0.423077 0.576923 +vt 0.461538 0.576923 +vt 0.469231 0.569231 +vt 0.469231 0.576923 +vt 0.446154 0.576923 +vt 0.453846 0.569231 +vt 0.453846 0.576923 +vt 0.430769 0.569231 +vt 0.407692 0.576923 +vt 0.415385 0.569231 +vt 0.461538 0.569231 +vt 0.446154 0.569231 +vt 0.430769 0.600000 +vt 0.438462 0.592308 +vt 0.438462 0.600000 +vt 0.415385 0.600000 +vt 0.423077 0.592308 +vt 0.423077 0.600000 +vt 0.461538 0.600000 +vt 0.469231 0.592308 +vt 0.469231 0.600000 +vt 0.446154 0.600000 +vt 0.453846 0.592308 +vt 0.453846 0.600000 +vt 0.430769 0.592308 +vt 0.407692 0.600000 +vt 0.415385 0.592308 +vt 0.461538 0.592308 +vt 0.446154 0.592308 +vt 0.192308 0.207692 +vt 0.253846 0.538462 +vt 0.196154 0.533309 +vt 0.215385 0.538462 +vt 0.234615 0.533309 +vt 0.253846 0.500000 +vt 0.248693 0.480769 +vt 0.234615 0.466691 +vt 0.196154 0.466691 +vt 0.182076 0.480769 +vt 0.176923 0.500000 +vt 0.436538 0.523077 +vt 0.482692 0.523077 +vt 0.528846 0.523077 +vt 0.344231 0.523077 +vt 0.388462 0.330769 +vt 0.319231 0.330769 +vt 0.296154 0.330769 +vt 0.273077 0.330769 +vt 0.526923 0.330769 +vt 0.457692 0.330769 +vt 0.434615 0.330769 +vt 0.530769 0.630769 +vt 0.407692 0.761538 +vt 0.407692 0.992308 +vt 0.030769 0.767308 +vt 0.030769 0.728846 +vt 0.030769 0.690385 +vt 0.030769 0.575000 +vt 0.030769 0.998077 +vt 0.030769 0.959615 +vt 0.030769 0.921154 +vt 0.000000 1.000000 +vt 0.034615 0.529186 +vt 0.009275 0.503846 +vt 0.000000 0.469231 +vt 0.034615 0.409275 +vt 0.069231 0.400000 +vt 0.103846 0.409275 +vt 0.138462 0.469231 +vt 0.129186 0.503846 +vt 0.103846 0.529186 +vt 0.346154 0.300000 +vt 0.346154 0.330769 +vt 0.602539 0.296154 +vt 0.588462 0.282076 +vt 0.569231 0.276923 +vt 0.550000 0.282076 +vt 0.535922 0.296154 +vt 0.530769 0.315385 +vt 0.535922 0.334615 +vt 0.569231 0.353846 +vt 0.602539 0.334615 +vt 0.513846 0.300000 +vt 0.529231 0.300000 +vt 0.436923 0.300000 +vt 0.421538 0.300000 +vt 0.615385 0.353846 +vt 0.615385 0.201538 +vt 0.615385 0.186154 +vt 0.615385 0.170769 +vt 0.615385 0.278462 +vt 0.615385 0.263077 +vt 0.646154 0.353846 +vt 0.651307 0.296154 +vt 0.665385 0.282076 +vt 0.684615 0.276923 +vt 0.703846 0.282076 +vt 0.717924 0.296154 +vt 0.723077 0.315385 +vt 0.717924 0.334615 +vt 0.684615 0.353846 +vt 0.651307 0.334615 +vt 0.846154 0.007692 +vt 0.707692 0.046154 +vt 0.846154 0.046154 +vt 0.676923 0.050276 +vt 0.665661 0.061538 +vt 0.665661 0.092308 +vt 0.692308 0.107692 +vt 0.707692 0.103570 +vt 0.718955 0.092308 +vt 0.718955 0.061538 +vt 0.707692 0.050276 +vt 0.692308 0.046154 +vt 0.846154 0.453846 +vt 0.138462 0.392308 +vt 0.161538 0.246154 +vt 1.000000 0.107692 +vt 0.407692 0.569231 +vt 0.407692 0.592308 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 -0.8944 -0.4472 +vn 0.8944 0.0000 -0.4472 +vn -0.8944 -0.0000 -0.4472 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.8944 0.0000 0.4472 +vn 0.0000 0.8944 0.4472 +vn -0.8944 0.0000 0.4472 +vn 0.0000 -0.8944 0.4472 +vn 0.0000 0.7071 -0.7071 +vn -0.8660 0.5000 0.0000 +vn -0.8660 -0.5000 -0.0000 +vn -0.5000 -0.8660 -0.0000 +vn 0.5000 0.8660 -0.0000 +vn 0.8660 -0.5000 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.8660 0.5000 0.0000 +vn 0.5000 -0.8660 -0.0000 +vn 0.0000 0.8320 0.5547 +vn 0.4160 0.7206 0.5547 +vn 0.7206 0.4160 0.5547 +vn 0.8321 0.0000 0.5547 +vn 0.7206 -0.4160 0.5547 +vn 0.4160 -0.7206 0.5547 +vn -0.0000 -0.8321 0.5547 +vn -0.4160 -0.7206 0.5547 +vn -0.7206 -0.4160 0.5547 +vn -0.8320 -0.0000 0.5547 +vn -0.8321 -0.0000 0.5547 +vn -0.7206 0.4160 0.5547 +vn -0.4160 0.7206 0.5547 +vn -0.0000 0.8321 0.5547 +vn 0.4851 0.8402 -0.2425 +vn 0.0000 0.9701 -0.2425 +vn 0.8402 0.4851 -0.2425 +vn 0.9701 0.0000 -0.2425 +vn 0.8402 -0.4851 -0.2425 +vn 0.4851 -0.8402 -0.2425 +vn 0.0000 -0.9701 -0.2425 +vn -0.4851 -0.8402 -0.2425 +vn -0.8402 -0.4851 -0.2425 +vn -0.9701 -0.0000 -0.2425 +vn -0.8402 0.4851 -0.2425 +vn -0.4851 0.8402 -0.2425 +vn 0.5000 0.0000 -0.8660 +vn 0.8660 0.0000 -0.5000 +vn -0.5000 -0.0000 0.8660 +vn -0.8660 0.0000 -0.5000 +vn 0.5000 0.0000 0.8660 +vn -0.8660 0.0000 0.5000 +vn -0.5000 0.0000 -0.8660 +vn 0.8660 0.0000 0.5000 +vn 0.0000 -0.8660 -0.5000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 0.8660 0.5000 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 -0.5000 0.8660 +vn 0.0000 0.5000 0.8660 +vn 0.0000 -0.8660 0.5000 +vn 0.2217 -0.0000 -0.9751 +vn 0.2217 0.4876 0.8445 +vn 0.2217 -0.8445 0.4876 +vn 0.2217 -0.4876 -0.8445 +vn 0.2217 0.8445 0.4876 +vn 0.2217 0.8445 -0.4876 +vn 0.2217 -0.4876 0.8445 +vn 0.2217 -0.8445 -0.4876 +vn 0.2217 0.9751 -0.0000 +vn 0.2217 0.4876 -0.8445 +vn 0.2217 -0.0000 0.9751 +vn 0.2217 -0.9751 -0.0000 +vn 0.4472 -0.0000 -0.8944 +vn 0.4472 0.4472 -0.7746 +vn 0.4472 0.7746 -0.4472 +vn 0.4472 0.7746 0.4472 +vn 0.4472 0.4472 0.7746 +vn 0.4472 -0.0000 0.8944 +vn 0.4472 -0.4472 0.7746 +vn 0.4472 -0.7746 0.4472 +vn 0.4472 -0.8944 -0.0000 +vn 0.4472 -0.4472 -0.7746 +vn 0.4472 -0.7746 -0.4472 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.3827 0.9239 +vn 0.8575 0.5145 -0.0000 +vn 0.4927 0.8702 -0.0000 +vn -0.9637 0.2669 0.0000 +vn -0.8575 0.5145 0.0000 +vn 0.0000 -0.9571 0.2898 +vn 0.0000 -0.9571 -0.2898 +vn 0.0000 -0.8321 -0.5547 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.4472 0.8944 0.0000 +usemtl None +s off +f 89/166/42 90/167/42 91/168/42 +f 92/169/43 93/170/43 94/171/43 +f 90/167/44 93/170/44 91/168/44 +f 89/172/45 92/169/45 95/173/45 +f 89/172/46 96/174/46 97/175/46 +f 93/170/47 98/176/47 91/168/47 +f 91/168/48 99/177/48 89/166/48 +f 97/175/49 100/178/49 93/170/49 +f 100/179/50 99/180/50 98/176/50 +f 101/181/51 102/182/51 103/183/51 +f 95/184/52 103/185/52 90/167/52 +f 92/169/53 101/186/53 95/173/53 +f 94/171/54 104/187/54 92/169/54 +f 90/167/55 102/182/55 94/171/55 +f 105/188/51 106/189/51 107/190/51 +f 108/191/45 109/192/45 110/193/45 +f 111/194/44 112/195/44 105/188/44 +f 113/196/42 114/197/42 115/198/42 +f 116/199/43 117/200/43 108/201/43 +f 118/202/42 109/203/42 119/204/42 +f 110/205/43 120/206/43 121/207/43 +f 118/208/56 121/209/56 120/210/56 +f 122/211/43 117/212/43 111/213/43 +f 106/189/42 112/195/42 115/214/42 +f 123/215/45 121/209/45 119/216/45 +f 124/217/44 125/218/44 126/219/44 +f 123/220/56 127/221/56 128/222/56 +f 129/223/42 130/224/42 131/225/42 +f 132/226/44 133/227/44 134/228/44 +f 135/229/44 136/230/44 137/231/44 +f 138/232/43 139/233/43 140/234/43 +f 141/235/42 142/236/42 143/237/42 +f 144/238/43 145/239/43 146/240/43 +f 147/241/42 148/242/42 149/243/42 +f 138/244/51 150/245/51 151/246/51 +f 113/196/42 149/247/42 152/248/42 +f 153/249/42 123/215/42 142/236/42 +f 119/216/42 109/192/42 143/237/42 +f 127/250/43 140/234/43 128/251/43 +f 145/252/43 116/199/43 108/201/43 +f 110/193/43 146/240/43 108/191/43 +f 154/253/42 155/254/42 156/255/42 +f 157/256/42 158/257/42 159/258/42 +f 160/259/50 161/260/50 127/221/50 +f 162/261/42 136/230/42 163/262/42 +f 147/263/50 164/264/50 165/265/50 +f 166/266/51 167/267/51 168/268/51 +f 169/269/44 129/223/44 131/225/44 +f 170/270/50 120/206/50 171/271/50 +f 172/272/42 173/273/42 174/274/42 +f 175/275/51 173/273/51 172/272/51 +f 176/276/43 177/277/43 175/275/43 +f 89/166/42 95/184/42 90/167/42 +f 92/169/43 97/175/43 93/170/43 +f 90/167/44 94/171/44 93/170/44 +f 89/172/45 97/175/45 92/169/45 +f 89/172/46 99/278/46 96/174/46 +f 93/170/47 100/179/47 98/176/47 +f 91/168/48 98/279/48 99/177/48 +f 97/175/49 96/280/49 100/178/49 +f 100/179/50 96/281/50 99/180/50 +f 101/181/51 104/282/51 102/182/51 +f 95/184/52 101/283/52 103/185/52 +f 92/169/53 104/284/53 101/186/53 +f 94/171/54 102/285/54 104/187/54 +f 90/167/55 103/183/55 102/182/55 +f 105/188/51 112/195/51 106/189/51 +f 108/191/45 152/286/45 109/192/45 +f 111/194/44 115/287/44 112/195/44 +f 113/196/42 152/248/42 114/197/42 +f 116/199/43 111/288/43 117/200/43 +f 118/202/42 174/274/42 109/203/42 +f 110/205/43 176/276/43 120/206/43 +f 118/208/56 119/216/56 121/209/56 +f 105/188/43 107/190/43 111/213/43 +f 107/190/43 122/211/43 111/213/43 +f 114/289/42 178/290/42 115/214/42 +f 178/290/42 106/189/42 115/214/42 +f 123/215/45 128/251/45 121/209/45 +f 124/217/44 179/291/44 125/218/44 +f 123/220/56 153/292/56 127/221/56 +f 129/223/42 180/293/42 130/224/42 +f 132/226/44 181/294/44 133/227/44 +f 135/229/44 163/262/44 136/230/44 +f 182/295/51 142/296/51 141/297/51 +f 138/244/51 140/298/51 150/245/51 +f 182/295/51 141/297/51 183/299/51 +f 141/297/51 138/244/51 183/299/51 +f 136/230/51 184/300/51 182/295/51 +f 183/299/51 137/301/51 136/230/51 +f 179/291/51 124/302/51 151/246/51 +f 183/299/51 136/230/51 182/295/51 +f 150/245/51 179/291/51 151/246/51 +f 151/246/51 183/299/51 138/244/51 +f 113/196/42 185/303/42 149/247/42 +f 109/192/42 152/286/42 148/242/42 +f 152/286/42 149/243/42 148/242/42 +f 148/242/42 143/237/42 109/192/42 +f 143/237/42 142/236/42 119/216/42 +f 142/236/42 123/215/42 119/216/42 +f 145/252/43 168/304/43 116/199/43 +f 110/193/43 121/209/43 139/233/43 +f 121/209/43 128/251/43 140/234/43 +f 139/233/43 121/209/43 140/234/43 +f 139/233/43 146/240/43 110/193/43 +f 146/240/43 145/239/43 108/191/43 +f 156/255/42 186/305/42 187/306/42 +f 187/306/42 188/307/42 156/255/42 +f 188/307/42 189/308/42 156/255/42 +f 189/308/42 190/309/42 156/255/42 +f 190/309/42 154/253/42 156/255/42 +f 157/256/42 191/310/42 158/257/42 +f 158/257/42 192/311/42 159/258/42 +f 159/258/42 193/312/42 194/313/42 +f 194/313/42 195/314/42 159/258/42 +f 195/314/42 157/256/42 159/258/42 +f 196/315/50 162/316/50 163/317/50 +f 163/317/50 135/318/50 197/319/50 +f 160/259/50 126/320/50 125/218/50 +f 196/315/50 163/317/50 197/319/50 +f 160/259/50 125/218/50 161/260/50 +f 196/315/50 197/319/50 153/292/50 +f 197/319/50 160/259/50 127/221/50 +f 127/221/50 153/292/50 197/319/50 +f 162/261/42 184/300/42 136/230/42 +f 133/227/50 198/321/50 199/322/50 +f 198/321/50 145/323/50 144/324/50 +f 198/321/50 144/324/50 199/322/50 +f 199/322/50 134/325/50 133/227/50 +f 129/326/50 200/327/50 165/265/50 +f 180/328/50 129/326/50 164/264/50 +f 129/326/50 165/265/50 164/264/50 +f 165/265/50 199/322/50 144/324/50 +f 147/263/50 149/329/50 164/264/50 +f 165/265/50 144/324/50 147/263/50 +f 169/330/51 131/225/51 167/267/51 +f 131/225/51 130/224/51 201/331/51 +f 201/331/51 185/332/51 167/267/51 +f 185/332/51 168/268/51 167/267/51 +f 131/225/51 201/331/51 167/267/51 +f 168/268/51 202/333/51 166/266/51 +f 202/333/51 181/294/51 166/266/51 +f 181/294/51 132/334/51 166/266/51 +f 169/269/44 200/335/44 129/223/44 +f 170/270/50 118/336/50 120/206/50 +f 118/202/42 170/337/42 174/274/42 +f 170/337/42 172/272/42 174/274/42 +f 175/275/51 177/277/51 173/273/51 +f 175/275/43 171/271/43 176/276/43 +f 171/271/43 120/206/43 176/276/43 +s 1 +f 203/338/57 204/339/43 205/340/43 +f 206/341/58 207/342/59 208/343/59 +f 209/344/60 210/345/45 211/346/45 +f 212/347/61 213/348/42 214/349/42 +f 208/343/59 215/350/44 216/351/44 +f 211/352/45 217/353/62 218/354/62 +f 214/349/42 219/355/63 220/356/63 +f 216/351/44 221/357/64 222/358/64 +f 218/354/62 223/359/57 203/338/57 +f 205/340/43 224/360/58 206/341/58 +f 220/356/63 225/361/60 209/344/60 +f 222/358/64 226/362/61 212/347/61 +f 217/363/50 213/364/50 207/365/50 +f 222/366/50 227/367/50 216/368/50 +f 222/369/50 228/370/50 229/371/50 +f 214/372/50 228/370/50 212/373/50 +f 214/374/50 230/375/50 231/376/50 +f 209/377/50 230/375/50 220/378/50 +f 209/379/50 232/380/50 233/381/50 +f 218/382/50 232/383/50 211/384/50 +f 203/385/50 234/386/50 218/387/50 +f 205/388/50 235/389/50 203/390/50 +f 205/391/50 236/392/50 237/393/50 +f 216/394/50 238/395/50 208/396/50 +f 208/397/50 236/392/50 206/398/50 +f 235/389/61 239/399/64 234/386/64 +f 236/392/63 240/400/42 237/393/42 +f 233/381/59 241/401/58 230/375/58 +f 228/370/57 242/402/62 229/371/62 +f 237/393/42 243/403/61 235/389/61 +f 238/395/60 244/404/63 236/392/63 +f 232/380/44 245/405/59 233/381/59 +f 231/376/43 246/406/57 228/370/57 +f 227/367/45 247/407/60 238/395/60 +f 234/386/64 248/408/44 232/383/44 +f 230/375/58 249/409/43 231/376/43 +f 229/371/62 250/410/45 227/367/45 +f 250/410/65 251/411/66 247/407/66 +f 244/404/67 251/412/66 252/413/67 +f 240/400/68 252/414/67 253/415/68 +f 240/400/68 254/416/69 243/403/69 +f 243/403/69 255/417/70 239/399/70 +f 239/399/70 256/418/71 248/408/71 +f 248/419/71 257/420/72 245/405/72 +f 241/401/73 257/421/72 258/422/73 +f 249/409/74 258/423/73 259/424/75 +f 249/409/74 260/425/76 246/406/76 +f 246/406/76 261/426/77 242/402/77 +f 250/410/65 261/427/77 262/428/78 +f 251/429/60 263/430/63 252/431/63 +f 256/432/44 264/433/59 257/434/59 +f 259/435/43 265/436/57 260/437/57 +f 262/438/45 266/439/60 251/429/60 +f 255/440/64 267/441/44 256/442/44 +f 258/443/58 268/444/43 259/435/43 +f 261/445/62 269/446/45 262/438/45 +f 254/447/61 270/448/64 255/440/64 +f 252/431/63 271/449/42 253/450/42 +f 257/434/59 272/451/58 258/443/58 +f 260/437/57 273/452/62 261/445/62 +f 253/450/42 274/453/61 254/447/61 +f 266/454/79 275/455/80 276/456/79 +f 266/457/79 277/458/81 263/459/81 +f 263/460/81 278/461/82 271/462/82 +f 271/463/82 279/464/83 274/465/83 +f 274/466/83 280/467/84 270/468/84 +f 270/469/84 281/470/85 267/471/85 +f 264/472/86 281/473/85 282/474/86 +f 264/475/86 283/476/87 272/477/87 +f 272/478/87 284/479/88 268/480/88 +f 268/481/88 285/482/89 265/483/89 +f 273/484/90 275/455/80 269/485/80 +f 265/486/89 286/487/90 273/488/90 +f 276/456/60 287/489/63 277/458/63 +f 281/473/44 288/490/59 282/474/59 +f 284/479/43 289/491/57 285/482/57 +f 275/455/45 290/492/60 276/456/60 +f 280/467/64 291/493/44 281/470/44 +f 283/476/58 292/494/43 284/479/43 +f 286/487/62 293/495/45 275/455/45 +f 279/464/61 294/496/64 280/467/64 +f 278/461/42 287/489/63 295/497/42 +f 282/474/59 296/498/58 283/476/58 +f 285/482/57 297/499/62 286/487/62 +f 278/461/42 298/500/61 279/464/61 +f 289/491/51 299/501/51 300/502/51 +f 297/499/51 300/503/51 301/504/51 +f 293/495/51 301/505/51 302/506/51 +f 293/495/51 303/507/51 290/492/51 +f 290/492/51 304/508/51 287/489/51 +f 287/489/51 305/509/51 295/497/51 +f 298/500/51 305/510/51 306/511/51 +f 294/496/51 306/512/51 307/513/51 +f 294/496/51 308/514/51 291/493/51 +f 291/515/51 309/516/51 288/490/51 +f 288/490/51 310/517/51 296/498/51 +f 296/498/51 299/518/51 292/494/51 +f 302/519/44 311/520/59 303/521/59 +f 307/522/62 312/523/45 308/524/45 +f 310/525/63 313/526/42 299/527/42 +f 301/528/64 314/529/44 302/519/44 +f 306/530/57 315/531/62 307/522/62 +f 304/532/58 316/533/43 305/534/43 +f 309/535/60 317/536/63 310/525/63 +f 300/537/61 318/538/64 301/528/64 +f 305/534/43 319/539/57 306/530/57 +f 303/521/59 320/540/58 304/532/58 +f 308/541/45 321/542/60 309/535/60 +f 299/527/42 322/543/61 300/537/61 +f 318/544/51 321/545/51 316/546/51 +f 323/547/91 324/548/92 325/549/91 +f 326/550/51 327/551/93 328/552/51 +f 329/553/43 330/554/94 331/555/43 +f 332/556/50 325/549/91 333/557/50 +f 334/558/95 328/552/51 335/559/95 +f 336/560/96 331/555/43 337/561/96 +f 338/562/97 333/563/50 339/564/97 +f 340/565/98 335/559/95 341/566/98 +f 342/567/92 343/568/42 324/548/92 +f 344/569/93 337/561/96 327/551/93 +f 345/570/94 339/564/97 330/554/94 +f 346/571/42 341/566/98 343/568/42 +f 347/572/94 348/573/97 349/574/94 +f 350/575/42 351/576/98 352/577/42 +f 353/578/91 354/579/92 355/580/91 +f 356/581/51 357/582/93 358/583/51 +f 359/584/43 349/574/94 360/585/43 +f 361/586/50 355/580/91 362/587/50 +f 363/588/95 358/583/51 364/589/95 +f 365/590/96 360/585/43 366/591/96 +f 367/592/97 362/593/50 348/573/97 +f 368/594/98 364/589/95 351/576/98 +f 369/595/92 352/577/42 354/579/92 +f 370/596/93 366/591/96 357/582/93 +f 370/597/45 363/598/45 350/599/45 +f 334/600/44 358/583/44 326/601/44 +f 340/602/44 364/589/44 334/603/44 +f 346/604/44 351/576/44 340/605/44 +f 342/606/44 352/577/44 346/607/44 +f 342/608/44 355/580/44 354/579/44 +f 323/609/44 362/587/44 355/580/44 +f 338/610/44 362/593/44 332/611/44 +f 345/612/44 348/573/44 338/613/44 +f 329/614/44 349/574/44 345/615/44 +f 336/616/44 360/585/44 329/617/44 +f 344/618/44 358/583/44 357/582/44 +f 336/619/44 357/582/44 366/591/44 +f 371/620/99 372/621/100 373/622/99 +f 374/623/45 375/624/101 376/625/45 +f 377/626/102 378/627/103 379/628/102 +f 380/629/51 381/630/104 382/631/51 +f 383/632/44 373/622/99 384/633/44 +f 385/634/50 379/628/102 386/635/50 +f 387/636/105 382/631/51 388/637/105 +f 389/638/106 384/633/44 390/639/106 +f 391/640/100 386/641/50 372/621/100 +f 392/642/101 388/637/105 375/624/101 +f 393/643/103 376/625/45 378/627/103 +f 394/644/104 390/639/106 381/630/104 +f 374/645/42 395/646/42 396/647/42 +f 393/648/42 397/649/42 395/646/42 +f 377/650/42 398/651/42 397/649/42 +f 391/652/42 398/653/42 385/654/42 +f 371/655/42 399/656/42 391/657/42 +f 383/658/42 400/659/42 371/660/42 +f 389/661/42 401/662/42 383/663/42 +f 389/664/42 402/665/42 403/666/42 +f 394/667/42 404/668/42 402/665/42 +f 387/669/42 404/668/42 380/670/42 +f 392/671/42 405/672/42 387/673/42 +f 374/674/42 406/675/42 392/676/42 +f 407/677/44 400/659/99 401/662/44 +f 408/678/50 397/649/102 398/651/50 +f 409/679/105 404/668/51 405/672/105 +f 410/680/106 401/662/44 403/666/106 +f 411/681/100 398/653/50 399/656/100 +f 412/682/101 405/672/105 406/675/101 +f 413/683/103 396/647/45 395/646/103 +f 414/684/104 403/666/106 402/665/104 +f 415/685/99 399/656/100 400/659/99 +f 416/686/45 406/675/101 396/647/45 +f 417/687/102 395/646/103 397/649/102 +f 418/688/51 402/665/104 404/668/51 +f 414/689/43 409/690/43 416/691/43 +f 419/692/102 420/693/50 421/694/50 +f 422/695/51 423/696/105 424/697/105 +f 425/698/44 426/699/106 427/700/106 +f 421/701/50 428/702/100 429/703/100 +f 424/697/105 430/704/101 431/705/101 +f 432/706/45 433/707/103 434/708/103 +f 427/700/106 435/709/104 436/710/104 +f 429/703/100 437/711/99 438/712/99 +f 431/705/101 439/713/45 432/706/45 +f 434/708/103 440/714/102 419/692/102 +f 436/710/104 441/715/51 422/695/51 +f 438/712/99 442/716/44 425/698/44 +f 443/717/102 444/718/107 445/719/50 +f 446/720/51 447/721/108 448/722/105 +f 449/723/44 450/724/109 451/725/106 +f 445/726/50 452/727/110 453/728/100 +f 448/722/105 454/729/111 455/730/101 +f 456/731/45 457/732/112 458/733/103 +f 451/725/106 459/734/113 460/735/104 +f 453/728/100 461/736/114 462/737/99 +f 455/730/101 463/738/115 456/731/45 +f 458/733/103 464/739/116 443/717/102 +f 460/735/104 465/740/117 446/720/51 +f 462/737/99 466/741/118 449/723/44 +f 464/739/116 467/742/119 444/718/107 +f 457/732/112 468/743/120 464/739/116 +f 463/738/115 469/744/121 457/732/112 +f 470/745/122 463/738/115 454/729/111 +f 471/746/123 454/729/111 447/721/108 +f 472/747/124 447/721/108 465/740/117 +f 473/748/125 465/740/117 459/734/113 +f 474/749/126 459/734/113 450/724/109 +f 475/750/127 450/724/109 466/741/118 +f 461/736/114 475/750/127 466/741/118 +f 444/751/107 476/752/128 452/727/110 +f 452/727/110 477/753/129 461/736/114 +f 478/754/42 471/755/42 475/756/42 +f 455/730/43 439/757/43 430/758/43 +f 448/722/43 430/759/43 423/760/43 +f 446/720/43 423/761/43 441/762/43 +f 435/763/43 446/720/43 441/764/43 +f 426/765/43 460/735/43 435/766/43 +f 449/723/43 426/767/43 442/768/43 +f 462/737/43 442/769/43 437/770/43 +f 453/728/43 437/771/43 428/772/43 +f 445/726/43 428/773/43 420/774/43 +f 440/775/43 445/719/43 420/776/43 +f 433/777/43 443/717/43 440/778/43 +f 439/779/43 458/733/43 433/780/43 +f 114/781/130 122/211/50 178/782/50 +f 110/783/131 174/784/132 176/785/132 +f 152/286/56 117/786/130 114/787/130 +f 115/788/131 116/789/133 113/790/133 +f 142/791/134 196/792/135 153/793/134 +f 150/245/136 125/218/43 179/291/43 +f 127/794/137 150/245/136 140/795/137 +f 202/333/136 133/227/43 181/294/43 +f 198/321/136 168/304/137 145/252/137 +f 149/247/134 201/796/135 164/797/135 +f 141/297/71 139/798/138 138/244/71 +f 148/799/139 144/324/140 146/800/139 +f 116/789/133 185/332/51 113/790/133 +f 148/242/139 139/801/138 143/237/138 +f 479/802/141 187/803/45 480/804/45 +f 481/805/131 189/806/51 482/807/51 +f 483/808/142 154/809/44 484/810/44 +f 485/811/56 156/812/50 486/813/50 +f 482/807/51 188/814/141 479/802/141 +f 484/815/44 190/816/131 481/805/131 +f 486/813/50 155/817/142 483/808/142 +f 480/804/45 186/818/56 485/811/56 +f 487/819/141 158/820/45 488/821/45 +f 489/822/131 159/823/51 490/824/51 +f 491/825/142 194/826/44 492/827/44 +f 493/828/56 157/829/50 494/830/50 +f 490/824/51 192/831/141 487/819/141 +f 492/832/44 193/833/131 489/822/131 +f 494/830/50 195/834/142 491/825/142 +f 488/821/45 191/835/56 493/828/56 +f 130/224/45 164/797/135 201/796/135 +f 182/836/135 162/261/45 196/792/135 +f 174/784/132 177/277/44 176/785/132 +f 203/338/57 223/359/57 204/339/43 +f 206/341/58 224/360/58 207/342/59 +f 209/344/60 225/361/60 210/345/45 +f 212/347/61 226/362/61 213/348/42 +f 208/343/59 207/342/59 215/350/44 +f 211/352/45 210/837/45 217/353/62 +f 214/349/42 213/348/42 219/355/63 +f 216/351/44 215/350/44 221/357/64 +f 218/354/62 217/353/62 223/359/57 +f 205/340/43 204/339/43 224/360/58 +f 220/356/63 219/355/63 225/361/60 +f 222/358/64 221/357/64 226/362/61 +f 207/365/50 224/838/50 217/363/50 +f 224/838/50 204/839/50 217/363/50 +f 204/839/50 223/840/50 217/363/50 +f 217/363/50 210/841/50 213/364/50 +f 210/841/50 225/842/50 213/364/50 +f 225/842/50 219/843/50 213/364/50 +f 213/364/50 226/844/50 221/845/50 +f 221/845/50 215/846/50 213/364/50 +f 215/846/50 207/365/50 213/364/50 +f 222/366/50 229/371/50 227/367/50 +f 222/369/50 212/847/50 228/370/50 +f 214/372/50 231/376/50 228/370/50 +f 214/374/50 220/848/50 230/375/50 +f 209/377/50 233/381/50 230/375/50 +f 209/379/50 211/849/50 232/380/50 +f 218/382/50 234/386/50 232/383/50 +f 203/385/50 235/389/50 234/386/50 +f 205/388/50 237/393/50 235/389/50 +f 205/391/50 206/850/50 236/392/50 +f 216/394/50 227/367/50 238/395/50 +f 208/397/50 238/395/50 236/392/50 +f 235/389/61 243/403/61 239/399/64 +f 236/392/63 244/404/63 240/400/42 +f 233/381/59 245/405/59 241/401/58 +f 228/370/57 246/406/57 242/402/62 +f 237/393/42 240/400/42 243/403/61 +f 238/395/60 247/407/60 244/404/63 +f 232/380/44 248/419/44 245/405/59 +f 231/376/43 249/409/43 246/406/57 +f 227/367/45 250/410/45 247/407/60 +f 234/386/64 239/399/64 248/408/44 +f 230/375/58 241/401/58 249/409/43 +f 229/371/62 242/402/62 250/410/45 +f 250/410/65 262/851/78 251/411/66 +f 244/404/67 247/407/66 251/412/66 +f 240/400/68 244/404/67 252/414/67 +f 240/400/68 253/852/68 254/416/69 +f 243/403/69 254/853/69 255/417/70 +f 239/399/70 255/854/70 256/418/71 +f 248/419/71 256/855/71 257/420/72 +f 241/401/73 245/405/72 257/421/72 +f 249/409/74 241/401/73 258/423/73 +f 249/409/74 259/856/75 260/425/76 +f 246/406/76 260/857/76 261/426/77 +f 250/410/65 242/402/77 261/427/77 +f 251/429/60 266/439/60 263/430/63 +f 256/432/44 267/858/44 264/433/59 +f 259/435/43 268/444/43 265/436/57 +f 262/438/45 269/446/45 266/439/60 +f 255/440/64 270/448/64 267/441/44 +f 258/443/58 272/451/58 268/444/43 +f 261/445/62 273/452/62 269/446/45 +f 254/447/61 274/453/61 270/448/64 +f 252/431/63 263/430/63 271/449/42 +f 257/434/59 264/433/59 272/451/58 +f 260/437/57 265/436/57 273/452/62 +f 253/450/42 271/449/42 274/453/61 +f 266/454/79 269/859/80 275/455/80 +f 266/457/79 276/456/79 277/458/81 +f 263/460/81 277/458/81 278/461/82 +f 271/463/82 278/461/82 279/464/83 +f 274/466/83 279/464/83 280/467/84 +f 270/469/84 280/467/84 281/470/85 +f 264/472/86 267/860/85 281/473/85 +f 264/475/86 282/474/86 283/476/87 +f 272/478/87 283/476/87 284/479/88 +f 268/481/88 284/479/88 285/482/89 +f 273/484/90 286/487/90 275/455/80 +f 265/486/89 285/482/89 286/487/90 +f 276/456/60 290/492/60 287/489/63 +f 281/473/44 291/515/44 288/490/59 +f 284/479/43 292/494/43 289/491/57 +f 275/455/45 293/495/45 290/492/60 +f 280/467/64 294/496/64 291/493/44 +f 283/476/58 296/498/58 292/494/43 +f 286/487/62 297/499/62 293/495/45 +f 279/464/61 298/500/61 294/496/64 +f 278/461/42 277/458/63 287/489/63 +f 282/474/59 288/490/59 296/498/58 +f 285/482/57 289/491/57 297/499/62 +f 278/461/42 295/497/42 298/500/61 +f 289/491/51 292/494/51 299/501/51 +f 297/499/51 289/491/51 300/503/51 +f 293/495/51 297/499/51 301/505/51 +f 293/495/51 302/861/51 303/507/51 +f 290/492/51 303/862/51 304/508/51 +f 287/489/51 304/863/51 305/509/51 +f 298/500/51 295/497/51 305/510/51 +f 294/496/51 298/500/51 306/512/51 +f 294/496/51 307/864/51 308/514/51 +f 291/515/51 308/865/51 309/516/51 +f 288/490/51 309/866/51 310/517/51 +f 296/498/51 310/867/51 299/518/51 +f 302/519/44 314/529/44 311/520/59 +f 307/522/62 315/531/62 312/523/45 +f 310/525/63 317/536/63 313/526/42 +f 301/528/64 318/538/64 314/529/44 +f 306/530/57 319/539/57 315/531/62 +f 304/532/58 320/540/58 316/533/43 +f 309/535/60 321/542/60 317/536/63 +f 300/537/61 322/543/61 318/538/64 +f 305/534/43 316/533/43 319/539/57 +f 303/521/59 311/520/59 320/540/58 +f 308/541/45 312/868/45 321/542/60 +f 299/527/42 313/526/42 322/543/61 +f 316/546/51 320/869/51 311/870/51 +f 311/870/51 314/871/51 318/544/51 +f 318/544/51 322/872/51 313/873/51 +f 313/873/51 317/874/51 321/545/51 +f 321/545/51 312/875/51 315/876/51 +f 315/876/51 319/877/51 316/546/51 +f 316/546/51 311/870/51 318/544/51 +f 318/544/51 313/873/51 321/545/51 +f 321/545/51 315/876/51 316/546/51 +f 323/547/91 342/567/92 324/548/92 +f 326/550/51 344/569/93 327/551/93 +f 329/553/43 345/570/94 330/554/94 +f 332/556/50 323/547/91 325/549/91 +f 334/558/95 326/550/51 328/552/51 +f 336/560/96 329/553/43 331/555/43 +f 338/562/97 332/878/50 333/563/50 +f 340/565/98 334/558/95 335/559/95 +f 342/567/92 346/571/42 343/568/42 +f 344/569/93 336/560/96 337/561/96 +f 345/570/94 338/562/97 339/564/97 +f 346/571/42 340/565/98 341/566/98 +f 347/572/94 367/592/97 348/573/97 +f 350/575/42 368/594/98 351/576/98 +f 353/578/91 369/595/92 354/579/92 +f 356/581/51 370/596/93 357/582/93 +f 359/584/43 347/572/94 349/574/94 +f 361/586/50 353/578/91 355/580/91 +f 363/588/95 356/581/51 358/583/51 +f 365/590/96 359/584/43 360/585/43 +f 367/592/97 361/879/50 362/593/50 +f 368/594/98 363/588/95 364/589/95 +f 369/595/92 350/575/42 352/577/42 +f 370/596/93 365/590/96 366/591/96 +f 350/599/45 369/880/45 353/881/45 +f 353/881/45 361/882/45 367/883/45 +f 367/883/45 347/884/45 359/885/45 +f 359/885/45 365/886/45 370/597/45 +f 370/597/45 356/887/45 363/598/45 +f 363/598/45 368/888/45 350/599/45 +f 350/599/45 353/881/45 370/597/45 +f 353/881/45 367/883/45 370/597/45 +f 367/883/45 359/885/45 370/597/45 +f 334/600/44 364/589/44 358/583/44 +f 340/602/44 351/576/44 364/589/44 +f 346/604/44 352/577/44 351/576/44 +f 342/606/44 354/579/44 352/577/44 +f 342/608/44 323/889/44 355/580/44 +f 323/609/44 332/890/44 362/587/44 +f 338/610/44 348/573/44 362/593/44 +f 345/612/44 349/574/44 348/573/44 +f 329/614/44 360/585/44 349/574/44 +f 336/616/44 366/591/44 360/585/44 +f 344/618/44 326/891/44 358/583/44 +f 336/619/44 344/892/44 357/582/44 +f 371/620/99 391/640/100 372/621/100 +f 374/623/45 392/642/101 375/624/101 +f 377/626/102 393/643/103 378/627/103 +f 380/629/51 394/644/104 381/630/104 +f 383/632/44 371/620/99 373/622/99 +f 385/634/50 377/626/102 379/628/102 +f 387/636/105 380/629/51 382/631/51 +f 389/638/106 383/632/44 384/633/44 +f 391/640/100 385/893/50 386/641/50 +f 392/642/101 387/636/105 388/637/105 +f 393/643/103 374/623/45 376/625/45 +f 394/644/104 389/638/106 390/639/106 +f 374/645/42 393/894/42 395/646/42 +f 393/648/42 377/895/42 397/649/42 +f 377/650/42 385/896/42 398/651/42 +f 391/652/42 399/656/42 398/653/42 +f 371/655/42 400/659/42 399/656/42 +f 383/658/42 401/662/42 400/659/42 +f 389/661/42 403/666/42 401/662/42 +f 389/664/42 394/897/42 402/665/42 +f 394/667/42 380/898/42 404/668/42 +f 387/669/42 405/672/42 404/668/42 +f 392/671/42 406/675/42 405/672/42 +f 374/674/42 396/647/42 406/675/42 +f 407/677/44 415/685/99 400/659/99 +f 408/678/50 417/687/102 397/649/102 +f 409/679/105 418/688/51 404/668/51 +f 410/680/106 407/677/44 401/662/44 +f 411/681/100 408/899/50 398/653/50 +f 412/682/101 409/679/105 405/672/105 +f 413/683/103 416/686/45 396/647/45 +f 414/684/104 410/680/106 403/666/106 +f 415/685/99 411/681/100 399/656/100 +f 416/686/45 412/682/101 406/675/101 +f 417/687/102 413/683/103 395/646/103 +f 418/688/51 414/684/104 402/665/104 +f 416/691/43 413/900/43 417/901/43 +f 417/901/43 408/902/43 411/903/43 +f 411/903/43 415/904/43 407/905/43 +f 407/905/43 410/906/43 414/689/43 +f 414/689/43 418/907/43 409/690/43 +f 409/690/43 412/908/43 416/691/43 +f 416/691/43 417/901/43 414/689/43 +f 417/901/43 411/903/43 414/689/43 +f 411/903/43 407/905/43 414/689/43 +f 419/692/102 440/714/102 420/693/50 +f 422/695/51 441/715/51 423/696/105 +f 425/698/44 442/716/44 426/699/106 +f 421/701/50 420/909/50 428/702/100 +f 424/697/105 423/696/105 430/704/101 +f 432/706/45 439/713/45 433/707/103 +f 427/700/106 426/699/106 435/709/104 +f 429/703/100 428/702/100 437/711/99 +f 431/705/101 430/704/101 439/713/45 +f 434/708/103 433/707/103 440/714/102 +f 436/710/104 435/709/104 441/715/51 +f 438/712/99 437/711/99 442/716/44 +f 443/717/102 464/739/116 444/718/107 +f 446/720/51 465/740/117 447/721/108 +f 449/723/44 466/741/118 450/724/109 +f 445/726/50 444/751/107 452/727/110 +f 448/722/105 447/721/108 454/729/111 +f 456/731/45 463/738/115 457/732/112 +f 451/725/106 450/724/109 459/734/113 +f 453/728/100 452/727/110 461/736/114 +f 455/730/101 454/729/111 463/738/115 +f 458/733/103 457/732/112 464/739/116 +f 460/735/104 459/734/113 465/740/117 +f 462/737/99 461/736/114 466/741/118 +f 464/739/116 468/743/120 467/742/119 +f 457/732/112 469/744/121 468/743/120 +f 463/738/115 478/910/143 469/744/121 +f 470/745/122 478/910/143 463/738/115 +f 471/746/123 470/745/122 454/729/111 +f 472/747/124 471/746/123 447/721/108 +f 473/748/125 472/747/124 465/740/117 +f 474/749/126 473/748/125 459/734/113 +f 475/750/127 474/749/126 450/724/109 +f 461/736/114 477/753/129 475/750/127 +f 444/751/107 467/911/119 476/752/128 +f 452/727/110 476/752/128 477/753/129 +f 468/912/42 469/913/42 478/754/42 +f 478/754/42 470/914/42 471/755/42 +f 471/755/42 472/915/42 475/756/42 +f 472/915/42 473/916/42 475/756/42 +f 473/916/42 474/917/42 475/756/42 +f 475/756/42 477/918/42 476/919/42 +f 476/919/42 467/920/42 475/756/42 +f 467/920/42 468/912/42 475/756/42 +f 468/912/42 478/754/42 475/756/42 +f 455/730/43 456/731/43 439/757/43 +f 448/722/43 455/730/43 430/759/43 +f 446/720/43 448/722/43 423/761/43 +f 435/763/43 460/735/43 446/720/43 +f 426/765/43 451/725/43 460/735/43 +f 449/723/43 451/725/43 426/767/43 +f 462/737/43 449/723/43 442/769/43 +f 453/728/43 462/737/43 437/771/43 +f 445/726/43 453/728/43 428/773/43 +f 440/775/43 443/717/43 445/719/43 +f 433/777/43 458/733/43 443/717/43 +f 439/779/43 456/731/43 458/733/43 +f 114/781/130 117/212/130 122/211/50 +f 110/783/131 109/921/131 174/784/132 +f 152/286/56 108/191/56 117/786/130 +f 115/788/131 111/922/131 116/789/133 +f 142/791/134 182/836/135 196/792/135 +f 150/245/136 161/260/136 125/218/43 +f 127/794/137 161/260/136 150/245/136 +f 202/333/136 198/321/136 133/227/43 +f 198/321/136 202/333/136 168/304/137 +f 149/247/134 185/303/134 201/796/135 +f 141/297/71 143/923/138 139/798/138 +f 148/799/139 147/263/140 144/324/140 +f 116/789/133 168/268/51 185/332/51 +f 148/242/139 146/924/139 139/801/138 +f 479/802/141 188/814/141 187/803/45 +f 481/805/131 190/816/131 189/806/51 +f 483/808/142 155/817/142 154/809/44 +f 485/811/56 186/818/56 156/812/50 +f 482/807/51 189/806/51 188/814/141 +f 484/815/44 154/925/44 190/816/131 +f 486/813/50 156/812/50 155/817/142 +f 480/804/45 187/803/45 186/818/56 +f 487/819/141 192/831/141 158/820/45 +f 489/822/131 193/833/131 159/823/51 +f 491/825/142 195/834/142 194/826/44 +f 493/828/56 191/835/56 157/829/50 +f 490/824/51 159/823/51 192/831/141 +f 492/832/44 194/926/44 193/833/131 +f 494/830/50 157/829/50 195/834/142 +f 488/821/45 158/820/45 191/835/56 +f 130/224/45 180/293/45 164/797/135 +f 182/836/135 184/300/45 162/261/45 +f 174/784/132 173/273/44 177/277/44 +o Flash_Hider +v -0.250001 -0.000000 12.500000 +v -0.176778 0.176777 12.500000 +v -0.176778 0.176777 11.625000 +v -0.176778 0.176777 11.250000 +v -0.000001 0.250000 11.250000 +v -0.000000 -0.250000 11.250000 +v 0.249999 0.000000 12.500000 +v 0.176776 -0.176777 12.500000 +v 0.176776 -0.176777 11.625000 +v -0.000000 -0.250000 11.625000 +v -0.176778 -0.176777 12.500000 +v -0.176778 -0.176777 11.625000 +v -0.000001 0.250000 11.625000 +v 0.176776 0.176777 12.500000 +v 0.176776 0.176777 11.625000 +v 0.176776 0.176777 11.250000 +v 0.249999 0.000000 11.625000 +v 0.250000 0.000000 11.250000 +v 0.176777 -0.176777 11.250000 +v -0.176777 -0.176777 11.250000 +v -0.250001 -0.000000 11.625000 +v -0.250001 -0.000000 11.250000 +v 0.088387 -0.088388 12.437500 +v -0.000001 -0.125000 12.437500 +v -0.000001 -0.250000 12.500000 +v -0.088389 -0.088388 11.625000 +v -0.088389 -0.088388 12.437500 +v -0.000001 0.125000 12.437500 +v 0.088387 0.088388 12.437500 +v -0.088389 0.088388 12.437500 +v 0.124999 0.000000 12.437500 +v 0.088387 -0.088388 11.625000 +v -0.125001 -0.000000 12.437500 +v -0.088389 0.088388 11.625000 +v 0.088387 0.088388 11.625000 +v -0.000001 0.250000 12.500000 +v -0.000001 0.125000 11.625000 +v 0.124999 0.000000 11.625000 +v -0.000001 -0.125000 11.625000 +v -0.125001 -0.000000 11.625000 +vt 0.092664 0.494208 +vt 0.081081 0.494208 +vt 0.081081 0.548263 +vt 0.058577 0.684060 +vt 0.054054 0.694981 +vt 0.084942 0.694981 +vt 0.046332 0.494208 +vt 0.034749 0.494208 +vt 0.034749 0.548263 +vt 0.115830 0.548263 +vt 0.104247 0.494208 +vt 0.104247 0.548263 +vt 0.069498 0.548263 +vt 0.057915 0.494208 +vt 0.057915 0.548263 +vt 0.081081 0.571429 +vt 0.069498 0.571429 +vt 0.057915 0.571429 +vt 0.046332 0.548263 +vt 0.046332 0.571429 +vt 0.034749 0.571429 +vt 0.023166 0.548263 +vt 0.023166 0.571429 +vt 0.104247 0.571429 +vt 0.092664 0.548263 +vt 0.092664 0.571429 +vt 0.038610 0.486486 +vt 0.084942 0.640927 +vt 0.034749 0.648649 +vt 0.030888 0.640927 +vt 0.084942 0.652510 +vt 0.034749 0.652510 +vt 0.115830 0.494208 +vt 0.108108 0.486486 +vt 0.065637 0.486486 +vt 0.061776 0.486486 +vt 0.084942 0.486486 +vt 0.084942 0.660232 +vt 0.030888 0.660232 +vt 0.034749 0.667954 +vt 0.084942 0.671815 +vt 0.034749 0.671815 +vt 0.034749 0.629344 +vt 0.084942 0.633205 +vt 0.034749 0.633205 +vt 0.034749 0.610039 +vt 0.084942 0.613900 +vt 0.034749 0.613900 +vt 0.084942 0.640927 +vt 0.030888 0.640927 +vt 0.084942 0.602317 +vt 0.030888 0.602317 +vt 0.084942 0.621622 +vt 0.030888 0.621622 +vt 0.084942 0.660232 +vt 0.030888 0.660232 +vt 0.084942 0.679537 +vt 0.030888 0.679537 +vt 0.084942 0.621622 +vt 0.030888 0.621622 +vt 0.027689 0.684062 +vt 0.030888 0.694981 +vt 0.023166 0.694981 +vt 0.027689 0.705901 +vt 0.038610 0.702703 +vt 0.038610 0.710425 +vt 0.046332 0.694981 +vt 0.049531 0.705900 +vt 0.044070 0.700440 +vt 0.049531 0.684060 +vt 0.038610 0.687259 +vt 0.038610 0.679537 +vt 0.044070 0.689520 +vt 0.033150 0.700441 +vt 0.058577 0.705901 +vt 0.069498 0.710425 +vt 0.080419 0.705901 +vt 0.080419 0.684060 +vt 0.069498 0.679537 +vt 0.115830 0.571429 +vt 0.069498 0.494208 +vt 0.042471 0.486486 +vt 0.084942 0.648649 +vt 0.111969 0.486486 +vt 0.088803 0.486486 +vt 0.084942 0.667954 +vt 0.084942 0.629344 +vt 0.084942 0.610039 +vt 0.033150 0.689521 +vt 0.054054 0.694981 +vn -0.9239 0.3827 -0.0000 +vn -0.7972 0.6037 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.9239 -0.3827 0.0000 +vn 0.7972 -0.6037 0.0000 +vn -0.1368 -0.9906 -0.0000 +vn -0.3827 -0.9239 -0.0000 +vn -0.6037 -0.7972 -0.0000 +vn 0.1368 0.9906 0.0000 +vn 0.3827 0.9239 0.0000 +vn 0.6037 0.7972 0.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.9906 -0.1368 0.0000 +vn 1.0000 -0.0000 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn -0.9906 0.1368 -0.0000 +vn -1.0000 0.0000 -0.0000 +vn -0.4397 0.1821 0.8795 +vn 0.8760 0.4823 0.0000 +vn -0.1951 0.9808 -0.0000 +vn -0.2783 0.9605 -0.0000 +vn 0.1821 0.4397 0.8795 +vn -0.1821 -0.4397 0.8795 +vn -0.1822 -0.4397 0.8795 +vn 0.4397 -0.1821 0.8795 +vn -0.4823 0.8760 -0.0000 +vn -0.9808 -0.1951 -0.0000 +vn -0.9605 -0.2783 -0.0000 +vn 0.4823 -0.8760 0.0000 +vn 0.9808 0.1951 0.0000 +vn 0.9605 0.2783 0.0000 +vn -0.8760 -0.4823 -0.0000 +vn 0.1951 -0.9808 0.0000 +vn 0.2783 -0.9605 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.8315 0.5556 0.0000 +vn 0.1822 0.4397 0.8795 +vn -0.5556 0.8315 -0.0000 +vn 0.5556 -0.8315 0.0000 +vn -0.8315 -0.5556 -0.0000 +usemtl None +s 1 +f 495/927/144 496/928/144 497/929/145 +f 498/930/146 499/931/146 500/932/146 +f 501/933/147 502/934/147 503/935/148 +f 504/936/149 505/937/150 506/938/151 +f 507/939/152 508/940/153 509/941/154 +f 498/942/155 507/939/152 499/943/156 +f 510/944/157 511/945/158 512/946/159 +f 513/947/160 504/948/149 500/949/161 +f 514/950/162 515/951/163 516/952/164 +f 501/933/165 517/953/165 502/934/165 +f 504/954/159 518/955/166 519/956/159 +f 518/955/166 520/957/167 521/958/168 +f 519/959/169 521/960/169 505/937/169 +f 508/940/170 522/961/170 523/962/171 +f 495/927/172 524/963/172 496/928/172 +f 521/958/168 506/964/155 505/965/155 +f 525/966/173 526/967/174 517/968/175 +f 527/969/176 528/970/177 524/971/178 +f 522/972/179 529/973/180 523/974/181 +f 524/971/178 497/975/157 496/976/157 +f 507/977/164 522/972/179 530/978/164 +f 523/974/181 509/979/160 508/980/160 +f 511/981/156 525/966/173 501/982/156 +f 517/968/175 503/983/162 502/984/162 +f 515/985/161 527/969/176 495/986/161 +f 497/987/182 531/988/182 507/989/182 +f 509/990/182 532/991/182 511/992/182 +f 533/993/182 503/994/182 526/995/182 +f 506/996/182 534/997/182 515/998/182 +f 520/999/182 526/995/182 529/1000/182 +f 497/929/145 498/942/155 516/952/164 +f 516/952/164 515/951/163 497/929/145 +f 515/951/163 495/927/144 497/929/145 +f 499/931/146 510/1001/146 512/1002/146 +f 512/1002/146 513/1003/146 499/931/146 +f 513/1003/146 500/932/146 499/931/146 +f 500/932/146 514/1004/146 516/1005/146 +f 516/1005/146 498/930/146 500/932/146 +f 503/935/148 513/947/160 512/946/159 +f 512/946/159 511/945/158 503/935/148 +f 511/945/158 501/933/147 503/935/148 +f 506/938/151 514/950/162 500/1006/161 +f 504/936/149 519/959/150 505/937/150 +f 506/938/151 500/1006/161 504/936/149 +f 509/941/154 510/944/157 499/943/156 +f 507/939/152 530/1007/153 508/940/153 +f 509/941/154 499/943/156 507/939/152 +f 498/942/155 497/929/145 507/939/152 +f 510/944/157 509/941/154 511/945/158 +f 513/947/160 503/935/148 504/948/149 +f 514/950/162 506/938/151 515/951/163 +f 501/933/165 525/1008/165 517/953/165 +f 504/954/159 533/1009/183 518/955/166 +f 518/955/166 533/1009/183 520/957/167 +f 519/959/169 518/1010/184 521/960/169 +f 508/940/170 530/1007/170 522/961/170 +f 495/927/172 527/1011/172 524/963/172 +f 521/958/168 520/957/167 506/964/155 +f 525/966/173 532/1012/185 526/967/174 +f 527/969/176 534/1013/186 528/970/177 +f 522/972/179 531/1014/187 529/973/180 +f 524/971/178 528/970/177 497/975/157 +f 507/977/164 531/1014/187 522/972/179 +f 523/974/181 529/973/180 509/979/160 +f 511/981/156 532/1012/185 525/966/173 +f 517/968/175 526/967/174 503/983/162 +f 515/985/161 534/1013/186 527/969/176 +f 497/987/182 528/1015/182 531/988/182 +f 509/990/182 529/1000/182 532/991/182 +f 533/993/182 504/1016/182 503/994/182 +f 506/996/182 520/999/182 534/997/182 +f 520/999/182 533/993/182 526/995/182 +f 526/995/182 532/991/182 529/1000/182 +f 529/1000/182 531/988/182 528/1015/182 +f 528/1015/182 534/997/182 529/1000/182 +f 534/997/182 520/999/182 529/1000/182 +o Stock +v 0.154680 0.735485 -6.625000 +v 0.343750 0.343750 -6.625000 +v 0.156250 0.343750 -7.375000 +v -0.154680 0.735485 -6.625000 +v -0.156250 0.343750 -7.375000 +v -0.343750 0.343750 -6.625000 +v 0.000000 0.781250 -6.625000 +v 0.468750 -0.093750 -6.625000 +v 0.406250 0.093750 -7.375000 +v 0.468750 0.093750 -6.625000 +v 0.343750 -0.343750 -6.625000 +v 0.343750 -0.343750 -7.625000 +v 0.406250 -0.093750 -7.375000 +v -0.156250 0.218750 -7.625000 +v 0.156250 0.218750 -7.625000 +v -0.156250 0.156250 -8.000000 +v 0.156250 0.156250 -8.000000 +v -0.156249 0.156250 -12.125000 +v 0.343751 0.031250 -12.125000 +v 0.156251 0.156250 -12.125000 +v 0.343750 -0.656249 -7.250000 +v 0.343750 -0.718750 -6.625000 +v 0.218750 -0.781249 -7.250000 +v -0.343750 -0.718750 -6.625000 +v -0.218750 -0.781249 -7.250000 +v 0.156251 -2.406250 -12.125000 +v 0.343751 -2.218750 -12.125000 +v -0.156249 -2.406250 -12.125000 +v 0.343750 0.031250 -8.000000 +v 0.343750 0.031250 -7.625000 +v -0.343750 -0.656249 -7.250000 +v -0.343750 -0.343750 -7.625000 +v -0.343750 -0.343750 -6.625000 +v -0.343749 -2.218750 -12.125000 +v -0.343749 0.031250 -12.125000 +v -0.343750 0.031250 -8.000000 +v -0.406250 0.093750 -7.375000 +v -0.343750 0.031250 -7.625000 +v -0.468750 0.093750 -6.625000 +v -0.468750 -0.093750 -6.625000 +v -0.406250 -0.093750 -7.375000 +v 0.343751 -2.218750 -12.500000 +v -0.156249 0.156250 -12.500000 +v -0.343749 0.031250 -12.500000 +v 0.156251 0.156250 -12.500000 +v 0.156251 -2.406250 -12.500000 +v -0.156249 -2.406250 -12.500000 +v 0.343751 -0.718750 -12.312500 +v 0.343751 0.031250 -12.500000 +v 0.343751 -1.468750 -12.312500 +v -0.343749 -0.718750 -12.312500 +v -0.343749 -2.218750 -12.500000 +v -0.343749 -1.468750 -12.312500 +vt 0.980695 0.088803 +vt 0.980695 0.115830 +vt 0.934363 0.108108 +vt 0.980695 0.069498 +vt 0.934363 0.050193 +vt 0.980695 0.042471 +vt 0.988417 0.088803 +vt 0.934363 0.088803 +vt 0.988417 0.079151 +vt 0.934363 0.069498 +vt 0.988417 0.069498 +vt 0.660232 0.270270 +vt 0.706564 0.281853 +vt 0.660232 0.281853 +vt 0.660232 0.297297 +vt 0.934363 0.127413 +vt 0.660232 0.254826 +vt 0.722008 0.254826 +vt 0.706564 0.270270 +vt 0.918919 0.069498 +vt 0.918919 0.088803 +vt 0.895753 0.069498 +vt 0.895753 0.088803 +vt 0.640927 0.069498 +vt 0.640927 0.104247 +vt 0.640927 0.088803 +vt 0.698842 0.235521 +vt 0.660232 0.231660 +vt 0.610039 0.158301 +vt 0.571429 0.150579 +vt 0.610039 0.146718 +vt 0.571429 0.115830 +vt 0.610039 0.119691 +vt 0.926641 0.142857 +vt 1.000000 0.123552 +vt 1.000000 0.138996 +vt 0.926641 0.123552 +vt 0.745174 0.277992 +vt 1.000000 0.277992 +vt 0.918919 0.104247 +vt 0.934363 0.108108 +vt 0.722008 0.277992 +vt 0.610039 0.108108 +vt 0.660232 0.231660 +vt 0.722008 0.254826 +vt 0.698842 0.235521 +vt 0.660232 0.254826 +vt 1.000000 0.138996 +vt 1.000000 0.123552 +vt 1.000000 0.277992 +vt 0.895753 0.054054 +vt 0.745174 0.277992 +vt 0.895753 0.104247 +vt 0.934363 0.050193 +vt 0.918919 0.054054 +vt 0.934363 0.030888 +vt 0.660232 0.297297 +vt 0.706564 0.281853 +vt 0.660232 0.281853 +vt 0.660232 0.270270 +vt 0.706564 0.270270 +vt 0.722008 0.277992 +vt 0.057915 0.266409 +vt 0.042471 0.289575 +vt 0.042471 0.266409 +vt 0.266409 0.266409 +vt 0.247104 0.289575 +vt 0.247104 0.266409 +vt 0.231660 0.289575 +vt 0.231660 0.266409 +vt 0.281853 0.266409 +vt 0.266409 0.289575 +vt 0.077220 0.266409 +vt 0.057915 0.289575 +vt 0.092664 0.266409 +vt 0.077220 0.289575 +vt 0.328185 0.277992 +vt 0.281853 0.289575 +vt 0.420849 0.266409 +vt 0.420849 0.289575 +vt 0.374517 0.277992 +vt 0.362934 0.223938 +vt 0.316602 0.266409 +vt 0.316602 0.223938 +vt 0.420849 0.235521 +vt 0.409266 0.266409 +vt 0.409266 0.223938 +vt 0.262548 0.235521 +vt 0.270270 0.266409 +vt 0.262548 0.254826 +vt 0.270270 0.223938 +vt 0.185328 0.277992 +vt 0.092664 0.289575 +vt 0.138996 0.277992 +vt 0.640927 0.054054 +vt 0.362934 0.266409 +vt 0.420849 0.254826 +vn 0.5473 0.7423 -0.3866 +vn 0.8653 0.4760 -0.1572 +vn 0.4013 0.8284 -0.3908 +vn -0.5473 0.7423 -0.3866 +vn -0.4013 0.8284 -0.3908 +vn -0.8653 0.4760 -0.1572 +vn -0.0000 0.8838 -0.4679 +vn 0.9776 -0.2045 -0.0496 +vn 0.9031 0.3710 -0.2165 +vn 0.9707 0.2263 -0.0809 +vn 0.8944 -0.4472 0.0000 +vn 0.9987 -0.0335 -0.0381 +vn 0.9878 -0.0620 -0.1431 +vn 0.0000 0.9510 -0.3092 +vn 0.0000 0.9966 -0.0825 +vn -0.1922 0.9814 0.0000 +vn 0.5865 0.8096 -0.0234 +vn 0.8817 0.4719 0.0000 +vn 0.5547 0.8321 0.0000 +vn 0.9999 -0.0096 0.0031 +vn 1.0000 0.0000 0.0000 +vn 0.7056 -0.7056 0.0657 +vn 0.1245 -0.9895 0.0741 +vn 0.3705 -0.9144 0.1632 +vn -0.1245 -0.9895 0.0741 +vn -0.3705 -0.9144 0.1632 +vn 0.2585 -0.9591 0.1158 +vn 0.6896 -0.6896 0.2210 +vn 0.8875 -0.4389 0.1407 +vn -0.2585 -0.9591 0.1158 +vn 0.9090 0.3749 -0.1824 +vn 0.6863 0.6863 -0.2408 +vn 0.9987 -0.0335 -0.0380 +vn -0.7056 -0.7056 0.0657 +vn -1.0000 -0.0000 -0.0000 +vn -0.9987 -0.0335 -0.0380 +vn -0.9999 -0.0096 0.0031 +vn -0.8875 -0.4389 0.1407 +vn -0.6896 -0.6896 0.2210 +vn -0.8817 0.4719 -0.0000 +vn -0.5547 0.8321 -0.0000 +vn -0.5865 0.8096 -0.0234 +vn -0.6863 0.6863 -0.2408 +vn -0.9031 0.3710 -0.2165 +vn -0.9090 0.3749 -0.1824 +vn -0.9707 0.2263 -0.0809 +vn -0.9776 -0.2045 -0.0496 +vn -0.9878 -0.0620 -0.1431 +vn -0.8944 -0.4472 -0.0000 +vn 0.9099 -0.4148 0.0000 +vn 0.9239 -0.3827 -0.0000 +vn 0.1922 0.9814 0.0000 +vn -0.2898 0.9571 -0.0000 +vn -0.8594 0.5112 -0.0000 +vn 0.2898 0.9571 -0.0000 +vn 0.3827 -0.9239 0.0000 +vn -0.9239 -0.3827 -0.0000 +vn -0.3827 -0.9239 0.0000 +vn 0.8594 0.5112 0.0000 +vn 0.0000 0.1222 -0.9925 +vn 0.0000 -0.1222 -0.9925 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.1628 -0.9867 +vn 0.0000 -0.1775 -0.9841 +vn -0.9099 -0.4148 -0.0000 +vn -0.1245 -0.9894 0.0741 +usemtl None +s 1 +f 535/1017/188 536/1018/189 537/1019/190 +f 538/1020/191 539/1021/192 540/1022/193 +f 535/1023/188 537/1024/190 541/1025/194 +f 541/1025/194 539/1026/192 538/1027/191 +f 537/1024/190 539/1026/192 541/1025/194 +f 542/1028/195 543/1029/196 544/1030/197 +f 544/1030/197 543/1029/196 536/1031/189 +f 537/1019/190 536/1018/189 543/1032/196 +f 542/1028/195 545/1033/198 546/1034/199 +f 547/1035/200 542/1028/195 546/1034/199 +f 537/1024/190 548/1036/201 539/1026/192 +f 549/1037/201 550/1038/202 548/1036/201 +f 551/1039/202 552/1040/203 550/1038/202 +f 551/1039/204 553/1041/205 554/1042/206 +f 555/1043/207 546/1034/199 556/1044/208 +f 555/1045/209 556/1046/210 557/1047/211 +f 557/1047/211 558/1048/212 559/1049/213 +f 557/1047/211 560/1050/214 555/1045/209 +f 560/1051/215 561/1052/216 555/1043/207 +f 562/1053/217 557/1047/211 559/1049/213 +f 555/1043/207 561/1052/216 546/1034/199 +f 563/1054/205 546/1034/199 553/1055/205 +f 561/1052/216 553/1055/205 546/1034/199 +f 564/1056/218 549/1037/219 543/1057/196 +f 543/1057/196 549/1037/219 537/1024/190 +f 546/1034/199 564/1058/218 547/1035/200 +f 563/1054/205 564/1058/218 546/1034/199 +f 543/1029/196 547/1035/200 564/1058/218 +f 545/1033/208 556/1044/208 546/1034/220 +f 559/1049/213 558/1048/212 565/1059/221 +f 558/1060/222 566/1061/223 565/1062/224 +f 558/1060/222 567/1063/222 566/1061/223 +f 562/1053/217 559/1049/213 565/1059/221 +f 568/1064/225 562/1065/226 565/1062/224 +f 565/1062/224 566/1061/223 568/1064/225 +f 568/1064/225 566/1061/223 569/1066/227 +f 552/1040/228 570/1067/227 550/1038/229 +f 569/1066/227 566/1061/223 570/1068/227 +f 563/1069/205 551/1039/204 564/1056/218 +f 548/1036/230 571/1070/231 539/1026/192 +f 572/1071/232 571/1070/231 548/1036/230 +f 539/1021/192 571/1072/231 540/1022/193 +f 540/1073/193 571/1074/231 573/1075/233 +f 574/1076/234 571/1074/231 575/1077/235 +f 567/1063/236 574/1076/234 566/1061/223 +f 575/1077/235 566/1061/223 574/1076/234 +f 571/1074/231 572/1078/232 575/1077/235 +f 575/1077/235 572/1078/232 566/1061/223 +f 570/1068/227 566/1061/223 572/1078/232 +f 560/1079/214 576/1080/237 561/1081/238 +f 554/1082/239 577/1083/240 552/1084/203 +f 552/1084/203 578/1085/241 569/1086/227 +f 553/1087/205 579/1088/242 554/1082/239 +f 562/1089/217 580/1090/243 560/1079/214 +f 568/1091/244 581/1092/245 562/1089/217 +f 553/1087/205 582/1093/208 583/1094/246 +f 561/1095/238 576/1096/237 584/1097/208 +f 561/1095/238 582/1093/208 553/1087/205 +f 584/1098/247 585/1099/248 582/1100/248 +f 580/1101/249 586/1102/250 576/1103/250 +f 586/1102/250 584/1098/247 576/1103/250 +f 579/1104/249 578/1105/251 577/1106/249 +f 582/1100/248 578/1105/251 583/1107/251 +f 578/1085/241 585/1108/222 569/1086/227 +f 586/1109/252 568/1091/244 587/1110/222 +f 585/1108/222 568/1091/244 569/1086/227 +f 551/1039/204 549/1037/219 564/1056/218 +f 570/1067/227 572/1071/232 550/1038/229 +f 548/1036/230 550/1038/229 572/1071/232 +f 542/1028/195 547/1035/200 543/1029/196 +f 537/1024/190 549/1037/201 548/1036/201 +f 549/1037/201 551/1039/202 550/1038/202 +f 551/1039/202 554/1042/239 552/1040/203 +f 551/1039/204 563/1069/205 553/1041/205 +f 557/1047/211 556/1046/210 558/1048/253 +f 562/1053/217 560/1050/214 557/1047/211 +f 552/1040/228 569/1111/227 570/1067/227 +f 574/1076/234 573/1075/233 571/1074/231 +f 560/1079/214 580/1090/243 576/1080/237 +f 554/1082/239 579/1088/242 577/1083/240 +f 552/1084/203 577/1083/240 578/1085/241 +f 553/1087/205 583/1094/246 579/1088/242 +f 562/1089/217 581/1092/245 580/1090/243 +f 568/1091/244 586/1109/252 581/1092/245 +f 561/1095/238 584/1097/208 582/1093/208 +f 584/1098/247 587/1112/247 585/1099/248 +f 580/1101/249 581/1113/249 586/1102/250 +f 586/1102/250 587/1112/247 584/1098/247 +f 579/1104/249 583/1107/251 578/1105/251 +f 582/1100/248 585/1099/248 578/1105/251 +f 585/1108/222 587/1110/222 568/1091/244 +o Magazine +v 0.312500 -3.843750 -1.312500 +v -0.312500 -3.593750 0.437500 +v -0.312500 -3.843750 -1.312500 +v 0.312500 -3.593750 0.437500 +v -0.312500 -0.218750 0.250000 +v 0.312500 -0.218750 -0.562500 +v 0.125000 -0.218750 -0.562500 +v 0.312500 -0.218750 0.250000 +v -0.312500 -0.218750 -0.562500 +v -0.125000 -0.218750 -0.562500 +v 0.125000 -0.218750 -1.437500 +v 0.125000 -0.093750 -0.687500 +v 0.125000 -0.093750 -1.437500 +v -0.125000 -0.093750 -0.687500 +v -0.125000 -0.218750 -1.437500 +v -0.125000 -0.093750 -1.437500 +v -0.187500 -0.093750 -1.437500 +v -0.312500 -0.218750 -1.437500 +v 0.187500 -0.093750 -1.437500 +v 0.312500 -0.218750 -1.437500 +v -0.187500 -0.093750 -0.687500 +v 0.187500 -0.093750 -0.687500 +vt 0.420849 0.328185 +vt 0.312741 0.289575 +vt 0.420849 0.289575 +vt 0.312741 0.328185 +vt 0.104247 0.289575 +vt 0.698842 0.328185 +vt 0.698842 0.316602 +vt 0.749035 0.328185 +vt 0.698842 0.289575 +vt 0.749035 0.289575 +vt 0.698842 0.301158 +vt 0.675676 0.316602 +vt 0.667954 0.359073 +vt 0.667954 0.316602 +vt 0.683398 0.359073 +vt 0.675676 0.316602 +vt 0.683398 0.316602 +vt 0.652510 0.297297 +vt 0.644788 0.301158 +vt 0.644788 0.289575 +vt 0.644788 0.316602 +vt 0.652510 0.320463 +vt 0.644788 0.328185 +vt 0.104247 0.328185 +vt 0.675676 0.366795 +vt 0.675676 0.366795 +vt 0.652510 0.301158 +vt 0.652510 0.316602 +vt 0.656371 0.243243 +vt 0.656371 0.289575 +vt 0.687259 0.362934 +vt 0.687259 0.316602 +vt 0.656371 0.374517 +vt 0.644788 0.382239 +vt 0.664093 0.362934 +vt 0.664093 0.316602 +vt 0.683398 0.374517 +vt 0.694981 0.374517 +vt 0.667954 0.374517 +vt 0.656371 0.374517 +vt 0.436293 0.185328 +vt 0.644788 0.185328 +vt 0.644788 0.235521 +vt 0.644788 0.432432 +vt 0.436293 0.432432 +vt 0.683398 0.362934 +vt 0.656371 0.328185 +vt 0.667954 0.362934 +vn 0.0000 -0.9899 0.1414 +vn 0.0000 0.0555 0.9985 +vn -0.0000 1.0000 0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn 0.0000 -0.0345 -0.9994 +vn -0.9221 0.3869 -0.0000 +vn -0.7071 0.7071 -0.0000 +vn 0.0000 0.8959 0.4444 +vn 0.9221 0.3869 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.9847 0.1743 0.0000 +vn 0.0000 0.7071 0.7071 +vn -0.9847 0.1743 0.0000 +vn 0.0000 0.9239 0.3827 +usemtl None +s off +f 588/1114/254 589/1115/254 590/1116/254 +f 591/1117/255 592/1118/255 589/1115/255 +f 593/1119/256 594/1120/256 595/1121/256 +f 596/1122/256 592/1123/256 597/1124/256 +f 598/1125/257 599/1126/257 600/1127/257 +f 601/1128/258 602/1129/258 603/1130/258 +f 604/1131/259 602/1132/259 605/1133/259 +f 598/1134/259 606/1135/259 607/1136/259 +f 594/1120/256 592/1123/256 595/1121/256 +f 598/1134/256 597/1124/256 594/1120/256 +f 598/1134/260 607/1136/260 588/1114/260 +f 588/1114/254 591/1117/254 589/1115/254 +f 591/1117/255 595/1137/255 592/1118/255 +f 598/1125/257 594/1138/257 599/1126/257 +f 601/1128/258 597/1139/258 602/1129/258 +f 604/1131/259 603/1140/259 602/1132/259 +f 598/1134/259 600/1141/259 606/1135/259 +f 594/1120/256 597/1124/256 592/1123/256 +f 598/1134/256 602/1132/256 597/1124/256 +f 588/1114/260 590/1116/260 602/1132/260 +f 590/1116/260 605/1133/260 602/1132/260 +f 602/1132/260 598/1134/260 588/1114/260 +s 1 +f 605/1133/261 608/1142/262 604/1143/262 +f 608/1144/263 603/1130/256 604/1145/256 +f 607/1136/264 609/1146/265 593/1147/266 +f 600/1127/256 609/1148/263 606/1149/256 +f 597/1150/267 608/1144/263 596/1151/267 +f 609/1148/263 594/1152/267 593/1153/267 +f 589/1154/257 592/1155/257 596/1156/268 +f 593/1147/266 595/1157/258 591/1158/258 +f 605/1133/261 596/1156/268 608/1142/262 +f 608/1144/263 601/1159/269 603/1130/256 +f 607/1136/264 606/1160/265 609/1146/265 +f 600/1127/256 599/1161/269 609/1148/263 +f 597/1150/267 601/1159/269 608/1144/263 +f 609/1148/263 599/1161/269 594/1152/267 +f 605/1133/261 590/1116/257 596/1156/268 +f 590/1116/257 589/1154/257 596/1156/268 +f 591/1158/258 588/1114/258 593/1147/266 +f 588/1114/258 607/1136/264 593/1147/266 +o Mag_Paddle +v -0.093750 -1.307663 -1.505856 +v 0.093750 -1.477596 -1.585097 +v 0.093750 -1.307663 -1.505856 +v 0.093750 -1.451182 -1.641741 +v -0.093750 -1.281250 -1.562500 +v 0.093750 -1.281250 -1.562500 +v -0.093750 -1.477596 -1.585097 +v 0.156250 -1.734404 -1.773809 +v -0.156250 -1.734404 -1.773809 +v -0.156250 -1.507827 -1.668154 +v 0.156250 -1.534240 -1.611510 +v -0.156250 -1.534240 -1.611510 +v -0.093750 -1.451182 -1.641741 +v 0.156250 -1.507827 -1.668154 +v -0.156250 -1.760817 -1.717165 +v 0.156250 -1.760817 -1.717165 +vt 0.725869 0.664093 +vt 0.737452 0.652510 +vt 0.737452 0.664093 +vt 0.749035 0.652510 +vt 0.760618 0.664093 +vt 0.749035 0.664093 +vt 0.741313 0.652510 +vt 0.745174 0.664093 +vt 0.741313 0.664093 +vt 0.764479 0.664093 +vt 0.768340 0.652510 +vt 0.768340 0.664093 +vt 0.745174 0.633205 +vt 0.764479 0.633205 +vt 0.764479 0.648649 +vt 0.741313 0.648649 +vt 0.722008 0.648649 +vt 0.725869 0.652510 +vt 0.760618 0.652510 +vt 0.745174 0.652510 +vt 0.764479 0.652510 +vt 0.745174 0.648649 +vt 0.722008 0.633205 +vt 0.741313 0.633205 +vt 0.768340 0.648649 +vt 0.768340 0.633205 +vt 0.745174 0.629344 +vt 0.764479 0.629344 +vn 0.0000 -0.4226 0.9063 +vn 0.0000 0.4226 -0.9063 +vn 1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.9239 0.3468 0.1617 +vn 0.7071 0.6409 0.2988 +vn -0.7071 0.6409 0.2988 +vn -0.9239 0.3468 0.1617 +vn 0.0000 -0.9063 -0.4226 +usemtl None +s off +f 610/1162/270 611/1163/270 612/1164/270 +f 613/1165/271 614/1166/271 615/1167/271 +f 611/1168/272 615/1169/272 612/1170/272 +f 614/1171/273 616/1172/273 610/1173/273 +f 617/1174/271 618/1175/271 619/1176/271 +f 620/1177/270 611/1163/270 621/1178/270 +f 610/1162/270 616/1179/270 611/1163/270 +f 613/1165/271 622/1180/271 614/1166/271 +f 611/1168/272 613/1181/272 615/1169/272 +f 614/1171/273 622/1182/273 616/1172/273 +f 619/1176/271 622/1180/271 613/1165/271 +f 613/1165/271 623/1183/271 619/1176/271 +f 623/1183/271 617/1174/271 619/1176/271 +f 611/1163/270 616/1179/270 621/1178/270 +f 621/1178/270 624/1184/270 625/1185/270 +f 625/1185/270 620/1177/270 621/1178/270 +s 1 +f 620/1177/274 613/1181/275 611/1168/275 +f 622/1182/276 621/1186/277 616/1172/276 +f 619/1176/277 624/1187/273 621/1186/277 +f 625/1185/272 623/1183/274 620/1177/274 +f 625/1188/278 618/1175/278 617/1174/278 +f 620/1177/274 623/1183/274 613/1181/275 +f 622/1182/276 619/1176/277 621/1186/277 +f 619/1176/277 618/1175/273 624/1187/273 +f 625/1185/272 617/1174/272 623/1183/274 +f 625/1188/278 624/1189/278 618/1175/278 +o Plug +v -0.000000 0.781250 5.125000 +v -0.156250 0.625000 5.125000 +v -0.110486 0.735485 5.125000 +v 0.156250 0.625000 5.437500 +v -0.110486 0.514515 5.125000 +v -0.110486 0.514515 5.687500 +v -0.156250 0.625000 5.687500 +v 0.110486 0.735485 5.437500 +v 0.110485 0.514515 5.125000 +v -0.000000 0.468750 5.125000 +v -0.110486 0.735485 6.000000 +v -0.110486 0.514515 6.000000 +v 0.110485 0.514515 6.000000 +v 0.110486 0.735485 5.125000 +v 0.156250 0.625000 5.125000 +v 0.110486 0.735485 6.000000 +v -0.000000 0.781250 6.000000 +v -0.156250 0.625000 6.000000 +v -0.000000 0.468750 6.000000 +v 0.156250 0.625000 6.000000 +vt 0.181467 0.602317 +vt 0.193050 0.598456 +vt 0.189189 0.602317 +vt 0.208494 0.579151 +vt 0.193050 0.598456 +vt 0.193050 0.563707 +vt 0.181467 0.509652 +vt 0.189189 0.486486 +vt 0.189189 0.509652 +vt 0.204633 0.602317 +vt 0.196911 0.602317 +vt 0.177606 0.579151 +vt 0.193050 0.563707 +vt 0.194084 0.547229 +vt 0.180433 0.547229 +vt 0.180433 0.560879 +vt 0.177606 0.598456 +vt 0.208494 0.598456 +vt 0.181467 0.486486 +vt 0.194084 0.560879 +vt 0.196911 0.554054 +vt 0.187259 0.544402 +vt 0.177606 0.554054 +vt 0.187259 0.563707 +vt 0.196911 0.544402 +vt 0.196911 0.490348 +vt 0.189189 0.544402 +vt 0.173745 0.544402 +vt 0.173745 0.490348 +vt 0.189189 0.490348 +vt 0.181467 0.490348 +vt 0.181467 0.544402 +vn 0.0000 0.0000 -1.0000 +vn -0.3827 0.9239 -0.0000 +vn -0.6048 -0.2505 -0.7560 +vn 0.3827 -0.9239 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.3827 0.9239 0.0000 +vn 0.6037 0.7972 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.9906 -0.1368 0.0000 +vn 0.9239 -0.3827 0.0000 +vn 1.0000 -0.0000 0.0000 +usemtl None +s off +f 626/1190/279 627/1191/279 628/1192/279 +f 629/1193/280 630/1194/280 631/1195/280 +f 629/1196/281 632/1197/281 633/1198/281 +f 630/1194/279 634/1199/279 635/1200/279 +f 627/1191/282 633/1201/282 632/1202/282 +f 636/1203/283 637/1204/283 638/1205/283 +f 626/1190/279 639/1206/279 627/1191/279 +f 629/1193/280 640/1207/280 630/1194/280 +f 629/1196/281 631/1208/281 632/1197/281 +f 630/1194/279 640/1207/279 634/1199/279 +f 627/1191/282 639/1206/282 633/1201/282 +f 641/1209/283 642/1210/283 636/1203/283 +f 636/1203/283 643/1211/283 637/1204/283 +f 637/1204/283 644/1212/283 638/1205/283 +f 638/1205/283 645/1213/283 641/1209/283 +f 641/1209/283 636/1203/283 638/1205/283 +s 1 +f 642/1214/284 633/1198/285 626/1215/284 +f 641/1216/286 629/1196/287 633/1198/285 +f 629/1196/287 638/1217/288 634/1218/288 +f 633/1198/285 639/1219/284 626/1215/284 +f 629/1196/287 634/1218/288 640/1220/288 +f 642/1214/284 641/1216/286 633/1198/285 +f 641/1216/286 645/1221/289 629/1196/287 +f 629/1196/287 645/1221/289 638/1217/288 +o Handle +v -0.034864 0.545839 5.343752 +v -0.080628 0.656323 5.218752 +v -0.034864 0.545839 5.218752 +v 0.208084 0.775912 5.343752 +v -0.080628 0.656323 5.343752 +v 0.253848 0.665427 5.593752 +v 0.253848 0.665427 5.343752 +v 0.450993 0.679438 5.656252 +v 0.427076 0.737180 5.593752 +v 0.381311 0.847665 5.593752 +v 0.357394 0.905408 5.656252 +v 0.184166 0.833655 5.968752 +v 0.357394 0.905408 6.031252 +v 0.277766 0.607685 5.968752 +v 0.450993 0.679438 6.031252 +v 0.208084 0.775912 5.593752 +v 0.184166 0.833655 5.656252 +v 0.277766 0.607685 5.656252 +v 0.080621 0.593674 5.156252 +v 0.427076 0.737180 5.343752 +v 0.323569 0.823748 5.156252 +v 0.034857 0.704159 5.156252 +v 0.381311 0.847665 5.343752 +v 0.369333 0.713263 5.156252 +vt 0.277992 0.416988 +vt 0.285714 0.409266 +vt 0.285714 0.416988 +vt 0.258687 0.409266 +vt 0.277992 0.409266 +vt 0.243243 0.416988 +vt 0.258687 0.416988 +vt 0.343629 0.420849 +vt 0.339768 0.416988 +vt 0.339768 0.409266 +vt 0.258687 0.378378 +vt 0.239382 0.389961 +vt 0.235521 0.378378 +vt 0.239382 0.436293 +vt 0.258687 0.447876 +vt 0.235521 0.447876 +vt 0.243243 0.409266 +vt 0.343629 0.405405 +vt 0.366795 0.405405 +vt 0.366795 0.420849 +vt 0.258687 0.389961 +vt 0.258687 0.436293 +vt 0.277992 0.436293 +vt 0.289575 0.424710 +vt 0.262548 0.447876 +vt 0.277992 0.447876 +vt 0.277992 0.389961 +vt 0.289575 0.382239 +vt 0.289575 0.401544 +vt 0.262548 0.378378 +vt 0.277992 0.378378 +vt 0.324324 0.416988 +vt 0.293436 0.416988 +vt 0.312741 0.409266 +vt 0.312741 0.416988 +vt 0.293436 0.409266 +vt 0.324324 0.409266 +vt 0.239382 0.405405 +vt 0.239382 0.420849 +vt 0.262548 0.389961 +vt 0.262548 0.436293 +vt 0.220077 0.420849 +vt 0.220077 0.405405 +vt 0.208494 0.420849 +vt 0.289575 0.444015 +vt 0.208494 0.405405 +vn -0.9239 -0.3827 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.9239 0.3827 0.0000 +vn -0.3827 0.9239 0.0000 +vn 0.3827 -0.9239 -0.0000 +vn 0.3536 -0.8536 -0.3827 +vn -0.3536 0.8535 -0.3827 +vn 0.9119 0.3777 -0.1602 +vn -0.2123 -0.0879 -0.9732 +vn -0.0000 0.0000 -1.0000 +vn -0.4132 -0.1711 -0.8944 +vn 0.8765 0.3630 -0.3162 +vn -0.2706 0.6533 -0.7071 +vn -0.3535 0.8536 -0.3827 +vn -0.3536 0.8536 -0.3827 +vn 0.2706 -0.6533 -0.7071 +vn -0.7495 -0.3104 0.5847 +vn -0.2922 -0.1210 0.9487 +usemtl None +s off +f 646/1222/290 647/1223/290 648/1224/290 +f 646/1222/291 649/1225/291 650/1226/291 +f 651/1227/290 649/1225/290 652/1228/290 +f 653/1229/292 654/1230/292 655/1231/292 +f 656/1232/293 657/1233/293 658/1234/293 +f 659/1235/294 653/1236/294 660/1237/294 +f 646/1222/290 650/1226/290 647/1223/290 +f 646/1222/291 652/1228/291 649/1225/291 +f 651/1227/290 661/1238/290 649/1225/290 +f 655/1231/292 656/1239/292 653/1229/292 +f 656/1239/292 658/1240/292 653/1229/292 +f 658/1240/292 660/1241/292 653/1229/292 +f 656/1232/293 662/1242/293 657/1233/293 +f 659/1235/294 663/1243/294 653/1236/294 +s 1 +f 652/1244/294 646/1222/294 664/1245/294 +f 654/1246/295 652/1244/294 665/1247/294 +f 649/1248/293 666/1249/293 667/1250/293 +f 649/1248/293 655/1251/296 668/1252/293 +f 665/1253/297 655/1231/292 654/1230/292 +f 664/1254/298 666/1255/299 669/1256/299 +f 648/1224/300 667/1257/298 664/1254/298 +f 669/1256/301 668/1258/297 665/1253/297 +f 662/1259/290 651/1227/290 663/1260/290 +f 662/1242/302 655/1251/303 661/1261/304 +f 654/1246/295 663/1243/305 651/1262/295 +f 662/1259/290 659/1263/306 657/1264/306 +f 660/1265/307 657/1264/306 659/1263/306 +f 646/1222/294 648/1224/294 664/1245/294 +f 664/1245/294 669/1266/294 652/1244/294 +f 669/1266/294 665/1247/294 652/1244/294 +f 654/1246/295 651/1262/295 652/1244/294 +f 667/1250/293 647/1223/293 650/1226/293 +f 649/1248/293 668/1252/293 666/1249/293 +f 667/1250/293 650/1226/293 649/1248/293 +f 649/1248/293 661/1261/296 655/1251/296 +f 665/1253/297 668/1258/297 655/1231/292 +f 664/1254/298 667/1257/298 666/1255/299 +f 648/1224/300 647/1223/300 667/1257/298 +f 669/1256/301 666/1255/301 668/1258/297 +f 662/1259/290 661/1238/290 651/1227/290 +f 662/1242/302 656/1232/302 655/1251/296 +f 654/1246/295 653/1236/305 663/1243/305 +f 662/1259/290 663/1260/290 659/1263/306 +f 660/1265/307 658/1267/307 657/1264/306 +o Guide_And_Bolt +v 0.093750 0.468750 0.125000 +v -0.156250 0.625000 0.125000 +v -0.093750 0.468750 0.125000 +v 0.281250 0.343750 0.125000 +v -0.281250 0.343750 0.125000 +v -0.218750 0.093750 0.125000 +v -0.093750 0.218750 0.125000 +v -0.343750 0.218750 0.125000 +v 0.218750 0.093750 0.125000 +v 0.343750 0.218750 0.125000 +v 0.093750 0.218750 0.125000 +v -0.093750 0.468750 -1.750000 +v 0.093750 0.218750 0.875000 +v -0.218750 0.093750 0.875000 +v -0.343750 0.218750 -1.750000 +v -0.093750 0.218750 0.875000 +v -0.281250 0.343750 -1.750000 +v -0.218750 -0.093750 0.875000 +v 0.093750 -0.218750 0.875000 +v -0.000000 0.468750 5.125000 +v -0.110486 0.514515 0.125000 +v -0.000000 0.468750 0.125000 +v -0.000000 0.781250 5.125000 +v 0.110486 0.735485 0.125000 +v -0.000000 0.781250 0.125000 +v 0.110485 0.514515 5.125000 +v 0.110485 0.514515 0.125000 +v -0.110486 0.514515 5.125000 +v 0.110486 0.735485 5.125000 +v 0.156250 0.625000 0.125000 +v -0.156250 0.625000 5.125000 +v -0.156250 0.625000 -1.750000 +v 0.218750 0.093750 0.875000 +v -0.093750 -0.218750 0.875000 +v 0.218750 -0.093750 0.875000 +v 0.156250 0.625000 5.125000 +v -0.110486 0.735485 5.125000 +vt 0.347490 0.509652 +vt 0.335907 0.494208 +vt 0.347490 0.498069 +vt 0.355212 0.521236 +vt 0.355212 0.486486 +vt 0.370656 0.490348 +vt 0.362934 0.498069 +vt 0.362934 0.482625 +vt 0.370656 0.517375 +vt 0.362934 0.525097 +vt 0.362934 0.509652 +vt 0.335907 0.517375 +vt 0.220077 0.505791 +vt 0.335907 0.505791 +vt 0.262548 0.471042 +vt 0.208494 0.482625 +vt 0.208494 0.471042 +vt 0.262548 0.447876 +vt 0.208494 0.459459 +vt 0.208494 0.447876 +vt 0.335907 0.490348 +vt 0.220077 0.482625 +vt 0.335907 0.482625 +vt 0.262548 0.459459 +vt 0.220077 0.490348 +vt 0.270270 0.474903 +vt 0.262548 0.455598 +vt 0.281853 0.447876 +vt 0.598456 0.440154 +vt 0.289575 0.447876 +vt 0.289575 0.440154 +vt 0.289575 0.471042 +vt 0.598456 0.463320 +vt 0.598456 0.471042 +vt 0.598456 0.432432 +vt 0.289575 0.432432 +vt 0.598456 0.447876 +vt 0.289575 0.455598 +vt 0.289575 0.463320 +vt 0.598456 0.455598 +vt 0.598456 0.461390 +vt 0.608108 0.451737 +vt 0.617761 0.461390 +vt 0.335907 0.513514 +vt 0.220077 0.517375 +vt 0.262548 0.482625 +vt 0.262548 0.467181 +vt 0.270270 0.447876 +vt 0.289575 0.455598 +vt 0.289575 0.467181 +vt 0.281853 0.474903 +vt 0.598456 0.455598 +vt 0.289575 0.455598 +vt 0.614933 0.468215 +vt 0.608108 0.471042 +vt 0.601283 0.468215 +vt 0.601283 0.454565 +vt 0.614933 0.454565 +vn -0.0000 0.0000 1.0000 +vn -0.9285 -0.3714 -0.0000 +vn -0.9550 0.2966 -0.0000 +vn 0.3827 0.9239 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.3827 0.9239 0.0000 +vn -0.7497 0.6618 -0.0000 +vn -0.8944 0.4472 -0.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 0.3827 -0.9239 0.0000 +vn -0.9239 -0.3827 -0.0000 +vn 0.9239 0.3827 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl None +s 1 +f 670/1268/308 671/1269/308 672/1270/308 +f 673/1271/308 672/1270/308 674/1272/308 +f 675/1273/308 676/1274/308 677/1275/308 +f 678/1276/308 679/1277/308 680/1278/308 +f 680/1278/308 679/1277/308 673/1271/308 +f 671/1279/309 681/1280/310 672/1281/310 +f 682/1282/311 678/1283/312 680/1284/311 +f 683/1285/313 676/1286/314 675/1287/313 +f 674/1288/315 684/1289/316 677/1290/316 +f 685/1291/314 680/1284/311 676/1286/314 +f 672/1281/310 686/1292/315 674/1288/315 +f 685/1293/308 687/1294/308 688/1295/308 +f 689/1296/317 690/1297/318 691/1298/317 +f 692/1299/311 693/1300/312 694/1301/311 +f 695/1302/319 691/1298/317 696/1303/319 +f 697/1304/318 671/1305/320 690/1297/318 +f 698/1306/312 699/1307/321 693/1300/312 +f 689/1308/322 700/1309/322 692/1310/322 +f 670/1268/308 699/1311/308 671/1269/308 +f 673/1271/308 670/1268/308 672/1270/308 +f 673/1271/308 674/1272/308 676/1274/308 +f 674/1272/308 677/1275/308 676/1274/308 +f 676/1274/308 680/1278/308 673/1271/308 +f 671/1279/309 701/1312/309 681/1280/310 +f 682/1282/311 702/1313/312 678/1283/312 +f 683/1285/313 685/1291/314 676/1286/314 +f 674/1288/315 686/1292/315 684/1289/316 +f 685/1291/314 682/1282/311 680/1284/311 +f 672/1281/310 681/1280/310 686/1292/315 +f 685/1293/308 683/1314/308 687/1294/308 +f 687/1294/308 703/1315/308 688/1295/308 +f 688/1295/308 704/1316/308 702/1317/308 +f 702/1317/308 682/1318/308 688/1295/308 +f 682/1318/308 685/1293/308 688/1295/308 +f 689/1296/317 697/1304/318 690/1297/318 +f 692/1299/311 698/1306/312 693/1300/312 +f 695/1302/319 689/1296/317 691/1298/317 +f 697/1304/318 700/1319/320 671/1305/320 +f 698/1306/312 705/1320/321 699/1307/321 +f 692/1310/322 698/1321/322 705/1322/322 +f 705/1322/322 695/1323/322 692/1310/322 +f 695/1323/322 689/1308/322 692/1310/322 +f 689/1308/322 697/1324/322 700/1309/322 +f 700/1309/322 706/1325/322 692/1310/322 +o Bullet +v 0.099841 -0.175376 -0.129965 +v 0.070825 -0.251737 -0.248711 +v 0.099231 -0.186101 -0.254503 +v 0.004758 -0.267392 -0.121575 +v -0.061742 -0.249788 -0.248230 +v 0.004148 -0.278117 -0.246113 +v -0.087637 -0.172620 -0.129284 +v -0.059841 -0.117709 -0.259614 +v -0.088247 -0.183345 -0.253822 +v 0.007446 -0.080604 -0.137674 +v 0.072726 -0.119658 -0.260095 +v 0.006836 -0.091329 -0.262212 +v 0.071436 -0.241012 -0.124174 +v -0.061132 -0.239063 -0.123692 +v -0.059231 -0.106984 -0.135076 +v 0.073336 -0.108933 -0.135558 +v 0.050573 -0.202586 0.060816 +v -0.037805 -0.201287 0.061137 +v -0.036538 -0.113234 0.053547 +v 0.051840 -0.114534 0.053226 +v 0.069510 -0.158829 0.056954 +v -0.055475 -0.156991 0.057409 +v 0.007913 -0.095648 0.051815 +v 0.007628 -0.147185 0.181719 +v 0.006122 -0.220173 0.062548 +v -0.108395 -0.325341 -0.617887 +v -0.156232 -0.278953 -1.374432 +v -0.112057 -0.389692 -1.365112 +v -0.105228 -0.105209 -0.636860 +v 0.002240 -0.125593 -1.388416 +v -0.108889 -0.169560 -1.384085 +v 0.115718 -0.108457 -0.637663 +v 0.156232 -0.283547 -1.375568 +v 0.112057 -0.172808 -1.384888 +v 0.159893 -0.219196 -0.628343 +v 0.108889 -0.392940 -1.365915 +v 0.001422 -0.372556 -0.614359 +v -0.002240 -0.436907 -1.361584 +v -0.152571 -0.214602 -0.627207 +v 0.005901 -0.061242 -0.641191 +v 0.112550 -0.328589 -0.618690 +v 0.007284 -0.060198 -0.264895 +v -0.082840 -0.116821 -0.510506 +v -0.081619 -0.095371 -0.261431 +v 0.130478 -0.186561 -0.254616 +v 0.093917 -0.119420 -0.511148 +v 0.095137 -0.097970 -0.262073 +v 0.092603 -0.274075 -0.246894 +v 0.129257 -0.208011 -0.503692 +v -0.084153 -0.271477 -0.246252 +v 0.002480 -0.330699 -0.492504 +v 0.003700 -0.309249 -0.243429 +v -0.120714 -0.204336 -0.502783 +v -0.119494 -0.182886 -0.253708 +v 0.006063 -0.081648 -0.513970 +v 0.091383 -0.295526 -0.495969 +v -0.085374 -0.292927 -0.495327 +vt 0.776062 0.513514 +vt 0.772201 0.505791 +vt 0.776062 0.505791 +vt 0.799228 0.513514 +vt 0.795367 0.505791 +vt 0.799228 0.505791 +vt 0.791506 0.513514 +vt 0.787645 0.505791 +vt 0.791506 0.505791 +vt 0.783784 0.513514 +vt 0.779923 0.505791 +vt 0.783784 0.505791 +vt 0.772201 0.513514 +vt 0.768340 0.505791 +vt 0.795367 0.513514 +vt 0.787645 0.513514 +vt 0.779923 0.513514 +vt 0.772201 0.525097 +vt 0.768340 0.513514 +vt 0.795367 0.525097 +vt 0.787645 0.525097 +vt 0.779923 0.525097 +vt 0.776062 0.525097 +vt 0.791506 0.525097 +vt 0.783784 0.525097 +vt 0.774131 0.532819 +vt 0.781853 0.532819 +vt 0.785714 0.532819 +vt 0.793436 0.532819 +vt 0.768340 0.525097 +vt 0.770270 0.532819 +vt 0.777992 0.532819 +vt 0.789575 0.532819 +vt 0.799228 0.525097 +vt 0.797297 0.532819 +vt 0.745174 0.494208 +vt 0.698842 0.501930 +vt 0.698842 0.494208 +vt 0.745174 0.509652 +vt 0.698842 0.517375 +vt 0.698842 0.509652 +vt 0.745174 0.525097 +vt 0.698842 0.532819 +vt 0.698842 0.525097 +vt 0.745174 0.532819 +vt 0.698842 0.540541 +vt 0.745174 0.486486 +vt 0.698842 0.486486 +vt 0.745174 0.501930 +vt 0.745174 0.517375 +vt 0.745174 0.540541 +vt 0.698842 0.548263 +vt 0.768340 0.517375 +vt 0.752896 0.509652 +vt 0.768340 0.509652 +vt 0.768340 0.532819 +vt 0.752896 0.525097 +vt 0.768340 0.525097 +vt 0.768340 0.540541 +vt 0.752896 0.532819 +vt 0.768340 0.494208 +vt 0.752896 0.486486 +vt 0.768340 0.486486 +vt 0.752896 0.501930 +vt 0.768340 0.501930 +vt 0.752896 0.517375 +vt 0.768340 0.548263 +vt 0.752896 0.540541 +vt 0.752896 0.494208 +vt 0.752896 0.494981 +vt 0.752896 0.501158 +vt 0.752896 0.502703 +vt 0.752896 0.508880 +vt 0.752896 0.516602 +vt 0.752896 0.524324 +vt 0.752896 0.525869 +vt 0.752896 0.532046 +vt 0.752896 0.539768 +vt 0.752896 0.547490 +vt 0.745174 0.548263 +vt 0.752896 0.493436 +vt 0.795367 0.501930 +vt 0.787645 0.494208 +vt 0.795367 0.486486 +vt 0.777992 0.486486 +vt 0.768340 0.496139 +vt 0.777992 0.505791 +vt 0.752896 0.548263 +vt 0.752896 0.510425 +vt 0.752896 0.518147 +vt 0.752896 0.533591 +vt 0.752896 0.541313 +vt 0.752896 0.487259 +vt 0.803089 0.494208 +vt 0.800827 0.499669 +vt 0.789907 0.499669 +vt 0.789907 0.488748 +vt 0.800827 0.488748 +vt 0.784818 0.502964 +vt 0.787645 0.496139 +vt 0.784818 0.489314 +vt 0.771167 0.489314 +vt 0.771167 0.502964 +vn 0.9970 -0.0077 0.0770 +vn 0.6969 -0.7148 0.0581 +vn 0.9999 -0.0147 -0.0036 +vn -0.0139 -0.9860 0.1662 +vn -0.7172 -0.6940 0.0633 +vn -0.0143 -0.9962 0.0859 +vn -0.9962 0.0216 0.0842 +vn -0.6969 0.7148 -0.0581 +vn -0.9999 0.0147 0.0036 +vn 0.0147 0.9999 -0.0050 +vn 0.7172 0.6940 -0.0633 +vn 0.0143 0.9962 -0.0859 +vn 0.6950 -0.7055 0.1385 +vn -0.7144 -0.6848 0.1437 +vn -0.6942 0.7194 0.0226 +vn 0.7152 0.6987 0.0175 +vn 0.6665 -0.6564 0.3534 +vn -0.6829 -0.6366 0.3583 +vn -0.6635 0.7078 0.2425 +vn 0.6858 0.6879 0.2376 +vn 0.9556 0.0116 0.2945 +vn -0.9527 0.0397 0.3014 +vn 0.0151 0.9763 0.2160 +vn 0.0049 0.0858 0.9963 +vn -0.0122 -0.9250 0.3799 +vn -0.7115 -0.6789 0.1811 +vn -0.6914 0.7199 0.0605 +vn 0.7127 0.6993 0.0554 +vn 0.9934 -0.0044 0.1147 +vn -0.0137 -0.9790 0.2035 +vn -0.9922 0.0248 0.1219 +vn 0.0148 0.9993 0.0330 +vn 0.6925 -0.6996 0.1760 +vn -0.6907 0.7199 0.0678 +vn 0.7121 0.6993 0.0627 +vn 0.9925 -0.0038 0.1219 +vn -0.0136 -0.9775 0.2107 +vn -0.9913 0.0254 0.1291 +vn 0.0148 0.9991 0.0403 +vn 0.6920 -0.6983 0.1832 +vn -0.7108 -0.6777 0.1883 +vn -0.0049 -0.0858 -0.9963 +usemtl None +s 1 +f 707/1326/323 708/1327/324 709/1328/325 +f 710/1329/326 711/1330/327 712/1331/328 +f 713/1332/329 714/1333/330 715/1334/331 +f 716/1335/332 717/1336/333 718/1337/334 +f 719/1338/335 712/1339/328 708/1327/324 +f 720/1340/336 715/1334/331 711/1330/327 +f 721/1341/337 718/1337/334 714/1333/330 +f 722/1342/338 709/1328/325 717/1336/333 +f 723/1343/339 710/1344/326 719/1338/335 +f 724/1345/340 713/1332/329 720/1340/336 +f 725/1346/341 716/1335/332 721/1341/337 +f 726/1347/342 707/1326/323 722/1342/338 +f 727/1348/343 719/1338/335 707/1326/323 +f 710/1329/326 724/1345/340 720/1340/336 +f 728/1349/344 721/1341/337 713/1332/329 +f 729/1350/345 722/1342/338 716/1335/332 +f 723/1343/339 727/1348/343 730/1351/346 +f 726/1347/342 729/1350/345 730/1352/346 +f 729/1350/345 725/1346/341 730/1353/346 +f 728/1349/344 724/1345/340 730/1354/346 +f 731/1355/347 723/1343/339 730/1356/346 +f 727/1348/343 726/1347/342 730/1357/346 +f 725/1346/341 728/1349/344 730/1358/346 +f 724/1345/340 731/1359/347 730/1360/346 +f 732/1361/348 733/1362/331 734/1363/327 +f 735/1364/349 736/1365/334 737/1366/330 +f 738/1367/350 739/1368/325 740/1369/333 +f 741/1370/351 742/1371/324 739/1368/325 +f 743/1372/352 734/1363/327 744/1373/328 +f 745/1374/353 737/1366/330 733/1362/331 +f 746/1375/354 740/1369/333 736/1365/334 +f 747/1376/355 744/1377/328 742/1371/324 +f 748/1378/334 749/1379/356 750/1380/330 +f 751/1381/325 752/1382/357 753/1383/333 +f 754/1384/324 755/1385/358 751/1381/325 +f 756/1386/327 757/1387/359 758/1388/328 +f 750/1380/330 759/1389/360 760/1390/331 +f 753/1383/333 761/1391/361 748/1378/334 +f 758/1392/328 762/1393/362 754/1384/324 +f 760/1390/331 763/1394/363 756/1386/327 +f 745/1374/353 763/1395/363 759/1396/360 +f 735/1364/349 759/1397/360 749/1398/356 +f 735/1364/349 761/1399/361 746/1375/354 +f 746/1375/354 752/1400/357 738/1367/350 +f 741/1370/351 752/1401/357 755/1402/358 +f 741/1370/351 762/1403/362 747/1376/355 +f 747/1376/355 757/1404/359 743/1405/352 +f 743/1372/352 763/1406/363 732/1361/348 +f 748/1407/346 760/1408/346 758/1409/346 +f 744/1410/364 733/1411/364 736/1412/364 +f 707/1326/323 719/1338/335 708/1327/324 +f 710/1329/326 720/1340/336 711/1330/327 +f 713/1332/329 721/1341/337 714/1333/330 +f 716/1335/332 722/1342/338 717/1336/333 +f 719/1338/335 710/1344/326 712/1339/328 +f 720/1340/336 713/1332/329 715/1334/331 +f 721/1341/337 716/1335/332 718/1337/334 +f 722/1342/338 707/1326/323 709/1328/325 +f 723/1343/339 731/1355/347 710/1344/326 +f 724/1345/340 728/1349/344 713/1332/329 +f 725/1346/341 729/1350/345 716/1335/332 +f 726/1347/342 727/1348/343 707/1326/323 +f 727/1348/343 723/1343/339 719/1338/335 +f 710/1329/326 731/1359/347 724/1345/340 +f 728/1349/344 725/1346/341 721/1341/337 +f 729/1350/345 726/1347/342 722/1342/338 +f 732/1361/348 745/1374/353 733/1362/331 +f 735/1364/349 746/1375/354 736/1365/334 +f 738/1367/350 741/1370/351 739/1368/325 +f 741/1370/351 747/1376/355 742/1371/324 +f 743/1372/352 732/1361/348 734/1363/327 +f 745/1374/353 735/1364/349 737/1366/330 +f 746/1375/354 738/1367/350 740/1369/333 +f 747/1376/355 743/1405/352 744/1377/328 +f 748/1378/334 761/1391/361 749/1379/356 +f 751/1381/325 755/1385/358 752/1382/357 +f 754/1384/324 762/1393/362 755/1385/358 +f 756/1386/327 763/1394/363 757/1387/359 +f 750/1380/330 749/1379/356 759/1389/360 +f 753/1383/333 752/1382/357 761/1391/361 +f 758/1392/328 757/1413/359 762/1393/362 +f 760/1390/331 759/1389/360 763/1394/363 +f 745/1374/353 732/1361/348 763/1395/363 +f 735/1364/349 745/1374/353 759/1397/360 +f 735/1364/349 749/1414/356 761/1399/361 +f 746/1375/354 761/1415/361 752/1400/357 +f 741/1370/351 738/1367/350 752/1401/357 +f 741/1370/351 755/1416/358 762/1403/362 +f 747/1376/355 762/1417/362 757/1404/359 +f 743/1372/352 757/1418/359 763/1406/363 +f 751/1419/346 753/1420/346 748/1407/346 +f 748/1407/346 750/1421/346 760/1408/346 +f 760/1408/346 756/1422/346 758/1409/346 +f 758/1409/346 754/1423/346 751/1419/346 +f 751/1419/346 748/1407/346 758/1409/346 +f 736/1412/364 740/1424/364 739/1425/364 +f 739/1425/364 742/1426/364 744/1410/364 +f 744/1410/364 734/1427/364 733/1411/364 +f 733/1411/364 737/1428/364 736/1412/364 +f 736/1412/364 739/1425/364 744/1410/364 o Rifle -v 2.000000 0.470320 0.154680 -v -6.625000 -0.343750 -0.343750 -v 2.000000 0.470320 -0.154680 -v -6.625000 -0.093750 0.468750 -v -6.625000 -0.468750 -0.093750 -v -6.625000 -0.468750 0.093750 -v -6.250000 0.470320 -0.154680 -v -6.250000 0.470320 0.154680 -v -6.250000 0.625000 0.218750 -v -6.250000 0.779680 0.154680 -v -6.250000 0.843750 0.000000 -v -6.250000 0.779680 -0.154680 -v -6.250000 0.625000 -0.218750 -v 2.000000 -0.468750 0.093750 -v 2.000000 -0.468750 -0.093750 -v 2.000000 -0.093750 0.468750 -v 2.000000 0.093750 0.468750 -v 2.000000 -0.343750 0.343750 -v 2.000000 -0.343750 -0.343750 -v 2.000000 -0.093750 -0.468750 -v 2.000000 0.093750 -0.468750 -v -6.625000 -0.343750 0.343750 -v -6.625000 0.093750 0.468750 -v 2.000000 0.343750 0.343750 -v 2.000000 0.343750 -0.343750 -v -6.625000 0.093750 -0.468750 -v -6.625000 -0.093750 -0.468750 -v -6.250000 0.343750 0.343750 -v -6.250000 0.343750 -0.343750 -v 0.125000 -0.093750 0.468750 -v 0.187500 -0.031250 0.468750 -v 0.125000 0.156250 0.437500 -v 0.187500 0.093750 0.468750 -v -6.187500 -0.093750 0.468750 -v -6.187500 0.156250 0.437500 -v -6.250000 -0.031250 0.468750 -v -6.250000 0.093750 0.468750 -v 0.125000 -0.093750 0.406250 -v 0.187500 -0.031250 0.406250 -v 0.125000 0.156250 0.406250 -v 0.187500 0.093750 0.406250 -v -6.187500 -0.093750 0.406250 -v -6.187500 0.156250 0.406250 -v -6.250000 -0.031250 0.406250 -v -6.250000 0.093750 0.406250 -v 0.125000 0.218750 0.406250 -v 0.125000 0.343750 0.343750 -v 0.125000 0.470320 0.154680 -v 0.125000 0.625000 0.218750 -v -1.750000 0.218750 0.406250 -v -1.750000 0.343750 0.343750 -v -1.750000 0.470320 0.154680 -v -1.750000 0.625000 0.218750 -v 5.375000 0.625000 -0.156250 -v 5.375000 0.735485 -0.110486 -v 6.000000 0.781250 0.000000 -v 6.000000 0.735485 0.110486 -v 6.000000 0.625000 0.156250 -v 6.000000 0.514515 0.110486 -v 6.000000 0.468750 0.000000 -v 6.000000 0.514515 -0.110485 -v 9.250000 0.470320 -0.154680 -v 9.250000 0.470320 0.154680 -v 9.250000 0.625000 0.218750 -v 9.250000 0.779680 0.154680 -v 9.250000 0.843750 0.000000 -v 9.250000 0.779680 -0.154680 -v 9.250000 0.625000 -0.218750 +v -0.375000 -0.656250 0.375000 v 0.375000 -0.281250 0.375000 +v -0.375000 -0.281250 0.375000 +v 0.375000 -0.281250 -1.750000 v 0.375000 -0.656250 0.375000 -v 0.375000 -0.281250 -0.375000 -v 0.375000 -0.656250 -0.375000 -v -1.750000 -0.281250 -0.375000 -v -1.500000 -1.343750 -0.375000 -v -1.500000 -1.343750 0.375000 -v -1.750000 -0.281250 0.375000 -v -4.250000 -1.343750 0.343750 -v -1.750000 -1.343750 0.343750 -v -4.250000 -1.343750 -0.343750 -v -1.750000 -1.343750 -0.343750 -v -4.437500 -1.218750 0.343750 -v -4.382583 -1.307138 0.343750 -v -4.437500 -1.031250 0.343750 -v -4.750000 -0.718750 0.343750 -v -4.479367 -0.875000 0.343750 -v -4.593750 -0.760617 0.343750 -v -6.625000 -0.718750 0.343750 -v -4.437500 -1.218750 -0.343750 -v -4.382583 -1.307138 -0.343750 -v -4.437500 -1.031250 -0.343750 -v -4.750000 -0.718750 -0.343750 -v -4.479367 -0.875000 -0.343750 -v -4.593750 -0.760617 -0.343750 -v -6.625000 -0.718750 -0.343750 -v -1.937500 -0.343750 0.343750 -v -1.750000 -1.031253 0.343750 -v -1.639515 -1.297988 0.343750 -v -1.593750 -1.187503 0.343750 -v -1.639515 -1.077017 0.343750 -v -1.937500 -0.906253 0.343750 -v -1.937500 -0.343750 -0.343750 -v -1.750000 -1.031253 -0.343750 -v -1.639515 -1.297988 -0.343750 -v -1.593750 -1.187503 -0.343750 -v -1.639515 -1.077017 -0.343750 -v -1.937500 -0.906253 -0.343750 -v -1.750000 -1.343750 0.281250 -v -1.500000 -1.343750 0.281250 -v -1.750000 -1.343750 -0.281250 -v -1.500000 -1.343750 -0.281250 -v -1.727942 -0.375001 -0.281250 -v -1.727942 -0.375001 0.281250 -v -1.937500 -0.375001 -0.281250 -v -1.937500 -0.375001 0.281250 -v -1.937500 -0.906250 -0.281250 -v -1.937500 -0.906250 0.281250 -v -1.750000 -1.093751 0.343750 -v -1.816291 -1.121210 0.343750 -v -1.843750 -1.187501 0.343750 -v -1.816291 -1.253792 0.343750 -v -1.750000 -1.281251 0.343750 -v -1.683709 -1.253792 0.343750 -v -1.656250 -1.187501 0.343750 -v -1.683709 -1.121210 0.343750 -v -1.750000 -1.093751 0.375000 -v -1.816291 -1.121210 0.375000 -v -1.843750 -1.187501 0.375000 -v -1.816291 -1.253792 0.375000 -v -1.750000 -1.281251 0.375000 -v -1.683709 -1.253792 0.375000 -v -1.656250 -1.187501 0.375000 -v -1.683709 -1.121210 0.375000 -v -1.750000 -0.593753 -0.281250 -v -1.860485 -0.639518 -0.281250 -v -1.906250 -0.750003 -0.281250 -v -1.860485 -0.860489 -0.281250 -v -1.750000 -0.906253 -0.281250 -v -1.125000 -0.593753 -0.281250 -v -1.125000 -0.906253 -0.281250 -v -1.125000 -0.593753 -0.468750 -v -1.125000 -0.906253 -0.468750 -v -1.716910 -0.593753 -0.468750 -v -1.643382 -0.906253 -0.468750 -v -1.716911 -0.593753 -0.343750 -v -1.643382 -0.906253 -0.343750 -v -1.750000 -0.593753 -0.343750 -v -1.860485 -0.639518 -0.343750 -v -1.906250 -0.750003 -0.343750 -v -1.860485 -0.860489 -0.343750 -v -1.750000 -0.906253 -0.343750 -v 0.125000 0.218750 0.343750 -v 0.125000 0.625000 -0.156250 -v 0.125000 0.468750 -0.093750 -v 0.125000 0.343750 -0.281250 -v 0.125000 0.218750 -0.343750 -v 0.125000 0.093750 0.218750 -v 0.125000 0.093750 -0.218750 -v 0.125000 0.218750 0.093750 -v 0.125000 0.218750 -0.093750 -v 0.750000 0.093750 0.218750 -v 0.750000 0.093750 -0.218750 -v 0.750000 -0.093750 0.218750 -v 0.750000 -0.093750 -0.218750 -v 0.750000 -0.218750 0.093750 -v 0.750000 -0.218750 -0.093750 -v 0.750000 0.218750 0.093750 -v 0.750000 0.218750 -0.093750 -v -1.750000 0.218750 0.343750 -v -1.750000 0.343750 0.281250 -v -1.750000 0.468750 0.093750 -v -1.750000 0.625000 0.156250 -v -6.250000 0.218750 0.343750 -v -6.250000 0.343750 0.281250 -v -6.250000 0.468750 0.093750 -v -6.250000 0.625000 0.156250 -v -6.250000 0.625000 -0.156250 -v -6.250000 0.468750 -0.093750 -v -6.250000 0.343750 -0.281250 -v -6.250000 0.218750 -0.343750 -v -6.250000 0.093750 -0.218750 -v -6.250000 -0.093750 0.218750 -v -6.250000 -0.093750 -0.218750 -v -6.250000 -0.218750 0.093750 -v -6.250000 -0.218750 -0.093750 -v -6.250000 0.093750 0.218750 -v 5.375000 0.647097 -0.209597 -v 5.375000 0.757582 -0.163832 -v 1.875000 0.647097 -0.209597 -v 1.875000 0.779680 -0.154680 -v 2.062500 0.757582 -0.163832 -v 2.062500 0.779680 -0.154680 -v 2.062500 0.834597 -0.022097 -v 1.875000 0.834597 -0.022097 -v 1.875000 0.625000 -0.156250 -v 1.875000 0.781250 0.000000 -v 1.812500 0.735485 0.110486 -v 1.812500 0.625000 0.156250 -v 1.812500 0.514515 0.110486 -v 1.812500 0.468750 0.000000 -v 1.812500 0.514515 -0.110485 -v 2.062500 0.781250 0.000000 -v 2.062500 0.735485 -0.110486 -v 6.000000 0.625000 -0.156250 -v 6.000000 0.735485 -0.110486 -v 1.875000 0.735485 -0.110486 -v 1.812500 0.625000 -0.156250 -v 1.812500 0.781250 0.000000 -v 1.812500 0.735485 -0.110486 -v 9.250000 0.406250 0.000000 -v 9.125000 0.000000 -0.218750 -v 9.125000 0.154680 -0.154680 -v 9.125000 0.218750 0.000000 -v 9.125000 0.154680 0.154680 -v 9.125000 -0.000000 0.218750 -v 9.125000 -0.154680 0.154680 -v 9.125000 -0.218750 0.000000 -v 9.125000 -0.154680 -0.154680 -v 9.437500 0.000000 -0.218750 -v 9.437500 0.154680 -0.154680 -v 9.437500 0.218750 0.000000 -v 9.437500 0.154680 0.154680 -v 9.437500 -0.000000 0.218750 -v 9.437500 -0.154680 0.154680 -v 9.437500 -0.218750 0.000000 -v 9.437500 -0.154680 -0.154680 -v 9.500000 0.000000 -0.187500 -v 9.500000 0.132583 -0.132582 -v 9.500000 0.187500 0.000000 -v 9.500000 0.132583 0.132582 -v 9.500000 -0.000000 0.187500 -v 9.500000 -0.132583 0.132582 -v 9.500000 -0.187500 0.000000 -v 9.500000 -0.132583 -0.132582 -v 11.250000 0.000000 -0.187500 -v 11.250000 0.132583 -0.132582 -v 11.250000 0.187500 0.000000 -v 11.250000 0.132583 0.132582 -v 11.250000 -0.000000 0.187500 -v 11.250000 -0.132583 0.132582 -v 11.250000 -0.187500 0.000000 -v 11.250000 -0.132583 -0.132582 -v 9.125000 0.625000 -0.281250 -v 9.125000 0.823874 -0.198874 -v 9.125000 0.823874 0.198874 -v 9.125000 0.625000 0.281250 -v 9.125000 0.426126 0.198874 -v 8.750000 0.198874 0.198874 -v 9.125000 0.426126 -0.198874 -v 8.750000 0.625000 -0.281250 -v 8.750000 0.823874 -0.198874 -v 8.750000 0.823874 0.198874 -v 8.750000 0.625000 0.281250 -v 8.750000 0.426126 0.198874 -v 8.750000 0.198874 -0.198874 -v 8.750000 0.426126 -0.198874 -v 9.125000 0.000000 -0.281250 -v 9.125000 0.198874 -0.198874 -v 8.750000 -0.000000 -0.281250 -v 9.125000 0.198874 0.198874 -v 9.125000 -0.000000 0.281250 -v 9.125000 -0.198874 0.198874 -v 9.125000 -0.281250 0.000000 -v 9.125000 -0.198874 -0.198874 -v 8.750000 -0.000000 0.281250 -v 8.750000 -0.198874 0.198874 -v 8.750000 -0.281250 0.000000 -v 8.750000 -0.198874 -0.198874 -v 0.125000 -0.093750 -0.468750 -v 0.187500 -0.031250 -0.468750 -v 0.187500 0.093750 -0.468750 -v -6.187500 -0.093750 -0.468750 -v -6.250000 -0.031250 -0.468750 -v -6.250000 0.093750 -0.468750 -v -6.187500 0.156250 -0.437500 -v 0.125000 0.156250 -0.437500 -v 0.125000 -0.093750 -0.406250 -v -6.187500 -0.093750 -0.406250 -v -6.250000 -0.031250 -0.406250 -v -6.250000 0.093750 -0.406250 -v -6.187500 0.156250 -0.406250 -v 0.125000 0.156250 -0.406250 -v 0.187500 -0.031250 -0.406250 -v 0.187500 0.093750 -0.406250 -v -1.750000 -0.718750 0.281250 -v -1.838388 -0.755362 0.281250 -v -1.875000 -0.843750 0.281250 -v -1.838388 -0.932138 0.281250 -v -1.750000 -0.968750 0.281250 -v -1.661612 -0.932138 0.281250 -v -1.625000 -0.843750 0.281250 -v -1.661612 -0.755362 0.281250 -v -1.750000 -0.718750 0.343750 -v -1.838388 -0.755362 0.343750 -v -1.875000 -0.843750 0.343750 -v -1.838388 -0.932138 0.343750 -v -1.750000 -0.968750 0.343750 -v -1.661612 -0.932138 0.343750 -v -1.625000 -0.843750 0.343750 -v -1.661612 -0.755362 0.343750 -v 0.250000 -0.093750 -0.218750 -v 0.250000 -0.281250 -0.218750 -v 0.250000 -0.281250 0.218750 -v 0.250000 -0.093750 0.218750 -v 0.250000 -0.218750 0.093750 -v 0.250000 -0.218750 -0.093750 -v -1.437500 -0.093750 -0.218750 -v -1.437500 -0.281250 -0.218750 -v -1.437500 -0.281250 0.218750 -v -1.437500 -0.093750 0.218750 -v -1.437500 -0.218750 0.093750 -v -1.437500 -0.218750 -0.093750 -v 8.750000 0.097057 -0.362222 -v 8.750000 0.265165 -0.265165 -v 8.750000 0.265165 0.265165 -v 8.750000 0.097057 0.362222 -v 8.750000 -0.097057 0.362222 -v 8.750000 -0.265165 0.265165 -v 8.750000 -0.362222 0.097057 -v 8.750000 -0.362222 -0.097057 -v 8.750000 -0.265165 -0.265165 -v 8.750000 -0.097057 -0.362222 -v 8.750000 0.470320 -0.250000 -v 8.750000 0.470320 0.250000 -v -6.625000 0.343750 0.343750 -v -6.625000 0.343750 -0.343750 -v -3.562500 -1.343750 -0.312500 -v -4.000000 -1.968750 -0.312500 -v -4.125000 -2.093750 -0.125000 -v -4.187500 -2.218750 -0.125000 -v -4.187500 -2.406250 -0.125000 -v -4.375000 -2.593750 -0.125000 -v -4.437500 -2.718750 -0.125000 -v -4.437500 -2.906250 -0.125000 -v -4.625000 -3.093750 -0.125000 -v -4.687500 -3.218750 -0.125000 -v -4.687500 -3.531250 -0.125000 -v -5.750000 -2.968750 -0.125000 -v -5.437500 -2.343750 -0.125000 -v -5.062500 -1.906249 -0.125000 -v -4.812500 -1.656250 -0.125000 -v -4.812500 -1.343750 -0.312500 -v -4.937500 -1.093749 -0.312500 -v -5.187500 -0.906249 -0.312500 -v -5.187500 -0.718750 -0.312500 -v -3.562500 -0.718750 -0.312500 -v -3.562500 -1.343750 0.312500 -v -4.000000 -1.968750 0.312500 -v -4.125000 -2.093750 0.125000 -v -4.187500 -2.218750 0.125000 -v -4.187500 -2.406250 0.125000 -v -4.375000 -2.593750 0.125000 -v -4.437500 -2.718750 0.125000 -v -4.437500 -2.906250 0.125000 -v -4.625000 -3.093750 0.125000 -v -4.687500 -3.218750 0.125000 -v -4.687500 -3.531250 0.125000 -v -5.750000 -2.968750 0.125000 -v -5.437500 -2.343750 0.125000 -v -5.062500 -1.906249 0.125000 -v -4.812500 -1.656250 0.125000 -v -4.812500 -1.343750 0.312500 -v -4.937500 -1.093749 0.312500 -v -5.187500 -0.906249 0.312500 -v -5.187500 -0.718750 0.312500 -v -3.562500 -0.718750 0.312500 -v -4.187500 -2.031250 -0.312500 -v -4.250000 -2.156250 -0.312500 -v -4.250000 -2.406250 -0.312500 -v -4.437500 -2.531250 -0.312500 -v -4.500000 -2.656250 -0.312500 -v -4.500000 -2.906250 -0.312500 -v -4.687500 -3.031250 -0.312500 -v -4.750000 -3.156250 -0.312500 -v -5.562500 -2.968750 -0.312500 -v -5.250000 -2.343750 -0.312500 -v -4.937500 -1.906250 -0.312500 -v -4.750000 -1.656250 -0.312500 -v -4.750000 -3.406250 -0.312500 -v -4.187500 -2.031250 0.312500 -v -4.250000 -2.156250 0.312500 -v -4.250000 -2.406250 0.312500 -v -4.437500 -2.531250 0.312500 -v -4.500000 -2.656250 0.312500 -v -4.500000 -2.906250 0.312500 -v -4.687500 -3.031250 0.312500 -v -4.750000 -3.156250 0.312500 -v -5.562500 -2.968750 0.312500 -v -5.250000 -2.343750 0.312500 -v -4.937500 -1.906250 0.312500 -v -4.750000 -1.656250 0.312500 -v -4.750000 -3.406250 0.312500 -v -2.312500 -1.343750 -0.187500 -v -2.312500 -1.906250 -0.187500 -v -2.375000 -2.093750 -0.187500 -v -2.500000 -2.218750 -0.187500 -v -2.687500 -2.281250 -0.187500 -v -3.437500 -2.281250 -0.187500 -v -4.000000 -1.906250 -0.187500 -v -2.312500 -1.343750 0.187500 -v -2.312500 -1.906250 0.187500 -v -2.375000 -2.093750 0.187500 -v -2.500000 -2.218750 0.187500 -v -2.687500 -2.281250 0.187500 -v -3.437500 -2.281250 0.187500 -v -4.000000 -1.906250 0.187500 -v -2.375000 -1.343750 -0.187500 -v -2.375000 -1.906250 -0.187500 -v -2.437500 -2.093750 -0.187500 -v -2.500000 -2.156250 -0.187500 -v -2.687500 -2.218750 -0.187500 -v -3.437500 -2.218750 -0.187500 -v -4.000000 -1.843750 -0.187500 -v -2.500000 -2.156250 0.187500 -v -2.687500 -2.218750 0.187500 -v -3.437500 -2.218750 0.187500 -v -4.000000 -1.843750 0.187500 -v -2.437500 -2.093750 0.187500 -v -2.375000 -1.906250 0.187500 -v -2.375000 -1.343750 0.187500 -v -6.625000 0.735485 -0.154680 -v -6.625000 0.781250 0.000000 -v -6.625000 0.735485 0.154680 -v 9.125000 1.187500 -0.281250 -v 9.125000 1.386374 -0.198874 -v 9.125000 1.468750 0.000000 -v 9.125000 1.386374 0.198874 -v 9.125000 1.187500 0.281250 -v 9.125000 0.988626 0.198874 -v 9.125000 0.988626 -0.198874 -v 9.125000 0.970971 -0.156250 -v 9.125000 0.841529 -0.156250 -v 9.125000 0.841529 0.156250 -v 9.125000 0.970971 0.156250 -v 8.750000 0.841529 0.156250 -v 8.750000 0.841529 -0.156250 -v 8.750000 1.187500 -0.281250 -v 8.750000 1.386374 -0.198874 -v 8.750000 1.468750 0.000000 -v 8.750000 1.386374 0.198874 -v 8.750000 1.187500 0.281250 -v 8.750000 0.988626 0.198874 -v 8.750000 0.988626 -0.198874 -v 8.750000 0.970971 -0.156250 -v 8.750000 0.970971 0.156250 -v 9.125000 1.187500 -0.218750 -v 9.125000 1.342180 -0.154680 -v 9.125000 1.406250 0.000000 -v 9.125000 1.342180 0.154680 -v 9.125000 1.187500 0.218750 -v 9.125000 1.032820 0.154680 -v 9.125000 0.968750 -0.000000 -v 9.125000 1.032820 -0.154680 -v 8.750000 1.187500 -0.218750 -v 8.750000 1.342180 -0.154680 -v 8.750000 1.406250 0.000000 -v 8.750000 1.342180 0.154680 -v 8.750000 1.187500 0.218750 -v 8.750000 1.032820 0.154680 -v 8.750000 0.968750 -0.000000 -v 8.750000 1.032820 -0.154680 -v 9.000000 1.187500 0.031250 -v 9.000000 1.031250 0.031250 -v 9.000000 1.187500 -0.031250 -v 9.000000 1.031250 -0.031250 -v 8.937500 1.187500 0.031250 -v 8.937500 1.187500 -0.031250 -v 9.000000 0.968750 0.093750 -v 9.000000 0.968750 -0.093750 -v 8.937500 1.031250 0.031250 -v 8.937500 1.031250 -0.031250 -v 8.937500 0.968750 -0.093750 -v 8.937500 0.968750 0.093750 -v -5.312500 1.187500 -0.156250 -v -5.437500 0.875000 0.156250 -v -5.437500 0.875000 -0.156250 -v -5.187500 1.187500 0.156250 -v -5.062500 0.875000 0.156250 -v -5.062500 0.875000 -0.156250 -v -5.187500 1.187500 -0.156250 -v -5.312500 1.187500 0.156250 -v -5.437500 0.750000 0.156250 -v -5.437500 0.750000 -0.156250 -v -5.062500 0.750000 0.156250 -v -5.062500 0.750000 -0.156250 -v -5.250000 1.250000 -0.156250 -v -5.294194 1.231694 -0.156250 -v -5.294194 1.231694 -0.125000 -v -5.250000 1.250000 -0.125000 -v -5.205806 1.231694 0.156250 -v -5.294194 1.231694 0.156250 -v -5.250000 1.250000 0.156250 -v -5.205806 1.231694 -0.156250 -v -5.205806 1.231694 -0.125000 -v -5.205806 1.231694 0.125000 -v -5.294194 1.231694 0.125000 -v -5.250000 1.250000 0.125000 -v -5.312500 1.187500 -0.125000 -v -5.187500 1.187500 -0.125000 -v -5.312500 1.187500 0.125000 -v -5.187500 1.187500 0.125000 -v -5.437500 0.875000 -0.125000 -v -5.437500 0.875000 0.125000 -v -5.062500 0.875000 0.125000 -v -5.062500 0.875000 -0.125000 -v -5.281250 1.187500 0.062500 -v -5.218750 1.187500 0.062500 -v -5.281250 1.187500 -0.062500 -v -5.218750 1.187500 -0.062500 -v -5.218750 1.250000 -0.062500 -v -5.281250 1.250000 -0.062500 -v -5.218750 1.250000 0.062500 -v -5.281250 1.250000 0.062500 -v -5.281250 1.250000 -0.125000 -v -5.218750 1.250000 -0.125000 -v -5.218750 1.250000 0.125000 -v -5.281250 1.250000 0.125000 -v -5.281250 1.125000 0.000000 -v -5.218750 1.125000 0.000000 -v -5.281250 0.875000 -0.125000 -v -5.281250 0.875000 0.125000 -v -5.281250 0.937500 -0.031250 -v -5.281250 0.959597 -0.022097 -v -5.281250 0.968750 0.000000 -v -5.281250 0.959597 0.022097 -v -5.281250 0.937500 0.031250 -v -5.281250 0.915403 0.022097 -v -5.281250 0.906250 -0.000000 -v -5.281250 0.915403 -0.022097 -v -5.218750 0.937500 -0.031250 -v -5.218750 0.959597 -0.022097 -v -5.218750 0.968750 0.000000 -v -5.218750 0.959597 0.022097 -v -5.218750 0.937500 0.031250 -v -5.218750 0.915403 0.022097 -v -5.218750 0.906250 -0.000000 -v -5.218750 0.915403 -0.022097 -v -5.218750 1.062500 0.125000 -v -5.218750 1.062500 -0.125000 -v -5.156250 1.062500 0.125000 -v -5.156250 1.062500 -0.125000 -v -5.093750 1.062500 -0.062500 -v -5.093750 1.062500 0.062500 -v -5.093750 1.000000 -0.062500 -v -5.093750 1.000000 0.062500 -v -5.156250 1.000000 0.125000 -v -5.156250 1.000000 -0.125000 -v -5.218750 1.000000 0.125000 -v -5.218750 1.000000 -0.125000 -v -5.218750 0.875000 0.125000 -v -5.218750 0.875000 -0.125000 -v -5.062500 0.843750 -0.093750 -v -5.062500 0.843750 0.093750 -v -4.750000 0.843750 -0.093750 -v -4.750000 0.843750 0.093750 -v -4.750000 0.875000 -0.031250 -v -4.750000 0.875000 0.031250 -v -4.687500 0.843750 -0.093750 -v -4.687500 0.875000 -0.031250 -v -4.687500 0.843750 0.093750 -v -4.687500 0.875000 0.031250 -v -4.687500 0.781250 -0.093750 -v -4.687500 0.781250 0.093750 -v -5.062500 0.781250 -0.093750 -v -5.062500 0.781250 0.093750 -v 2.000000 0.406250 0.000000 -v -1.750000 -1.093751 -0.343750 -v -1.683709 -1.121210 -0.343750 -v -1.656250 -1.187501 -0.343750 -v -1.683709 -1.253792 -0.343750 -v -1.750000 -1.281251 -0.343750 -v -1.816291 -1.253792 -0.343750 -v -1.843750 -1.187501 -0.343750 -v -1.816291 -1.121210 -0.343750 -v -1.750000 -1.093751 -0.375000 -v -1.683709 -1.121210 -0.375000 -v -1.656250 -1.187501 -0.375000 -v -1.683709 -1.253792 -0.375000 -v -1.750000 -1.281251 -0.375000 -v -1.816291 -1.253792 -0.375000 -v -1.843750 -1.187501 -0.375000 -v -1.816291 -1.121210 -0.375000 +v 0.375000 -1.343750 -1.500000 +v -0.375000 -0.281250 -1.750000 +v -0.375000 -1.343750 -1.500000 +v 0.281250 -1.343750 -1.750000 +v -0.281250 -1.343750 -1.500000 +v -0.281250 -1.343750 -1.750000 +v -0.281250 -0.375001 -1.727942 +v -0.281250 -0.906250 -1.937500 +v 0.281250 -0.906250 -1.937500 +v 0.281250 -0.375001 -1.727942 +v 0.281250 -1.343750 -1.500000 +v 0.468750 -0.906253 -1.643382 +v 0.468750 -0.593753 -1.125000 +v 0.468750 -0.906253 -1.125000 +v 0.343750 -0.906253 -1.643382 +v 0.468750 -0.593753 -1.716910 +v 0.343750 -0.906253 -1.750000 +v 0.343750 -0.860489 -1.860485 +v 0.343750 -0.750003 -1.906250 +v 0.343750 -0.593753 -1.716911 +v 0.281250 -0.906253 -1.125000 +v 0.281250 -0.593753 -1.125000 +v -0.156250 0.625000 -1.750000 +v -0.218750 0.625000 0.125000 +v -0.218750 0.625000 -1.750000 +v 0.156250 0.625000 -6.250000 +v -0.156250 0.625000 -6.250000 +v 0.110486 0.735485 5.375000 +v 0.209597 0.647097 5.375000 +v 0.156250 0.625000 5.375000 +v -0.110486 0.735485 1.812500 +v -0.000000 0.781250 1.875000 +v -0.000000 0.781250 2.062500 +v 0.110486 0.735485 2.062500 +v 0.163832 0.757582 5.375000 +v 0.154680 0.779680 2.062500 +v 0.163832 0.757582 2.062500 +v 0.022097 0.834597 2.062500 +v 0.022097 0.834597 1.875000 +v 0.156250 0.625000 1.875000 +v -0.110486 0.514515 1.812500 +v -0.000000 0.468750 1.812500 +v 0.110485 0.514515 1.812500 +v 0.110486 0.735485 1.875000 +v 0.209597 0.647097 1.875000 +v 0.154680 0.779680 1.875000 +v -0.156250 0.625000 6.000000 +v -0.000000 0.781250 6.000000 +v 0.156250 0.625000 6.000000 +v 0.198874 0.426126 9.125000 +v -0.198874 0.198874 9.125000 +v 0.198874 0.198874 9.125000 +v 0.281250 0.000000 9.125000 +v -0.198874 -0.198874 9.125000 +v 0.218750 -0.281250 0.250000 +v 0.093750 -0.218750 0.250000 +v 0.218750 -0.093750 0.250000 +v -0.218750 -0.093750 0.250000 +v -0.093750 -0.218750 0.250000 +v -0.218750 -0.281250 0.250000 +v -0.218750 -0.281250 -1.437500 +v 0.218750 -0.281250 -1.437500 +v -0.218750 -0.093750 -1.437500 +v 0.218750 -0.093750 -1.437500 +v 0.093750 -0.218750 -1.437500 +v -0.093750 -0.218750 -1.437500 +v 0.187500 -1.906250 -2.375000 +v 0.187500 -1.343750 -2.312500 +v 0.187500 -1.906250 -2.312500 +v 0.187500 -2.093750 -2.375000 +v 0.187500 -2.156250 -2.500000 +v 0.187500 -2.218750 -2.500000 +v 0.187500 -2.218750 -2.687500 +v 0.187500 -2.281250 -2.687500 +v 0.187500 -2.218750 -3.437500 +v 0.187500 -2.281250 -3.437500 +v 0.187500 -1.906250 -4.000000 +v -0.187500 -2.218750 -3.437500 +v -0.187500 -1.906250 -4.000000 +v -0.187500 -2.281250 -3.437500 +v -0.187500 -2.218750 -2.687500 +v -0.187500 -2.281250 -2.687500 +v -0.187500 -2.218750 -2.500000 +v -0.187500 -2.156250 -2.500000 +v -0.187500 -2.093750 -2.375000 +v -0.187500 -2.093750 -2.437500 +v -0.187500 -1.906250 -2.375000 +v -0.187500 -1.906250 -2.312500 +v -0.187500 -1.343750 -2.312500 +v -0.187500 -1.343750 -2.375000 +v -0.031250 1.031250 9.000000 +v 0.031250 1.187500 9.000000 +v -0.031250 1.187500 9.000000 +v -0.031250 1.187500 8.937500 +v 0.093750 0.968750 9.000000 +v 0.031250 1.031250 9.000000 +v 0.031250 1.187500 8.937500 +v -0.031250 1.031250 8.937500 +v 0.031250 1.031250 8.937500 +v -0.093750 0.968750 8.937500 +v -0.093750 0.968750 9.000000 +v 0.093750 0.968750 8.937500 +v 0.156250 1.187500 -5.187500 +v 0.156250 0.875000 -5.437500 +v 0.156250 1.187500 -5.312500 +v -0.156250 1.187500 -5.187500 +v -0.156250 0.875000 -5.437500 +v -0.156250 0.875000 -5.062500 +v 0.156250 0.750000 -5.062500 +v 0.156250 0.875000 -5.062500 +v -0.156250 0.750000 -5.062500 +v 0.156250 1.231694 -5.294194 +v 0.156250 1.250000 -5.250000 +v -0.156250 1.250000 -5.250000 +v -0.156250 1.187500 -5.312500 +v -0.125000 1.187500 -5.312500 +v -0.125000 1.231694 -5.294194 +v -0.125000 1.250000 -5.250000 +v 0.125000 1.187500 -5.187500 +v 0.125000 1.231694 -5.205806 +v 0.125000 1.250000 -5.250000 +v -0.125000 1.187500 -5.187500 +v -0.125000 0.875000 -5.437500 +v 0.125000 1.187500 -5.312500 +v 0.125000 0.875000 -5.062500 +v 0.125000 0.875000 -5.437500 +v 0.156250 0.750000 -5.437500 +v -0.125000 0.875000 -5.062500 +v 0.125000 1.250000 -5.281250 +v 0.062500 1.250000 -5.218750 +v 0.125000 1.250000 -5.218750 +v -0.125000 1.250000 -5.281250 +v -0.062500 1.250000 -5.218750 +v -0.062500 1.250000 -5.281250 +v 0.062500 1.187500 -5.281250 +v 0.125000 0.875000 -5.281250 +v -0.062500 1.187500 -5.281250 +v 0.000000 1.125000 -5.281250 +v -0.125000 0.875000 -5.281250 +v 0.022097 0.915403 -5.281250 +v 0.031250 0.937500 -5.281250 +v -0.031250 0.937500 -5.281250 +v -0.022097 0.915403 -5.281250 +v 0.000000 0.906250 -5.281250 +v 0.000000 0.968750 -5.281250 +v 0.022097 0.959597 -5.281250 +v -0.022097 0.959597 -5.281250 +v -0.125000 1.062500 -5.218750 +v 0.125000 1.062500 -5.156250 +v 0.125000 1.062500 -5.218750 +v -0.062500 1.062500 -5.093750 +v -0.125000 1.062500 -5.156250 +v 0.062500 1.187500 -5.218750 +v -0.125000 1.250000 -5.218750 +v -0.062500 1.187500 -5.218750 +v 0.000000 1.125000 -5.218750 +v -0.125000 1.000000 -5.156250 +v 0.062500 1.000000 -5.093750 +v -0.062500 1.000000 -5.093750 +v 0.125000 1.000000 -5.218750 +v 0.125000 1.000000 -5.156250 +v 0.125000 0.875000 -5.218750 +v 0.000000 0.906250 -5.218750 +v -0.125000 0.875000 -5.218750 +v -0.125000 1.000000 -5.218750 +v 0.000000 0.968750 -5.218750 +v 0.022097 0.959597 -5.218750 +v 0.022097 0.915403 -5.218750 +v -0.022097 0.915403 -5.218750 +v -0.022097 0.959597 -5.218750 +v -0.031250 0.937500 -5.218750 +v 0.031250 0.937500 -5.218750 +v -0.093750 0.843750 -5.062500 +v 0.093750 0.843750 -4.750000 +v 0.093750 0.843750 -5.062500 +v -0.093750 0.843750 -4.750000 +v 0.031250 0.875000 -4.750000 +v -0.093750 0.781250 -4.687500 +v 0.093750 0.781250 -4.687500 +v 0.031250 0.875000 -4.687500 +v 0.093750 0.781250 -5.062500 +v -0.093750 0.843750 -4.687500 +v -0.281250 -0.375001 -1.937500 +v 0.281250 -0.375001 -1.937500 +v 0.343750 -0.639518 -1.860485 +v 0.343750 -0.593753 -1.750000 +v 0.281250 -0.593753 -1.750000 +v 0.281250 -0.906253 -1.750000 +v 0.156250 0.625000 0.125000 +v -0.110486 0.735485 6.000000 +v -0.000000 0.781250 1.812500 +v 0.156250 0.625000 1.812500 +v 0.110486 0.735485 1.812500 +v -0.156250 0.625000 1.812500 +v 0.110486 0.735485 6.000000 +v 0.110485 0.514515 6.000000 +v -0.000000 0.468750 6.000000 +v -0.110486 0.514515 6.000000 +v -0.198874 0.426126 9.125000 +v -0.281250 -0.000000 9.125000 +v -0.000000 -0.281250 9.125000 +v 0.198874 -0.198874 9.125000 +v 0.187500 -1.343750 -2.375000 +v 0.187500 -2.093750 -2.437500 +v 0.187500 -1.843750 -4.000000 +v -0.187500 -1.843750 -4.000000 +v -0.156250 0.750000 -5.437500 +v 0.156250 1.231694 -5.205806 +v -0.156250 1.231694 -5.205806 +v -0.156250 1.231694 -5.294194 +v -0.125000 1.231694 -5.205806 +v 0.125000 1.231694 -5.294194 +v 0.062500 1.250000 -5.281250 +v 0.062500 1.062500 -5.093750 +v -0.031250 0.875000 -4.750000 +v 0.093750 0.843750 -4.687500 +v -0.031250 0.875000 -4.687500 +v -0.093750 0.781250 -5.062500 +v -0.343750 -0.343750 2.000000 +v -0.093750 -0.468750 -6.625000 +v -0.093750 -0.468750 2.000000 +v 0.154680 0.470320 2.000000 +v 0.343750 0.343750 -6.250000 +v 0.154680 0.470320 -6.250000 +v 0.468750 -0.093750 0.125000 +v 0.468750 -0.031250 0.187500 +v 0.468750 -0.093750 2.000000 +v -0.468750 -0.093750 0.125000 +v -0.468750 -0.093750 -6.187500 +v -0.343750 -0.343750 -6.625000 +v 0.093750 -0.468750 -6.625000 +v 0.343750 -0.343750 2.000000 +v 0.093750 -0.468750 2.000000 +v 0.468750 -0.093750 -6.187500 +v 0.343750 -0.343750 -6.625000 +v 0.468750 0.093750 2.000000 +v 0.468750 0.093750 0.187500 +v -0.468750 -0.031250 0.187500 +v -0.468750 -0.093750 2.000000 +v -0.406250 -0.093750 -6.187500 +v -0.468750 0.093750 0.187500 +v -0.406250 -0.031250 0.187500 +v -0.437500 0.156250 -6.187500 +v -0.406250 0.093750 -6.250000 +v -0.406250 0.156250 -6.187500 +v -0.406250 0.156250 0.125000 +v -0.437500 0.156250 0.125000 +v -0.406250 0.093750 0.187500 +v -0.406250 -0.093750 0.125000 +v -0.406250 -0.031250 -6.250000 +v -0.468750 0.093750 -6.250000 +v -0.468750 -0.031250 -6.250000 +v -0.468750 0.093750 -6.625000 +v -0.468750 -0.093750 -6.625000 +v -0.343750 0.343750 2.000000 +v -0.154680 0.470320 0.125000 +v -0.343750 0.343750 0.125000 +v -0.343750 0.343750 -6.250000 +v -0.154680 0.470320 -1.750000 +v -0.154680 0.470320 -6.250000 +v -0.406250 0.218750 0.125000 +v -0.343750 0.343750 -1.750000 +v -0.406250 0.218750 -1.750000 +v -0.468750 0.093750 2.000000 +v 0.343750 -1.343750 -4.250000 +v -0.343750 -1.343750 -1.750000 +v -0.343750 -1.343750 -4.250000 +v 0.343750 -0.760617 -4.593750 +v -0.343750 -0.875000 -4.479367 +v -0.343750 -0.760617 -4.593750 +v 0.343750 -0.718750 -4.750000 +v -0.343750 -0.718750 -4.750000 +v 0.343750 -1.218750 -4.437500 +v -0.343750 -1.307138 -4.382583 +v -0.343750 -1.218750 -4.437500 +v 0.343750 -0.718750 -6.625000 +v -0.343750 -0.718750 -6.625000 +v 0.343750 -0.875000 -4.479367 +v -0.343750 -1.031250 -4.437500 +v 0.343750 -1.031250 -4.437500 +v 0.343750 -1.307138 -4.382583 +v -0.343750 -0.343750 -1.937500 +v 0.343750 -1.031253 -1.750000 +v -0.343750 -0.906253 -1.937500 +v -0.343750 -1.031253 -1.750000 +v 0.343750 -1.187503 -1.593750 +v -0.343750 -1.077017 -1.639515 +v -0.343750 -1.187503 -1.593750 +v 0.343750 -0.906253 -1.937500 +v 0.343750 -1.077017 -1.639515 +v 0.343750 -1.297988 -1.639515 +v -0.343750 -1.297988 -1.639515 +v 0.343750 -0.343750 -1.937500 +v 0.343750 -1.343750 -1.750000 +v -0.375000 -1.121210 -1.683709 +v -0.343750 -1.187501 -1.656250 +v -0.343750 -1.121210 -1.683709 +v -0.375000 -1.253792 -1.683709 +v -0.343750 -1.281251 -1.750000 +v -0.343750 -1.253792 -1.683709 +v -0.375000 -1.253792 -1.816291 +v -0.343750 -1.187501 -1.843750 +v -0.343750 -1.253792 -1.816291 +v -0.375000 -1.121210 -1.816291 +v -0.343750 -1.093751 -1.750000 +v -0.343750 -1.121210 -1.816291 +v -0.375000 -1.093751 -1.750000 +v -0.375000 -1.187501 -1.656250 +v -0.375000 -1.281251 -1.750000 +v -0.375000 -1.187501 -1.843750 +v 0.281250 -0.639518 -1.860485 +v 0.281250 -0.750003 -1.906250 +v 0.281250 -0.860489 -1.860485 +v 0.093750 0.468750 0.125000 +v 0.281250 0.343750 0.125000 +v 0.218750 0.093750 0.125000 +v 0.093750 0.218750 0.125000 +v 0.343750 0.218750 0.125000 +v -0.343750 0.218750 0.125000 +v -0.093750 0.218750 0.125000 +v -0.218750 0.093750 0.125000 +v -0.218750 0.093750 -6.250000 +v -0.343750 0.218750 -6.250000 +v -0.343750 0.218750 -1.750000 +v 0.093750 -0.218750 0.750000 +v -0.093750 -0.218750 0.750000 +v 0.093750 0.218750 0.750000 +v -0.218750 0.093750 0.750000 +v 0.218750 -0.093750 0.750000 +v 0.218750 0.093750 0.750000 +v -0.093750 0.218750 0.750000 +v -0.281250 0.343750 -1.750000 +v -0.093750 0.468750 -1.750000 +v -0.281250 0.343750 -6.250000 +v -0.093750 0.468750 -6.250000 +v 0.343750 0.218750 -6.250000 +v 0.093750 0.468750 -6.250000 +v 0.218750 0.093750 -6.250000 +v 0.281250 0.343750 -6.250000 +v 0.093750 -0.218750 -6.250000 +v -0.218750 -0.093750 -6.250000 +v -0.218750 0.625000 9.250000 +v -0.154680 0.779680 9.250000 +v 0.000000 0.843750 -6.250000 +v -0.000000 0.843750 9.250000 +v -0.154680 0.470320 2.000000 +v 0.218750 0.625000 9.250000 +v 0.154680 0.470320 9.250000 +v 0.154680 0.779680 9.250000 +v 0.218750 0.625000 -6.250000 +v 0.154680 0.779680 -6.250000 +v -0.154680 0.470320 9.250000 +v 0.154680 -0.154680 9.437500 +v -0.000000 -0.218750 9.125000 +v 0.154680 -0.154680 9.125000 +v -0.154680 -0.154680 9.437500 +v -0.218750 -0.000000 9.125000 +v -0.154680 -0.154680 9.125000 +v -0.154680 0.154680 9.437500 +v -0.000000 0.218750 9.125000 +v -0.154680 0.154680 9.125000 +v 0.154680 0.154680 9.437500 +v 0.218750 0.000000 9.125000 +v 0.154680 0.154680 9.125000 +v 0.218750 0.000000 9.437500 +v -0.000000 -0.218750 9.437500 +v -0.218750 -0.000000 9.437500 +v -0.000000 0.218750 9.437500 +v -0.132582 0.132583 9.500000 +v 0.132582 0.132583 9.500000 +v 0.187500 0.000000 9.500000 +v -0.000000 -0.187500 9.500000 +v -0.000000 0.187500 9.500000 +v 0.132582 -0.132583 9.500000 +v -0.187500 -0.000000 9.500000 +v 0.187500 0.000000 11.250000 +v -0.000000 -0.187500 11.250000 +v -0.132582 -0.132583 9.500000 +v -0.187500 -0.000000 11.250000 +v -0.000000 0.187500 11.250000 +v 0.132582 -0.132583 11.250000 +v -0.132582 -0.132583 11.250000 +v -0.132582 0.132583 11.250000 +v 0.132582 0.132583 11.250000 +v 0.281250 0.625000 8.750000 +v 0.281250 0.625000 9.125000 +v 0.198874 -0.198874 8.750000 +v -0.198874 0.823874 9.125000 +v -0.281250 0.625000 8.750000 +v -0.281250 0.625000 9.125000 +v -0.198874 0.198874 8.750000 +v -0.281250 -0.000000 8.750000 +v -0.198874 0.426126 8.750000 +v 0.198874 0.823874 8.750000 +v 0.198874 0.823874 9.125000 +v -0.198874 -0.198874 8.750000 +v 0.198874 0.198874 8.750000 +v 0.281250 0.000000 8.750000 +v -0.000000 -0.281250 8.750000 +v 0.198874 0.426126 8.750000 +v 0.468750 -0.031250 -6.250000 +v 0.468750 -0.093750 -6.625000 +v 0.468750 0.093750 -6.625000 +v 0.343750 0.343750 2.000000 +v 0.437500 0.156250 0.125000 +v 0.468750 0.093750 -6.250000 +v 0.406250 -0.031250 -6.250000 +v 0.406250 -0.093750 -6.187500 +v 0.406250 -0.093750 0.125000 +v 0.406250 0.156250 -6.187500 +v 0.437500 0.156250 -6.187500 +v 0.406250 0.093750 0.187500 +v 0.406250 -0.031250 0.187500 +v 0.406250 0.156250 0.125000 +v 0.406250 0.093750 -6.250000 +v -0.343750 -0.755362 -1.661612 +v -0.281250 -0.843750 -1.625000 +v -0.281250 -0.755362 -1.661612 +v -0.343750 -0.932138 -1.661612 +v -0.281250 -0.968750 -1.750000 +v -0.281250 -0.932138 -1.661612 +v -0.343750 -0.932138 -1.838388 +v -0.281250 -0.843750 -1.875000 +v -0.281250 -0.932138 -1.838388 +v -0.343750 -0.755362 -1.838388 +v -0.281250 -0.718750 -1.750000 +v -0.281250 -0.755362 -1.838388 +v -0.343750 -0.718750 -1.750000 +v -0.343750 -0.843750 -1.625000 +v -0.343750 -0.968750 -1.750000 +v -0.343750 -0.843750 -1.875000 +v -0.218750 -0.093750 0.750000 +v -0.093750 -0.218750 -6.250000 +v 0.218750 -0.093750 -6.250000 +v -0.097057 -0.362222 8.750000 +v 0.097057 -0.362222 8.750000 +v 0.362222 -0.097057 8.750000 +v 0.265165 -0.265165 8.750000 +v 0.362222 0.097057 8.750000 +v 0.265165 0.265165 8.750000 +v 0.250000 0.470320 8.750000 +v -0.265165 -0.265165 8.750000 +v -0.362222 -0.097057 8.750000 +v -0.362222 0.097057 8.750000 +v -0.265165 0.265165 8.750000 +v -0.250000 0.470320 8.750000 +v 0.156250 0.841529 9.125000 +v -0.218750 0.625000 -6.250000 +v -0.343750 0.343750 -6.625000 +v 0.343750 0.343750 -6.625000 +v -0.125000 -2.406250 -4.187500 +v 0.125000 -2.593750 -4.375000 +v 0.125000 -2.406250 -4.187500 +v 0.125000 -2.343750 -5.437500 +v -0.125000 -1.906249 -5.062500 +v 0.125000 -1.906249 -5.062500 +v -0.125000 -2.593750 -4.375000 +v 0.125000 -2.718750 -4.437500 +v 0.125000 -1.656250 -4.812500 +v -0.125000 -2.718750 -4.437500 +v 0.125000 -2.906250 -4.437500 +v -0.312500 -1.343750 -4.812500 +v 0.312500 -1.343750 -4.812500 +v -0.125000 -2.906250 -4.437500 +v 0.125000 -3.093750 -4.625000 +v -0.312500 -1.343750 -3.562500 +v 0.312500 -1.968750 -4.000000 +v 0.312500 -1.343750 -3.562500 +v -0.312500 -1.093749 -4.937500 +v 0.312500 -1.093749 -4.937500 +v -0.125000 -3.093750 -4.625000 +v 0.125000 -3.218750 -4.687500 +v -0.312500 -1.968750 -4.000000 +v 0.125000 -2.093750 -4.125000 +v 0.312500 -0.906249 -5.187500 +v 0.312500 -3.406250 -4.750000 +v 0.125000 -3.531250 -4.687500 +v -0.125000 -2.093750 -4.125000 +v 0.125000 -2.218750 -4.187500 +v -0.312500 -0.906249 -5.187500 +v 0.312500 -0.718750 -5.187500 +v -0.125000 -3.531250 -4.687500 +v 0.125000 -2.968750 -5.750000 +v -0.125000 -2.218750 -4.187500 +v -0.125000 -2.968750 -5.750000 +v 0.312500 -2.031250 -4.187500 +v 0.312500 -2.156250 -4.250000 +v 0.312500 -2.406250 -4.250000 +v 0.312500 -2.656250 -4.500000 +v 0.312500 -2.531250 -4.437500 +v 0.312500 -2.906250 -4.500000 +v 0.312500 -3.156250 -4.750000 +v 0.312500 -3.031250 -4.687500 +v 0.312500 -2.968750 -5.562500 +v 0.312500 -2.343750 -5.250000 +v 0.312500 -1.906250 -4.937500 +v 0.312500 -1.656250 -4.750000 +v 0.312500 -0.718750 -3.562500 +v -0.125000 -3.218750 -4.687500 +v -0.312500 -3.406250 -4.750000 +v -0.312500 -3.156250 -4.750000 +v -0.312500 -2.968750 -5.562500 +v -0.312500 -2.906250 -4.500000 +v -0.312500 -2.656250 -4.500000 +v -0.312500 -3.031250 -4.687500 +v -0.312500 -2.406250 -4.250000 +v -0.312500 -2.156250 -4.250000 +v -0.312500 -2.531250 -4.437500 +v -0.312500 -2.343750 -5.250000 +v -0.312500 -1.906250 -4.937500 +v -0.312500 -2.031250 -4.187500 +v -0.312500 -1.656250 -4.750000 +v -0.125000 -2.343750 -5.437500 +v -0.125000 -1.656250 -4.812500 +v -0.312500 -0.718750 -3.562500 +v -0.312500 -0.718750 -5.187500 +v 0.154680 0.735485 -6.625000 +v -0.154680 0.735485 -6.625000 +v -0.154680 0.779680 -6.250000 +v 0.000000 0.781250 -6.625000 +v 0.156250 0.841529 8.750000 +v -0.156250 0.841529 8.750000 +v -0.198874 0.823874 8.750000 +v -0.000000 1.468750 9.125000 +v -0.154680 1.342180 9.125000 +v -0.000000 1.406250 9.125000 +v -0.281250 1.187500 8.750000 +v -0.198874 0.988626 9.125000 +v -0.281250 1.187500 9.125000 +v 0.198874 1.386374 8.750000 +v 0.198874 1.386374 9.125000 +v 0.198874 0.988626 8.750000 +v 0.281250 1.187500 9.125000 +v 0.198874 0.988626 9.125000 +v -0.198874 0.988626 8.750000 +v -0.156250 0.970971 9.125000 +v -0.000000 1.468750 8.750000 +v -0.198874 1.386374 9.125000 +v -0.156250 0.970971 8.750000 +v -0.156250 0.841529 9.125000 +v -0.198874 1.386374 8.750000 +v 0.156250 0.970971 8.750000 +v 0.156250 0.970971 9.125000 +v 0.281250 1.187500 8.750000 +v 0.218750 1.187500 8.750000 +v 0.154680 1.032820 9.125000 +v 0.218750 1.187500 9.125000 +v -0.218750 1.187500 9.125000 +v 0.154680 1.342180 9.125000 +v -0.000000 0.968750 9.125000 +v -0.154680 1.032820 9.125000 +v -0.000000 0.968750 8.750000 +v -0.218750 1.187500 8.750000 +v -0.000000 1.406250 8.750000 +v 0.154680 1.032820 8.750000 +v -0.154680 1.032820 8.750000 +v -0.154680 1.342180 8.750000 +v 0.154680 1.342180 8.750000 +v -0.000000 0.406250 9.250000 +v -0.000000 0.406250 2.000000 +v 0.375000 -1.121210 -1.816291 +v 0.343750 -1.187501 -1.843750 +v 0.343750 -1.121210 -1.816291 +v 0.375000 -1.253792 -1.816291 +v 0.343750 -1.281251 -1.750000 +v 0.343750 -1.253792 -1.816291 +v 0.375000 -1.253792 -1.683709 +v 0.343750 -1.187501 -1.656250 +v 0.343750 -1.253792 -1.683709 +v 0.375000 -1.121210 -1.683709 +v 0.343750 -1.093751 -1.750000 +v 0.343750 -1.121210 -1.683709 +v 0.375000 -1.093751 -1.750000 +v 0.375000 -1.187501 -1.843750 +v 0.375000 -1.281251 -1.750000 +v 0.375000 -1.187501 -1.656250 vt 0.810811 0.532819 vt 0.833977 0.486486 vt 0.833977 0.532819 @@ -1697,5147 +5617,1248 @@ vt 0.575290 0.789575 vt 0.573593 0.785480 vt 0.565403 0.785480 vt 0.563707 0.789575 -vn 1.0000 0.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn -0.9734 -0.2290 0.0000 -vn 0.3443 -0.9389 0.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -vn -1.0000 -0.0000 0.0000 -vn -0.0000 -0.9239 -0.3827 -vn 0.0000 -0.3827 -0.9239 -vn 0.0000 0.9239 0.3827 -vn 0.0000 0.7071 0.7071 -vn 0.0000 0.7071 -0.7071 -vn 0.0073 -0.7071 0.7071 -vn 0.0000 -0.9732 0.2298 -vn 0.0076 -0.9733 0.2295 -vn 0.0078 0.8267 -0.5626 -vn 0.0000 0.5474 -0.8369 -vn -0.0000 0.8310 -0.5563 -vn 0.0000 -0.3640 -0.9314 -vn 0.0076 -0.2295 -0.9733 -vn -0.0000 -0.3640 0.9314 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 -0.9732 -0.2298 -vn 0.0073 -0.7071 -0.7071 -vn 0.0076 -0.9733 -0.2295 -vn -0.0000 -0.7071 -0.7071 -vn 0.0076 0.2295 -0.9733 -vn -0.0000 0.2728 -0.9621 -vn 0.0076 -0.2295 0.9733 -vn -0.3827 0.9239 0.0000 -vn 0.3827 0.9239 0.0000 -vn -0.9419 -0.3358 0.0000 -vn -0.9239 0.3827 0.0000 -vn 0.4197 -0.9077 0.0000 -vn 0.9239 -0.3827 0.0000 -vn 0.3827 -0.9239 0.0000 -vn -0.3827 -0.9239 0.0000 -vn -0.4197 -0.9077 0.0000 -vn -0.9239 -0.3827 0.0000 -vn 0.9239 0.3827 0.0000 -vn 0.9419 -0.3358 0.0000 -vn 0.0000 0.2298 0.9732 -vn 0.0000 -0.2298 0.9732 -vn 0.0078 0.6613 0.7501 -vn -0.0000 0.8310 0.5563 -vn -0.0000 0.6611 0.7503 -vn 0.0000 0.5474 0.8369 -vn 0.0000 0.1368 0.9906 -vn 0.0000 -0.3827 0.9239 -vn -0.0000 0.4472 0.8944 -vn -0.0000 0.2728 0.9621 -vn 0.0076 0.2295 0.9733 -vn -0.1343 -0.9909 0.0000 -vn 0.1951 -0.9808 0.0000 -vn -0.5000 -0.8660 0.0000 -vn -0.8660 -0.5000 0.0000 -vn -0.1305 -0.9914 0.0000 -vn -0.9616 -0.2744 0.0000 -vn -0.5989 -0.8008 0.0000 -vn -0.9914 -0.1305 0.0000 -vn 0.4709 0.8822 0.0000 -vn 0.8817 0.4719 0.0000 -vn 0.7071 0.7071 0.0000 -vn 0.7071 -0.7071 0.0000 -vn -0.7071 -0.7071 0.0000 -vn -0.7071 0.7071 0.0000 -vn -0.0000 0.1602 -0.9871 -vn -0.0000 0.3863 -0.9224 -vn 0.0000 0.9239 -0.3827 -vn 0.0000 -0.9239 0.3827 -vn 0.0000 -0.2527 -0.9675 -vn 0.0000 0.3827 0.9239 -vn -0.0000 -0.6618 -0.7497 -vn 0.0000 0.3714 -0.9285 -vn 0.0000 -0.8321 -0.5547 -vn -0.0000 -0.6618 0.7497 -vn -0.0000 0.1602 0.9871 -vn 0.0000 0.3714 0.9285 -vn -0.0000 -0.8321 0.5547 -vn 0.0000 -0.6037 0.7972 -vn 0.0000 -0.6037 -0.7972 -vn 0.0000 -0.7972 0.6037 -vn -0.0000 0.3827 -0.9239 -vn -0.0000 0.9239 -0.3828 -vn 0.2181 -0.6901 -0.6901 -vn 0.2181 -0.6901 0.6901 -vn 0.2181 0.6901 0.6901 -vn 0.2181 0.6901 -0.6901 -vn 0.2181 0.0000 -0.9759 -vn 0.2181 -0.9759 -0.0000 -vn 0.2181 0.0000 0.9759 -vn 0.2181 0.9759 0.0000 -vn 0.2434 0.6858 0.6858 -vn 0.2434 0.6858 -0.6858 -vn 0.2434 0.0000 -0.9699 -vn 0.2434 -0.9699 -0.0000 -vn 0.2434 0.9699 0.0000 -vn 0.2434 -0.6858 -0.6858 -vn 0.2434 0.0000 0.9699 -vn 0.2434 -0.6858 0.6858 -vn 0.0000 -0.1951 -0.9808 -vn 0.0000 0.1951 0.9808 -vn 0.0000 -0.1951 0.9808 -vn -0.0000 0.1951 -0.9808 -vn -0.0000 -0.2298 -0.9732 -vn 0.0000 0.2298 -0.9732 -vn 0.0078 0.6613 -0.7501 -vn -0.0000 0.4472 -0.8944 -vn -0.0000 0.2527 -0.9675 -vn 0.0000 0.2527 0.9675 -vn 0.0000 -0.2527 0.9675 -vn 0.0164 -0.9658 0.2587 -vn 0.0164 -0.9658 -0.2587 -vn 0.0164 -0.2587 -0.9658 -vn 0.0165 -0.7070 -0.7070 -vn 0.0164 0.2587 -0.9658 -vn 0.0013 0.3034 -0.9529 -vn -0.0141 0.0737 -0.9972 -vn 0.0165 -0.7070 0.7070 -vn 0.0164 -0.2587 0.9658 -vn 0.0164 0.2587 0.9658 -vn 0.0013 0.3034 0.9529 -vn 0.0078 0.8267 0.5626 -vn -0.0141 0.0737 0.9972 -vn -0.0073 0.4348 0.9005 -vn -0.0073 0.4348 -0.9005 -vn -0.0262 0.4060 -0.9135 -vn 0.9188 -0.3671 0.1452 -vn 0.7817 -0.5913 -0.1981 -vn 0.9188 -0.3671 -0.1452 -vn -0.7971 0.5046 -0.3316 -vn -0.7290 0.6491 0.2171 -vn -0.7290 0.6491 -0.2171 -vn 0.7817 -0.5913 0.1981 -vn 0.9592 -0.2085 -0.1909 -vn -0.9228 0.3641 -0.1257 -vn 0.9592 -0.2085 0.1909 -vn -0.9632 -0.2625 0.0577 -vn -0.9632 -0.2625 -0.0577 -vn 0.8192 -0.5735 0.0000 -vn -0.7678 -0.6407 0.0000 -vn 0.5024 -0.8356 0.2221 -vn 0.7665 -0.6204 -0.1664 -vn 0.5024 -0.8356 -0.2221 -vn -0.8944 -0.4472 0.0000 -vn 0.9487 0.0000 -0.3162 -vn 0.9921 0.0000 -0.1251 -vn 0.7665 -0.6204 0.1664 -vn -0.4634 -0.8707 0.1647 -vn -0.4621 -0.8728 -0.1574 -vn -0.4634 -0.8707 -0.1647 -vn -0.8487 0.4243 0.3158 -vn -0.8487 0.4243 -0.3158 -vn 0.5972 -0.6798 -0.4257 -vn 0.8941 -0.2402 -0.3781 -vn 0.8379 -0.4253 -0.3421 -vn 0.6760 -0.6015 -0.4258 -vn -0.3953 0.1977 -0.8970 -vn -0.3704 0.2330 -0.8992 -vn -0.4032 0.3129 -0.8599 -vn -0.4342 0.1096 -0.8941 -vn -0.4248 -0.8013 -0.4212 -vn -0.4357 -0.8092 -0.3942 -vn 0.9921 -0.0000 0.1251 -vn -0.3953 0.1977 0.8970 -vn -0.3704 0.2330 0.8992 -vn -0.4032 0.3129 0.8599 -vn -0.4342 0.1096 0.8941 -vn -0.4248 -0.8013 0.4213 -vn -0.4621 -0.8728 0.1574 -vn -0.4357 -0.8092 0.3942 -vn 0.9487 -0.0000 0.3162 -vn 0.8941 -0.2402 0.3781 -vn 0.6760 -0.6015 0.4258 -vn 0.8379 -0.4253 0.3421 -vn 0.5972 -0.6798 0.4257 -vn -0.7971 0.5046 0.3316 -vn -0.9228 0.3641 0.1257 -vn 0.9871 -0.1602 0.0000 -vn 0.8507 -0.5257 0.0000 -vn 0.1602 -0.9871 0.0000 -vn -0.2898 -0.9571 0.0000 -vn 0.5257 -0.8507 0.0000 -vn -0.5547 -0.8321 0.0000 -vn -0.9871 0.1602 0.0000 -vn -0.8507 0.5257 0.0000 -vn -0.5257 0.8507 0.0000 -vn -0.1602 0.9871 0.0000 -vn 0.2898 0.9571 0.0000 -vn 0.5547 0.8321 0.0000 -vn -0.0931 0.7307 -0.6763 -vn -0.1298 0.9915 -0.0000 -vn -0.0931 0.7307 0.6763 -vn -0.0846 0.7182 0.6906 -vn -0.1644 0.9864 -0.0000 -vn -0.0846 0.7182 -0.6906 -vn -0.0262 0.4060 0.9135 -vn 0.0000 0.5556 -0.8315 -vn 0.0000 0.5556 0.8315 -vn 0.0000 -0.5556 0.8315 -vn 0.0000 -0.5556 -0.8315 -vn -0.9262 0.3770 0.0000 -vn -0.9285 0.3714 0.0000 -vn 0.9262 0.3770 0.0000 -vn 0.9285 0.3714 0.0000 -vn 0.9239 0.0000 0.3827 -vn 0.9239 0.0000 -0.3827 -vn 0.7071 0.0000 -0.7071 -vn 0.7071 0.0000 0.7071 -vn 0.0000 0.9732 -0.2298 -vn 0.0000 0.8944 -0.4472 -vn 0.0000 0.8944 0.4472 -vn 0.0000 0.9732 0.2298 -s off -f 70/1/1 71/2/1 69/3/1 -f 73/4/2 72/5/2 74/6/2 -f 76/7/3 70/1/3 69/3/3 -f 74/8/4 76/7/4 73/9/4 -f 75/10/5 72/11/5 70/12/5 -f 109/13/6 108/14/6 107/15/6 -f 112/16/3 116/17/3 108/14/3 -f 115/18/2 111/19/2 110/20/2 -f 143/21/2 140/22/2 141/23/2 -f 145/24/4 142/25/4 143/26/4 -f 150/27/2 149/28/2 148/29/2 -f 140/22/7 142/30/7 144/31/7 -f 145/32/6 141/23/6 139/33/6 -f 139/34/1 140/22/1 138/35/1 -f 171/36/6 49/37/6 53/38/6 -f 176/39/6 171/36/6 175/40/6 -f 55/41/8 186/42/8 54/43/8 -f 196/44/9 195/45/9 201/46/9 -f 202/47/9 187/48/9 55/49/9 -f 191/50/8 190/51/8 202/52/8 -f 192/53/8 202/54/8 201/55/8 -f 192/53/10 195/56/10 193/57/10 -f 186/42/11 194/58/11 54/43/11 -f 198/59/1 199/60/1 200/61/1 -f 205/62/1 188/63/1 189/64/1 -f 58/65/8 56/66/8 203/67/8 -f 193/57/1 205/68/1 189/64/1 -f 248/69/1 259/70/1 257/71/1 -f 256/72/1 259/70/1 261/73/1 -f 301/74/8 305/75/8 300/76/8 -f 303/77/8 304/78/8 302/79/8 -f 305/75/8 302/79/8 304/78/8 -f 301/74/7 308/80/7 302/79/7 -f 300/81/3 307/82/3 301/74/3 -f 302/79/2 309/83/2 303/84/2 -f 307/82/1 306/85/1 311/86/1 -f 310/87/1 309/88/1 308/80/1 -f 307/82/1 310/87/1 308/80/1 -f 407/89/2 392/90/2 393/91/2 -f 394/92/2 407/89/2 393/91/2 -f 409/93/2 394/92/2 395/94/2 -f 410/95/2 395/94/2 396/96/2 -f 411/97/2 396/96/2 397/98/2 -f 398/99/2 411/97/2 397/98/2 -f 415/100/3 405/101/3 404/102/3 -f 414/103/3 404/102/3 403/104/3 -f 402/105/3 414/103/3 403/104/3 -f 413/106/3 401/107/3 417/108/3 -f 418/109/3 401/107/3 400/110/3 -f 418/109/3 399/111/3 419/112/3 -f 462/113/1 463/114/1 461/115/1 -f 463/114/7 465/116/7 461/115/7 -f 462/113/1 468/117/1 464/118/1 -f 466/119/8 469/120/8 465/116/8 -f 465/116/3 462/121/3 461/115/3 -f 470/122/2 463/114/2 464/123/2 -f 470/124/8 472/125/8 469/120/8 -f 462/121/12 472/126/12 467/127/12 -f 471/128/13 464/123/13 468/129/13 -f 479/130/2 475/131/2 473/132/2 -f 476/133/3 474/134/3 477/135/3 -f 484/136/2 475/131/2 478/137/2 -f 474/134/3 483/138/3 477/135/3 -f 473/132/2 486/139/2 485/140/2 -f 491/141/3 480/142/3 476/133/3 -f 499/143/2 495/144/2 496/145/2 -f 498/146/3 493/147/3 488/148/3 -f 500/149/2 502/150/2 499/143/2 -f 497/151/3 504/152/3 498/146/3 -f 502/153/8 501/154/8 482/155/8 -f 504/152/7 502/150/7 503/156/7 -f 513/157/7 509/158/7 514/159/7 -f 516/160/7 511/161/7 512/162/7 -f 507/163/8 513/164/8 519/165/8 -f 505/166/8 516/167/8 512/168/8 -f 517/169/8 520/170/8 505/166/8 -f 517/169/8 507/163/8 519/165/8 -f 519/165/8 528/171/8 521/172/8 -f 525/173/8 526/174/8 520/170/8 -f 520/170/8 527/175/8 519/165/8 -f 523/176/8 517/169/8 522/177/8 -f 519/165/8 522/177/8 517/169/8 -f 520/170/8 517/169/8 524/178/8 -f 537/179/7 540/180/7 538/181/7 -f 542/182/7 540/180/7 539/183/7 -f 508/184/1 514/185/1 509/186/1 -f 515/187/1 506/188/1 511/161/1 -f 506/188/1 537/189/1 518/190/1 -f 508/184/1 518/190/1 538/191/1 -f 538/191/1 518/190/1 537/189/1 -f 545/192/6 543/193/6 544/194/6 -f 545/192/6 548/195/6 546/196/6 -f 550/197/1 535/198/1 549/199/1 -f 547/200/1 531/201/1 548/195/1 -f 530/202/1 548/195/1 531/201/1 -f 550/197/1 536/203/1 535/198/1 -f 534/204/1 549/199/1 535/198/1 -f 547/200/1 532/205/1 531/201/1 -f 547/200/1 549/199/1 533/206/1 -f 548/195/1 529/207/1 550/197/1 -f 516/208/3 537/209/3 515/210/3 -f 538/211/2 513/212/2 514/213/2 -f 503/214/1 483/138/1 484/136/1 -f 552/215/7 553/216/7 551/217/7 -f 554/218/8 555/219/8 553/216/8 -f 562/220/1 561/221/1 558/222/1 -f 553/223/2 561/221/2 563/224/2 -f 562/220/3 559/225/3 554/218/3 -f 70/1/1 72/5/1 71/2/1 -f 73/4/2 71/2/2 72/5/2 -f 76/7/3 75/226/3 70/1/3 -f 74/8/4 75/10/4 76/7/4 -f 75/10/5 74/8/5 72/11/5 -f 109/13/6 110/20/6 108/14/6 -f 114/227/3 116/17/3 112/16/3 -f 116/17/3 107/15/3 108/14/3 -f 110/20/2 109/13/2 115/18/2 -f 115/18/2 113/228/2 111/19/2 -f 143/21/2 142/30/2 140/22/2 -f 145/24/4 144/229/4 142/25/4 -f 147/230/2 146/231/2 148/29/2 -f 146/231/2 144/232/2 150/27/2 -f 148/29/2 146/231/2 150/27/2 -f 144/232/2 145/233/2 150/27/2 -f 146/234/7 133/235/7 144/31/7 -f 133/235/7 138/236/7 144/31/7 -f 138/236/7 140/22/7 144/31/7 -f 139/33/6 137/237/6 145/32/6 -f 137/237/6 150/238/6 145/32/6 -f 145/32/6 143/21/6 141/23/6 -f 139/34/1 141/23/1 140/22/1 -f 171/36/6 152/239/6 49/37/6 -f 176/39/6 152/239/6 171/36/6 -f 55/41/8 187/240/8 186/42/8 -f 56/241/9 57/242/9 201/46/9 -f 57/242/9 196/44/9 201/46/9 -f 196/44/9 207/243/9 195/45/9 -f 202/47/9 190/244/9 187/48/9 -f 192/53/8 191/50/8 202/54/8 -f 192/53/10 201/245/10 195/56/10 -f 186/42/11 188/63/11 194/58/11 -f 200/61/1 206/246/1 208/247/1 -f 208/247/1 207/248/1 200/61/1 -f 207/248/1 196/249/1 200/61/1 -f 196/249/1 197/250/1 200/61/1 -f 197/250/1 198/59/1 200/61/1 -f 205/62/1 194/251/1 188/63/1 -f 58/65/8 57/252/8 56/66/8 -f 56/66/8 204/253/8 203/67/8 -f 203/67/8 61/254/8 58/65/8 -f 61/254/8 60/255/8 58/65/8 -f 60/255/8 59/256/8 58/65/8 -f 193/57/1 195/257/1 205/68/1 -f 248/69/1 246/258/1 259/70/1 -f 256/72/1 257/71/1 259/70/1 -f 259/70/1 260/259/1 261/73/1 -f 261/73/1 262/260/1 263/261/1 -f 263/261/1 256/72/1 261/73/1 -f 305/75/8 301/74/8 302/79/8 -f 301/74/7 307/82/7 308/80/7 -f 300/81/3 306/262/3 307/82/3 -f 302/79/2 308/80/2 309/83/2 -f 307/82/1 311/86/1 310/87/1 -f 407/89/2 406/263/2 392/90/2 -f 394/92/2 408/264/2 407/89/2 -f 409/93/2 408/265/2 394/92/2 -f 410/95/2 409/266/2 395/94/2 -f 411/97/2 410/95/2 396/96/2 -f 398/99/2 412/267/2 411/97/2 -f 415/100/3 416/268/3 405/101/3 -f 414/103/3 415/100/3 404/102/3 -f 402/105/3 413/269/3 414/103/3 -f 413/106/3 402/105/3 401/107/3 -f 418/109/3 417/270/3 401/107/3 -f 418/109/3 400/110/3 399/111/3 -f 462/113/1 464/118/1 463/114/1 -f 463/114/7 466/119/7 465/116/7 -f 462/113/1 467/271/1 468/117/1 -f 466/119/8 470/124/8 469/120/8 -f 465/116/3 469/272/3 462/121/3 -f 470/122/2 466/119/2 463/114/2 -f 470/124/8 471/273/8 472/125/8 -f 462/121/12 469/272/12 472/126/12 -f 471/128/13 470/122/13 464/123/13 -f 479/130/2 478/137/2 475/131/2 -f 476/133/3 480/142/3 474/134/3 -f 484/136/2 482/155/2 475/131/2 -f 474/134/3 481/274/3 483/138/3 -f 485/140/2 492/275/2 479/130/2 -f 479/130/2 473/132/2 485/140/2 -f 476/133/3 489/276/3 491/141/3 -f 491/141/3 490/277/3 480/142/3 -f 496/145/2 494/278/2 500/149/2 -f 500/149/2 499/143/2 496/145/2 -f 488/148/3 487/279/3 497/151/3 -f 497/151/3 498/146/3 488/148/3 -f 500/149/2 503/156/2 502/150/2 -f 497/151/3 501/280/3 504/152/3 -f 501/154/8 475/131/8 482/155/8 -f 482/155/8 481/281/8 502/153/8 -f 481/281/8 474/282/8 502/153/8 -f 504/152/7 501/280/7 502/150/7 -f 513/157/7 510/283/7 509/158/7 -f 516/160/7 515/187/7 511/161/7 -f 507/163/8 510/284/8 513/164/8 -f 505/166/8 520/170/8 516/167/8 -f 521/172/8 522/177/8 519/165/8 -f 519/165/8 527/175/8 528/171/8 -f 526/174/8 527/175/8 520/170/8 -f 520/170/8 524/178/8 525/173/8 -f 523/176/8 524/178/8 517/169/8 -f 537/179/7 539/183/7 540/180/7 -f 542/182/7 541/285/7 540/180/7 -f 508/184/1 538/191/1 514/185/1 -f 515/187/1 537/189/1 506/188/1 -f 545/192/6 546/196/6 543/193/6 -f 545/192/6 547/200/6 548/195/6 -f 530/202/1 529/207/1 548/195/1 -f 550/197/1 529/207/1 536/203/1 -f 534/204/1 533/206/1 549/199/1 -f 547/200/1 533/206/1 532/205/1 -f 516/208/3 520/286/3 537/209/3 -f 538/211/2 519/287/2 513/212/2 -f 484/136/1 478/137/1 504/288/1 -f 503/214/1 477/135/1 483/138/1 -f 484/136/1 504/288/1 503/214/1 -f 552/215/7 554/218/7 553/216/7 -f 554/218/8 556/289/8 555/219/8 -f 561/221/1 557/290/1 558/222/1 -f 558/222/1 560/291/1 562/220/1 -f 560/291/1 559/225/1 562/220/1 -f 563/224/2 551/292/2 553/223/2 -f 553/223/2 557/290/2 561/221/2 -f 554/218/3 552/215/3 564/293/3 -f 564/293/3 562/220/3 554/218/3 -s 1 -f 18/294/14 6/295/15 14/296/16 -f 3/297/17 29/298/18 7/299/19 -f 268/300/20 269/301/2 20/302/21 -f 30/303/22 34/304/22 22/305/23 -f 5/306/24 19/307/25 15/308/26 -f 271/309/20 268/300/20 2/310/27 -f 21/311/28 269/301/2 270/312/29 -f 6/295/15 15/308/26 14/296/16 -f 31/313/3 30/303/22 16/314/30 -f 30/315/31 42/316/32 34/317/32 -f 33/318/33 39/319/34 31/320/34 -f 35/321/35 45/322/36 43/323/37 -f 35/321/35 40/324/38 32/325/39 -f 32/326/39 41/327/40 33/318/33 -f 31/320/34 38/328/31 30/315/31 -f 44/329/41 37/330/42 36/331/41 -f 34/317/32 44/329/41 36/331/41 -f 45/332/3 44/333/3 42/334/3 -f 36/335/3 23/336/43 4/337/44 -f 24/338/45 48/339/46 47/340/47 -f 28/341/48 52/342/46 8/343/46 -f 53/344/49 8/345/50 52/346/50 -f 47/340/47 46/347/51 33/348/52 -f 37/349/52 28/341/48 23/336/43 -f 51/350/47 35/351/51 50/352/51 -f 32/353/51 50/352/51 35/351/51 -f 17/354/53 31/313/3 16/314/30 -f 79/355/54 78/356/55 77/357/54 -f 93/358/56 85/359/57 86/360/56 -f 91/361/58 86/360/56 84/362/58 -f 88/363/59 82/364/60 81/365/59 -f 94/366/6 84/362/58 87/367/6 -f 92/368/57 83/369/61 85/359/57 -f 90/370/61 81/365/59 83/369/61 -f 77/357/54 89/371/60 79/355/54 -f 85/372/3 77/357/3 95/373/3 -f 102/374/62 100/375/63 96/376/62 -f 104/377/1 99/378/64 98/379/1 -f 106/380/63 95/381/1 100/375/63 -f 105/382/64 96/376/62 99/378/64 -f 103/383/65 98/379/1 97/384/65 -f 92/385/2 93/386/2 101/387/2 -f 80/388/55 97/384/65 78/356/55 -f 132/389/64 123/390/1 124/391/64 -f 130/392/65 121/393/6 122/394/65 -f 128/395/66 119/396/8 120/397/66 -f 126/398/67 117/399/7 118/400/67 -f 125/401/7 124/391/64 117/399/7 -f 131/402/1 122/394/65 123/390/1 -f 129/403/6 120/397/66 121/404/6 -f 127/405/8 118/400/67 119/396/8 -f 132/406/3 125/407/3 129/408/3 -f 146/234/31 134/409/67 133/235/31 -f 134/409/67 148/410/8 135/411/8 -f 149/412/66 137/237/38 136/413/66 -f 135/414/8 149/412/66 136/413/66 -f 47/415/8 153/416/8 154/417/8 -f 157/418/8 159/419/8 155/420/8 -f 48/421/8 152/422/8 153/416/8 -f 151/423/8 158/424/8 156/425/8 -f 185/426/13 172/427/68 168/428/69 -f 165/429/11 304/430/70 164/431/70 -f 167/432/71 158/433/9 159/434/71 -f 158/433/9 160/435/10 156/436/72 -f 163/437/73 305/438/11 165/429/11 -f 159/434/71 161/439/50 167/432/71 -f 166/440/8 161/441/8 165/442/8 -f 46/443/8 47/415/8 151/423/8 -f 158/424/8 47/415/8 154/417/8 -f 46/444/7 168/428/7 50/445/7 -f 51/446/1 168/428/1 169/447/1 -f 52/448/1 169/447/1 170/449/1 -f 171/450/1 52/448/1 170/449/1 -f 168/451/69 173/452/74 169/453/74 -f 170/454/75 175/40/75 171/36/75 -f 169/453/74 174/455/76 170/454/76 -f 154/456/77 179/457/78 155/458/78 -f 152/239/79 177/459/79 153/460/79 -f 155/458/78 180/461/12 157/462/12 -f 153/460/80 178/463/77 154/456/77 -f 184/464/1 180/465/1 181/466/1 -f 178/467/1 173/468/1 180/465/1 -f 178/467/1 174/469/1 173/468/1 -f 175/470/1 177/471/1 176/472/1 -f 49/473/49 64/474/3 65/475/12 -f 11/476/7 65/475/12 66/477/7 -f 49/473/49 48/478/50 1/479/81 -f 68/480/2 62/481/27 3/482/82 -f 54/483/49 204/484/23 55/49/83 -f 199/485/7 59/486/13 60/487/7 -f 197/488/2 57/242/10 58/489/2 -f 200/490/12 60/487/7 61/491/12 -f 198/492/13 58/489/2 59/486/13 -f 191/493/13 187/494/84 190/495/84 -f 186/496/84 67/497/13 68/480/2 -f 188/498/84 68/480/2 13/499/2 -f 12/500/13 188/498/84 13/499/2 -f 67/497/13 192/501/85 66/477/7 -f 193/502/70 12/500/13 11/476/7 -f 66/477/7 193/502/70 11/476/7 -f 201/46/71 202/47/71 55/49/83 -f 195/45/71 208/503/23 205/504/23 -f 205/504/23 206/505/3 194/506/49 -f 200/490/12 61/491/12 54/43/49 -f 63/507/1 62/508/1 67/509/1 -f 225/510/86 216/511/6 217/512/27 -f 223/513/87 214/514/3 215/515/23 -f 221/516/88 212/517/7 213/518/12 -f 219/519/89 210/520/2 211/521/13 -f 218/522/90 217/512/27 210/520/2 -f 224/523/91 215/515/23 216/524/6 -f 222/525/92 213/518/12 214/514/3 -f 220/526/93 211/521/13 212/517/7 -f 229/527/94 220/526/93 221/516/88 -f 227/528/95 218/522/90 219/519/89 -f 226/529/96 225/510/86 218/522/90 -f 232/530/97 223/513/87 224/523/91 -f 222/525/92 229/531/94 221/516/88 -f 228/532/98 219/519/89 220/526/93 -f 233/533/99 224/534/91 225/510/86 -f 223/513/87 230/535/100 222/525/92 -f 234/536/2 233/537/99 226/538/96 -f 240/539/6 231/540/101 232/541/97 -f 238/542/3 229/543/94 230/544/100 -f 236/545/7 227/546/95 228/547/98 -f 241/548/27 232/549/97 233/537/99 -f 239/550/23 230/544/100 231/540/101 -f 237/551/12 228/547/98 229/543/94 -f 235/552/13 226/538/96 227/546/95 -f 248/553/102 249/554/2 242/555/2 -f 262/556/6 267/557/27 263/558/27 -f 244/559/12 252/560/3 245/561/3 -f 260/562/3 247/563/103 264/564/3 -f 245/561/3 253/565/104 246/566/104 -f 242/555/2 250/567/13 243/568/13 -f 260/562/3 265/569/23 261/570/23 -f 256/571/2 254/572/105 257/573/105 -f 263/558/27 258/574/2 256/571/2 -f 261/570/23 266/575/6 262/576/6 -f 247/563/103 246/566/104 253/565/104 -f 257/573/105 255/577/102 248/553/102 -f 272/578/2 27/579/106 26/580/107 -f 25/581/108 270/312/29 275/582/109 -f 275/582/109 29/298/18 25/581/108 -f 29/298/18 273/583/29 26/580/107 -f 273/584/42 278/585/41 272/586/41 -f 272/586/41 277/587/32 271/588/32 -f 271/588/32 276/589/31 268/590/31 -f 275/591/39 280/592/37 274/593/35 -f 269/594/34 283/595/40 270/596/33 -f 268/590/31 282/597/34 269/594/34 -f 283/595/40 275/598/39 270/596/33 -f 281/599/2 283/600/2 282/601/2 -f 274/593/35 279/602/36 273/584/42 -f 299/603/64 290/604/1 291/605/64 -f 297/606/65 288/607/6 289/608/65 -f 295/609/66 286/610/8 287/611/66 -f 293/612/67 284/613/7 285/614/67 -f 292/615/7 291/605/64 284/613/7 -f 298/616/1 289/608/65 290/604/1 -f 296/617/6 287/611/66 288/618/6 -f 294/619/8 285/614/67 286/610/8 -f 296/620/3 298/621/3 292/622/3 -f 304/430/70 162/623/84 164/431/70 -f 310/624/70 184/625/11 183/626/70 -f 311/627/11 182/628/73 184/625/11 -f 309/629/110 183/626/70 181/630/84 -f 306/631/111 300/632/111 157/462/112 -f 156/633/72 303/634/110 309/635/110 -f 15/636/26 318/637/113 14/638/16 -f 19/639/25 319/640/114 15/636/26 -f 19/639/25 321/641/115 320/642/116 -f 21/643/28 321/641/115 20/644/21 -f 25/645/108 312/646/117 21/643/28 -f 3/647/17 313/648/118 25/645/108 -f 313/648/118 3/647/17 322/649/119 -f 18/650/14 318/637/113 317/651/120 -f 18/650/14 316/652/121 16/653/30 -f 16/653/30 315/654/122 17/655/53 -f 24/656/45 315/654/122 314/657/123 -f 24/656/45 314/657/123 1/658/124 -f 314/657/123 323/659/125 1/658/124 -f 322/660/7 1/661/7 323/662/7 -f 314/663/1 317/664/1 321/665/1 -f 248/69/1 242/666/1 431/667/1 -f 8/668/1 9/669/1 28/670/1 -f 7/671/1 29/672/1 13/673/1 -f 28/341/48 324/674/126 23/336/43 -f 29/298/18 26/580/107 325/675/127 -f 13/673/128 29/672/18 325/676/127 -f 350/677/129 331/678/130 330/679/131 -f 338/680/132 359/681/133 339/682/134 -f 351/683/135 332/684/136 331/678/130 -f 359/681/133 340/685/137 339/682/134 -f 352/686/138 333/687/131 332/688/136 -f 340/685/137 361/689/139 341/690/140 -f 353/691/129 334/692/130 333/687/131 -f 346/693/141 327/694/141 326/695/141 -f 341/690/140 362/696/142 342/697/142 -f 354/698/135 335/699/136 334/692/130 -f 347/700/143 328/701/144 327/694/145 -f 362/696/142 343/702/146 342/697/142 -f 378/703/147 335/699/136 336/704/148 -f 348/705/149 329/706/136 328/701/144 -f 363/707/146 344/708/8 343/702/146 -f 356/709/150 337/710/151 336/704/152 -f 349/711/138 330/679/131 329/712/136 -f 357/713/153 338/680/132 337/710/154 -f 328/701/144 366/714/155 327/694/145 -f 367/715/156 328/701/144 329/706/136 -f 330/679/131 368/716/157 329/712/136 -f 367/715/156 329/712/136 368/716/157 -f 370/717/156 331/678/130 332/684/136 -f 331/678/130 368/716/157 330/679/131 -f 369/718/158 368/716/157 331/678/130 -f 333/687/131 371/719/157 332/688/136 -f 332/688/136 371/719/157 370/717/156 -f 373/720/156 334/692/130 335/699/136 -f 334/692/130 371/719/157 333/687/131 -f 372/721/158 371/719/157 334/692/130 -f 378/722/2 374/723/159 373/724/2 -f 338/680/132 375/725/160 337/710/154 -f 374/726/159 337/710/154 375/725/160 -f 339/682/134 376/727/161 338/680/132 -f 375/725/160 338/680/132 376/727/161 -f 340/685/137 377/728/162 339/682/134 -f 376/727/161 339/682/134 377/728/162 -f 341/690/140 377/728/162 340/685/137 -f 374/729/163 378/730/164 336/704/152 -f 335/699/136 378/703/147 373/720/156 -f 371/731/2 372/732/2 370/733/2 -f 368/734/2 369/735/2 367/736/2 -f 373/724/2 374/723/159 372/732/2 -f 374/723/159 375/737/160 372/732/2 -f 372/732/2 375/737/160 370/733/2 -f 370/733/2 375/737/160 369/735/2 -f 369/735/2 375/737/160 367/736/2 -f 375/737/160 376/738/161 367/736/2 -f 367/736/2 376/738/161 366/739/2 -f 376/738/161 377/740/162 366/739/2 -f 377/740/162 341/741/2 326/742/2 -f 327/743/2 366/739/2 326/742/2 -f 343/744/2 344/745/2 342/746/2 -f 344/745/2 345/747/2 342/746/2 -f 345/747/2 326/742/2 341/741/2 -f 342/746/2 345/747/2 341/741/2 -f 366/739/2 377/740/162 326/742/2 -f 337/710/151 374/729/163 336/704/152 -f 356/709/165 335/699/136 355/748/138 -f 391/749/3 386/750/3 387/751/166 -f 384/752/3 383/753/3 385/754/3 -f 381/755/3 380/756/3 382/757/3 -f 386/750/3 385/754/3 387/751/166 -f 387/751/166 385/754/3 388/758/167 -f 385/754/3 383/753/3 388/758/167 -f 383/753/3 382/757/3 388/758/167 -f 382/757/3 380/756/3 388/758/167 -f 388/758/167 380/756/3 389/759/168 -f 380/756/3 379/760/3 389/759/168 -f 389/759/168 379/760/3 390/761/169 -f 387/762/170 357/713/171 356/709/150 -f 387/762/170 356/709/150 391/763/172 -f 356/709/165 355/748/138 391/764/173 -f 391/764/173 355/748/138 386/765/174 -f 354/698/135 386/765/174 355/748/138 -f 385/766/175 354/698/135 384/767/176 -f 354/698/135 353/691/129 384/767/176 -f 353/691/129 352/686/138 384/767/176 -f 384/767/176 352/686/138 383/768/174 -f 351/683/135 383/768/174 352/769/138 -f 382/770/175 351/683/135 381/771/176 -f 351/683/135 350/677/129 381/771/176 -f 350/677/129 349/711/138 381/771/176 -f 381/771/176 349/711/138 380/772/174 -f 348/705/149 380/772/174 349/773/138 -f 348/705/149 347/700/143 379/774/177 -f 387/775/166 388/776/167 357/713/153 -f 357/713/153 388/776/167 358/777/178 -f 388/776/167 389/778/168 358/777/178 -f 358/777/178 389/778/168 359/681/133 -f 389/778/168 390/779/169 359/681/133 -f 359/681/133 390/779/169 360/780/179 -f 361/689/139 360/780/179 390/779/169 -f 347/781/3 346/782/3 379/760/3 -f 379/760/3 346/782/3 390/761/169 -f 390/761/169 346/782/3 361/783/3 -f 346/782/3 365/784/3 361/783/3 -f 361/783/3 365/784/3 362/785/3 -f 363/786/3 362/785/3 364/787/3 -f 364/787/3 362/785/3 365/784/3 -f 400/110/180 394/92/181 393/91/180 -f 403/104/182 397/98/183 396/96/182 -f 401/107/181 395/94/184 394/92/181 -f 399/111/1 393/91/180 392/90/1 -f 404/102/183 398/99/185 397/98/183 -f 402/105/184 396/96/182 395/94/184 -f 407/89/186 419/788/8 406/263/8 -f 408/264/187 418/789/186 407/89/186 -f 409/790/188 417/791/187 408/264/187 -f 414/792/189 409/790/188 410/793/189 -f 415/794/190 410/793/189 411/795/190 -f 416/796/191 411/795/190 412/797/191 -f 13/673/128 325/676/127 420/798/192 -f 11/799/193 422/800/194 10/801/195 -f 422/800/194 11/799/193 421/802/196 -f 420/798/192 421/802/196 11/799/193 -f 11/799/193 12/803/197 420/798/192 -f 13/673/128 420/798/192 12/803/197 -f 28/670/48 9/669/198 324/804/126 -f 10/801/195 422/800/194 9/669/198 -f 324/804/126 9/669/198 422/800/194 -f 435/805/199 243/568/13 250/567/13 -f 244/559/12 434/806/200 251/807/12 -f 434/808/8 435/809/8 253/810/8 -f 425/811/1 448/812/1 447/813/1 -f 440/814/3 428/815/23 427/816/3 -f 437/817/13 425/811/7 424/818/13 -f 442/819/27 423/820/2 429/821/27 -f 441/822/23 433/823/201 428/824/23 -f 438/825/7 426/826/12 425/811/7 -f 444/827/201 432/828/200 433/829/201 -f 439/830/12 427/816/3 426/826/12 -f 443/831/202 429/821/27 430/832/202 -f 436/833/2 424/818/13 423/820/2 -f 453/834/3 452/835/12 445/836/3 -f 431/837/199 443/831/202 430/832/202 -f 426/826/1 449/838/1 448/839/1 -f 428/815/1 449/840/1 427/816/1 -f 425/811/1 446/841/1 424/818/1 -f 424/818/1 445/842/1 423/820/1 -f 423/820/1 452/843/1 429/821/1 -f 430/844/1 452/845/1 451/846/1 -f 433/847/1 450/848/1 428/815/1 -f 451/849/1 433/850/1 432/851/1 -f 459/852/7 450/853/13 451/854/7 -f 457/855/2 448/856/27 449/857/2 -f 455/858/6 446/859/23 447/860/6 -f 460/861/12 451/862/7 452/835/12 -f 458/863/13 449/857/2 450/853/13 -f 456/864/27 447/860/6 448/856/27 -f 454/865/23 445/836/3 446/859/23 -f 454/866/8 438/825/8 437/817/8 -f 453/867/8 437/817/8 436/833/8 -f 460/868/8 436/833/8 442/819/8 -f 438/825/8 456/869/8 439/830/8 -f 439/830/8 457/870/8 440/814/8 -f 457/871/8 441/872/8 440/814/8 -f 443/873/8 460/874/8 442/819/8 -f 458/875/8 444/876/8 441/872/8 -f 459/877/8 443/878/8 435/809/8 -f 480/879/203 502/880/204 474/881/204 -f 488/882/7 492/883/64 485/884/7 -f 487/885/67 485/884/7 486/886/67 -f 491/887/7 495/888/67 490/889/67 -f 489/890/64 496/891/7 491/887/7 -f 480/879/203 495/888/67 499/892/203 -f 487/885/67 473/893/203 497/894/203 -f 479/895/205 493/896/64 498/897/205 -f 494/898/64 476/899/205 500/900/205 -f 503/901/206 476/899/205 477/135/206 -f 497/894/203 475/902/204 501/903/204 -f 479/895/205 504/904/206 478/137/206 -f 518/905/7 505/906/84 506/907/84 -f 512/162/2 506/907/84 505/906/84 -f 508/908/73 510/283/3 507/909/73 -f 508/908/73 517/910/7 518/905/7 -f 527/911/7 536/912/12 528/913/12 -f 525/914/2 534/915/13 526/916/13 -f 523/917/6 532/918/27 524/919/27 -f 521/920/3 530/921/23 522/922/23 -f 528/913/12 529/923/3 521/920/3 -f 526/916/13 535/924/7 527/925/7 -f 524/919/27 533/926/2 525/914/2 -f 522/922/23 531/927/6 523/917/6 -f 542/928/207 543/193/208 541/929/208 -f 540/930/209 543/193/208 546/931/209 -f 544/194/207 539/932/210 545/933/210 -f 23/934/8 324/935/8 325/936/8 -f 555/937/211 557/938/212 553/939/212 -f 554/940/213 560/941/214 556/942/214 -f 560/941/214 555/937/211 556/942/214 -f 3/482/82 209/943/6 565/944/6 -f 565/944/6 63/945/23 1/946/81 -f 581/947/67 572/948/8 573/949/67 -f 579/950/66 570/951/6 571/952/66 -f 577/953/65 568/954/1 569/955/65 -f 575/956/64 566/957/7 567/958/64 -f 574/959/7 573/949/67 566/957/7 -f 580/960/8 571/952/66 572/948/8 -f 578/961/6 569/955/65 570/962/6 -f 576/963/1 567/958/64 568/954/1 -f 581/964/2 574/965/2 578/966/2 -f 18/294/14 22/305/23 6/295/15 -f 3/297/17 25/581/108 29/298/18 -f 18/294/14 16/314/30 30/303/22 -f 34/304/22 4/337/44 22/305/23 -f 18/294/14 30/303/22 22/305/23 -f 5/306/24 2/310/27 19/307/25 -f 20/302/21 19/307/25 268/300/20 -f 19/307/25 2/310/27 268/300/20 -f 2/310/27 27/579/106 271/309/20 -f 21/311/28 20/302/21 269/301/2 -f 6/295/15 5/306/24 15/308/26 -f 30/315/31 38/328/31 42/316/32 -f 33/318/33 41/327/40 39/319/34 -f 35/321/35 37/330/42 45/322/36 -f 35/321/35 43/323/37 40/324/38 -f 32/326/39 40/967/38 41/327/40 -f 31/320/34 39/319/34 38/328/31 -f 44/329/41 45/322/36 37/330/42 -f 34/317/32 42/316/32 44/329/41 -f 42/334/3 38/968/3 40/969/3 -f 38/968/3 39/970/3 40/969/3 -f 39/970/3 41/971/3 40/969/3 -f 40/969/3 43/972/3 42/334/3 -f 43/972/3 45/332/3 42/334/3 -f 4/337/44 34/304/22 36/335/3 -f 36/335/3 37/349/52 23/336/43 -f 24/338/45 1/973/124 48/339/46 -f 28/341/48 51/350/47 52/342/46 -f 53/344/49 9/974/3 8/345/50 -f 17/354/53 24/338/45 33/348/52 -f 24/338/45 47/340/47 33/348/52 -f 46/347/51 32/353/51 33/348/52 -f 37/349/52 35/351/51 28/341/48 -f 51/350/47 28/341/48 35/351/51 -f 32/353/51 46/347/51 50/352/51 -f 17/354/53 33/348/52 31/313/3 -f 79/355/54 80/388/55 78/356/55 -f 93/358/56 92/368/57 85/359/57 -f 91/361/58 93/358/56 86/360/56 -f 88/363/59 89/371/60 82/364/60 -f 94/366/6 91/361/58 84/362/58 -f 92/368/57 90/370/61 83/369/61 -f 90/370/61 88/363/59 81/365/59 -f 77/357/54 82/364/60 89/371/60 -f 82/975/3 77/357/3 81/976/3 -f 77/357/3 78/356/3 100/977/3 -f 78/356/3 97/978/3 98/979/3 -f 98/979/3 99/980/3 96/981/3 -f 100/977/3 95/373/3 77/357/3 -f 95/373/3 22/982/3 84/983/3 -f 98/979/3 96/981/3 78/356/3 -f 96/981/3 100/977/3 78/356/3 -f 83/984/3 81/976/3 77/357/3 -f 83/984/3 77/357/3 85/372/3 -f 95/373/3 84/983/3 86/985/3 -f 22/982/3 87/986/3 84/983/3 -f 95/373/3 86/985/3 85/372/3 -f 102/374/62 106/380/63 100/375/63 -f 104/377/1 105/382/64 99/378/64 -f 106/380/63 101/987/1 95/381/1 -f 105/382/64 102/374/62 96/376/62 -f 103/383/65 104/377/1 98/379/1 -f 103/988/2 80/388/2 104/989/2 -f 80/388/2 79/355/2 106/990/2 -f 104/989/2 80/388/2 102/991/2 -f 79/355/2 89/992/2 88/993/2 -f 79/355/2 88/993/2 90/994/2 -f 102/991/2 105/995/2 104/989/2 -f 2/996/2 101/387/2 91/997/2 -f 101/387/2 106/990/2 79/355/2 -f 91/997/2 101/387/2 93/386/2 -f 106/990/2 102/991/2 80/388/2 -f 79/355/2 90/994/2 92/385/2 -f 79/355/2 92/385/2 101/387/2 -f 91/997/2 94/998/2 2/996/2 -f 80/388/55 103/383/65 97/384/65 -f 132/389/64 131/402/1 123/390/1 -f 130/392/65 129/999/6 121/393/6 -f 128/395/66 127/405/8 119/396/8 -f 126/398/67 125/401/7 117/399/7 -f 125/401/7 132/389/64 124/391/64 -f 131/402/1 130/392/65 122/394/65 -f 129/403/6 128/395/66 120/397/66 -f 127/405/8 126/398/67 118/400/67 -f 125/407/3 126/1000/3 129/408/3 -f 126/1000/3 127/1001/3 129/408/3 -f 127/1001/3 128/1002/3 129/408/3 -f 129/408/3 130/1003/3 131/1004/3 -f 131/1004/3 132/406/3 129/408/3 -f 146/234/31 147/1005/67 134/409/67 -f 134/409/67 147/1005/67 148/410/8 -f 149/412/66 150/238/38 137/237/38 -f 135/414/8 148/1006/8 149/412/66 -f 47/415/8 48/421/8 153/416/8 -f 48/421/8 49/1007/8 152/422/8 -f 151/1008/13 156/633/13 168/428/69 -f 156/633/13 185/426/13 168/428/69 -f 165/429/11 305/438/11 304/430/70 -f 167/432/71 166/1009/9 158/433/9 -f 158/433/9 166/1009/9 160/435/10 -f 163/437/73 300/1010/111 305/438/11 -f 159/434/71 157/462/112 161/439/50 -f 165/442/8 164/1011/8 162/1012/8 -f 162/1012/8 160/1013/8 166/440/8 -f 166/440/8 167/1014/8 161/441/8 -f 161/441/8 163/1015/8 165/442/8 -f 165/442/8 162/1012/8 166/440/8 -f 154/417/8 155/420/8 159/419/8 -f 158/424/8 151/423/8 47/415/8 -f 154/417/8 159/419/8 158/424/8 -f 46/444/7 151/1008/7 168/428/7 -f 51/446/1 50/445/1 168/428/1 -f 52/448/1 51/446/1 169/447/1 -f 171/450/1 53/1016/1 52/448/1 -f 168/451/69 172/1017/68 173/452/74 -f 170/454/75 174/455/75 175/40/75 -f 169/453/74 173/452/74 174/455/76 -f 154/456/77 178/463/77 179/457/78 -f 152/239/79 176/39/79 177/459/79 -f 155/458/78 179/457/78 180/461/12 -f 153/460/80 177/459/80 178/463/77 -f 181/466/1 183/1018/1 184/464/1 -f 184/464/1 182/1019/1 180/465/1 -f 180/465/1 185/1020/1 181/466/1 -f 172/1021/1 185/1020/1 173/468/1 -f 185/1020/1 180/465/1 173/468/1 -f 180/465/1 179/1022/1 178/467/1 -f 178/467/1 177/471/1 174/469/1 -f 175/470/1 174/469/1 177/471/1 -f 65/475/12 10/1023/12 49/473/49 -f 10/1023/12 9/974/3 53/344/49 -f 53/344/49 49/473/49 10/1023/12 -f 11/476/7 10/1023/12 65/475/12 -f 63/1024/23 64/474/3 1/479/81 -f 64/474/3 49/473/49 1/479/81 -f 7/1025/10 13/499/2 3/482/82 -f 13/499/2 68/480/2 3/482/82 -f 54/483/49 203/1026/3 204/484/23 -f 199/485/7 198/492/13 59/486/13 -f 197/488/2 196/44/10 57/242/10 -f 200/490/12 199/485/7 60/487/7 -f 198/492/13 197/488/2 58/489/2 -f 191/493/13 67/497/13 187/494/84 -f 186/496/84 187/494/84 67/497/13 -f 188/498/84 186/496/84 68/480/2 -f 12/500/13 189/1027/13 188/498/84 -f 67/497/13 191/493/13 192/501/85 -f 193/502/70 189/1027/13 12/500/13 -f 66/477/7 192/501/85 193/502/70 -f 55/49/83 204/484/23 56/241/71 -f 56/241/71 201/46/71 55/49/83 -f 195/45/71 207/243/71 208/503/23 -f 205/504/23 208/503/23 206/505/3 -f 203/1028/3 54/43/49 61/491/12 -f 54/43/49 194/58/49 200/490/12 -f 194/58/49 206/1029/3 200/490/12 -f 65/1030/1 64/1031/1 63/507/1 -f 63/507/1 209/1032/1 62/508/1 -f 62/508/1 68/1033/1 67/509/1 -f 67/509/1 66/1034/1 65/1030/1 -f 65/1030/1 63/507/1 67/509/1 -f 225/510/86 224/534/91 216/511/6 -f 223/513/87 222/525/92 214/514/3 -f 221/516/88 220/526/93 212/517/7 -f 219/519/89 218/522/90 210/520/2 -f 218/522/90 225/510/86 217/512/27 -f 224/523/91 223/513/87 215/515/23 -f 222/525/92 221/516/88 213/518/12 -f 220/526/93 219/519/89 211/521/13 -f 229/527/94 228/1035/98 220/526/93 -f 227/528/95 226/1036/96 218/522/90 -f 226/529/96 233/1037/99 225/510/86 -f 232/530/97 231/1038/101 223/513/87 -f 222/525/92 230/1039/100 229/531/94 -f 228/532/98 227/1040/95 219/519/89 -f 233/533/99 232/1041/97 224/534/91 -f 223/513/87 231/1042/101 230/535/100 -f 234/536/2 241/548/27 233/537/99 -f 240/539/6 239/550/23 231/540/101 -f 238/542/3 237/551/12 229/543/94 -f 236/545/7 235/552/13 227/546/95 -f 241/548/27 240/1043/6 232/549/97 -f 239/550/23 238/542/3 230/544/100 -f 237/551/12 236/545/7 228/547/98 -f 235/552/13 234/536/2 226/538/96 -f 248/553/102 255/577/102 249/554/2 -f 262/556/6 266/1044/6 267/557/27 -f 244/559/12 251/807/12 252/560/3 -f 260/562/3 259/1045/103 247/563/103 -f 245/561/3 252/560/3 253/565/104 -f 242/555/2 249/554/2 250/567/13 -f 260/562/3 264/564/3 265/569/23 -f 256/571/2 258/574/2 254/572/105 -f 263/558/27 267/557/27 258/574/2 -f 261/570/23 265/569/23 266/575/6 -f 247/563/103 259/1045/103 246/566/104 -f 257/573/105 254/572/105 255/577/102 -f 26/580/107 273/583/29 272/578/2 -f 272/578/2 271/309/20 27/579/106 -f 25/581/108 21/311/28 270/312/29 -f 275/582/109 274/1046/109 29/298/18 -f 29/298/18 274/1046/109 273/583/29 -f 273/584/42 279/602/36 278/585/41 -f 272/586/41 278/585/41 277/587/32 -f 271/588/32 277/587/32 276/589/31 -f 275/591/39 281/1047/38 280/592/37 -f 269/594/34 282/597/34 283/595/40 -f 268/590/31 276/589/31 282/597/34 -f 283/595/40 281/1048/38 275/598/39 -f 282/601/2 276/1049/2 281/599/2 -f 276/1049/2 277/1050/2 281/599/2 -f 277/1050/2 278/1051/2 279/1052/2 -f 279/1052/2 280/1053/2 277/1050/2 -f 280/1053/2 281/599/2 277/1050/2 -f 274/593/35 280/592/37 279/602/36 -f 299/603/64 298/616/1 290/604/1 -f 297/606/65 296/1054/6 288/607/6 -f 295/609/66 294/619/8 286/610/8 -f 293/612/67 292/615/7 284/613/7 -f 292/615/7 299/603/64 291/605/64 -f 298/616/1 297/606/65 289/608/65 -f 296/617/6 295/609/66 287/611/66 -f 294/619/8 293/612/67 285/614/67 -f 292/622/3 293/1055/3 294/1056/3 -f 294/1056/3 295/1057/3 296/620/3 -f 296/620/3 297/1058/3 298/621/3 -f 298/621/3 299/1059/3 292/622/3 -f 292/622/3 294/1056/3 296/620/3 -f 304/430/70 303/1060/110 162/623/84 -f 310/624/70 311/627/11 184/625/11 -f 311/627/11 306/631/111 182/628/73 -f 309/629/110 310/624/70 183/626/70 -f 300/632/111 163/437/73 161/439/50 -f 157/462/112 180/461/3 306/631/111 -f 180/461/3 182/628/73 306/631/111 -f 300/632/111 161/439/50 157/462/112 -f 156/633/72 160/1061/10 303/634/110 -f 160/1061/10 162/623/84 303/634/110 -f 181/630/84 185/426/2 309/635/110 -f 185/426/2 156/633/72 309/635/110 -f 15/636/26 319/640/114 318/637/113 -f 19/639/25 320/642/116 319/640/114 -f 19/639/25 20/644/21 321/641/115 -f 21/643/28 312/646/117 321/641/115 -f 25/645/108 313/648/118 312/646/117 -f 18/650/14 14/638/16 318/637/113 -f 18/650/14 317/651/120 316/652/121 -f 16/653/30 316/652/121 315/654/122 -f 24/656/45 17/655/53 315/654/122 -f 322/660/7 3/1062/7 1/661/7 -f 313/1063/1 322/660/1 323/662/1 -f 314/663/1 315/1064/1 317/664/1 -f 315/1064/1 316/1065/1 317/664/1 -f 313/1063/1 323/662/1 314/663/1 -f 321/665/1 312/1066/1 313/1063/1 -f 319/1067/1 320/1068/1 321/665/1 -f 317/664/1 318/1069/1 321/665/1 -f 318/1069/1 319/1067/1 321/665/1 -f 321/665/1 313/1063/1 314/663/1 -f 242/666/1 243/1070/1 431/667/1 -f 431/667/1 432/851/1 246/258/1 -f 432/851/1 244/1071/1 245/1072/1 -f 246/258/1 432/851/1 245/1072/1 -f 246/258/1 248/69/1 431/667/1 -f 350/677/129 351/683/135 331/678/130 -f 338/680/132 358/777/178 359/681/133 -f 351/683/135 352/769/138 332/684/136 -f 359/681/133 360/780/179 340/685/137 -f 352/686/138 353/691/129 333/687/131 -f 340/685/137 360/780/179 361/689/139 -f 353/691/129 354/698/135 334/692/130 -f 346/693/141 347/700/141 327/694/141 -f 341/690/140 361/689/139 362/696/142 -f 354/698/135 355/748/138 335/699/136 -f 347/700/143 348/705/149 328/701/144 -f 362/696/142 363/707/146 343/702/146 -f 348/705/149 349/773/138 329/706/136 -f 363/707/146 364/1073/8 344/708/8 -f 356/709/150 357/713/171 337/710/151 -f 349/711/138 350/677/129 330/679/131 -f 357/713/153 358/777/178 338/680/132 -f 367/715/156 366/714/155 328/701/144 -f 370/717/156 369/718/158 331/678/130 -f 373/720/156 372/721/158 334/692/130 -f 356/709/165 336/704/148 335/699/136 -f 354/698/135 385/766/175 386/765/174 -f 351/683/135 382/770/175 383/768/174 -f 348/705/149 379/774/177 380/772/174 -f 400/110/180 401/107/181 394/92/181 -f 403/104/182 404/102/183 397/98/183 -f 401/107/181 402/105/184 395/94/184 -f 399/111/1 400/110/180 393/91/180 -f 404/102/183 405/101/185 398/99/185 -f 402/105/184 403/104/182 396/96/182 -f 407/89/186 418/789/186 419/788/8 -f 408/264/187 417/791/187 418/789/186 -f 409/790/188 413/1074/188 417/791/187 -f 414/792/189 413/1074/188 409/790/188 -f 415/794/190 414/792/189 410/793/189 -f 416/796/191 415/794/190 411/795/190 -f 435/805/199 431/837/199 243/568/13 -f 244/559/12 432/828/200 434/806/200 -f 435/809/8 250/1075/8 249/1076/8 -f 249/1076/8 255/1077/8 435/809/8 -f 255/1077/8 253/810/8 435/809/8 -f 253/810/8 252/1078/8 434/808/8 -f 252/1078/8 251/1079/8 434/808/8 -f 425/811/1 426/826/1 448/812/1 -f 440/814/3 441/872/23 428/815/23 -f 437/817/13 438/825/7 425/811/7 -f 442/819/27 436/833/2 423/820/2 -f 441/822/23 444/1080/201 433/823/201 -f 438/825/7 439/830/12 426/826/12 -f 444/827/201 434/806/200 432/828/200 -f 439/830/12 440/814/3 427/816/3 -f 443/831/202 442/819/27 429/821/27 -f 436/833/2 437/817/13 424/818/13 -f 453/834/3 460/861/12 452/835/12 -f 431/837/199 435/805/199 443/831/202 -f 426/826/1 427/816/1 449/838/1 -f 428/815/1 450/1081/1 449/840/1 -f 425/811/1 447/1082/1 446/841/1 -f 424/818/1 446/1083/1 445/842/1 -f 423/820/1 445/1084/1 452/843/1 -f 430/844/1 429/821/1 452/845/1 -f 433/847/1 451/1085/1 450/848/1 -f 432/851/1 431/667/1 451/849/1 -f 431/667/1 430/1086/1 451/849/1 -f 459/852/7 458/863/13 450/853/13 -f 457/855/2 456/864/27 448/856/27 -f 455/858/6 454/865/23 446/859/23 -f 460/861/12 459/1087/7 451/862/7 -f 458/863/13 457/855/2 449/857/2 -f 456/864/27 455/858/6 447/860/6 -f 454/865/23 453/834/3 445/836/3 -f 454/866/8 455/1088/8 438/825/8 -f 453/867/8 454/1089/8 437/817/8 -f 460/868/8 453/1090/8 436/833/8 -f 438/825/8 455/1091/8 456/869/8 -f 439/830/8 456/1092/8 457/870/8 -f 457/871/8 458/1093/8 441/872/8 -f 443/873/8 459/1094/8 460/874/8 -f 458/875/8 459/1095/8 444/876/8 -f 435/809/8 434/808/8 459/877/8 -f 434/808/8 444/1096/8 459/877/8 -f 480/879/203 499/892/203 502/880/204 -f 488/882/7 493/896/64 492/883/64 -f 487/885/67 488/882/7 485/884/7 -f 491/887/7 496/891/7 495/888/67 -f 489/890/64 494/898/64 496/891/7 -f 480/879/203 490/889/67 495/888/67 -f 487/885/67 486/886/67 473/893/203 -f 479/895/205 492/883/64 493/896/64 -f 494/898/64 489/890/64 476/899/205 -f 503/901/206 500/900/205 476/899/205 -f 497/894/203 473/893/203 475/902/204 -f 479/895/205 498/897/205 504/904/206 -f 518/905/7 517/910/7 505/906/84 -f 512/162/2 511/161/2 506/907/84 -f 508/908/73 509/158/3 510/283/3 -f 508/908/73 507/909/73 517/910/7 -f 527/911/7 535/1097/7 536/912/12 -f 525/914/2 533/926/2 534/915/13 -f 523/917/6 531/927/6 532/918/27 -f 521/920/3 529/923/3 530/921/23 -f 528/913/12 536/912/12 529/923/3 -f 526/916/13 534/915/13 535/924/7 -f 524/919/27 532/918/27 533/926/2 -f 522/922/23 530/921/23 531/927/6 -f 542/928/207 544/194/207 543/193/208 -f 540/930/209 541/929/208 543/193/208 -f 544/194/207 542/928/207 539/932/210 -f 26/1098/8 27/1099/8 4/1100/8 -f 27/1099/8 2/1101/8 22/1102/8 -f 2/1101/8 94/1103/8 87/1104/8 -f 22/1102/8 4/1100/8 27/1099/8 -f 4/1100/8 23/934/8 26/1098/8 -f 2/1101/8 87/1104/8 22/1102/8 -f 325/936/8 26/1098/8 23/934/8 -f 421/1105/8 420/1106/8 422/1107/8 -f 420/1106/8 325/936/8 324/935/8 -f 324/935/8 422/1107/8 420/1106/8 -f 555/937/211 558/1108/211 557/938/212 -f 554/940/213 559/1109/213 560/941/214 -f 560/941/214 558/1108/211 555/937/211 -f 3/482/82 62/481/27 209/943/6 -f 565/944/6 209/943/6 63/945/23 -f 581/947/67 580/960/8 572/948/8 -f 579/950/66 578/1110/6 570/951/6 -f 577/953/65 576/963/1 568/954/1 -f 575/956/64 574/959/7 566/957/7 -f 574/959/7 581/947/67 573/949/67 -f 580/960/8 579/950/66 571/952/66 -f 578/961/6 577/953/65 569/955/65 -f 576/963/1 575/956/64 567/958/64 -f 574/965/2 575/1111/2 578/966/2 -f 575/1111/2 576/1112/2 578/966/2 -f 576/1112/2 577/1113/2 578/966/2 -f 578/966/2 579/1114/2 580/1115/2 -f 580/1115/2 581/964/2 578/966/2 -o Bullet -v -0.254503 -0.186101 -0.099231 -v -0.260095 -0.119658 -0.072726 -v -0.262212 -0.091329 -0.006836 -v -0.259614 -0.117709 0.059841 -v -0.253822 -0.183345 0.088247 -v -0.248230 -0.249788 0.061742 -v -0.246113 -0.278117 -0.004148 -v -0.248711 -0.251737 -0.070825 -v -0.129965 -0.175376 -0.099841 -v -0.135558 -0.108933 -0.073336 -v -0.137674 -0.080604 -0.007446 -v -0.135076 -0.106984 0.059231 -v -0.129284 -0.172620 0.087637 -v -0.123692 -0.239063 0.061132 -v -0.121575 -0.267392 -0.004758 -v -0.124174 -0.241012 -0.071436 -v 0.056954 -0.158829 -0.069510 -v 0.053226 -0.114534 -0.051840 -v 0.051815 -0.095648 -0.007913 -v 0.053547 -0.113234 0.036538 -v 0.057409 -0.156991 0.055475 -v 0.061137 -0.201287 0.037805 -v 0.062548 -0.220173 -0.006122 -v 0.060816 -0.202586 -0.050573 -v 0.181719 -0.147185 -0.007628 -v -1.375568 -0.283547 -0.156232 -v -1.384888 -0.172808 -0.112057 -v -1.388416 -0.125593 -0.002240 -v -1.384085 -0.169560 0.108889 -v -1.374432 -0.278953 0.156232 -v -1.365112 -0.389692 0.112057 -v -1.361584 -0.436907 0.002240 -v -1.365915 -0.392940 -0.108889 -v -0.628343 -0.219196 -0.159893 -v -0.637663 -0.108457 -0.115718 -v -0.641191 -0.061242 -0.005901 -v -0.636860 -0.105209 0.105228 -v -0.627207 -0.214602 0.152571 -v -0.617887 -0.325341 0.108395 -v -0.614359 -0.372556 -0.001422 -v -0.618690 -0.328589 -0.112550 -v -0.254616 -0.186561 -0.130478 -v -0.262073 -0.097970 -0.095137 -v -0.264895 -0.060198 -0.007284 -v -0.261431 -0.095371 0.081619 -v -0.253708 -0.182886 0.119494 -v -0.246252 -0.271477 0.084153 -v -0.243429 -0.309249 -0.003700 -v -0.246894 -0.274075 -0.092603 -v -0.503692 -0.208011 -0.129257 -v -0.511148 -0.119420 -0.093917 -v -0.513970 -0.081648 -0.006063 -v -0.510506 -0.116821 0.082840 -v -0.502783 -0.204336 0.120714 -v -0.495327 -0.292927 0.085374 -v -0.492504 -0.330699 -0.002480 -v -0.495969 -0.295526 -0.091383 -vt 0.776062 0.513514 -vt 0.772201 0.505791 -vt 0.776062 0.505791 -vt 0.799228 0.513514 -vt 0.795367 0.505791 -vt 0.799228 0.505791 -vt 0.791506 0.513514 -vt 0.787645 0.505791 -vt 0.791506 0.505791 -vt 0.783784 0.513514 -vt 0.779923 0.505791 -vt 0.783784 0.505791 -vt 0.772201 0.513514 -vt 0.768340 0.505791 -vt 0.795367 0.513514 -vt 0.787645 0.513514 -vt 0.779923 0.513514 -vt 0.772201 0.525097 -vt 0.768340 0.513514 -vt 0.795367 0.525097 -vt 0.787645 0.525097 -vt 0.779923 0.525097 -vt 0.776062 0.525097 -vt 0.791506 0.525097 -vt 0.783784 0.525097 -vt 0.774131 0.532819 -vt 0.781853 0.532819 -vt 0.785714 0.532819 -vt 0.793436 0.532819 -vt 0.768340 0.525097 -vt 0.770270 0.532819 -vt 0.777992 0.532819 -vt 0.789575 0.532819 -vt 0.799228 0.525097 -vt 0.797297 0.532819 -vt 0.745174 0.494208 -vt 0.698842 0.501930 -vt 0.698842 0.494208 -vt 0.745174 0.509652 -vt 0.698842 0.517375 -vt 0.698842 0.509652 -vt 0.745174 0.525097 -vt 0.698842 0.532819 -vt 0.698842 0.525097 -vt 0.745174 0.532819 -vt 0.698842 0.540541 -vt 0.745174 0.486486 -vt 0.698842 0.486486 -vt 0.745174 0.501930 -vt 0.745174 0.517375 -vt 0.745174 0.540541 -vt 0.698842 0.548263 -vt 0.768340 0.517375 -vt 0.752896 0.509652 -vt 0.768340 0.509652 -vt 0.768340 0.532819 -vt 0.752896 0.525097 -vt 0.768340 0.525097 -vt 0.768340 0.540541 -vt 0.752896 0.532819 -vt 0.768340 0.494208 -vt 0.752896 0.486486 -vt 0.768340 0.486486 -vt 0.752896 0.501930 -vt 0.768340 0.501930 -vt 0.752896 0.517375 -vt 0.768340 0.548263 -vt 0.752896 0.540541 -vt 0.752896 0.494208 -vt 0.752896 0.494981 -vt 0.752896 0.501158 -vt 0.752896 0.502703 -vt 0.752896 0.508880 -vt 0.752896 0.516602 -vt 0.752896 0.524324 -vt 0.752896 0.525869 -vt 0.752896 0.532046 -vt 0.752896 0.539768 -vt 0.752896 0.547490 -vt 0.745174 0.548263 -vt 0.752896 0.493436 -vt 0.795367 0.501930 -vt 0.787645 0.494208 -vt 0.795367 0.486486 -vt 0.777992 0.486486 -vt 0.768340 0.496139 -vt 0.777992 0.505791 -vt 0.752896 0.548263 -vt 0.752896 0.510425 -vt 0.752896 0.518147 -vt 0.752896 0.533591 -vt 0.752896 0.541313 -vt 0.752896 0.487259 -vt 0.803089 0.494208 -vt 0.800827 0.499669 -vt 0.789907 0.499669 -vt 0.789907 0.488748 -vt 0.800827 0.488748 -vt 0.784818 0.502964 -vt 0.787645 0.496139 -vt 0.784818 0.489314 -vt 0.771167 0.489314 -vt 0.771167 0.502964 -vn 0.0770 -0.0077 -0.9970 -vn 0.0581 -0.7148 -0.6969 -vn -0.0036 -0.0147 -0.9999 -vn 0.1662 -0.9860 0.0139 -vn 0.0633 -0.6940 0.7172 -vn 0.0859 -0.9962 0.0143 -vn 0.0842 0.0216 0.9962 -vn -0.0581 0.7148 0.6969 -vn 0.0036 0.0147 0.9999 -vn -0.0050 0.9999 -0.0147 -vn -0.0633 0.6940 -0.7172 -vn -0.0859 0.9962 -0.0143 -vn 0.1385 -0.7055 -0.6950 -vn 0.1437 -0.6848 0.7144 -vn 0.0226 0.7194 0.6942 -vn 0.0175 0.6987 -0.7152 -vn 0.3534 -0.6564 -0.6665 -vn 0.3583 -0.6366 0.6829 -vn 0.2425 0.7078 0.6635 -vn 0.2376 0.6879 -0.6858 -vn 0.2945 0.0116 -0.9556 -vn 0.3014 0.0397 0.9527 -vn 0.2160 0.9763 -0.0151 -vn 0.9963 0.0858 -0.0049 -vn 0.3799 -0.9250 0.0122 -vn 0.1811 -0.6789 0.7115 -vn 0.0605 0.7199 0.6914 -vn 0.0554 0.6993 -0.7127 -vn 0.1147 -0.0044 -0.9934 -vn 0.2035 -0.9790 0.0137 -vn 0.1219 0.0248 0.9922 -vn 0.0330 0.9993 -0.0148 -vn 0.1760 -0.6996 -0.6925 -vn 0.0678 0.7199 0.6907 -vn 0.0627 0.6993 -0.7121 -vn 0.1219 -0.0038 -0.9925 -vn 0.2107 -0.9775 0.0136 -vn 0.1291 0.0254 0.9913 -vn 0.0403 0.9991 -0.0148 -vn 0.1832 -0.6983 -0.6920 -vn 0.1883 -0.6777 0.7108 -vn -0.9963 -0.0858 0.0049 -s 1 -f 590/1116/215 589/1117/216 582/1118/217 -f 596/1119/218 587/1120/219 588/1121/220 -f 594/1122/221 585/1123/222 586/1124/223 -f 592/1125/224 583/1126/225 584/1127/226 -f 597/1128/227 588/1129/220 589/1117/216 -f 595/1130/228 586/1124/223 587/1120/219 -f 593/1131/229 584/1127/226 585/1123/222 -f 591/1132/230 582/1118/217 583/1126/225 -f 605/1133/231 596/1134/218 597/1128/227 -f 603/1135/232 594/1122/221 595/1130/228 -f 601/1136/233 592/1125/224 593/1131/229 -f 599/1137/234 590/1116/215 591/1132/230 -f 598/1138/235 597/1128/227 590/1116/215 -f 596/1119/218 603/1135/232 595/1130/228 -f 602/1139/236 593/1131/229 594/1122/221 -f 600/1140/237 591/1132/230 592/1125/224 -f 605/1133/231 598/1138/235 606/1141/238 -f 599/1137/234 600/1140/237 606/1142/238 -f 600/1140/237 601/1136/233 606/1143/238 -f 602/1139/236 603/1135/232 606/1144/238 -f 604/1145/239 605/1133/231 606/1146/238 -f 598/1138/235 599/1137/234 606/1147/238 -f 601/1136/233 602/1139/236 606/1148/238 -f 603/1135/232 604/1149/239 606/1150/238 -f 620/1151/240 611/1152/223 612/1153/219 -f 618/1154/241 609/1155/226 610/1156/222 -f 616/1157/242 607/1158/217 608/1159/225 -f 615/1160/243 614/1161/216 607/1158/217 -f 621/1162/244 612/1153/219 613/1163/220 -f 619/1164/245 610/1156/222 611/1152/223 -f 617/1165/246 608/1159/225 609/1155/226 -f 622/1166/247 613/1167/220 614/1161/216 -f 625/1168/226 634/1169/248 626/1170/222 -f 623/1171/217 632/1172/249 624/1173/225 -f 630/1174/216 631/1175/250 623/1171/217 -f 628/1176/219 637/1177/251 629/1178/220 -f 626/1170/222 635/1179/252 627/1180/223 -f 624/1173/225 633/1181/253 625/1168/226 -f 629/1182/220 638/1183/254 630/1174/216 -f 627/1180/223 636/1184/255 628/1176/219 -f 619/1164/245 636/1185/255 635/1186/252 -f 618/1154/241 635/1187/252 634/1188/248 -f 618/1154/241 633/1189/253 617/1165/246 -f 617/1165/246 632/1190/249 616/1157/242 -f 615/1160/243 632/1191/249 631/1192/250 -f 615/1160/243 638/1193/254 622/1166/247 -f 622/1166/247 637/1194/251 621/1195/244 -f 621/1162/244 636/1196/255 620/1151/240 -f 625/1197/238 627/1198/238 629/1199/238 -f 613/1200/256 611/1201/256 609/1202/256 -f 590/1116/215 597/1128/227 589/1117/216 -f 596/1119/218 595/1130/228 587/1120/219 -f 594/1122/221 593/1131/229 585/1123/222 -f 592/1125/224 591/1132/230 583/1126/225 -f 597/1128/227 596/1134/218 588/1129/220 -f 595/1130/228 594/1122/221 586/1124/223 -f 593/1131/229 592/1125/224 584/1127/226 -f 591/1132/230 590/1116/215 582/1118/217 -f 605/1133/231 604/1145/239 596/1134/218 -f 603/1135/232 602/1139/236 594/1122/221 -f 601/1136/233 600/1140/237 592/1125/224 -f 599/1137/234 598/1138/235 590/1116/215 -f 598/1138/235 605/1133/231 597/1128/227 -f 596/1119/218 604/1149/239 603/1135/232 -f 602/1139/236 601/1136/233 593/1131/229 -f 600/1140/237 599/1137/234 591/1132/230 -f 620/1151/240 619/1164/245 611/1152/223 -f 618/1154/241 617/1165/246 609/1155/226 -f 616/1157/242 615/1160/243 607/1158/217 -f 615/1160/243 622/1166/247 614/1161/216 -f 621/1162/244 620/1151/240 612/1153/219 -f 619/1164/245 618/1154/241 610/1156/222 -f 617/1165/246 616/1157/242 608/1159/225 -f 622/1166/247 621/1195/244 613/1167/220 -f 625/1168/226 633/1181/253 634/1169/248 -f 623/1171/217 631/1175/250 632/1172/249 -f 630/1174/216 638/1183/254 631/1175/250 -f 628/1176/219 636/1184/255 637/1177/251 -f 626/1170/222 634/1169/248 635/1179/252 -f 624/1173/225 632/1172/249 633/1181/253 -f 629/1182/220 637/1203/251 638/1183/254 -f 627/1180/223 635/1179/252 636/1184/255 -f 619/1164/245 620/1151/240 636/1185/255 -f 618/1154/241 619/1164/245 635/1187/252 -f 618/1154/241 634/1204/248 633/1189/253 -f 617/1165/246 633/1205/253 632/1190/249 -f 615/1160/243 616/1157/242 632/1191/249 -f 615/1160/243 631/1206/250 638/1193/254 -f 622/1166/247 638/1207/254 637/1194/251 -f 621/1162/244 637/1208/251 636/1196/255 -f 623/1209/238 624/1210/238 625/1197/238 -f 625/1197/238 626/1211/238 627/1198/238 -f 627/1198/238 628/1212/238 629/1199/238 -f 629/1199/238 630/1213/238 623/1209/238 -f 623/1209/238 625/1197/238 629/1199/238 -f 609/1202/256 608/1214/256 607/1215/256 -f 607/1215/256 614/1216/256 613/1200/256 -f 613/1200/256 612/1217/256 611/1201/256 -f 611/1201/256 610/1218/256 609/1202/256 -f 609/1202/256 607/1215/256 613/1200/256 -o Guide_And_Bolt -v 0.125000 0.625000 0.156250 -v 0.125000 0.468750 0.093750 -v 0.125000 0.343750 0.281250 -v 0.125000 0.218750 0.343750 -v 0.125000 0.625000 -0.156250 -v 0.125000 0.468750 -0.093750 -v 0.125000 0.343750 -0.281250 -v 0.125000 0.218750 -0.343750 -v 0.125000 0.218750 0.093750 -v 0.125000 0.093750 0.218750 -v 0.125000 0.218750 -0.093750 -v 0.125000 0.093750 -0.218750 -v -1.750000 0.218750 0.343750 -v -1.750000 0.343750 0.281250 -v -1.750000 0.468750 0.093750 -v -1.750000 0.625000 0.156250 -v 0.875000 0.218750 0.093750 -v 0.875000 0.093750 0.218750 -v 0.875000 0.218750 -0.093750 -v 0.875000 0.093750 -0.218750 -v 0.875000 -0.093750 0.218750 -v 0.875000 -0.093750 -0.218750 -v 0.875000 -0.218750 0.093750 -v 0.875000 -0.218750 -0.093750 -v 0.125000 0.735485 -0.110486 -v 0.125000 0.781250 0.000000 -v 0.125000 0.514515 0.110486 -v 0.125000 0.468750 0.000000 -v 0.125000 0.514515 -0.110485 -v 5.125000 0.625000 -0.156250 -v 5.125000 0.735485 -0.110486 -v 5.125000 0.781250 0.000000 -v 5.125000 0.735485 0.110486 -v 5.125000 0.625000 0.156250 -v 5.125000 0.514515 0.110486 -v 5.125000 0.468750 0.000000 -v 5.125000 0.514515 -0.110485 -vt 0.347490 0.509652 -vt 0.335907 0.494208 -vt 0.347490 0.498069 -vt 0.355212 0.521236 -vt 0.355212 0.486486 -vt 0.370656 0.490348 -vt 0.362934 0.498069 -vt 0.362934 0.482625 -vt 0.370656 0.517375 -vt 0.362934 0.525097 -vt 0.362934 0.509652 -vt 0.335907 0.517375 -vt 0.220077 0.505791 -vt 0.335907 0.505791 -vt 0.262548 0.471042 -vt 0.208494 0.482625 -vt 0.208494 0.471042 -vt 0.262548 0.447876 -vt 0.208494 0.459459 -vt 0.208494 0.447876 -vt 0.335907 0.490348 -vt 0.220077 0.482625 -vt 0.335907 0.482625 -vt 0.262548 0.459459 -vt 0.220077 0.490348 -vt 0.270270 0.474903 -vt 0.262548 0.455598 -vt 0.281853 0.447876 -vt 0.598456 0.440154 -vt 0.289575 0.447876 -vt 0.289575 0.440154 -vt 0.289575 0.471042 -vt 0.598456 0.463320 -vt 0.598456 0.471042 -vt 0.598456 0.432432 -vt 0.289575 0.432432 -vt 0.598456 0.447876 -vt 0.289575 0.455598 -vt 0.289575 0.463320 -vt 0.598456 0.455598 -vt 0.598456 0.461390 -vt 0.608108 0.451737 -vt 0.617761 0.461390 -vt 0.335907 0.513514 -vt 0.220077 0.517375 -vt 0.262548 0.482625 -vt 0.262548 0.467181 -vt 0.270270 0.447876 -vt 0.289575 0.455598 -vt 0.289575 0.467181 -vt 0.281853 0.474903 -vt 0.598456 0.455598 -vt 0.289575 0.455598 -vt 0.614933 0.468215 -vt 0.608108 0.471042 -vt 0.601283 0.468215 -vt 0.601283 0.454565 -vt 0.614933 0.454565 -vn 1.0000 0.0000 0.0000 -vn 0.0000 -0.3714 0.9285 -vn 0.0000 0.2966 0.9550 -vn 0.0000 0.9239 -0.3827 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 0.7071 0.7071 -vn 0.0000 0.9239 0.3827 -vn 0.0000 0.6618 0.7497 -vn 0.0000 0.4472 0.8944 -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 -0.9239 -0.3827 -vn 0.0000 -0.3827 0.9239 -vn 0.0000 0.3827 -0.9239 -vn -1.0000 0.0000 0.0000 -s 1 -f 644/1219/257 639/1220/257 640/1221/257 -f 645/1222/257 640/1221/257 641/1223/257 -f 648/1224/257 647/1225/257 642/1226/257 -f 650/1227/257 646/1228/257 649/1229/257 -f 649/1229/257 646/1228/257 645/1222/257 -f 639/1230/258 653/1231/259 640/1232/259 -f 657/1233/260 650/1234/261 649/1235/260 -f 656/1236/262 647/1237/263 648/1238/262 -f 641/1239/264 651/1240/265 642/1241/265 -f 655/1242/263 649/1235/260 647/1237/263 -f 640/1232/259 652/1243/264 641/1239/264 -f 655/1244/257 659/1245/257 662/1246/257 -f 674/1247/266 665/1248/267 666/1249/266 -f 670/1250/260 663/1251/261 664/1252/260 -f 675/1253/268 666/1249/266 667/1254/268 -f 673/1255/267 639/1256/269 665/1248/267 -f 669/1257/261 643/1258/270 663/1251/261 -f 674/1259/271 672/1260/271 670/1261/271 -f 644/1219/257 643/1262/257 639/1220/257 -f 645/1222/257 644/1219/257 640/1221/257 -f 645/1222/257 641/1223/257 647/1225/257 -f 641/1223/257 642/1226/257 647/1225/257 -f 647/1225/257 649/1229/257 645/1222/257 -f 639/1230/258 654/1263/258 653/1231/259 -f 657/1233/260 658/1264/261 650/1234/261 -f 656/1236/262 655/1242/263 647/1237/263 -f 641/1239/264 652/1243/264 651/1240/265 -f 655/1242/263 657/1233/260 649/1235/260 -f 640/1232/259 653/1231/259 652/1243/264 -f 655/1244/257 656/1265/257 659/1245/257 -f 659/1245/257 661/1266/257 662/1246/257 -f 662/1246/257 660/1267/257 658/1268/257 -f 658/1268/257 657/1269/257 662/1246/257 -f 657/1269/257 655/1244/257 662/1246/257 -f 674/1247/266 673/1255/267 665/1248/267 -f 670/1250/260 669/1257/261 663/1251/261 -f 675/1253/268 674/1247/266 666/1249/266 -f 673/1255/267 672/1270/269 639/1256/269 -f 669/1257/261 668/1271/270 643/1258/270 -f 670/1261/271 669/1272/271 668/1273/271 -f 668/1273/271 675/1274/271 670/1261/271 -f 675/1274/271 674/1259/271 670/1261/271 -f 674/1259/271 673/1275/271 672/1260/271 -f 672/1260/271 671/1276/271 670/1261/271 -o Handle -v 5.218752 0.545839 0.034864 -v 5.343752 0.545839 0.034864 -v 5.156252 0.593674 -0.080621 -v 5.343752 0.665427 -0.253848 -v 5.156252 0.713263 -0.369333 -v 5.343752 0.737180 -0.427076 -v 5.593752 0.665427 -0.253848 -v 5.593752 0.737180 -0.427076 -v 5.218752 0.656323 0.080628 -v 5.343752 0.656323 0.080628 -v 5.156252 0.704159 -0.034857 -v 5.343752 0.775912 -0.208084 -v 5.156252 0.823748 -0.323569 -v 5.343752 0.847665 -0.381311 -v 5.593752 0.775912 -0.208084 -v 5.593752 0.847665 -0.381311 -v 5.656252 0.905408 -0.357394 -v 5.656252 0.679438 -0.450993 -v 6.031252 0.905408 -0.357394 -v 6.031252 0.679438 -0.450993 -v 5.656252 0.833655 -0.184166 -v 5.656252 0.607685 -0.277766 -v 5.968752 0.833655 -0.184166 -v 5.968752 0.607685 -0.277766 -vt 0.277992 0.416988 -vt 0.285714 0.409266 -vt 0.285714 0.416988 -vt 0.258687 0.409266 -vt 0.277992 0.409266 -vt 0.243243 0.416988 -vt 0.258687 0.416988 -vt 0.343629 0.420849 -vt 0.339768 0.416988 -vt 0.339768 0.409266 -vt 0.258687 0.378378 -vt 0.239382 0.389961 -vt 0.235521 0.378378 -vt 0.239382 0.436293 -vt 0.258687 0.447876 -vt 0.235521 0.447876 -vt 0.243243 0.409266 -vt 0.343629 0.405405 -vt 0.366795 0.405405 -vt 0.366795 0.420849 -vt 0.258687 0.389961 -vt 0.258687 0.436293 -vt 0.277992 0.436293 -vt 0.289575 0.424710 -vt 0.262548 0.447876 -vt 0.277992 0.447876 -vt 0.277992 0.389961 -vt 0.289575 0.382239 -vt 0.289575 0.401544 -vt 0.262548 0.378378 -vt 0.277992 0.378378 -vt 0.324324 0.416988 -vt 0.293436 0.416988 -vt 0.312741 0.409266 -vt 0.312741 0.416988 -vt 0.293436 0.409266 -vt 0.324324 0.409266 -vt 0.239382 0.405405 -vt 0.239382 0.420849 -vt 0.262548 0.389961 -vt 0.262548 0.436293 -vt 0.220077 0.420849 -vt 0.220077 0.405405 -vt 0.208494 0.420849 -vt 0.289575 0.444015 -vt 0.208494 0.405405 -vn 0.0000 -0.3827 0.9239 -vn 1.0000 0.0000 0.0000 -vn 0.0000 0.3827 -0.9239 -vn -0.0000 0.9239 0.3827 -vn 0.0000 -0.9239 -0.3827 -vn -0.3827 -0.8536 -0.3536 -vn -0.3827 0.8536 0.3536 -vn -0.1602 0.3777 -0.9119 -vn -0.9732 -0.0879 0.2123 -vn -1.0000 -0.0000 0.0000 -vn -0.8944 -0.1711 0.4132 -vn -0.3162 0.3630 -0.8765 -vn -0.7071 0.6533 0.2706 -vn -0.7071 -0.6533 -0.2706 -vn 0.5847 -0.3104 0.7495 -vn 0.9487 -0.1210 0.2922 -s off -f 677/1277/272 684/1278/272 676/1279/272 -f 677/1277/273 687/1280/273 685/1281/273 -f 682/1282/272 687/1280/272 679/1283/272 -f 693/1284/274 683/1285/274 691/1286/274 -f 692/1287/275 698/1288/275 694/1289/275 -f 699/1290/276 693/1291/276 695/1292/276 -f 677/1277/272 685/1281/272 684/1278/272 -f 677/1277/273 679/1283/273 687/1280/273 -f 682/1282/272 690/1293/272 687/1280/272 -f 691/1286/274 692/1294/274 693/1284/274 -f 692/1294/274 694/1295/274 693/1284/274 -f 694/1295/274 695/1296/274 693/1284/274 -f 692/1287/275 696/1297/275 698/1288/275 -f 699/1290/276 697/1298/276 693/1291/276 -s 1 -f 679/1299/276 677/1277/276 678/1300/276 -f 683/1301/277 679/1299/276 681/1302/276 -f 687/1303/275 688/1304/275 686/1305/275 -f 687/1303/275 691/1306/278 689/1307/275 -f 681/1308/279 691/1286/274 683/1285/274 -f 678/1309/280 688/1310/281 680/1311/281 -f 676/1279/282 686/1312/280 678/1309/280 -f 680/1311/283 689/1313/279 681/1308/279 -f 696/1314/272 682/1282/272 697/1315/272 -f 696/1297/284 691/1306/278 690/1316/278 -f 683/1301/277 697/1298/285 682/1317/277 -f 696/1314/272 699/1318/286 698/1319/286 -f 695/1320/287 698/1319/286 699/1318/286 -f 677/1277/276 676/1279/276 678/1300/276 -f 678/1300/276 680/1321/276 679/1299/276 -f 680/1321/276 681/1302/276 679/1299/276 -f 683/1301/277 682/1317/277 679/1299/276 -f 686/1305/275 684/1278/275 685/1281/275 -f 687/1303/275 689/1307/275 688/1304/275 -f 686/1305/275 685/1281/275 687/1303/275 -f 687/1303/275 690/1316/278 691/1306/278 -f 681/1308/279 689/1313/279 691/1286/274 -f 678/1309/280 686/1312/280 688/1310/281 -f 676/1279/282 684/1278/282 686/1312/280 -f 680/1311/283 688/1310/283 689/1313/279 -f 696/1314/272 690/1293/272 682/1282/272 -f 696/1297/284 692/1287/284 691/1306/278 -f 683/1301/277 693/1291/285 697/1298/285 -f 696/1314/272 697/1315/272 699/1318/286 -f 695/1320/287 694/1322/287 698/1319/286 -o Plug -v 5.437500 0.625000 -0.156250 -v 5.437500 0.735485 -0.110486 -v 5.125000 0.781250 -0.000000 -v 5.125000 0.735485 0.110486 -v 5.125000 0.625000 0.156250 -v 5.125000 0.514515 0.110486 -v 5.125000 0.468750 -0.000000 -v 5.125000 0.514515 -0.110485 -v 6.000000 0.625000 -0.156250 -v 6.000000 0.735485 -0.110486 -v 6.000000 0.781250 -0.000000 -v 5.687500 0.514515 0.110486 -v 5.687500 0.625000 0.156250 -v 5.125000 0.735485 -0.110486 -v 5.125000 0.625000 -0.156250 -v 6.000000 0.514515 -0.110485 -v 6.000000 0.514515 0.110486 -v 6.000000 0.625000 0.156250 -v 6.000000 0.735485 0.110486 -v 6.000000 0.468750 -0.000000 -vt 0.181467 0.602317 -vt 0.193050 0.598456 -vt 0.189189 0.602317 -vt 0.208494 0.579151 -vt 0.193050 0.598456 -vt 0.193050 0.563707 -vt 0.181467 0.509652 -vt 0.189189 0.486486 -vt 0.189189 0.509652 -vt 0.204633 0.602317 -vt 0.196911 0.602317 -vt 0.177606 0.579151 -vt 0.193050 0.563707 -vt 0.194084 0.547229 -vt 0.180433 0.547229 -vt 0.180433 0.560879 -vt 0.177606 0.598456 -vt 0.208494 0.598456 -vt 0.181467 0.486486 -vt 0.194084 0.560879 -vt 0.196911 0.554054 -vt 0.187259 0.544402 -vt 0.177606 0.554054 -vt 0.187259 0.563707 -vt 0.196911 0.544402 -vt 0.196911 0.490348 -vt 0.189189 0.544402 -vt 0.173745 0.544402 -vt 0.173745 0.490348 -vt 0.189189 0.490348 -vt 0.181467 0.490348 -vt 0.181467 0.544402 -vn -1.0000 0.0000 0.0000 -vn -0.0000 0.9239 0.3827 -vn -0.7560 -0.2505 0.6048 -vn 0.0000 -0.9239 -0.3827 -vn 1.0000 0.0000 0.0000 -vn -0.0000 0.9239 -0.3827 -vn -0.0000 0.7972 -0.6037 -vn -0.0000 0.7071 -0.7071 -vn 0.0000 -0.1368 -0.9906 -vn 0.0000 -0.3827 -0.9239 -vn 0.0000 -0.0000 -1.0000 -s off -f 702/1323/288 704/1324/288 703/1325/288 -f 700/1326/289 705/1327/289 711/1328/289 -f 700/1329/290 712/1330/290 701/1331/290 -f 705/1327/288 707/1332/288 706/1333/288 -f 704/1324/291 701/1334/291 712/1335/291 -f 718/1336/292 716/1337/292 715/1338/292 -f 702/1323/288 713/1339/288 704/1324/288 -f 700/1326/289 714/1340/289 705/1327/289 -f 700/1329/290 711/1341/290 712/1330/290 -f 705/1327/288 714/1340/288 707/1332/288 -f 704/1324/291 713/1339/291 701/1334/291 -f 709/1342/292 710/1343/292 718/1336/292 -f 718/1336/292 717/1344/292 716/1337/292 -f 716/1337/292 719/1345/292 715/1338/292 -f 715/1338/292 708/1346/292 709/1342/292 -f 709/1342/292 718/1336/292 715/1338/292 -s 1 -f 710/1347/293 701/1331/294 702/1348/293 -f 709/1349/295 700/1329/296 701/1331/294 -f 700/1329/296 715/1350/297 707/1351/297 -f 701/1331/294 713/1352/293 702/1348/293 -f 700/1329/296 707/1351/297 714/1353/297 -f 710/1347/293 709/1349/295 701/1331/294 -f 709/1349/295 708/1354/298 700/1329/296 -f 700/1329/296 708/1354/298 715/1350/297 -o Mag_Paddle -v -1.505856 -1.307663 0.093750 -v -1.505856 -1.307663 -0.093750 -v -1.562500 -1.281250 -0.093750 -v -1.562500 -1.281250 0.093750 -v -1.585097 -1.477596 0.093750 -v -1.585097 -1.477596 -0.093750 -v -1.641741 -1.451182 -0.093750 -v -1.641741 -1.451182 0.093750 -v -1.611510 -1.534240 -0.156250 -v -1.668154 -1.507827 -0.156250 -v -1.611510 -1.534240 0.156250 -v -1.668154 -1.507827 0.156250 -v -1.717165 -1.760817 -0.156250 -v -1.773809 -1.734404 -0.156250 -v -1.717165 -1.760817 0.156250 -v -1.773809 -1.734404 0.156250 -vt 0.725869 0.664093 -vt 0.737452 0.652510 -vt 0.737452 0.664093 -vt 0.749035 0.652510 -vt 0.760618 0.664093 -vt 0.749035 0.664093 -vt 0.741313 0.652510 -vt 0.745174 0.664093 -vt 0.741313 0.664093 -vt 0.764479 0.664093 -vt 0.768340 0.652510 -vt 0.768340 0.664093 -vt 0.745174 0.633205 -vt 0.764479 0.633205 -vt 0.764479 0.648649 -vt 0.741313 0.648649 -vt 0.722008 0.648649 -vt 0.725869 0.652510 -vt 0.760618 0.652510 -vt 0.745174 0.652510 -vt 0.764479 0.652510 -vt 0.745174 0.648649 -vt 0.722008 0.633205 -vt 0.741313 0.633205 -vt 0.768340 0.648649 -vt 0.768340 0.633205 -vt 0.745174 0.629344 -vt 0.764479 0.629344 -vn 0.9063 -0.4226 0.0000 -vn -0.9063 0.4226 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 0.1617 0.3468 -0.9239 -vn 0.2988 0.6409 -0.7071 -vn 0.2988 0.6409 0.7071 -vn 0.1617 0.3468 0.9239 -vn -0.4226 -0.9063 0.0000 -s off -f 720/1355/299 725/1356/299 721/1357/299 -f 726/1358/300 723/1359/300 722/1360/300 -f 725/1361/301 722/1362/301 721/1363/301 -f 723/1364/302 724/1365/302 720/1366/302 -f 733/1367/300 735/1368/300 731/1369/300 -f 728/1370/299 725/1356/299 730/1371/299 -f 720/1355/299 724/1372/299 725/1356/299 -f 726/1358/300 727/1373/300 723/1359/300 -f 725/1361/301 726/1374/301 722/1362/301 -f 723/1364/302 727/1375/302 724/1365/302 -f 731/1369/300 727/1373/300 726/1358/300 -f 726/1358/300 729/1376/300 731/1369/300 -f 729/1376/300 733/1367/300 731/1369/300 -f 725/1356/299 724/1372/299 730/1371/299 -f 730/1371/299 734/1377/299 732/1378/299 -f 732/1378/299 728/1370/299 730/1371/299 -s 1 -f 728/1370/303 726/1374/304 725/1361/304 -f 727/1375/305 730/1379/306 724/1365/305 -f 731/1369/306 734/1380/302 730/1379/306 -f 732/1378/301 729/1376/303 728/1370/303 -f 732/1381/307 735/1368/307 733/1367/307 -f 728/1370/303 729/1376/303 726/1374/304 -f 727/1375/305 731/1369/306 730/1379/306 -f 731/1369/306 735/1368/302 734/1380/302 -f 732/1378/301 733/1367/301 729/1376/303 -f 732/1381/307 734/1382/307 735/1368/307 -o Magazine -v -1.312500 -3.843750 0.312500 -v -1.312500 -3.843750 -0.312500 -v 0.437500 -3.593750 0.312500 -v 0.437500 -3.593750 -0.312500 -v -1.437500 -0.218750 0.312500 -v -1.437500 -0.218750 -0.312500 -v 0.250000 -0.218750 0.312500 -v 0.250000 -0.218750 -0.312500 -v -1.437500 -0.093750 -0.187500 -v -1.437500 -0.093750 0.187500 -v -1.437500 -0.093750 0.125000 -v -1.437500 -0.093750 -0.125000 -v -1.437500 -0.218750 -0.125000 -v -1.437500 -0.218750 0.125000 -v -0.562500 -0.218750 0.312500 -v -0.562500 -0.218750 -0.312500 -v -0.687500 -0.093750 -0.187500 -v -0.687500 -0.093750 0.187500 -v -0.687500 -0.093750 0.125000 -v -0.687500 -0.093750 -0.125000 -v -0.562500 -0.218750 -0.125000 -v -0.562500 -0.218750 0.125000 -vt 0.420849 0.328185 -vt 0.312741 0.289575 -vt 0.420849 0.289575 -vt 0.312741 0.328185 -vt 0.104247 0.289575 -vt 0.698842 0.328185 -vt 0.698842 0.316602 -vt 0.749035 0.328185 -vt 0.698842 0.289575 -vt 0.749035 0.289575 -vt 0.698842 0.301158 -vt 0.675676 0.316602 -vt 0.667954 0.359073 -vt 0.667954 0.316602 -vt 0.683398 0.359073 -vt 0.675676 0.316602 -vt 0.683398 0.316602 -vt 0.652510 0.297297 -vt 0.644788 0.301158 -vt 0.644788 0.289575 -vt 0.644788 0.316602 -vt 0.652510 0.320463 -vt 0.644788 0.328185 -vt 0.104247 0.328185 -vt 0.675676 0.366795 -vt 0.675676 0.366795 -vt 0.652510 0.301158 -vt 0.652510 0.316602 -vt 0.656371 0.243243 -vt 0.656371 0.289575 -vt 0.687259 0.362934 -vt 0.687259 0.316602 -vt 0.656371 0.374517 -vt 0.644788 0.382239 -vt 0.664093 0.362934 -vt 0.664093 0.316602 -vt 0.683398 0.374517 -vt 0.694981 0.374517 -vt 0.667954 0.374517 -vt 0.656371 0.374517 -vt 0.436293 0.185328 -vt 0.644788 0.185328 -vt 0.644788 0.235521 -vt 0.644788 0.432432 -vt 0.436293 0.432432 -vt 0.683398 0.362934 -vt 0.656371 0.328185 -vt 0.667954 0.362934 -vn 0.1414 -0.9899 0.0000 -vn 0.9985 0.0555 0.0000 -vn -0.0000 1.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.9994 -0.0345 0.0000 -vn -0.0000 0.3869 0.9221 -vn -0.0000 0.7071 0.7071 -vn 0.4444 0.8959 0.0000 -vn -0.0000 0.3869 -0.9221 -vn -0.0000 0.7071 -0.7071 -vn -0.0000 0.1743 -0.9847 -vn 0.7071 0.7071 0.0000 -vn -0.0000 0.1743 0.9847 -vn 0.3827 0.9239 0.0000 -s off -f 737/1383/308 738/1384/308 736/1385/308 -f 739/1386/309 742/1387/309 738/1384/309 -f 751/1388/310 756/1389/310 743/1390/310 -f 750/1391/310 742/1392/310 757/1393/310 -f 748/1394/311 755/1395/311 747/1396/311 -f 754/1397/312 749/1398/312 746/1399/312 -f 745/1400/313 749/1401/313 740/1402/313 -f 748/1403/313 744/1404/313 741/1405/313 -f 756/1389/310 742/1392/310 743/1390/310 -f 748/1403/310 757/1393/310 756/1389/310 -f 748/1403/314 741/1405/314 737/1383/314 -f 737/1383/308 739/1386/308 738/1384/308 -f 739/1386/309 743/1406/309 742/1387/309 -f 748/1394/311 756/1407/311 755/1395/311 -f 754/1397/312 757/1408/312 749/1398/312 -f 745/1400/313 746/1409/313 749/1401/313 -f 748/1403/313 747/1410/313 744/1404/313 -f 756/1389/310 757/1393/310 742/1392/310 -f 748/1403/310 749/1401/310 757/1393/310 -f 737/1383/314 736/1385/314 749/1401/314 -f 736/1385/314 740/1402/314 749/1401/314 -f 749/1401/314 748/1403/314 737/1383/314 -s 1 -f 740/1402/315 753/1411/316 745/1412/316 -f 753/1413/317 746/1399/310 745/1414/310 -f 741/1405/318 752/1415/319 751/1416/320 -f 747/1396/310 752/1417/317 744/1418/310 -f 757/1419/321 753/1413/317 750/1420/321 -f 752/1417/317 756/1421/321 751/1422/321 -f 738/1423/311 742/1424/311 750/1425/322 -f 751/1416/320 743/1426/312 739/1427/312 -f 740/1402/315 750/1425/322 753/1411/316 -f 753/1413/317 754/1428/323 746/1399/310 -f 741/1405/318 744/1429/319 752/1415/319 -f 747/1396/310 755/1430/323 752/1417/317 -f 757/1419/321 754/1428/323 753/1413/317 -f 752/1417/317 755/1430/323 756/1421/321 -f 740/1402/315 736/1385/311 750/1425/322 -f 736/1385/311 738/1423/311 750/1425/322 -f 739/1427/312 737/1383/312 751/1416/320 -f 737/1383/312 741/1405/318 751/1416/320 -o Stock -v -6.625000 -0.343750 -0.343750 -v -6.625000 -0.093750 0.468750 -v -6.625000 -0.343750 0.343750 -v -6.625000 0.093750 0.468750 -v -6.625000 0.093750 -0.468750 -v -6.625000 -0.093750 -0.468750 -v -6.625000 -0.718750 0.343750 -v -6.625000 -0.718750 -0.343750 -v -6.625000 0.343750 0.343750 -v -6.625000 0.343750 -0.343750 -v -6.625000 0.735485 -0.154680 -v -6.625000 0.781250 0.000000 -v -6.625000 0.735485 0.154680 -v -7.375000 0.343750 -0.156250 -v -7.375000 0.343750 0.156250 -v -7.375000 0.093750 -0.406250 -v -7.375000 -0.093750 -0.406250 -v -7.625000 -0.343750 -0.343750 -v -7.625000 0.218750 -0.156250 -v -7.625000 0.218750 0.156250 -v -8.000000 0.156250 -0.156250 -v -8.000000 0.156250 0.156250 -v -12.125000 0.156250 -0.156250 -v -12.125000 0.156250 0.156250 -v -8.000000 0.031250 -0.343750 -v -12.125000 0.031250 -0.343750 -v -7.250000 -0.656249 -0.343750 -v -7.250000 -0.781249 -0.218750 -v -7.250000 -0.781249 0.218750 -v -12.125000 -2.406250 -0.156250 -v -12.125000 -2.218750 -0.343750 -v -12.125000 -2.406250 0.156250 -v -7.625000 0.031250 -0.343750 -v -7.250000 -0.656249 0.343750 -v -7.625000 -0.343750 0.343750 -v -12.125000 -2.218750 0.343750 -v -12.125000 0.031250 0.343750 -v -8.000000 0.031250 0.343750 -v -7.625000 0.031250 0.343750 -v -7.375000 0.093750 0.406250 -v -7.375000 -0.093750 0.406250 -v -12.500000 0.156250 -0.156250 -v -12.500000 0.156250 0.156250 -v -12.500000 0.031250 -0.343750 -v -12.500000 -2.406250 -0.156250 -v -12.500000 -2.218750 -0.343750 -v -12.500000 -2.406250 0.156250 -v -12.500000 -2.218750 0.343750 -v -12.500000 0.031250 0.343750 -v -12.312500 -1.468750 -0.343750 -v -12.312500 -0.718750 -0.343750 -v -12.312500 -1.468750 0.343750 -v -12.312500 -0.718750 0.343750 -vt 0.980695 0.088803 -vt 0.980695 0.115830 -vt 0.934363 0.108108 -vt 0.980695 0.069498 -vt 0.934363 0.050193 -vt 0.980695 0.042471 -vt 0.988417 0.088803 -vt 0.934363 0.088803 -vt 0.988417 0.079151 -vt 0.934363 0.069498 -vt 0.988417 0.069498 -vt 0.660232 0.270270 -vt 0.706564 0.281853 -vt 0.660232 0.281853 -vt 0.660232 0.297297 -vt 0.934363 0.127413 -vt 0.660232 0.254826 -vt 0.722008 0.254826 -vt 0.706564 0.270270 -vt 0.918919 0.069498 -vt 0.918919 0.088803 -vt 0.895753 0.069498 -vt 0.895753 0.088803 -vt 0.640927 0.069498 -vt 0.640927 0.104247 -vt 0.640927 0.088803 -vt 0.698842 0.235521 -vt 0.660232 0.231660 -vt 0.610039 0.158301 -vt 0.571429 0.150579 -vt 0.610039 0.146718 -vt 0.571429 0.115830 -vt 0.610039 0.119691 -vt 0.926641 0.142857 -vt 1.000000 0.123552 -vt 1.000000 0.138996 -vt 0.926641 0.123552 -vt 0.745174 0.277992 -vt 1.000000 0.277992 -vt 0.918919 0.104247 -vt 0.934363 0.108108 -vt 0.722008 0.277992 -vt 0.610039 0.108108 -vt 0.660232 0.231660 -vt 0.722008 0.254826 -vt 0.698842 0.235521 -vt 0.660232 0.254826 -vt 1.000000 0.138996 -vt 1.000000 0.123552 -vt 1.000000 0.277992 -vt 0.895753 0.054054 -vt 0.745174 0.277992 -vt 0.895753 0.104247 -vt 0.934363 0.050193 -vt 0.918919 0.054054 -vt 0.934363 0.030888 -vt 0.660232 0.297297 -vt 0.706564 0.281853 -vt 0.660232 0.281853 -vt 0.660232 0.270270 -vt 0.706564 0.270270 -vt 0.722008 0.277992 -vt 0.057915 0.266409 -vt 0.042471 0.289575 -vt 0.042471 0.266409 -vt 0.266409 0.266409 -vt 0.247104 0.289575 -vt 0.247104 0.266409 -vt 0.231660 0.289575 -vt 0.231660 0.266409 -vt 0.281853 0.266409 -vt 0.266409 0.289575 -vt 0.077220 0.266409 -vt 0.057915 0.289575 -vt 0.092664 0.266409 -vt 0.077220 0.289575 -vt 0.328185 0.277992 -vt 0.281853 0.289575 -vt 0.420849 0.266409 -vt 0.420849 0.289575 -vt 0.374517 0.277992 -vt 0.362934 0.223938 -vt 0.316602 0.266409 -vt 0.316602 0.223938 -vt 0.420849 0.235521 -vt 0.409266 0.266409 -vt 0.409266 0.223938 -vt 0.262548 0.235521 -vt 0.270270 0.266409 -vt 0.262548 0.254826 -vt 0.270270 0.223938 -vt 0.185328 0.277992 -vt 0.092664 0.289575 -vt 0.138996 0.277992 -vt 0.640927 0.054054 -vt 0.362934 0.266409 -vt 0.420849 0.254826 -vn -0.3866 0.7423 -0.5473 -vn -0.1572 0.4760 -0.8653 -vn -0.3908 0.8284 -0.4013 -vn -0.3866 0.7423 0.5473 -vn -0.3908 0.8284 0.4013 -vn -0.1572 0.4760 0.8653 -vn -0.4679 0.8838 0.0000 -vn -0.0496 -0.2045 -0.9776 -vn -0.2165 0.3710 -0.9031 -vn -0.0809 0.2263 -0.9707 -vn 0.0000 -0.4472 -0.8944 -vn -0.0380 -0.0335 -0.9987 -vn -0.1431 -0.0620 -0.9878 -vn -0.3092 0.9510 0.0000 -vn -0.0825 0.9966 0.0000 -vn 0.0000 0.9814 0.1922 -vn -0.0234 0.8096 -0.5865 -vn -0.0000 0.4719 -0.8817 -vn 0.0000 0.8321 -0.5547 -vn 0.0031 -0.0096 -0.9999 -vn 0.0000 0.0000 -1.0000 -vn 0.0657 -0.7056 -0.7056 -vn 0.0741 -0.9895 -0.1245 -vn 0.1632 -0.9144 -0.3705 -vn 0.0741 -0.9895 0.1245 -vn 0.1632 -0.9144 0.3705 -vn 0.1158 -0.9591 -0.2585 -vn 0.2210 -0.6896 -0.6896 -vn 0.1407 -0.4389 -0.8875 -vn 0.1158 -0.9591 0.2585 -vn -0.1824 0.3749 -0.9090 -vn -0.2408 0.6863 -0.6863 -vn 0.0657 -0.7056 0.7056 -vn 0.0000 0.0000 1.0000 -vn -0.0380 -0.0335 0.9987 -vn 0.0031 -0.0096 0.9999 -vn 0.1407 -0.4389 0.8875 -vn 0.2210 -0.6896 0.6896 -vn -0.0000 0.4719 0.8817 -vn 0.0000 0.8321 0.5547 -vn -0.0234 0.8096 0.5865 -vn -0.2408 0.6863 0.6863 -vn -0.2165 0.3710 0.9031 -vn -0.1824 0.3749 0.9090 -vn -0.0809 0.2263 0.9707 -vn -0.0496 -0.2045 0.9776 -vn -0.1431 -0.0620 0.9878 -vn 0.0000 -0.4472 0.8944 -vn 0.0000 -0.4148 -0.9099 -vn 0.0000 -0.3827 -0.9239 -vn 0.0000 0.9814 -0.1922 -vn 0.0000 0.9571 0.2898 -vn 0.0000 0.5112 0.8594 -vn 0.0000 0.9571 -0.2898 -vn 0.0000 -0.9239 -0.3827 -vn 0.0000 -0.3827 0.9239 -vn 0.0000 -0.9239 0.3827 -vn 0.0000 0.5112 -0.8594 -vn -0.9925 0.1222 0.0000 -vn -0.9925 -0.1222 0.0000 -vn -1.0000 0.0000 0.0000 -vn -0.9867 0.1628 0.0000 -vn -0.9841 -0.1775 0.0000 -vn 0.0000 -0.4148 0.9099 -s 1 -f 768/1431/324 767/1432/325 771/1433/326 -f 770/1434/327 772/1435/328 766/1436/329 -f 768/1437/324 771/1438/326 769/1439/330 -f 769/1439/330 772/1440/328 770/1441/327 -f 771/1438/326 772/1440/328 769/1439/330 -f 763/1442/331 773/1443/332 762/1444/333 -f 762/1444/333 773/1443/332 767/1445/325 -f 771/1433/326 767/1432/325 773/1446/332 -f 763/1442/331 758/1447/334 775/1448/335 -f 774/1449/336 763/1442/331 775/1448/335 -f 771/1438/326 777/1450/337 772/1440/328 -f 776/1451/337 779/1452/338 777/1450/337 -f 778/1453/338 781/1454/339 779/1452/338 -f 778/1453/340 783/1455/341 780/1456/342 -f 784/1457/343 775/1448/335 765/1458/344 -f 784/1459/345 765/1460/346 785/1461/347 -f 785/1461/347 764/1462/348 786/1463/349 -f 785/1461/347 787/1464/350 784/1459/345 -f 787/1465/351 788/1466/352 784/1457/343 -f 789/1467/353 785/1461/347 786/1463/349 -f 784/1457/343 788/1466/352 775/1448/335 -f 782/1468/341 775/1448/335 783/1469/341 -f 788/1466/352 783/1469/341 775/1448/335 -f 790/1470/354 776/1451/355 773/1471/332 -f 773/1471/332 776/1451/355 771/1438/326 -f 775/1448/335 790/1472/354 774/1449/336 -f 782/1468/341 790/1472/354 775/1448/335 -f 773/1443/332 774/1449/336 790/1472/354 -f 758/1447/344 765/1458/344 775/1448/335 -f 786/1463/349 764/1462/348 791/1473/356 -f 764/1474/357 792/1475/358 791/1476/359 -f 764/1474/357 760/1477/357 792/1475/358 -f 789/1467/353 786/1463/349 791/1473/356 -f 793/1478/360 789/1479/361 791/1476/359 -f 791/1476/359 792/1475/358 793/1478/360 -f 793/1478/360 792/1475/358 794/1480/362 -f 781/1454/363 795/1481/362 779/1452/364 -f 794/1480/362 792/1475/358 795/1482/362 -f 782/1483/341 778/1453/340 790/1470/354 -f 777/1450/365 797/1484/366 772/1440/328 -f 796/1485/367 797/1484/366 777/1450/365 -f 772/1435/328 797/1486/366 766/1436/329 -f 766/1487/329 797/1488/366 761/1489/368 -f 759/1490/369 797/1488/366 798/1491/370 -f 760/1477/371 759/1490/369 792/1475/358 -f 798/1491/370 792/1475/358 759/1490/369 -f 797/1488/366 796/1492/367 798/1491/370 -f 798/1491/370 796/1492/367 792/1475/358 -f 795/1482/362 792/1475/358 796/1492/367 -f 787/1493/350 803/1494/372 788/1495/373 -f 780/1496/374 800/1497/375 781/1498/339 -f 781/1498/339 806/1499/376 794/1500/362 -f 783/1501/341 799/1502/377 780/1496/374 -f 789/1503/353 802/1504/378 787/1493/350 -f 793/1505/379 804/1506/380 789/1503/353 -f 783/1501/341 808/1507/344 801/1508/381 -f 788/1509/373 803/1510/372 807/1511/344 -f 788/1509/373 808/1507/344 783/1501/341 -f 807/1512/382 810/1513/383 808/1514/383 -f 802/1515/384 805/1516/385 803/1517/385 -f 805/1516/385 807/1512/382 803/1517/385 -f 799/1518/384 806/1519/386 800/1520/384 -f 808/1514/383 806/1519/386 801/1521/386 -f 806/1499/376 810/1522/357 794/1500/362 -f 805/1523/387 793/1505/379 809/1524/357 -f 810/1522/357 793/1505/379 794/1500/362 -f 778/1453/340 776/1451/355 790/1470/354 -f 795/1481/362 796/1485/367 779/1452/364 -f 777/1450/365 779/1452/364 796/1485/367 -f 763/1442/331 774/1449/336 773/1443/332 -f 771/1438/326 776/1451/337 777/1450/337 -f 776/1451/337 778/1453/338 779/1452/338 -f 778/1453/338 780/1456/374 781/1454/339 -f 778/1453/340 782/1483/341 783/1455/341 -f 785/1461/347 765/1460/346 764/1462/348 -f 789/1467/353 787/1464/350 785/1461/347 -f 781/1454/363 794/1525/362 795/1481/362 -f 759/1490/369 761/1489/368 797/1488/366 -f 787/1493/350 802/1504/378 803/1494/372 -f 780/1496/374 799/1502/377 800/1497/375 -f 781/1498/339 800/1497/375 806/1499/376 -f 783/1501/341 801/1508/381 799/1502/377 -f 789/1503/353 804/1506/380 802/1504/378 -f 793/1505/379 805/1523/387 804/1506/380 -f 788/1509/373 807/1511/344 808/1507/344 -f 807/1512/382 809/1526/382 810/1513/383 -f 802/1515/384 804/1527/384 805/1516/385 -f 805/1516/385 809/1526/382 807/1512/382 -f 799/1518/384 801/1521/386 806/1519/386 -f 808/1514/383 810/1513/383 806/1519/386 -f 810/1522/357 809/1524/357 793/1505/379 -o Flash_Hider -v 11.250000 -0.000000 -0.250000 -v 11.250000 0.176777 -0.176777 -v 11.250000 0.250000 0.000000 -v 11.250000 0.176777 0.176777 -v 11.250000 -0.000000 0.250000 -v 11.250000 -0.176777 0.176777 -v 11.250000 -0.250000 0.000000 -v 11.250000 -0.176777 -0.176777 -v 12.500000 0.000000 -0.250000 -v 12.500000 0.176777 -0.176777 -v 12.500000 0.250000 0.000000 -v 12.500000 0.176777 0.176777 -v 12.500000 -0.000000 0.250000 -v 12.500000 -0.176777 0.176777 -v 12.500000 -0.250000 0.000000 -v 12.500000 -0.176777 -0.176777 -v 11.625000 -0.000000 -0.250000 -v 11.625000 0.176777 -0.176777 -v 11.625000 0.250000 0.000000 -v 11.625000 0.176777 0.176777 -v 11.625000 -0.000000 0.250000 -v 11.625000 -0.176777 0.176777 -v 11.625000 -0.250000 0.000000 -v 11.625000 -0.176777 -0.176777 -v 11.625000 -0.125000 -0.000000 -v 11.625000 -0.088388 0.088388 -v 12.437500 -0.000000 -0.125000 -v 12.437500 0.088388 -0.088388 -v 12.437500 0.125000 0.000000 -v 12.437500 0.088388 0.088388 -v 12.437500 -0.000000 0.125000 -v 12.437500 -0.088388 0.088388 -v 12.437500 -0.125000 -0.000000 -v 12.437500 -0.088388 -0.088388 -v 11.625000 -0.000000 -0.125000 -v 11.625000 0.088388 -0.088388 -v 11.625000 0.125000 0.000000 -v 11.625000 0.088388 0.088388 -v 11.625000 -0.000000 0.125000 -v 11.625000 -0.088388 -0.088388 -vt 0.092664 0.494208 -vt 0.081081 0.494208 -vt 0.081081 0.548263 -vt 0.058577 0.684060 -vt 0.054054 0.694981 -vt 0.084942 0.694981 -vt 0.046332 0.494208 -vt 0.034749 0.494208 -vt 0.034749 0.548263 -vt 0.115830 0.548263 -vt 0.104247 0.494208 -vt 0.104247 0.548263 -vt 0.069498 0.548263 -vt 0.057915 0.494208 -vt 0.057915 0.548263 -vt 0.081081 0.571429 -vt 0.069498 0.571429 -vt 0.057915 0.571429 -vt 0.046332 0.548263 -vt 0.046332 0.571429 -vt 0.034749 0.571429 -vt 0.023166 0.548263 -vt 0.023166 0.571429 -vt 0.104247 0.571429 -vt 0.092664 0.548263 -vt 0.092664 0.571429 -vt 0.038610 0.486486 -vt 0.084942 0.640927 -vt 0.034749 0.648649 -vt 0.030888 0.640927 -vt 0.084942 0.652510 -vt 0.034749 0.652510 -vt 0.115830 0.494208 -vt 0.108108 0.486486 -vt 0.065637 0.486486 -vt 0.061776 0.486486 -vt 0.084942 0.486486 -vt 0.084942 0.660232 -vt 0.030888 0.660232 -vt 0.034749 0.667954 -vt 0.084942 0.671815 -vt 0.034749 0.671815 -vt 0.034749 0.629344 -vt 0.084942 0.633205 -vt 0.034749 0.633205 -vt 0.034749 0.610039 -vt 0.084942 0.613900 -vt 0.034749 0.613900 -vt 0.084942 0.640927 -vt 0.030888 0.640927 -vt 0.084942 0.602317 -vt 0.030888 0.602317 -vt 0.084942 0.621622 -vt 0.030888 0.621622 -vt 0.084942 0.660232 -vt 0.030888 0.660232 -vt 0.084942 0.679537 -vt 0.030888 0.679537 -vt 0.084942 0.621622 -vt 0.030888 0.621622 -vt 0.027689 0.684062 -vt 0.030888 0.694981 -vt 0.023166 0.694981 -vt 0.027689 0.705901 -vt 0.038610 0.702703 -vt 0.038610 0.710425 -vt 0.046332 0.694981 -vt 0.049531 0.705900 -vt 0.044070 0.700440 -vt 0.049531 0.684060 -vt 0.038610 0.687259 -vt 0.038610 0.679537 -vt 0.044070 0.689520 -vt 0.033150 0.700441 -vt 0.058577 0.705901 -vt 0.069498 0.710425 -vt 0.080419 0.705901 -vt 0.080419 0.684060 -vt 0.069498 0.679537 -vt 0.115830 0.571429 -vt 0.069498 0.494208 -vt 0.042471 0.486486 -vt 0.084942 0.648649 -vt 0.111969 0.486486 -vt 0.088803 0.486486 -vt 0.084942 0.667954 -vt 0.084942 0.629344 -vt 0.084942 0.610039 -vt 0.033150 0.689521 -vt 0.054054 0.694981 -vn 0.0000 0.3827 0.9239 -vn -0.0000 0.6037 0.7972 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.3827 -0.9239 -vn 0.0000 -0.6037 -0.7972 -vn 0.0000 -0.9906 0.1368 -vn 0.0000 -0.9239 0.3827 -vn 0.0000 -0.7972 0.6037 -vn 0.0000 0.9906 -0.1368 -vn 0.0000 0.9239 -0.3827 -vn 0.0000 0.7972 -0.6037 -vn 0.0000 0.7071 0.7071 -vn 0.0000 1.0000 -0.0000 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 -0.1368 -0.9906 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 -0.7071 0.7071 -vn -0.0000 0.1368 0.9906 -vn 0.0000 -0.0000 1.0000 -vn 0.8795 0.1821 0.4397 -vn 0.0000 0.4823 -0.8760 -vn 0.0000 0.9808 0.1951 -vn 0.0000 0.9605 0.2783 -vn 0.8795 0.4397 -0.1821 -vn 0.8795 -0.4397 0.1821 -vn 0.8795 -0.1821 -0.4397 -vn 0.8795 -0.1822 -0.4397 -vn -0.0000 0.8760 0.4823 -vn 0.0000 -0.1951 0.9808 -vn 0.0000 -0.2783 0.9605 -vn 0.0000 -0.8760 -0.4823 -vn -0.0000 0.1951 -0.9808 -vn 0.0000 0.2783 -0.9605 -vn 0.0000 -0.4823 0.8760 -vn 0.0000 -0.9808 -0.1951 -vn -0.0000 -0.9605 -0.2783 -vn 1.0000 0.0000 0.0000 -vn 0.8795 0.1822 0.4397 -vn 0.0000 0.5556 -0.8315 -vn 0.0000 0.8315 0.5556 -vn 0.0000 -0.8315 -0.5556 -vn 0.0000 -0.5556 0.8315 -s 1 -f 823/1528/388 822/1529/388 830/1530/389 -f 814/1531/390 813/1532/390 817/1533/390 -f 819/1534/391 826/1535/391 834/1536/392 -f 833/1537/393 824/1538/394 832/1539/395 -f 829/1540/396 820/1541/397 828/1542/398 -f 814/1543/399 829/1540/396 813/1544/400 -f 812/1545/401 827/1546/402 811/1547/403 -f 818/1548/404 833/1549/393 817/1550/405 -f 816/1551/406 831/1552/407 815/1553/408 -f 819/1534/409 844/1554/409 826/1535/409 -f 833/1555/403 843/1556/410 825/1557/403 -f 843/1556/410 836/1558/411 842/1559/412 -f 825/1560/413 842/1561/413 824/1538/413 -f 820/1541/414 839/1562/414 838/1563/414 -f 823/1528/415 840/1564/415 822/1529/416 -f 842/1559/412 832/1565/399 824/1566/399 -f 837/1567/417 850/1568/418 844/1569/419 -f 841/1570/420 848/1571/421 840/1572/422 -f 839/1573/423 846/1574/424 838/1575/425 -f 840/1572/422 830/1576/401 822/1577/401 -f 829/1578/408 839/1573/423 821/1579/408 -f 838/1575/425 828/1580/404 820/1581/404 -f 827/1582/400 837/1567/417 819/1583/400 -f 844/1569/419 834/1584/406 826/1585/406 -f 831/1586/405 841/1570/420 823/1587/405 -f 830/1588/426 847/1589/426 829/1590/426 -f 828/1591/426 845/1592/426 827/1593/426 -f 835/1594/426 834/1595/426 850/1596/426 -f 832/1597/426 849/1598/426 831/1599/426 -f 836/1600/426 850/1596/426 846/1601/426 -f 830/1530/389 814/1543/399 815/1553/408 -f 815/1553/408 831/1552/407 830/1530/389 -f 831/1552/407 823/1528/388 830/1530/389 -f 813/1532/390 812/1602/390 811/1603/390 -f 811/1603/390 818/1604/390 813/1532/390 -f 818/1604/390 817/1533/390 813/1532/390 -f 817/1533/390 816/1605/390 815/1606/390 -f 815/1606/390 814/1531/390 817/1533/390 -f 834/1536/392 818/1548/404 811/1547/403 -f 811/1547/403 827/1546/402 834/1536/392 -f 827/1546/402 819/1534/391 834/1536/392 -f 832/1539/395 816/1551/406 817/1607/405 -f 833/1537/393 825/1560/394 824/1538/394 -f 832/1539/395 817/1607/405 833/1537/393 -f 828/1542/398 812/1545/401 813/1544/400 -f 829/1540/396 821/1608/397 820/1541/397 -f 828/1542/398 813/1544/400 829/1540/396 -f 814/1543/399 830/1530/389 829/1540/396 -f 812/1545/401 828/1542/398 827/1546/402 -f 818/1548/404 834/1536/392 833/1549/393 -f 816/1551/406 832/1539/395 831/1552/407 -f 819/1534/409 837/1609/427 844/1554/409 -f 833/1555/403 835/1610/428 843/1556/410 -f 843/1556/410 835/1610/428 836/1558/411 -f 825/1560/413 843/1611/413 842/1561/413 -f 820/1541/414 821/1608/414 839/1562/414 -f 823/1528/415 841/1612/415 840/1564/415 -f 842/1559/412 836/1558/411 832/1565/399 -f 837/1567/417 845/1613/429 850/1568/418 -f 841/1570/420 849/1614/430 848/1571/421 -f 839/1573/423 847/1615/431 846/1574/424 -f 840/1572/422 848/1571/421 830/1576/401 -f 829/1578/408 847/1615/431 839/1573/423 -f 838/1575/425 846/1574/424 828/1580/404 -f 827/1582/400 845/1613/429 837/1567/417 -f 844/1569/419 850/1568/418 834/1584/406 -f 831/1586/405 849/1614/430 841/1570/420 -f 830/1588/426 848/1616/426 847/1589/426 -f 828/1591/426 846/1601/426 845/1592/426 -f 835/1594/426 833/1617/426 834/1595/426 -f 832/1597/426 836/1600/426 849/1598/426 -f 836/1600/426 835/1594/426 850/1596/426 -f 850/1596/426 845/1592/426 846/1601/426 -f 846/1601/426 847/1589/426 848/1616/426 -f 848/1616/426 849/1598/426 846/1601/426 -f 849/1598/426 836/1600/426 846/1601/426 -o Scope_Scope.001 -v -5.750000 1.843750 -0.312500 -v -5.750000 2.000000 -0.270633 -v -5.750000 2.114383 -0.156250 -v -5.750000 2.156250 0.000000 -v -5.750000 2.114383 0.156250 -v -5.750000 2.000000 0.270633 -v -5.750000 1.843750 0.312500 -v -5.750000 1.687500 0.270633 -v -5.750000 1.573117 0.156250 -v -5.750000 1.531250 -0.000000 -v -5.750000 1.573117 -0.156250 -v -5.750000 1.687500 -0.270633 -v -5.625000 1.843750 -0.312500 -v -5.625000 2.000000 -0.270633 -v -5.625000 2.114383 -0.156250 -v -5.625000 2.156250 0.000000 -v -5.625000 2.114383 0.156250 -v -5.625000 2.000000 0.270633 -v -5.625000 1.843750 0.312500 -v -5.625000 1.687500 0.270633 -v -5.625000 1.573117 0.156250 -v -5.625000 1.531250 -0.000000 -v -5.625000 1.573117 -0.156250 -v -5.625000 1.687500 -0.270633 -v -5.750000 1.843750 -0.375000 -v -5.750000 2.031250 -0.324759 -v -5.750000 2.168509 -0.187500 -v -5.750000 2.218750 0.000000 -v -5.750000 2.168509 0.187500 -v -5.750000 2.031250 0.324760 -v -5.750000 1.843750 0.375000 -v -5.750000 1.656250 0.324760 -v -5.750000 1.518990 0.187500 -v -5.750000 1.468750 -0.000000 -v -5.750000 1.518990 -0.187500 -v -5.750000 1.656250 -0.324759 -v -4.500000 1.843750 -0.375000 -v -4.500000 2.031250 -0.324759 -v -4.500000 2.168509 -0.187500 -v -4.500000 2.218750 0.000000 -v -4.500000 2.168509 0.187500 -v -4.500000 2.031250 0.324760 -v -4.500000 1.843750 0.375000 -v -4.500000 1.656250 0.324760 -v -4.500000 1.518990 0.187500 -v -4.500000 1.468750 -0.000000 -v -4.500000 1.518990 -0.187500 -v -4.500000 1.656250 -0.324759 -v -4.312500 1.843750 -0.250000 -v -4.312500 1.968750 -0.216506 -v -4.312500 2.060256 -0.125000 -v -4.312500 2.093750 0.000000 -v -4.312500 2.060256 0.125000 -v -4.312500 1.968750 0.216506 -v -4.312500 1.843750 0.250000 -v -4.312500 1.718750 0.216506 -v -4.312500 1.627244 0.125000 -v -4.312500 1.593750 0.000000 -v -4.312500 1.627244 -0.125000 -v -4.312500 1.718750 -0.216506 -v -1.687500 1.843750 -0.250000 -v -1.687500 1.968750 -0.216506 -v -1.687500 2.060256 -0.125000 -v -1.687500 2.093750 0.000000 -v -1.687500 2.060256 0.125000 -v -1.687500 1.968750 0.216506 -v -1.687500 1.843750 0.250000 -v -1.687500 1.718750 0.216506 -v -1.687500 1.627244 0.125000 -v -1.687500 1.593750 0.000000 -v -1.687500 1.627244 -0.125000 -v -1.687500 1.718750 -0.216506 -v -3.312500 1.531250 0.312500 -v -3.312500 2.156250 0.312500 -v -3.312500 1.531250 -0.312500 -v -3.312500 2.156250 -0.312500 -v -2.687500 1.531250 0.312500 -v -2.687500 2.156250 0.312500 -v -2.687500 1.531250 -0.312500 -v -2.687500 2.156250 -0.312500 -v -3.437500 1.593750 0.250000 -v -3.437500 2.093750 0.250000 -v -3.437500 1.593750 -0.250000 -v -3.437500 2.093750 -0.250000 -v -2.562500 1.593750 0.250000 -v -2.562500 2.093750 0.250000 -v -2.562500 1.593750 -0.250000 -v -2.562500 2.093750 -0.250000 -v -0.187500 1.843750 -0.625000 -v -0.187500 2.156250 -0.541266 -v -0.187500 2.385015 -0.312500 -v -0.187500 2.468750 0.000000 -v -0.187500 2.385015 0.312500 -v -0.187500 2.156250 0.541266 -v -0.187500 1.843750 0.625000 -v -0.187500 1.531250 0.541266 -v -0.187500 1.302484 0.312500 -v -0.187500 1.218750 -0.000000 -v -0.187500 1.302484 -0.312500 -v -0.187500 1.531250 -0.541266 -v 1.312500 1.843750 -0.625000 -v 1.312500 2.156250 -0.541266 -v 1.312500 2.385015 -0.312500 -v 1.312500 2.468750 0.000000 -v 1.312500 2.385015 0.312500 -v 1.312500 2.156250 0.541266 -v 1.312500 1.843750 0.625000 -v 1.312500 1.531250 0.541266 -v 1.312500 1.302484 0.312500 -v 1.312500 1.218750 -0.000000 -v 1.312500 1.302484 -0.312500 -v 1.312500 1.531250 -0.541266 -v 1.312500 1.843750 -0.562500 -v 1.312500 2.125000 -0.487139 -v 1.312500 2.330889 -0.281250 -v 1.312500 2.406250 0.000000 -v 1.312500 2.330889 0.281250 -v 1.312500 2.125000 0.487139 -v 1.312500 1.843750 0.562500 -v 1.312500 1.562500 0.487139 -v 1.312500 1.356611 0.281250 -v 1.312500 1.281250 -0.000000 -v 1.312500 1.356611 -0.281250 -v 1.312500 1.562500 -0.487139 -v 1.062500 1.843750 -0.562500 -v 1.062500 2.125000 -0.487139 -v 1.062500 2.330889 -0.281250 -v 1.062500 2.406250 0.000000 -v 1.062500 2.330889 0.281250 -v 1.062500 2.125000 0.487139 -v 1.062500 1.843750 0.562500 -v 1.062500 1.562500 0.487139 -v 1.062500 1.356611 0.281250 -v 1.062500 1.281250 -0.000000 -v 1.062500 1.356611 -0.281250 -v 1.062500 1.562500 -0.487139 -v -3.000000 2.156250 -0.250000 -v -3.125000 2.156250 -0.216506 -v -3.216506 2.156250 -0.125000 -v -3.250000 2.156250 0.000000 -v -3.216506 2.156250 0.125000 -v -3.125000 2.156250 0.216506 -v -3.000000 2.156250 0.250000 -v -2.875000 2.156250 0.216506 -v -2.783494 2.156250 0.125000 -v -2.750000 2.156250 -0.000000 -v -2.783494 2.156250 -0.125000 -v -2.875000 2.156250 -0.216506 -v -3.000000 2.218750 -0.250000 -v -3.125000 2.218750 -0.216506 -v -3.216506 2.218750 -0.125000 -v -3.250000 2.218750 0.000000 -v -3.216506 2.218750 0.125000 -v -3.125000 2.218750 0.216506 -v -3.000000 2.218750 0.250000 -v -2.875000 2.218750 0.216506 -v -2.783494 2.218750 0.125000 -v -2.750000 2.218750 -0.000000 -v -2.783494 2.218750 -0.125000 -v -2.875000 2.218750 -0.216506 -v -3.000000 2.218750 -0.312500 -v -3.156250 2.218750 -0.270633 -v -3.270633 2.218750 -0.156250 -v -3.312500 2.218750 0.000000 -v -3.270633 2.218750 0.156250 -v -3.156250 2.218750 0.270633 -v -3.000000 2.218750 0.312500 -v -2.843750 2.218750 0.270633 -v -2.729367 2.218750 0.156250 -v -2.687500 2.218750 0.000000 -v -2.729367 2.218750 -0.156250 -v -2.843750 2.218750 -0.270633 -v -3.000000 2.406250 -0.312500 -v -3.156250 2.406250 -0.270633 -v -3.270633 2.406250 -0.156250 -v -3.312500 2.406250 0.000000 -v -3.270633 2.406250 0.156250 -v -3.156250 2.406250 0.270633 -v -3.000000 2.406250 0.312500 -v -2.843750 2.406250 0.270633 -v -2.729367 2.406250 0.156250 -v -2.687500 2.406250 0.000000 -v -2.729367 2.406250 -0.156250 -v -2.843750 2.406250 -0.270633 -v -3.000000 2.093750 0.312500 -v -3.125000 2.060256 0.312500 -v -3.216506 1.968750 0.312500 -v -3.250000 1.843750 0.312500 -v -3.216506 1.718750 0.312500 -v -3.125000 1.627243 0.312500 -v -3.000000 1.593750 0.312500 -v -2.875000 1.627243 0.312500 -v -2.783494 1.718750 0.312500 -v -2.750000 1.843750 0.312500 -v -2.783494 1.968750 0.312500 -v -2.875000 2.060256 0.312500 -v -3.000000 2.093750 0.375000 -v -3.125000 2.060256 0.375000 -v -3.216506 1.968750 0.375000 -v -3.250000 1.843750 0.375000 -v -3.216506 1.718750 0.375000 -v -3.125000 1.627243 0.375000 -v -3.000000 1.593750 0.375000 -v -2.875000 1.627243 0.375000 -v -2.783494 1.718750 0.375000 -v -2.750000 1.843750 0.375000 -v -2.783494 1.968750 0.375000 -v -2.875000 2.060256 0.375000 -v -3.000000 2.156250 0.375000 -v -3.156250 2.114383 0.375000 -v -3.270633 2.000000 0.375000 -v -3.312500 1.843750 0.375000 -v -3.270633 1.687500 0.375000 -v -3.156250 1.573117 0.375000 -v -3.000000 1.531250 0.375000 -v -2.843750 1.573117 0.375000 -v -2.729367 1.687500 0.375000 -v -2.687500 1.843750 0.375000 -v -2.729367 2.000000 0.375000 -v -2.843750 2.114383 0.375000 -v -3.000000 2.156250 0.562500 -v -3.156250 2.114383 0.562500 -v -3.270633 2.000000 0.562500 -v -3.312500 1.843750 0.562500 -v -3.270633 1.687500 0.562500 -v -3.156250 1.573117 0.562500 -v -3.000000 1.531250 0.562500 -v -2.843750 1.573117 0.562500 -v -2.729367 1.687500 0.562500 -v -2.687500 1.843750 0.562500 -v -2.729367 2.000000 0.562500 -v -2.843750 2.114383 0.562500 -v -3.000000 2.093750 -0.312500 -v -3.125000 2.060256 -0.312500 -v -3.216506 1.968750 -0.312500 -v -3.250000 1.843750 -0.312500 -v -3.216506 1.718750 -0.312500 -v -3.125000 1.627243 -0.312500 -v -3.000000 1.593750 -0.312500 -v -2.875000 1.627243 -0.312500 -v -2.783494 1.718750 -0.312500 -v -2.750000 1.843750 -0.312500 -v -2.783494 1.968750 -0.312500 -v -2.875000 2.060256 -0.312500 -v -3.000000 2.093750 -0.375000 -v -3.125000 2.060256 -0.375000 -v -3.216506 1.968750 -0.375000 -v -3.250000 1.843750 -0.375000 -v -3.216506 1.718750 -0.375000 -v -3.125000 1.627243 -0.375000 -v -3.000000 1.593750 -0.375000 -v -2.875000 1.627243 -0.375000 -v -2.783494 1.718750 -0.375000 -v -2.750000 1.843750 -0.375000 -v -2.783494 1.968750 -0.375000 -v -2.875000 2.060256 -0.375000 -v -3.000000 2.156250 -0.375000 -v -3.156250 2.114383 -0.375000 -v -3.270633 2.000000 -0.375000 -v -3.312500 1.843750 -0.375000 -v -3.270633 1.687500 -0.375000 -v -3.156250 1.573117 -0.375000 -v -3.000000 1.531250 -0.375000 -v -2.843750 1.573117 -0.375000 -v -2.729367 1.687500 -0.375000 -v -2.687500 1.843750 -0.375000 -v -2.729367 2.000000 -0.375000 -v -2.843750 2.114383 -0.375000 -v -3.000000 2.156250 -0.500000 -v -3.156250 2.114383 -0.500000 -v -3.270633 2.000000 -0.500000 -v -3.312500 1.843750 -0.500000 -v -3.270633 1.687500 -0.500000 -v -3.156250 1.573117 -0.500000 -v -3.000000 1.531250 -0.500000 -v -2.843750 1.573117 -0.500000 -v -2.729367 1.687500 -0.500000 -v -2.687500 1.843750 -0.500000 -v -2.729367 2.000000 -0.500000 -v -2.843750 2.114383 -0.500000 -v -3.000000 2.093750 -0.625000 -v -3.125000 2.060256 -0.625000 -v -3.216506 1.968750 -0.625000 -v -3.250000 1.843750 -0.625000 -v -3.216506 1.718750 -0.625000 -v -3.125000 1.627244 -0.625000 -v -3.000000 1.593750 -0.625000 -v -2.875000 1.627244 -0.625000 -v -2.783494 1.718750 -0.625000 -v -2.750000 1.843750 -0.625000 -v -2.783494 1.968750 -0.625000 -v -2.875000 2.060256 -0.625000 -v -4.125000 1.656250 0.093750 -v -3.687500 1.656250 0.093750 -v -4.125000 1.656250 -0.093750 -v -3.687500 1.656250 -0.093750 -v -3.812500 1.468750 0.093750 -v -3.812500 1.468750 -0.093750 -v -2.312500 1.656250 0.093750 -v -1.875000 1.656250 0.093750 -v -2.312500 1.656250 -0.093750 -v -1.875000 1.656250 -0.093750 -v -2.312500 1.468750 0.093750 -v -1.875000 1.468750 0.093750 -v -2.312500 1.468750 -0.093750 -v -1.875000 1.468750 -0.093750 -v -4.312500 1.281250 0.093750 -v -4.312500 1.281250 -0.093750 -v -4.000000 1.281250 0.093750 -v -4.000000 1.281250 -0.093750 -v -2.500000 1.281250 0.093750 -v -2.187500 1.281250 0.093750 -v -2.500000 1.281250 -0.093750 -v -2.187500 1.281250 -0.093750 -v -2.000000 1.468750 0.093750 -v -2.000000 1.468750 -0.093750 -v -4.125000 1.468750 0.093750 -v -4.125000 1.468750 -0.093750 -v -4.875000 1.281250 0.093750 -v -4.875000 1.281250 -0.093750 -v -5.062500 1.093750 -0.093750 -v -5.062500 0.781250 -0.281250 -v -4.750000 1.093750 -0.093750 -v -4.750000 0.781250 -0.281250 -v -5.062500 0.531250 -0.156250 -v -4.750000 0.531250 -0.156250 -v -4.750000 0.718750 -0.156250 -v -4.750000 0.718750 0.156250 -v -4.750000 0.531250 0.156250 -v -5.062500 1.093750 0.093750 -v -4.750000 1.093750 0.093750 -v -4.750000 0.531250 0.281250 -v -4.750000 0.781250 0.281250 -v -5.062500 0.781250 0.281250 -v -5.062500 0.531250 0.281250 -v -5.062500 0.531250 0.156250 -v -5.062500 0.718750 0.156250 -v -5.062500 0.718750 -0.156250 -v -2.187500 1.093750 0.093750 -v -2.500000 1.093750 0.093750 -v -2.500000 0.781250 -0.281250 -v -2.187500 0.781250 -0.281250 -v -2.500000 0.531250 -0.156250 -v -2.187500 0.531250 -0.156250 -v -2.187500 0.718750 -0.156250 -v -2.187500 0.718750 0.156250 -v -2.187500 0.531250 0.156250 -v -2.187500 0.531250 0.281250 -v -2.187500 0.781250 0.281250 -v -2.500000 0.781250 0.281250 -v -2.500000 0.531250 0.281250 -v -2.500000 0.531250 0.156250 -v -2.500000 0.718750 0.156250 -v -2.500000 0.718750 -0.156250 -v -2.187500 1.093750 -0.093750 -v -2.500000 1.093750 -0.093750 -v -4.750000 0.906250 0.093750 -v -4.750000 0.906250 -0.093750 -v -4.562500 1.031250 0.093750 -v -4.562500 1.031250 -0.093750 -v -2.500000 0.906250 0.093750 -v -2.500000 0.906250 -0.093750 -v -2.687500 1.031250 0.093750 -v -2.687500 1.031250 -0.093750 -v -4.906250 0.718750 -0.343750 -v -4.950444 0.700444 -0.343750 -v -4.968750 0.656250 -0.343750 -v -4.950444 0.612056 -0.343750 -v -4.906250 0.593750 -0.343750 -v -4.862056 0.612056 -0.343750 -v -4.843750 0.656250 -0.343750 -v -4.862056 0.700444 -0.343750 -v -4.906250 0.718750 -0.406250 -v -4.950444 0.700444 -0.406250 -v -4.968750 0.656250 -0.406250 -v -4.950444 0.612056 -0.406250 -v -4.906250 0.593750 -0.406250 -v -4.862056 0.612056 -0.406250 -v -4.843750 0.656250 -0.406250 -v -4.862056 0.700444 -0.406250 -v -2.343750 0.718750 -0.343750 -v -2.387945 0.700444 -0.343750 -v -2.406250 0.656250 -0.343750 -v -2.387945 0.612056 -0.343750 -v -2.343750 0.593750 -0.343750 -v -2.299556 0.612056 -0.343750 -v -2.281250 0.656250 -0.343750 -v -2.299556 0.700444 -0.343750 -v -2.343750 0.718750 -0.406250 -v -2.387945 0.700444 -0.406250 -v -2.406250 0.656250 -0.406250 -v -2.387945 0.612056 -0.406250 -v -2.343750 0.593750 -0.406250 -v -2.299556 0.612056 -0.406250 -v -2.281250 0.656250 -0.406250 -v -2.299556 0.700444 -0.406250 -v -2.500000 0.531250 -0.343750 -v -2.187500 0.531250 -0.343750 -v -2.500000 0.781250 -0.343750 -v -2.187500 0.781250 -0.343750 -v -5.062500 0.781250 -0.343750 -v -5.062500 0.531250 -0.343750 -v -4.750000 0.781250 -0.343750 -v -4.750000 0.531250 -0.343750 -v -3.687500 1.468750 0.093750 -v -3.687500 1.468750 -0.093750 -vt 0.815385 0.353846 -vt 0.738462 0.276923 -vt 0.815385 0.276923 -vt 0.738462 0.123077 -vt 0.815385 0.200000 -vt 0.738462 0.200000 -vt 0.815385 0.046154 -vt 0.738462 0.046154 -vt 0.830769 0.115385 -vt 0.815385 0.123077 -vt 0.830769 0.269231 -vt 0.830769 0.346154 -vt 0.830769 0.192308 -vt 0.830769 0.207692 -vt 0.892308 0.269231 -vt 0.661538 0.269231 -vt 0.723077 0.207692 -vt 0.723077 0.269231 -vt 0.738462 0.353846 -vt 0.723077 0.284615 -vt 0.723077 0.053846 -vt 0.723077 0.130769 -vt 0.938462 0.476923 -vt 0.961538 0.453846 -vt 0.961538 0.476923 -vt 0.923077 0.084615 -vt 0.946154 0.269231 -vt 0.923077 0.269231 -vt 0.923077 0.476923 -vt 0.938462 0.453846 -vt 0.192308 0.384615 -vt 0.215385 0.407692 -vt 0.169231 0.407692 -vt 0.115385 0.376923 -vt 0.100000 0.400000 -vt 0.076923 0.376923 -vt 0.900000 0.400000 -vt 0.876923 0.415385 -vt 0.876923 0.376923 -vt 0.876923 0.515385 -vt 0.900000 0.530769 -vt 0.876923 0.553846 -vt 0.946154 0.284615 -vt 0.923077 0.307692 -vt 0.923077 0.284615 -vt 0.961538 0.530769 -vt 0.938462 0.530769 -vt 0.938462 0.492308 -vt 0.938462 0.438462 -vt 0.946154 0.376923 -vt 0.946154 0.307692 -vt 0.115385 0.153846 -vt 0.076923 0.169231 -vt 0.076923 0.153846 -vt 0.030769 0.261538 -vt 0.053846 0.238462 -vt 0.053846 0.261538 -vt 0.230769 0.276923 -vt 0.192308 0.307692 -vt 0.192308 0.276923 -vt 0.115385 0.261538 -vt 0.076923 0.276923 -vt 0.076923 0.261538 -vt 0.230769 0.146154 -vt 0.192308 0.169231 -vt 0.192308 0.146154 -vt 0.876923 0.361538 -vt 0.892308 0.338462 -vt 0.900000 0.361538 -vt 0.992308 0.361538 -vt 0.969231 0.361538 -vt 0.976923 0.338462 -vt 0.876923 0.084615 -vt 0.900000 0.084615 -vt 0.892308 0.107692 -vt 0.992308 0.084615 -vt 0.976923 0.107692 -vt 0.969231 0.084615 -vt 0.138462 0.215385 -vt 0.115385 0.200000 -vt 0.130769 0.192308 -vt 0.230769 0.361538 -vt 0.230769 0.384615 -vt 0.969231 0.400000 -vt 0.900000 0.400000 -vt 0.923077 0.376923 -vt 0.076923 0.353846 -vt 0.423077 0.584615 -vt 0.420824 0.579176 -vt 0.415385 0.576923 -vt 0.415385 0.600000 -vt 0.407692 0.607692 -vt 0.415385 0.615385 -vt 0.061538 0.192308 -vt 0.076923 0.200000 -vt 0.230769 0.200000 -vt 0.230769 0.169231 -vt 0.030769 0.323077 -vt 0.007692 0.307692 -vt 0.023077 0.300000 -vt 0.130769 0.300000 -vt 0.169231 0.300000 -vt 0.138462 0.346154 -vt 0.192308 0.253846 -vt 0.923077 0.553846 -vt 0.923077 0.530769 -vt 0.923077 0.453846 -vt 0.900000 0.453846 -vt 0.900000 0.438462 -vt 0.923077 0.476923 -vt 0.900000 0.492308 -vt 0.900000 0.476923 -vt 0.830769 0.053846 -vt 0.830769 0.284615 -vt 0.830769 0.130769 -vt 0.892308 0.207692 -vt 0.661538 0.207692 -vt 0.723077 0.346154 -vt 0.723077 0.115385 -vt 0.723077 0.192308 -vt 0.946154 0.084615 -vt 0.923077 0.453846 -vt 0.138462 0.400000 -vt 0.938462 0.400000 -vt 0.961538 0.400000 -vt 0.115385 0.169231 -vt 0.030769 0.238462 -vt 0.230769 0.307692 -vt 0.115385 0.276923 -vt 0.184615 0.200000 -vt 0.161538 0.238462 -vt 0.161538 0.215385 -vt 0.138462 0.238462 -vt 0.169231 0.192308 -vt 0.192308 0.200000 -vt 0.169231 0.169231 -vt 0.130769 0.169231 -vt 0.192308 0.361538 -vt 0.115385 0.353846 -vt 0.409945 0.579176 -vt 0.407692 0.584615 -vt 0.409945 0.590055 -vt 0.415385 0.592308 -vt 0.420824 0.590055 -vt 0.409945 0.602253 -vt 0.409945 0.613132 -vt 0.420824 0.613132 -vt 0.423077 0.607692 -vt 0.420824 0.602253 -vt 0.007692 0.200000 -vt 0.000000 0.200000 -vt 0.000000 0.169231 -vt 0.023077 0.169231 -vt 0.023077 0.192308 -vt 0.061538 0.169231 -vt 0.076923 0.307692 -vt 0.061538 0.300000 -vt 0.053846 0.346154 -vt 0.053846 0.323077 -vt 0.061538 0.276923 -vt -0.000000 0.276923 -vt 0.023077 0.276923 -vt -0.000000 0.307692 -vt 0.030769 0.346154 -vt 0.169231 0.276923 -vt 0.184615 0.307692 -vt 0.161538 0.346154 -vt 0.115385 0.307692 -vt 0.130769 0.276923 -vt 0.230769 0.253846 -vt 0.900000 0.553846 -vt 0.923077 0.400000 -vt 0.300000 0.523077 -vt 0.323077 0.538462 -vt 0.323077 0.523077 -vt 0.346154 0.523077 -vt 0.369231 0.538462 -vt 0.369231 0.523077 -vt 0.507692 0.523077 -vt 0.530769 0.538462 -vt 0.530769 0.523077 -vt 0.438462 0.523077 -vt 0.461538 0.538462 -vt 0.461538 0.523077 -vt 0.392308 0.538462 -vt 0.392308 0.523077 -vt 0.253846 0.523077 -vt 0.276923 0.538462 -vt 0.276923 0.523077 -vt 0.484615 0.538462 -vt 0.484615 0.523077 -vt 0.415385 0.538462 -vt 0.415385 0.523077 -vt 0.300000 0.538462 -vt 0.346154 0.538462 -vt 0.507692 0.538462 -vt 0.438462 0.538462 -vt 0.248693 0.519231 -vt 0.215385 0.461538 -vt 0.182076 0.519231 -vt 0.413462 0.523077 -vt 0.392308 0.515385 -vt 0.394231 0.523077 -vt 0.417308 0.523077 -vt 0.438462 0.515385 -vt 0.415385 0.515385 -vt 0.459615 0.523077 -vt 0.440385 0.523077 -vt 0.463462 0.523077 -vt 0.484615 0.515385 -vt 0.461538 0.515385 -vt 0.505769 0.523077 -vt 0.486538 0.523077 -vt 0.509615 0.523077 -vt 0.530769 0.515385 -vt 0.507692 0.515385 -vt 0.275000 0.523077 -vt 0.253846 0.515385 -vt 0.255769 0.523077 -vt 0.298077 0.523077 -vt 0.276923 0.515385 -vt 0.278846 0.523077 -vt 0.321154 0.523077 -vt 0.300000 0.515385 -vt 0.301923 0.523077 -vt 0.325000 0.523077 -vt 0.346154 0.515385 -vt 0.323077 0.515385 -vt 0.390385 0.523077 -vt 0.369231 0.515385 -vt 0.371154 0.523077 -vt 0.367308 0.523077 -vt 0.348077 0.523077 -vt 0.276923 0.361538 -vt 0.323077 0.361538 -vt 0.484615 0.361538 -vt 0.415385 0.361538 -vt 0.300000 0.361538 -vt 0.346154 0.361538 -vt 0.507692 0.361538 -vt 0.438462 0.361538 -vt 0.369231 0.361538 -vt 0.253846 0.361538 -vt 0.461538 0.361538 -vt 0.392308 0.361538 -vt 0.373077 0.330769 -vt 0.365385 0.330769 -vt 0.350000 0.330769 -vt 0.342308 0.330769 -vt 0.326923 0.330769 -vt 0.303846 0.330769 -vt 0.280769 0.330769 -vt 0.257692 0.330769 -vt 0.530769 0.361538 -vt 0.511539 0.330769 -vt 0.503846 0.330769 -vt 0.488462 0.330769 -vt 0.480769 0.330769 -vt 0.465385 0.330769 -vt 0.442308 0.330769 -vt 0.419231 0.330769 -vt 0.411538 0.330769 -vt 0.396154 0.330769 -vt 0.853846 0.469231 -vt 0.530769 0.446154 -vt 0.853846 0.446154 -vt 0.853846 0.630769 -vt 0.530769 0.607692 -vt 0.853846 0.607692 -vt 0.853846 0.561538 -vt 0.530769 0.538462 -vt 0.853846 0.538462 -vt 0.853846 0.492308 -vt 0.530769 0.469231 -vt 0.853846 0.376923 -vt 0.530769 0.353846 -vt 0.853846 0.353846 -vt 0.853846 0.584615 -vt 0.530769 0.561538 -vt 0.853846 0.515385 -vt 0.530769 0.492308 -vt 0.853846 0.400000 -vt 0.530769 0.376923 -vt 0.530769 0.423077 -vt 0.853846 0.423077 -vt 0.530769 0.584615 -vt 0.530769 0.515385 -vt 0.530769 0.400000 -vt 0.407692 0.738462 -vt 0.223077 0.769231 -vt 0.223077 0.730769 -vt 0.407692 0.723077 -vt 0.223077 0.692308 -vt 0.407692 0.700000 -vt 0.407692 0.684615 -vt 0.223077 0.653846 -vt 0.407692 0.661538 -vt 0.407692 0.646154 -vt 0.223077 0.615385 -vt 0.407692 0.623077 -vt 0.407692 0.607692 -vt 0.223077 0.576923 -vt 0.407692 0.584615 -vt 0.407692 0.569231 -vt 0.223077 0.538462 -vt 0.407692 0.546154 -vt 0.407692 0.969231 -vt 0.223077 1.000000 -vt 0.223077 0.961538 -vt 0.407692 0.953846 -vt 0.223077 0.923077 -vt 0.407692 0.930769 -vt 0.407692 0.915385 -vt 0.223077 0.884615 -vt 0.407692 0.892308 -vt 0.407692 0.876923 -vt 0.223077 0.846154 -vt 0.407692 0.853846 -vt 0.407692 0.800000 -vt 0.407692 0.776923 -vt 0.407692 0.838462 -vt 0.223077 0.807692 -vt 0.407692 0.815385 -vt 0.038462 0.692308 -vt 0.038462 0.961538 -vt 0.038462 0.846154 -vt 0.038462 0.730769 -vt 0.038462 0.538462 -vt 0.038462 0.884615 -vt 0.038462 0.769231 -vt 0.038462 0.576923 -vt 0.038462 0.653846 -vt 0.038462 0.923077 -vt 0.038462 0.807692 -vt 0.038462 0.615385 -vt 0.030769 0.882692 -vt 0.030769 0.848077 -vt 0.030769 0.844231 -vt 0.030769 0.809615 -vt 0.030769 0.805769 -vt 0.030769 0.771154 -vt 0.030769 0.732692 -vt 0.030769 0.694231 -vt 0.030769 0.655769 -vt 0.030769 0.651923 -vt 0.030769 0.617308 -vt 0.030769 0.613461 -vt 0.030769 0.578846 -vt 0.030769 0.540385 -vt 0.038462 1.000000 -vt 0.030769 0.963462 -vt 0.030769 0.925000 -vt 0.030769 0.886539 -vt 0.030769 0.769231 -vt 0.000000 0.730769 -vt 0.030769 0.730769 -vt 0.030769 0.576923 -vt -0.000000 0.538462 -vt 0.030769 0.538462 -vt 0.030769 0.923077 -vt 0.000000 0.884615 -vt 0.030769 0.884615 -vt 0.030769 0.807692 -vt -0.000000 0.769231 -vt 0.030769 0.615385 -vt 0.000000 0.576923 -vt 0.030769 0.692308 -vt 0.000000 0.653846 -vt 0.030769 0.653846 -vt 0.030769 0.961538 -vt -0.000000 0.923077 -vt 0.030769 0.846154 -vt -0.000000 0.807692 -vt 0.000000 0.615385 -vt 0.000000 0.692308 -vt 0.030769 1.000000 -vt -0.000000 0.961538 -vt -0.000000 0.846154 -vt 0.009275 0.434615 -vt 0.129186 0.434615 -vt 0.069231 0.538462 -vt 0.515385 0.300000 -vt 0.500000 0.292308 -vt 0.515385 0.292308 -vt 0.438462 0.300000 -vt 0.423077 0.292308 -vt 0.438462 0.292308 -vt 0.392308 0.300000 -vt 0.376923 0.292308 -vt 0.392308 0.292308 -vt 0.530769 0.300000 -vt 0.530769 0.292308 -vt 0.453846 0.300000 -vt 0.453846 0.292308 -vt 0.407692 0.300000 -vt 0.407692 0.292308 -vt 0.361538 0.300000 -vt 0.346154 0.292308 -vt 0.361538 0.292308 -vt 0.469231 0.300000 -vt 0.469231 0.292308 -vt 0.500000 0.300000 -vt 0.484615 0.292308 -vt 0.423077 0.300000 -vt 0.376923 0.300000 -vt 0.484615 0.300000 -vt 0.376923 0.330769 -vt 0.361538 0.307692 -vt 0.376923 0.307692 -vt 0.484615 0.330769 -vt 0.469231 0.307692 -vt 0.484615 0.307692 -vt 0.515385 0.330769 -vt 0.500000 0.307692 -vt 0.515385 0.307692 -vt 0.438462 0.330769 -vt 0.423077 0.307692 -vt 0.438462 0.307692 -vt 0.392308 0.330769 -vt 0.392308 0.307692 -vt 0.530769 0.330769 -vt 0.530769 0.307692 -vt 0.453846 0.330769 -vt 0.453846 0.307692 -vt 0.407692 0.330769 -vt 0.407692 0.307692 -vt 0.361538 0.330769 -vt 0.346154 0.307692 -vt 0.469231 0.330769 -vt 0.500000 0.330769 -vt 0.423077 0.330769 -vt 0.550000 0.348693 -vt 0.588462 0.348693 -vt 0.607692 0.315385 -vt 0.452308 0.300000 -vt 0.440000 0.300000 -vt 0.467692 0.300000 -vt 0.455385 0.300000 -vt 0.483077 0.300000 -vt 0.470769 0.300000 -vt 0.498462 0.300000 -vt 0.486154 0.300000 -vt 0.501539 0.300000 -vt 0.516923 0.300000 -vt 0.360000 0.300000 -vt 0.347692 0.300000 -vt 0.375385 0.300000 -vt 0.363077 0.300000 -vt 0.390769 0.300000 -vt 0.378462 0.300000 -vt 0.406154 0.300000 -vt 0.393846 0.300000 -vt 0.424615 0.300000 -vt 0.409231 0.300000 -vt 0.615385 0.323077 -vt 0.607692 0.338462 -vt 0.607692 0.323077 -vt 0.615385 0.215385 -vt 0.607692 0.230769 -vt 0.607692 0.215385 -vt 0.615385 0.184615 -vt 0.607692 0.200000 -vt 0.607692 0.184615 -vt 0.615385 0.261538 -vt 0.607692 0.276923 -vt 0.607692 0.261538 -vt 0.615385 0.307692 -vt 0.607692 0.307692 -vt 0.615385 0.169231 -vt 0.607692 0.169231 -vt 0.615385 0.246154 -vt 0.607692 0.246154 -vt 0.615385 0.292308 -vt 0.607692 0.292308 -vt 0.615385 0.338462 -vt 0.607692 0.353846 -vt 0.615385 0.230769 -vt 0.615385 0.200000 -vt 0.615385 0.276923 -vt 0.615385 0.213846 -vt 0.623077 0.200000 -vt 0.623077 0.215385 -vt 0.615385 0.198462 -vt 0.623077 0.184615 -vt 0.615385 0.183077 -vt 0.623077 0.169231 -vt 0.615385 0.340000 -vt 0.623077 0.353846 -vt 0.615385 0.352308 -vt 0.615385 0.324615 -vt 0.623077 0.338462 -vt 0.615385 0.336923 -vt 0.615385 0.309231 -vt 0.623077 0.323077 -vt 0.615385 0.321538 -vt 0.615385 0.293846 -vt 0.623077 0.307692 -vt 0.615385 0.306154 -vt 0.615385 0.290769 -vt 0.623077 0.276923 -vt 0.623077 0.292308 -vt 0.615385 0.275385 -vt 0.623077 0.261538 -vt 0.615385 0.247692 -vt 0.615385 0.260000 -vt 0.615385 0.232308 -vt 0.623077 0.246154 -vt 0.615385 0.244615 -vt 0.615385 0.216923 -vt 0.623077 0.230769 -vt 0.615385 0.229231 -vt 0.646154 0.307692 -vt 0.646154 0.169231 -vt 0.646154 0.246154 -vt 0.646154 0.292308 -vt 0.646154 0.338462 -vt 0.646154 0.230769 -vt 0.646154 0.200000 -vt 0.646154 0.276923 -vt 0.646154 0.323077 -vt 0.646154 0.215385 -vt 0.646154 0.184615 -vt 0.646154 0.261538 -vt 0.703846 0.348693 -vt 0.665385 0.348693 -vt 0.646154 0.315385 -vt 0.676923 -0.000000 -vt 0.661538 0.007692 -vt 0.661538 -0.000000 -vt 0.753846 -0.000000 -vt 0.738462 0.007692 -vt 0.738462 0.000000 -vt 0.800000 0.000000 -vt 0.784615 0.007692 -vt 0.784615 -0.000000 -vt 0.846154 -0.000000 -vt 0.830769 0.007692 -vt 0.830769 -0.000000 -vt 0.723077 0.007692 -vt 0.723077 -0.000000 -vt 0.707692 -0.000000 -vt 0.692308 0.007692 -vt 0.692308 -0.000000 -vt 0.769231 0.007692 -vt 0.769231 -0.000000 -vt 0.815385 0.007692 -vt 0.815385 -0.000000 -vt 0.707692 0.007692 -vt 0.676923 0.007692 -vt 0.753846 0.007692 -vt 0.800000 0.007692 -vt 0.676923 0.015385 -vt 0.661538 0.030769 -vt 0.661538 0.015385 -vt 0.753846 0.015385 -vt 0.738462 0.030769 -vt 0.738462 0.015385 -vt 0.800000 0.015385 -vt 0.784615 0.030769 -vt 0.784615 0.015385 -vt 0.846154 0.015385 -vt 0.830769 0.030769 -vt 0.830769 0.015385 -vt 0.723077 0.030769 -vt 0.723077 0.015385 -vt 0.707692 0.015385 -vt 0.692308 0.030769 -vt 0.692308 0.015385 -vt 0.769231 0.030769 -vt 0.769231 0.015385 -vt 0.815385 0.030769 -vt 0.815385 0.015385 -vt 0.707692 0.030769 -vt 0.676923 0.030769 -vt 0.753846 0.030769 -vt 0.800000 0.030769 -vt 0.661538 0.046154 -vt 0.676923 0.046154 -vt 0.692308 0.046154 -vt 0.723077 0.046154 -vt 0.738462 0.046154 -vt 0.753846 0.046154 -vt 0.769231 0.046154 -vt 0.784615 0.046154 -vt 0.800000 0.046154 -vt 0.846154 0.030769 -vt 0.830769 0.046154 -vt 0.815385 0.046154 -vt 0.661538 0.076923 -vt 0.676923 0.103570 -vt 0.723077 0.076923 -vt 0.709231 0.007692 -vt 0.721538 0.007692 -vt 0.724615 0.007692 -vt 0.736923 0.007692 -vt 0.740000 0.007692 -vt 0.752308 0.007692 -vt 0.767692 0.007692 -vt 0.755385 0.007692 -vt 0.783077 0.007692 -vt 0.770769 0.007692 -vt 0.786154 0.007692 -vt 0.798462 0.007692 -vt 0.801538 0.007692 -vt 0.813846 0.007692 -vt 0.816923 0.007692 -vt 0.829231 0.007692 -vt 0.832308 0.007692 -vt 0.844615 0.007692 -vt 0.675385 0.007692 -vt 0.663077 0.007692 -vt 0.690769 0.007692 -vt 0.678462 0.007692 -vt 0.706154 0.007692 -vt 0.693846 0.007692 -vt 0.938462 0.553846 -vt 0.961538 0.553846 -vt 0.846154 0.476923 -vt 0.884615 0.453846 -vt 0.884615 0.476923 -vt 0.923077 0.061538 -vt 0.946154 0.061538 -vt 0.161538 0.392308 -vt 0.138462 0.369231 -vt 0.161538 0.369231 -vt 0.192308 0.253846 -vt 0.230769 0.207692 -vt 0.230769 0.253846 -vt 0.076923 0.246154 -vt 0.115385 0.246154 -vt 0.192308 0.315385 -vt 0.230769 0.315385 -vt 0.138462 0.246154 -vt 0.030769 0.353846 -vt 0.053846 0.353846 -vt 1.000000 0.338462 -vt 0.430769 0.576923 -vt 0.438462 0.569231 -vt 0.438462 0.576923 -vt 0.415385 0.576923 -vt 0.423077 0.569231 -vt 0.423077 0.576923 -vt 0.461538 0.576923 -vt 0.469231 0.569231 -vt 0.469231 0.576923 -vt 0.446154 0.576923 -vt 0.453846 0.569231 -vt 0.453846 0.576923 -vt 0.430769 0.569231 -vt 0.407692 0.576923 -vt 0.415385 0.569231 -vt 0.461538 0.569231 -vt 0.446154 0.569231 -vt 0.430769 0.600000 -vt 0.438462 0.592308 -vt 0.438462 0.600000 -vt 0.415385 0.600000 -vt 0.423077 0.592308 -vt 0.423077 0.600000 -vt 0.461538 0.600000 -vt 0.469231 0.592308 -vt 0.469231 0.600000 -vt 0.446154 0.600000 -vt 0.453846 0.592308 -vt 0.453846 0.600000 -vt 0.430769 0.592308 -vt 0.407692 0.600000 -vt 0.415385 0.592308 -vt 0.461538 0.592308 -vt 0.446154 0.592308 -vt 0.192308 0.207692 -vt 0.253846 0.538462 -vt 0.196154 0.533309 -vt 0.215385 0.538462 -vt 0.234615 0.533309 -vt 0.253846 0.500000 -vt 0.248693 0.480769 -vt 0.234615 0.466691 -vt 0.196154 0.466691 -vt 0.182076 0.480769 -vt 0.176923 0.500000 -vt 0.436538 0.523077 -vt 0.482692 0.523077 -vt 0.528846 0.523077 -vt 0.344231 0.523077 -vt 0.388462 0.330769 -vt 0.319231 0.330769 -vt 0.296154 0.330769 -vt 0.273077 0.330769 -vt 0.526923 0.330769 -vt 0.457692 0.330769 -vt 0.434615 0.330769 -vt 0.530769 0.630769 -vt 0.407692 0.761538 -vt 0.407692 0.992308 -vt 0.030769 0.767308 -vt 0.030769 0.728846 -vt 0.030769 0.690385 -vt 0.030769 0.575000 -vt 0.030769 0.998077 -vt 0.030769 0.959615 -vt 0.030769 0.921154 -vt 0.000000 1.000000 -vt 0.034615 0.529186 -vt 0.009275 0.503846 -vt 0.000000 0.469231 -vt 0.034615 0.409275 -vt 0.069231 0.400000 -vt 0.103846 0.409275 -vt 0.138462 0.469231 -vt 0.129186 0.503846 -vt 0.103846 0.529186 -vt 0.346154 0.300000 -vt 0.346154 0.330769 -vt 0.602539 0.296154 -vt 0.588462 0.282076 -vt 0.569231 0.276923 -vt 0.550000 0.282076 -vt 0.535922 0.296154 -vt 0.530769 0.315385 -vt 0.535922 0.334615 -vt 0.569231 0.353846 -vt 0.602539 0.334615 -vt 0.513846 0.300000 -vt 0.529231 0.300000 -vt 0.436923 0.300000 -vt 0.421538 0.300000 -vt 0.615385 0.353846 -vt 0.615385 0.201538 -vt 0.615385 0.186154 -vt 0.615385 0.170769 -vt 0.615385 0.278462 -vt 0.615385 0.263077 -vt 0.646154 0.353846 -vt 0.651307 0.296154 -vt 0.665385 0.282076 -vt 0.684615 0.276923 -vt 0.703846 0.282076 -vt 0.717924 0.296154 -vt 0.723077 0.315385 -vt 0.717924 0.334615 -vt 0.684615 0.353846 -vt 0.651307 0.334615 -vt 0.846154 0.007692 -vt 0.707692 0.046154 -vt 0.846154 0.046154 -vt 0.676923 0.050276 -vt 0.665661 0.061538 -vt 0.665661 0.092308 -vt 0.692308 0.107692 -vt 0.707692 0.103570 -vt 0.718955 0.092308 -vt 0.718955 0.061538 -vt 0.707692 0.050276 -vt 0.692308 0.046154 -vt 0.846154 0.453846 -vt 0.138462 0.392308 -vt 0.161538 0.246154 -vt 1.000000 0.107692 -vt 0.407692 0.569231 -vt 0.407692 0.592308 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -vn -0.4472 0.8944 0.0000 -vn -0.4472 -0.8944 0.0000 -vn -0.4472 0.0000 -0.8944 -vn -0.4472 0.0000 0.8944 -vn -1.0000 0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn 0.4472 0.0000 -0.8944 -vn 0.4472 0.8944 0.0000 -vn 0.4472 0.0000 0.8944 -vn 0.4472 -0.8944 0.0000 -vn -0.7071 0.7071 0.0000 -vn 0.0000 0.5000 0.8660 -vn 0.0000 -0.5000 0.8660 -vn 0.0000 -0.8660 0.5000 -vn 0.0000 0.8660 -0.5000 -vn 0.0000 -0.5000 -0.8660 -vn 0.0000 0.8660 0.5000 -vn 0.0000 0.5000 -0.8660 -vn 0.0000 -0.8660 -0.5000 -vn 0.5547 0.8321 0.0000 -vn 0.5547 0.7206 -0.4160 -vn 0.5547 0.4160 -0.7206 -vn 0.5547 -0.0000 -0.8321 -vn 0.5547 -0.4160 -0.7206 -vn 0.5547 -0.7206 -0.4160 -vn 0.5547 -0.8321 0.0000 -vn 0.5547 -0.7206 0.4160 -vn 0.5547 -0.4160 0.7206 -vn 0.5547 0.0000 0.8321 -vn 0.5547 0.4160 0.7206 -vn 0.5547 0.7206 0.4160 -vn -0.2425 0.8402 -0.4851 -vn -0.2425 0.9701 -0.0000 -vn -0.2425 0.4851 -0.8402 -vn -0.2425 0.0000 -0.9701 -vn -0.2425 -0.4851 -0.8402 -vn -0.2425 -0.8402 -0.4851 -vn -0.2425 -0.9701 0.0000 -vn -0.2425 -0.8402 0.4851 -vn -0.2425 -0.4851 0.8402 -vn -0.2425 -0.0000 0.9701 -vn -0.2425 0.4851 0.8402 -vn -0.2425 0.8402 0.4851 -vn -0.8660 0.0000 -0.5000 -vn -0.5000 0.0000 -0.8660 -vn 0.8660 0.0000 0.5000 -vn -0.5000 0.0000 0.8660 -vn 0.8660 0.0000 -0.5000 -vn 0.5000 0.0000 0.8660 -vn -0.8660 0.0000 0.5000 -vn 0.5000 0.0000 -0.8660 -vn -0.5000 -0.8660 0.0000 -vn -0.8660 -0.5000 0.0000 -vn 0.5000 0.8660 0.0000 -vn -0.8660 0.5000 0.0000 -vn -0.5000 0.8660 0.0000 -vn 0.8660 -0.5000 0.0000 -vn 0.8660 0.5000 0.0000 -vn 0.5000 -0.8660 0.0000 -vn -0.9751 0.0000 -0.2217 -vn 0.8445 0.4876 -0.2217 -vn 0.4876 -0.8445 -0.2217 -vn -0.8445 -0.4876 -0.2217 -vn 0.4876 0.8445 -0.2217 -vn -0.4876 0.8445 -0.2217 -vn 0.8445 -0.4876 -0.2217 -vn -0.4876 -0.8445 -0.2217 -vn 0.0000 0.9751 -0.2217 -vn -0.8445 0.4876 -0.2217 -vn 0.9751 0.0000 -0.2217 -vn -0.0000 -0.9751 -0.2217 -vn -0.8944 0.0000 -0.4472 -vn -0.7746 0.4472 -0.4472 -vn -0.4472 0.7746 -0.4472 -vn 0.4472 0.7746 -0.4472 -vn 0.7746 0.4472 -0.4472 -vn 0.8944 0.0000 -0.4472 -vn 0.7746 -0.4472 -0.4472 -vn 0.4472 -0.7746 -0.4472 -vn 0.0000 -0.8944 -0.4472 -vn -0.7746 -0.4472 -0.4472 -vn -0.4472 -0.7746 -0.4472 -vn -0.9239 0.3827 0.0000 -vn 0.7071 -0.7071 0.0000 -vn 0.3827 -0.9239 0.0000 -vn 0.9239 -0.3827 0.0000 -vn 0.0000 0.5145 -0.8575 -vn 0.0000 0.8702 -0.4927 -vn 0.0000 0.2669 0.9637 -vn 0.0000 0.5145 0.8575 -vn 0.2898 -0.9571 0.0000 -vn -0.2898 -0.9571 0.0000 -vn -0.5547 -0.8321 0.0000 -vn 0.7071 0.7071 0.0000 -vn -0.7071 -0.7071 0.0000 -vn 0.0000 0.8944 -0.4472 -s off -f 926/1618/432 929/1619/432 925/1620/432 -f 928/1621/433 923/1622/433 927/1623/433 -f 929/1619/434 923/1622/434 925/1620/434 -f 926/1624/435 928/1621/435 930/1625/435 -f 926/1624/436 932/1626/436 924/1627/436 -f 923/1622/437 933/1628/437 925/1620/437 -f 925/1620/438 934/1629/438 926/1618/438 -f 924/1627/439 931/1630/439 923/1622/439 -f 931/1631/440 934/1632/440 933/1628/440 -f 938/1633/441 935/1634/441 937/1635/441 -f 930/1636/442 937/1637/442 929/1619/442 -f 928/1621/443 938/1638/443 930/1625/443 -f 927/1623/444 936/1639/444 928/1621/444 -f 929/1619/445 935/1634/445 927/1623/445 -f 1154/1640/441 1152/1641/441 1150/1642/441 -f 1161/1643/435 1160/1644/435 1159/1645/435 -f 1165/1646/434 1156/1647/434 1154/1640/434 -f 1164/1648/432 1155/1649/432 1166/1650/432 -f 1162/1651/433 1153/1652/433 1161/1653/433 -f 1168/1654/432 1160/1655/432 1158/1656/432 -f 1159/1657/433 1167/1658/433 1157/1659/433 -f 1168/1660/446 1157/1661/446 1167/1662/446 -f 1149/1663/433 1153/1664/433 1165/1665/433 -f 1152/1641/432 1156/1647/432 1166/1666/432 -f 1170/1667/435 1157/1661/435 1158/1668/435 -f 1179/1669/434 1185/1670/434 1186/1671/434 -f 1170/1672/446 1180/1673/446 1169/1674/446 -f 1247/1675/432 1250/1676/432 1248/1677/432 -f 1197/1678/434 1201/1679/434 1202/1680/434 -f 1175/1681/434 1254/1682/434 1176/1683/434 -f 1207/1684/433 1209/1685/433 1181/1686/433 -f 1208/1687/432 1173/1688/432 1210/1689/432 -f 1211/1690/433 1190/1691/433 1213/1692/433 -f 1212/1693/432 1214/1694/432 1206/1695/432 -f 1207/1696/441 1183/1697/441 1178/1698/441 -f 1164/1648/432 1206/1699/432 1163/1700/432 -f 1171/1701/432 1170/1667/432 1173/1688/432 -f 1158/1668/432 1160/1644/432 1210/1689/432 -f 1180/1702/433 1181/1686/433 1169/1703/433 -f 1190/1704/433 1162/1651/433 1161/1653/433 -f 1159/1645/433 1213/1692/433 1161/1643/433 -f 1227/1705/432 1226/1706/432 1225/1707/432 -f 1241/1708/432 1239/1709/432 1245/1710/432 -f 1187/1711/440 1184/1712/440 1180/1673/440 -f 1251/1713/432 1254/1682/432 1252/1714/432 -f 1212/1715/440 1191/1716/440 1204/1717/440 -f 1196/1718/441 1195/1719/441 1189/1720/441 -f 1194/1721/434 1247/1675/434 1248/1677/434 -f 1145/1722/440 1167/1658/440 1143/1723/440 -f 1146/1724/432 1256/1725/432 1148/1726/432 -f 1144/1727/441 1256/1725/441 1146/1724/441 -f 1147/1728/433 1255/1729/433 1144/1727/433 -f 926/1618/432 930/1636/432 929/1619/432 -f 928/1621/433 924/1627/433 923/1622/433 -f 929/1619/434 927/1623/434 923/1622/434 -f 926/1624/435 924/1627/435 928/1621/435 -f 926/1624/436 934/1730/436 932/1626/436 -f 923/1622/437 931/1631/437 933/1628/437 -f 925/1620/438 933/1731/438 934/1629/438 -f 924/1627/439 932/1732/439 931/1630/439 -f 931/1631/440 932/1733/440 934/1632/440 -f 938/1633/441 936/1734/441 935/1634/441 -f 930/1636/442 938/1735/442 937/1637/442 -f 928/1621/443 936/1736/443 938/1638/443 -f 927/1623/444 935/1737/444 936/1639/444 -f 929/1619/445 937/1635/445 935/1634/445 -f 1154/1640/441 1156/1647/441 1152/1641/441 -f 1161/1643/435 1163/1738/435 1160/1644/435 -f 1165/1646/434 1166/1739/434 1156/1647/434 -f 1164/1648/432 1163/1700/432 1155/1649/432 -f 1162/1651/433 1165/1740/433 1153/1652/433 -f 1168/1654/432 1148/1726/432 1160/1655/432 -f 1159/1657/433 1147/1728/433 1167/1658/433 -f 1168/1660/446 1158/1668/446 1157/1661/446 -f 1154/1640/433 1150/1642/433 1165/1665/433 -f 1150/1642/433 1149/1663/433 1165/1665/433 -f 1155/1741/432 1151/1742/432 1166/1666/432 -f 1151/1742/432 1152/1641/432 1166/1666/432 -f 1170/1667/435 1169/1703/435 1157/1661/435 -f 1179/1669/434 1182/1743/434 1185/1670/434 -f 1170/1672/446 1171/1744/446 1180/1673/446 -f 1247/1675/432 1249/1745/432 1250/1676/432 -f 1197/1678/434 1198/1746/434 1201/1679/434 -f 1175/1681/434 1252/1714/434 1254/1682/434 -f 1174/1747/441 1173/1748/441 1208/1749/441 -f 1207/1696/441 1181/1750/441 1183/1697/441 -f 1174/1747/441 1208/1749/441 1177/1751/441 -f 1208/1749/441 1207/1696/441 1177/1751/441 -f 1254/1682/441 1253/1752/441 1174/1747/441 -f 1177/1751/441 1176/1753/441 1254/1682/441 -f 1182/1743/441 1179/1754/441 1178/1698/441 -f 1177/1751/441 1254/1682/441 1174/1747/441 -f 1183/1697/441 1182/1743/441 1178/1698/441 -f 1178/1698/441 1177/1751/441 1207/1696/441 -f 1164/1648/432 1205/1755/432 1206/1699/432 -f 1160/1644/432 1163/1738/432 1214/1694/432 -f 1163/1738/432 1206/1695/432 1214/1694/432 -f 1214/1694/432 1210/1689/432 1160/1644/432 -f 1210/1689/432 1173/1688/432 1158/1668/432 -f 1173/1688/432 1170/1667/432 1158/1668/432 -f 1190/1704/433 1189/1756/433 1162/1651/433 -f 1159/1645/433 1157/1661/433 1209/1685/433 -f 1157/1661/433 1169/1703/433 1181/1686/433 -f 1209/1685/433 1157/1661/433 1181/1686/433 -f 1209/1685/433 1213/1692/433 1159/1645/433 -f 1213/1692/433 1190/1691/433 1161/1643/433 -f 1225/1707/432 1224/1757/432 1223/1758/432 -f 1223/1758/432 1230/1759/432 1225/1707/432 -f 1230/1759/432 1229/1760/432 1225/1707/432 -f 1229/1760/432 1228/1761/432 1225/1707/432 -f 1228/1761/432 1227/1705/432 1225/1707/432 -f 1241/1708/432 1240/1762/432 1239/1709/432 -f 1239/1709/432 1246/1763/432 1245/1710/432 -f 1245/1710/432 1244/1764/432 1243/1765/432 -f 1243/1765/432 1242/1766/432 1245/1710/432 -f 1242/1766/432 1241/1708/432 1245/1710/432 -f 1172/1767/440 1251/1768/440 1252/1769/440 -f 1252/1769/440 1175/1770/440 1188/1771/440 -f 1187/1711/440 1186/1772/440 1185/1670/440 -f 1172/1767/440 1252/1769/440 1188/1771/440 -f 1187/1711/440 1185/1670/440 1184/1712/440 -f 1172/1767/440 1188/1771/440 1171/1744/440 -f 1188/1771/440 1187/1711/440 1180/1673/440 -f 1180/1673/440 1171/1744/440 1188/1771/440 -f 1251/1713/432 1253/1752/432 1254/1682/432 -f 1201/1679/440 1200/1773/440 1203/1774/440 -f 1200/1773/440 1190/1775/440 1211/1776/440 -f 1200/1773/440 1211/1776/440 1203/1774/440 -f 1203/1774/440 1202/1777/440 1201/1679/440 -f 1247/1778/440 1193/1779/440 1204/1717/440 -f 1249/1780/440 1247/1778/440 1191/1716/440 -f 1247/1778/440 1204/1717/440 1191/1716/440 -f 1204/1717/440 1203/1774/440 1211/1776/440 -f 1212/1715/440 1206/1781/440 1191/1716/440 -f 1204/1717/440 1211/1776/440 1212/1715/440 -f 1194/1782/441 1248/1677/441 1195/1719/441 -f 1248/1677/441 1250/1676/441 1192/1783/441 -f 1192/1783/441 1205/1784/441 1195/1719/441 -f 1205/1784/441 1189/1720/441 1195/1719/441 -f 1248/1677/441 1192/1783/441 1195/1719/441 -f 1189/1720/441 1199/1785/441 1196/1718/441 -f 1199/1785/441 1198/1746/441 1196/1718/441 -f 1198/1746/441 1197/1786/441 1196/1718/441 -f 1194/1721/434 1193/1787/434 1247/1675/434 -f 1145/1722/440 1168/1788/440 1167/1658/440 -f 1168/1654/432 1145/1789/432 1148/1726/432 -f 1145/1789/432 1146/1724/432 1148/1726/432 -f 1144/1727/441 1255/1729/441 1256/1725/441 -f 1144/1727/433 1143/1723/433 1147/1728/433 -f 1143/1723/433 1167/1658/433 1147/1728/433 -s 1 -f 862/1790/447 863/1791/433 851/1792/433 -f 852/1793/448 865/1794/449 853/1795/449 -f 859/1796/450 872/1797/435 860/1798/435 -f 856/1799/451 869/1800/432 857/1801/432 -f 853/1795/449 866/1802/434 854/1803/434 -f 860/1804/435 873/1805/452 861/1806/452 -f 857/1801/432 870/1807/453 858/1808/453 -f 854/1803/434 867/1809/454 855/1810/454 -f 861/1806/452 874/1811/447 862/1790/447 -f 851/1792/433 864/1812/448 852/1793/448 -f 858/1808/453 871/1813/450 859/1796/450 -f 855/1810/454 868/1814/451 856/1799/451 -f 873/1815/440 869/1816/440 865/1817/440 -f 855/1818/440 878/1819/440 854/1820/440 -f 855/1821/440 880/1822/440 879/1823/440 -f 857/1824/440 880/1822/440 856/1825/440 -f 857/1826/440 882/1827/440 881/1828/440 -f 859/1829/440 882/1827/440 858/1830/440 -f 859/1831/440 884/1832/440 883/1833/440 -f 861/1834/440 884/1835/440 860/1836/440 -f 862/1837/440 885/1838/440 861/1839/440 -f 851/1840/440 886/1841/440 862/1842/440 -f 851/1843/440 876/1844/440 875/1845/440 -f 854/1846/440 877/1847/440 853/1848/440 -f 853/1849/440 876/1844/440 852/1850/440 -f 886/1841/451 897/1851/454 885/1838/454 -f 876/1844/453 887/1852/432 875/1845/432 -f 883/1833/449 894/1853/448 882/1827/448 -f 880/1822/447 891/1854/452 879/1823/452 -f 875/1845/432 898/1855/451 886/1841/451 -f 877/1847/450 888/1856/453 876/1844/453 -f 884/1832/434 895/1857/449 883/1833/449 -f 881/1828/433 892/1858/447 880/1822/447 -f 878/1819/435 889/1859/450 877/1847/450 -f 885/1838/454 896/1860/434 884/1835/434 -f 882/1827/448 893/1861/433 881/1828/433 -f 879/1823/452 890/1862/435 878/1819/435 -f 890/1862/455 901/1863/456 889/1859/456 -f 888/1856/457 901/1864/456 900/1865/457 -f 887/1852/458 900/1866/457 899/1867/458 -f 887/1852/458 910/1868/459 898/1855/459 -f 898/1855/459 909/1869/460 897/1851/460 -f 897/1851/460 908/1870/461 896/1860/461 -f 896/1871/461 907/1872/462 895/1857/462 -f 894/1853/463 907/1873/462 906/1874/463 -f 893/1861/464 906/1875/463 905/1876/464 -f 893/1861/464 904/1877/465 892/1858/465 -f 892/1858/465 903/1878/466 891/1854/466 -f 890/1862/455 903/1879/466 902/1880/455 -f 901/1881/450 912/1882/453 900/1883/453 -f 908/1884/434 919/1885/449 907/1886/449 -f 905/1887/433 916/1888/447 904/1889/447 -f 902/1890/435 913/1891/450 901/1881/450 -f 909/1892/454 920/1893/434 908/1894/434 -f 906/1895/448 917/1896/433 905/1887/433 -f 903/1897/452 914/1898/435 902/1890/435 -f 910/1899/451 921/1900/454 909/1892/454 -f 900/1883/453 911/1901/432 899/1902/432 -f 907/1886/449 918/1903/448 906/1895/448 -f 904/1889/447 915/1904/452 903/1897/452 -f 899/1902/432 922/1905/451 910/1899/451 -f 913/1906/467 942/1907/468 941/1908/467 -f 913/1909/467 940/1910/469 912/1911/469 -f 912/1912/469 939/1913/470 911/1914/470 -f 911/1915/470 950/1916/471 922/1917/471 -f 922/1918/471 949/1919/472 921/1920/472 -f 921/1921/472 948/1922/473 920/1923/473 -f 919/1924/474 948/1925/473 947/1926/474 -f 919/1927/474 946/1928/475 918/1929/475 -f 918/1930/475 945/1931/476 917/1932/476 -f 917/1933/476 944/1934/477 916/1935/477 -f 915/1936/478 942/1907/468 914/1937/468 -f 916/1938/477 943/1939/478 915/1940/478 -f 941/1908/450 952/1941/453 940/1910/453 -f 948/1925/434 959/1942/449 947/1926/449 -f 945/1931/433 956/1943/447 944/1934/447 -f 942/1907/435 953/1944/450 941/1908/450 -f 949/1919/454 960/1945/434 948/1922/434 -f 946/1928/448 957/1946/433 945/1931/433 -f 943/1939/452 954/1947/435 942/1907/435 -f 950/1916/451 961/1948/454 949/1919/454 -f 939/1913/432 952/1941/453 951/1949/432 -f 947/1926/449 958/1950/448 946/1928/448 -f 944/1934/447 955/1951/452 943/1939/452 -f 939/1913/432 962/1952/451 950/1916/451 -f 956/1943/441 969/1953/441 968/1954/441 -f 955/1951/441 968/1955/441 967/1956/441 -f 954/1947/441 967/1957/441 966/1958/441 -f 954/1947/441 965/1959/441 953/1944/441 -f 953/1944/441 964/1960/441 952/1941/441 -f 952/1941/441 963/1961/441 951/1949/441 -f 962/1952/441 963/1962/441 974/1963/441 -f 961/1948/441 974/1964/441 973/1965/441 -f 961/1948/441 972/1966/441 960/1945/441 -f 960/1967/441 971/1968/441 959/1942/441 -f 959/1942/441 970/1969/441 958/1950/441 -f 958/1950/441 969/1970/441 957/1946/441 -f 966/1971/434 977/1972/449 965/1973/449 -f 973/1974/452 984/1975/435 972/1976/435 -f 970/1977/453 981/1978/432 969/1979/432 -f 967/1980/454 978/1981/434 966/1971/434 -f 974/1982/447 985/1983/452 973/1974/452 -f 964/1984/448 975/1985/433 963/1986/433 -f 971/1987/450 982/1988/453 970/1977/453 -f 968/1989/451 979/1990/454 967/1980/454 -f 963/1986/433 986/1991/447 974/1982/447 -f 965/1973/449 976/1992/448 964/1984/448 -f 972/1993/435 983/1994/450 971/1987/450 -f 969/1979/432 980/1995/451 968/1989/451 -f 979/1996/441 983/1997/441 975/1998/441 -f 1001/1999/479 988/2000/480 989/2001/479 -f 1008/2002/441 995/2003/481 996/2004/441 -f 1005/2005/433 992/2006/482 993/2007/433 -f 1002/2008/440 989/2001/479 990/2009/440 -f 1009/2010/483 996/2004/441 997/2011/483 -f 1006/2012/484 993/2007/433 994/2013/484 -f 1003/2014/485 990/2015/440 991/2016/485 -f 1010/2017/486 997/2011/483 998/2018/486 -f 1000/2019/480 987/2020/432 988/2000/480 -f 1007/2021/481 994/2013/484 995/2003/481 -f 1004/2022/482 991/2016/485 992/2006/482 -f 999/2023/432 998/2018/486 987/2020/432 -f 1028/2024/482 1015/2025/485 1016/2026/482 -f 1023/2027/432 1022/2028/486 1011/2029/432 -f 1025/2030/479 1012/2031/480 1013/2032/479 -f 1032/2033/441 1019/2034/481 1020/2035/441 -f 1029/2036/433 1016/2026/482 1017/2037/433 -f 1026/2038/440 1013/2032/479 1014/2039/440 -f 1033/2040/483 1020/2035/441 1021/2041/483 -f 1030/2042/484 1017/2037/433 1018/2043/484 -f 1027/2044/485 1014/2045/440 1015/2025/485 -f 1034/2046/486 1021/2041/483 1022/2028/486 -f 1024/2047/480 1011/2029/432 1012/2031/480 -f 1031/2048/481 1018/2043/484 1019/2034/481 -f 1031/2049/435 1033/2050/435 1023/2051/435 -f 1009/2052/434 1020/2035/434 1008/2053/434 -f 1010/2054/434 1021/2041/434 1009/2055/434 -f 999/2056/434 1022/2028/434 1010/2057/434 -f 1000/2058/434 1011/2029/434 999/2059/434 -f 1000/2060/434 1013/2032/434 1012/2031/434 -f 1001/2061/434 1014/2039/434 1013/2032/434 -f 1003/2062/434 1014/2045/434 1002/2063/434 -f 1004/2064/434 1015/2025/434 1003/2065/434 -f 1005/2066/434 1016/2026/434 1004/2067/434 -f 1006/2068/434 1017/2037/434 1005/2069/434 -f 1007/2070/434 1020/2035/434 1019/2034/434 -f 1006/2071/434 1019/2034/434 1018/2043/434 -f 1052/2072/487 1039/2073/488 1040/2074/487 -f 1047/2075/435 1046/2076/489 1035/2077/435 -f 1049/2078/490 1036/2079/491 1037/2080/490 -f 1056/2081/441 1043/2082/492 1044/2083/441 -f 1053/2084/434 1040/2074/487 1041/2085/434 -f 1050/2086/440 1037/2080/490 1038/2087/440 -f 1057/2088/493 1044/2083/441 1045/2089/493 -f 1054/2090/494 1041/2085/434 1042/2091/494 -f 1051/2092/488 1038/2093/440 1039/2073/488 -f 1058/2094/489 1045/2089/493 1046/2076/489 -f 1048/2095/491 1035/2077/435 1036/2079/491 -f 1055/2096/492 1042/2091/494 1043/2082/492 -f 1047/2097/432 1060/2098/432 1059/2099/432 -f 1048/2100/432 1061/2101/432 1060/2098/432 -f 1049/2102/432 1062/2103/432 1061/2101/432 -f 1051/2104/432 1062/2105/432 1050/2106/432 -f 1052/2107/432 1063/2108/432 1051/2109/432 -f 1053/2110/432 1064/2111/432 1052/2112/432 -f 1054/2113/432 1065/2114/432 1053/2115/432 -f 1054/2116/432 1067/2117/432 1066/2118/432 -f 1055/2119/432 1068/2120/432 1067/2117/432 -f 1057/2121/432 1068/2120/432 1056/2122/432 -f 1058/2123/432 1069/2124/432 1057/2125/432 -f 1047/2126/432 1070/2127/432 1058/2128/432 -f 1077/2129/434 1064/2111/487 1065/2114/434 -f 1074/2130/440 1061/2101/490 1062/2103/440 -f 1081/2131/493 1068/2120/441 1069/2124/493 -f 1078/2132/494 1065/2114/434 1066/2118/494 -f 1075/2133/488 1062/2105/440 1063/2108/488 -f 1082/2134/489 1069/2124/493 1070/2127/489 -f 1072/2135/491 1059/2099/435 1060/2098/491 -f 1079/2136/492 1066/2118/494 1067/2117/492 -f 1076/2137/487 1063/2108/488 1064/2111/487 -f 1071/2138/435 1070/2127/489 1059/2099/435 -f 1073/2139/490 1060/2098/491 1061/2101/490 -f 1080/2140/441 1067/2117/492 1068/2120/441 -f 1079/2141/433 1081/2142/433 1071/2143/433 -f 1085/2144/490 1098/2145/440 1086/2146/440 -f 1092/2147/441 1105/2148/493 1093/2149/493 -f 1089/2150/434 1102/2151/494 1090/2152/494 -f 1086/2153/440 1099/2154/488 1087/2155/488 -f 1093/2149/493 1106/2156/489 1094/2157/489 -f 1083/2158/435 1096/2159/491 1084/2160/491 -f 1090/2152/494 1103/2161/492 1091/2162/492 -f 1087/2155/488 1100/2163/487 1088/2164/487 -f 1094/2157/489 1095/2165/435 1083/2158/435 -f 1084/2160/491 1097/2166/490 1085/2144/490 -f 1091/2162/492 1104/2167/441 1092/2147/441 -f 1088/2164/487 1101/2168/434 1089/2150/434 -f 1109/2169/490 1122/2170/495 1110/2171/440 -f 1116/2172/441 1129/2173/496 1117/2174/493 -f 1113/2175/434 1126/2176/497 1114/2177/494 -f 1110/2178/440 1123/2179/498 1111/2180/488 -f 1117/2174/493 1130/2181/499 1118/2182/489 -f 1107/2183/435 1120/2184/500 1108/2185/491 -f 1114/2177/494 1127/2186/501 1115/2187/492 -f 1111/2180/488 1124/2188/502 1112/2189/487 -f 1118/2182/489 1119/2190/503 1107/2183/435 -f 1108/2185/491 1121/2191/504 1109/2169/490 -f 1115/2187/492 1128/2192/505 1116/2172/441 -f 1112/2189/487 1125/2193/506 1113/2175/434 -f 1121/2191/504 1134/2194/507 1122/2170/495 -f 1120/2184/500 1133/2195/508 1121/2191/504 -f 1119/2190/503 1132/2196/509 1120/2184/500 -f 1142/2197/510 1119/2190/503 1130/2181/499 -f 1141/2198/511 1130/2181/499 1129/2173/496 -f 1140/2199/512 1129/2173/496 1128/2192/505 -f 1139/2200/513 1128/2192/505 1127/2186/501 -f 1138/2201/514 1127/2186/501 1126/2176/497 -f 1137/2202/515 1126/2176/497 1125/2193/506 -f 1124/2188/502 1137/2202/515 1125/2193/506 -f 1122/2203/495 1135/2204/516 1123/2179/498 -f 1123/2179/498 1136/2205/517 1124/2188/502 -f 1131/2206/432 1141/2207/432 1137/2208/432 -f 1118/2182/433 1095/2209/433 1106/2210/433 -f 1117/2174/433 1106/2211/433 1105/2212/433 -f 1116/2172/433 1105/2213/433 1104/2214/433 -f 1103/2215/433 1116/2172/433 1104/2216/433 -f 1102/2217/433 1115/2187/433 1103/2218/433 -f 1113/2175/433 1102/2219/433 1101/2220/433 -f 1112/2189/433 1101/2221/433 1100/2222/433 -f 1111/2180/433 1100/2223/433 1099/2224/433 -f 1110/2178/433 1099/2225/433 1098/2226/433 -f 1097/2227/433 1110/2171/433 1098/2228/433 -f 1096/2229/433 1109/2169/433 1097/2230/433 -f 1095/2231/433 1108/2185/433 1096/2232/433 -f 1155/2233/518 1149/1663/440 1151/2234/440 -f 1159/2235/519 1148/2236/520 1147/2237/520 -f 1163/1738/446 1153/2238/518 1155/2239/518 -f 1166/2240/519 1162/2241/521 1164/2242/521 -f 1173/2243/522 1172/2244/523 1171/2245/522 -f 1183/1697/524 1185/1670/433 1182/1743/433 -f 1180/2246/525 1183/1697/524 1181/2247/525 -f 1199/1785/524 1201/1679/433 1198/1746/433 -f 1200/1773/524 1189/1756/525 1190/1704/525 -f 1206/1699/522 1192/2248/523 1191/2249/523 -f 1208/1749/461 1209/2250/526 1207/1696/461 -f 1214/2251/527 1211/1776/528 1213/2252/527 -f 1162/2241/521 1205/1784/441 1164/2242/521 -f 1214/1694/527 1209/2253/526 1210/1689/526 -f 1222/2254/529 1223/2255/435 1215/2256/435 -f 1220/2257/519 1229/2258/441 1221/2259/441 -f 1218/2260/530 1227/2261/434 1219/2262/434 -f 1216/2263/446 1225/2264/440 1217/2265/440 -f 1221/2259/441 1230/2266/529 1222/2254/529 -f 1219/2267/434 1228/2268/519 1220/2257/519 -f 1217/2265/440 1226/2269/530 1218/2260/530 -f 1215/2256/435 1224/2270/446 1216/2263/446 -f 1238/2271/529 1239/2272/435 1231/2273/435 -f 1236/2274/519 1245/2275/441 1237/2276/441 -f 1234/2277/530 1243/2278/434 1235/2279/434 -f 1232/2280/446 1241/2281/440 1233/2282/440 -f 1237/2276/441 1246/2283/529 1238/2271/529 -f 1235/2284/434 1244/2285/519 1236/2274/519 -f 1233/2282/440 1242/2286/530 1234/2277/530 -f 1231/2273/435 1240/2287/446 1232/2280/446 -f 1250/1676/435 1191/2249/523 1192/2248/523 -f 1174/2288/523 1251/1713/435 1172/2244/523 -f 1148/2236/520 1255/1729/434 1147/2237/520 -f 862/1790/447 874/1811/447 863/1791/433 -f 852/1793/448 864/1812/448 865/1794/449 -f 859/1796/450 871/1813/450 872/1797/435 -f 856/1799/451 868/1814/451 869/1800/432 -f 853/1795/449 865/1794/449 866/1802/434 -f 860/1804/435 872/2289/435 873/1805/452 -f 857/1801/432 869/1800/432 870/1807/453 -f 854/1803/434 866/1802/434 867/1809/454 -f 861/1806/452 873/1805/452 874/1811/447 -f 851/1792/433 863/1791/433 864/1812/448 -f 858/1808/453 870/1807/453 871/1813/450 -f 855/1810/454 867/1809/454 868/1814/451 -f 865/1817/440 864/2290/440 873/1815/440 -f 864/2290/440 863/2291/440 873/1815/440 -f 863/2291/440 874/2292/440 873/1815/440 -f 873/1815/440 872/2293/440 869/1816/440 -f 872/2293/440 871/2294/440 869/1816/440 -f 871/2294/440 870/2295/440 869/1816/440 -f 869/1816/440 868/2296/440 867/2297/440 -f 867/2297/440 866/2298/440 869/1816/440 -f 866/2298/440 865/1817/440 869/1816/440 -f 855/1818/440 879/1823/440 878/1819/440 -f 855/1821/440 856/2299/440 880/1822/440 -f 857/1824/440 881/1828/440 880/1822/440 -f 857/1826/440 858/2300/440 882/1827/440 -f 859/1829/440 883/1833/440 882/1827/440 -f 859/1831/440 860/2301/440 884/1832/440 -f 861/1834/440 885/1838/440 884/1835/440 -f 862/1837/440 886/1841/440 885/1838/440 -f 851/1840/440 875/1845/440 886/1841/440 -f 851/1843/440 852/2302/440 876/1844/440 -f 854/1846/440 878/1819/440 877/1847/440 -f 853/1849/440 877/1847/440 876/1844/440 -f 886/1841/451 898/1855/451 897/1851/454 -f 876/1844/453 888/1856/453 887/1852/432 -f 883/1833/449 895/1857/449 894/1853/448 -f 880/1822/447 892/1858/447 891/1854/452 -f 875/1845/432 887/1852/432 898/1855/451 -f 877/1847/450 889/1859/450 888/1856/453 -f 884/1832/434 896/1871/434 895/1857/449 -f 881/1828/433 893/1861/433 892/1858/447 -f 878/1819/435 890/1862/435 889/1859/450 -f 885/1838/454 897/1851/454 896/1860/434 -f 882/1827/448 894/1853/448 893/1861/433 -f 879/1823/452 891/1854/452 890/1862/435 -f 890/1862/455 902/2303/455 901/1863/456 -f 888/1856/457 889/1859/456 901/1864/456 -f 887/1852/458 888/1856/457 900/1866/457 -f 887/1852/458 899/2304/458 910/1868/459 -f 898/1855/459 910/2305/459 909/1869/460 -f 897/1851/460 909/2306/460 908/1870/461 -f 896/1871/461 908/2307/461 907/1872/462 -f 894/1853/463 895/1857/462 907/1873/462 -f 893/1861/464 894/1853/463 906/1875/463 -f 893/1861/464 905/2308/464 904/1877/465 -f 892/1858/465 904/2309/465 903/1878/466 -f 890/1862/455 891/1854/466 903/1879/466 -f 901/1881/450 913/1891/450 912/1882/453 -f 908/1884/434 920/2310/434 919/1885/449 -f 905/1887/433 917/1896/433 916/1888/447 -f 902/1890/435 914/1898/435 913/1891/450 -f 909/1892/454 921/1900/454 920/1893/434 -f 906/1895/448 918/1903/448 917/1896/433 -f 903/1897/452 915/1904/452 914/1898/435 -f 910/1899/451 922/1905/451 921/1900/454 -f 900/1883/453 912/1882/453 911/1901/432 -f 907/1886/449 919/1885/449 918/1903/448 -f 904/1889/447 916/1888/447 915/1904/452 -f 899/1902/432 911/1901/432 922/1905/451 -f 913/1906/467 914/2311/468 942/1907/468 -f 913/1909/467 941/1908/467 940/1910/469 -f 912/1912/469 940/1910/469 939/1913/470 -f 911/1915/470 939/1913/470 950/1916/471 -f 922/1918/471 950/1916/471 949/1919/472 -f 921/1921/472 949/1919/472 948/1922/473 -f 919/1924/474 920/2312/473 948/1925/473 -f 919/1927/474 947/1926/474 946/1928/475 -f 918/1930/475 946/1928/475 945/1931/476 -f 917/1933/476 945/1931/476 944/1934/477 -f 915/1936/478 943/1939/478 942/1907/468 -f 916/1938/477 944/1934/477 943/1939/478 -f 941/1908/450 953/1944/450 952/1941/453 -f 948/1925/434 960/1967/434 959/1942/449 -f 945/1931/433 957/1946/433 956/1943/447 -f 942/1907/435 954/1947/435 953/1944/450 -f 949/1919/454 961/1948/454 960/1945/434 -f 946/1928/448 958/1950/448 957/1946/433 -f 943/1939/452 955/1951/452 954/1947/435 -f 950/1916/451 962/1952/451 961/1948/454 -f 939/1913/432 940/1910/453 952/1941/453 -f 947/1926/449 959/1942/449 958/1950/448 -f 944/1934/447 956/1943/447 955/1951/452 -f 939/1913/432 951/1949/432 962/1952/451 -f 956/1943/441 957/1946/441 969/1953/441 -f 955/1951/441 956/1943/441 968/1955/441 -f 954/1947/441 955/1951/441 967/1957/441 -f 954/1947/441 966/2313/441 965/1959/441 -f 953/1944/441 965/2314/441 964/1960/441 -f 952/1941/441 964/2315/441 963/1961/441 -f 962/1952/441 951/1949/441 963/1962/441 -f 961/1948/441 962/1952/441 974/1964/441 -f 961/1948/441 973/2316/441 972/1966/441 -f 960/1967/441 972/2317/441 971/1968/441 -f 959/1942/441 971/2318/441 970/1969/441 -f 958/1950/441 970/2319/441 969/1970/441 -f 966/1971/434 978/1981/434 977/1972/449 -f 973/1974/452 985/1983/452 984/1975/435 -f 970/1977/453 982/1988/453 981/1978/432 -f 967/1980/454 979/1990/454 978/1981/434 -f 974/1982/447 986/1991/447 985/1983/452 -f 964/1984/448 976/1992/448 975/1985/433 -f 971/1987/450 983/1994/450 982/1988/453 -f 968/1989/451 980/1995/451 979/1990/454 -f 963/1986/433 975/1985/433 986/1991/447 -f 965/1973/449 977/1972/449 976/1992/448 -f 972/1993/435 984/2320/435 983/1994/450 -f 969/1979/432 981/1978/432 980/1995/451 -f 975/1998/441 976/2321/441 977/2322/441 -f 977/2322/441 978/2323/441 979/1996/441 -f 979/1996/441 980/2324/441 981/2325/441 -f 981/2325/441 982/2326/441 983/1997/441 -f 983/1997/441 984/2327/441 985/2328/441 -f 985/2328/441 986/2329/441 975/1998/441 -f 975/1998/441 977/2322/441 979/1996/441 -f 979/1996/441 981/2325/441 983/1997/441 -f 983/1997/441 985/2328/441 975/1998/441 -f 1001/1999/479 1000/2019/480 988/2000/480 -f 1008/2002/441 1007/2021/481 995/2003/481 -f 1005/2005/433 1004/2022/482 992/2006/482 -f 1002/2008/440 1001/1999/479 989/2001/479 -f 1009/2010/483 1008/2002/441 996/2004/441 -f 1006/2012/484 1005/2005/433 993/2007/433 -f 1003/2014/485 1002/2330/440 990/2015/440 -f 1010/2017/486 1009/2010/483 997/2011/483 -f 1000/2019/480 999/2023/432 987/2020/432 -f 1007/2021/481 1006/2012/484 994/2013/484 -f 1004/2022/482 1003/2014/485 991/2016/485 -f 999/2023/432 1010/2017/486 998/2018/486 -f 1028/2024/482 1027/2044/485 1015/2025/485 -f 1023/2027/432 1034/2046/486 1022/2028/486 -f 1025/2030/479 1024/2047/480 1012/2031/480 -f 1032/2033/441 1031/2048/481 1019/2034/481 -f 1029/2036/433 1028/2024/482 1016/2026/482 -f 1026/2038/440 1025/2030/479 1013/2032/479 -f 1033/2040/483 1032/2033/441 1020/2035/441 -f 1030/2042/484 1029/2036/433 1017/2037/433 -f 1027/2044/485 1026/2331/440 1014/2045/440 -f 1034/2046/486 1033/2040/483 1021/2041/483 -f 1024/2047/480 1023/2027/432 1011/2029/432 -f 1031/2048/481 1030/2042/484 1018/2043/484 -f 1023/2051/435 1024/2332/435 1025/2333/435 -f 1025/2333/435 1026/2334/435 1027/2335/435 -f 1027/2335/435 1028/2336/435 1029/2337/435 -f 1029/2337/435 1030/2338/435 1031/2049/435 -f 1031/2049/435 1032/2339/435 1033/2050/435 -f 1033/2050/435 1034/2340/435 1023/2051/435 -f 1023/2051/435 1025/2333/435 1031/2049/435 -f 1025/2333/435 1027/2335/435 1031/2049/435 -f 1027/2335/435 1029/2337/435 1031/2049/435 -f 1009/2052/434 1021/2041/434 1020/2035/434 -f 1010/2054/434 1022/2028/434 1021/2041/434 -f 999/2056/434 1011/2029/434 1022/2028/434 -f 1000/2058/434 1012/2031/434 1011/2029/434 -f 1000/2060/434 1001/2341/434 1013/2032/434 -f 1001/2061/434 1002/2342/434 1014/2039/434 -f 1003/2062/434 1015/2025/434 1014/2045/434 -f 1004/2064/434 1016/2026/434 1015/2025/434 -f 1005/2066/434 1017/2037/434 1016/2026/434 -f 1006/2068/434 1018/2043/434 1017/2037/434 -f 1007/2070/434 1008/2343/434 1020/2035/434 -f 1006/2071/434 1007/2344/434 1019/2034/434 -f 1052/2072/487 1051/2092/488 1039/2073/488 -f 1047/2075/435 1058/2094/489 1046/2076/489 -f 1049/2078/490 1048/2095/491 1036/2079/491 -f 1056/2081/441 1055/2096/492 1043/2082/492 -f 1053/2084/434 1052/2072/487 1040/2074/487 -f 1050/2086/440 1049/2078/490 1037/2080/490 -f 1057/2088/493 1056/2081/441 1044/2083/441 -f 1054/2090/494 1053/2084/434 1041/2085/434 -f 1051/2092/488 1050/2345/440 1038/2093/440 -f 1058/2094/489 1057/2088/493 1045/2089/493 -f 1048/2095/491 1047/2075/435 1035/2077/435 -f 1055/2096/492 1054/2090/494 1042/2091/494 -f 1047/2097/432 1048/2346/432 1060/2098/432 -f 1048/2100/432 1049/2347/432 1061/2101/432 -f 1049/2102/432 1050/2348/432 1062/2103/432 -f 1051/2104/432 1063/2108/432 1062/2105/432 -f 1052/2107/432 1064/2111/432 1063/2108/432 -f 1053/2110/432 1065/2114/432 1064/2111/432 -f 1054/2113/432 1066/2118/432 1065/2114/432 -f 1054/2116/432 1055/2349/432 1067/2117/432 -f 1055/2119/432 1056/2350/432 1068/2120/432 -f 1057/2121/432 1069/2124/432 1068/2120/432 -f 1058/2123/432 1070/2127/432 1069/2124/432 -f 1047/2126/432 1059/2099/432 1070/2127/432 -f 1077/2129/434 1076/2137/487 1064/2111/487 -f 1074/2130/440 1073/2139/490 1061/2101/490 -f 1081/2131/493 1080/2140/441 1068/2120/441 -f 1078/2132/494 1077/2129/434 1065/2114/434 -f 1075/2133/488 1074/2351/440 1062/2105/440 -f 1082/2134/489 1081/2131/493 1069/2124/493 -f 1072/2135/491 1071/2138/435 1059/2099/435 -f 1079/2136/492 1078/2132/494 1066/2118/494 -f 1076/2137/487 1075/2133/488 1063/2108/488 -f 1071/2138/435 1082/2134/489 1070/2127/489 -f 1073/2139/490 1072/2135/491 1060/2098/491 -f 1080/2140/441 1079/2136/492 1067/2117/492 -f 1071/2143/433 1072/2352/433 1073/2353/433 -f 1073/2353/433 1074/2354/433 1075/2355/433 -f 1075/2355/433 1076/2356/433 1077/2357/433 -f 1077/2357/433 1078/2358/433 1079/2141/433 -f 1079/2141/433 1080/2359/433 1081/2142/433 -f 1081/2142/433 1082/2360/433 1071/2143/433 -f 1071/2143/433 1073/2353/433 1079/2141/433 -f 1073/2353/433 1075/2355/433 1079/2141/433 -f 1075/2355/433 1077/2357/433 1079/2141/433 -f 1085/2144/490 1097/2166/490 1098/2145/440 -f 1092/2147/441 1104/2167/441 1105/2148/493 -f 1089/2150/434 1101/2168/434 1102/2151/494 -f 1086/2153/440 1098/2361/440 1099/2154/488 -f 1093/2149/493 1105/2148/493 1106/2156/489 -f 1083/2158/435 1095/2165/435 1096/2159/491 -f 1090/2152/494 1102/2151/494 1103/2161/492 -f 1087/2155/488 1099/2154/488 1100/2163/487 -f 1094/2157/489 1106/2156/489 1095/2165/435 -f 1084/2160/491 1096/2159/491 1097/2166/490 -f 1091/2162/492 1103/2161/492 1104/2167/441 -f 1088/2164/487 1100/2163/487 1101/2168/434 -f 1109/2169/490 1121/2191/504 1122/2170/495 -f 1116/2172/441 1128/2192/505 1129/2173/496 -f 1113/2175/434 1125/2193/506 1126/2176/497 -f 1110/2178/440 1122/2203/495 1123/2179/498 -f 1117/2174/493 1129/2173/496 1130/2181/499 -f 1107/2183/435 1119/2190/503 1120/2184/500 -f 1114/2177/494 1126/2176/497 1127/2186/501 -f 1111/2180/488 1123/2179/498 1124/2188/502 -f 1118/2182/489 1130/2181/499 1119/2190/503 -f 1108/2185/491 1120/2184/500 1121/2191/504 -f 1115/2187/492 1127/2186/501 1128/2192/505 -f 1112/2189/487 1124/2188/502 1125/2193/506 -f 1121/2191/504 1133/2195/508 1134/2194/507 -f 1120/2184/500 1132/2196/509 1133/2195/508 -f 1119/2190/503 1131/2362/531 1132/2196/509 -f 1142/2197/510 1131/2362/531 1119/2190/503 -f 1141/2198/511 1142/2197/510 1130/2181/499 -f 1140/2199/512 1141/2198/511 1129/2173/496 -f 1139/2200/513 1140/2199/512 1128/2192/505 -f 1138/2201/514 1139/2200/513 1127/2186/501 -f 1137/2202/515 1138/2201/514 1126/2176/497 -f 1124/2188/502 1136/2205/517 1137/2202/515 -f 1122/2203/495 1134/2363/507 1135/2204/516 -f 1123/2179/498 1135/2204/516 1136/2205/517 -f 1133/2364/432 1132/2365/432 1131/2206/432 -f 1131/2206/432 1142/2366/432 1141/2207/432 -f 1141/2207/432 1140/2367/432 1137/2208/432 -f 1140/2367/432 1139/2368/432 1137/2208/432 -f 1139/2368/432 1138/2369/432 1137/2208/432 -f 1137/2208/432 1136/2370/432 1135/2371/432 -f 1135/2371/432 1134/2372/432 1137/2208/432 -f 1134/2372/432 1133/2364/432 1137/2208/432 -f 1133/2364/432 1131/2206/432 1137/2208/432 -f 1118/2182/433 1107/2183/433 1095/2209/433 -f 1117/2174/433 1118/2182/433 1106/2211/433 -f 1116/2172/433 1117/2174/433 1105/2213/433 -f 1103/2215/433 1115/2187/433 1116/2172/433 -f 1102/2217/433 1114/2177/433 1115/2187/433 -f 1113/2175/433 1114/2177/433 1102/2219/433 -f 1112/2189/433 1113/2175/433 1101/2221/433 -f 1111/2180/433 1112/2189/433 1100/2223/433 -f 1110/2178/433 1111/2180/433 1099/2225/433 -f 1097/2227/433 1109/2169/433 1110/2171/433 -f 1096/2229/433 1108/2185/433 1109/2169/433 -f 1095/2231/433 1107/2183/433 1108/2185/433 -f 1155/2233/518 1153/1664/518 1149/1663/440 -f 1159/2235/519 1160/2373/519 1148/2236/520 -f 1163/1738/446 1161/1643/446 1153/2238/518 -f 1166/2240/519 1165/2374/519 1162/2241/521 -f 1173/2243/522 1174/2288/523 1172/2244/523 -f 1183/1697/524 1184/1712/524 1185/1670/433 -f 1180/2246/525 1184/1712/524 1183/1697/524 -f 1199/1785/524 1200/1773/524 1201/1679/433 -f 1200/1773/524 1199/1785/524 1189/1756/525 -f 1206/1699/522 1205/1755/522 1192/2248/523 -f 1208/1749/461 1210/2375/526 1209/2250/526 -f 1214/2251/527 1212/1715/528 1211/1776/528 -f 1162/2241/521 1189/1720/441 1205/1784/441 -f 1214/1694/527 1213/2376/527 1209/2253/526 -f 1222/2254/529 1230/2266/529 1223/2255/435 -f 1220/2257/519 1228/2268/519 1229/2258/441 -f 1218/2260/530 1226/2269/530 1227/2261/434 -f 1216/2263/446 1224/2270/446 1225/2264/440 -f 1221/2259/441 1229/2258/441 1230/2266/529 -f 1219/2267/434 1227/2377/434 1228/2268/519 -f 1217/2265/440 1225/2264/440 1226/2269/530 -f 1215/2256/435 1223/2255/435 1224/2270/446 -f 1238/2271/529 1246/2283/529 1239/2272/435 -f 1236/2274/519 1244/2285/519 1245/2275/441 -f 1234/2277/530 1242/2286/530 1243/2278/434 -f 1232/2280/446 1240/2287/446 1241/2281/440 -f 1237/2276/441 1245/2275/441 1246/2283/529 -f 1235/2284/434 1243/2378/434 1244/2285/519 -f 1233/2282/440 1241/2281/440 1242/2286/530 -f 1231/2273/435 1239/2272/435 1240/2287/446 -f 1250/1676/435 1249/1745/435 1191/2249/523 -f 1174/2288/523 1253/1752/435 1251/1713/435 -f 1148/2236/520 1256/1725/434 1255/1729/434 -o Silencer -v 11.250000 -0.000000 -0.312500 -v 11.250000 0.220971 -0.220971 -v 11.250000 0.312500 0.000000 -v 11.250000 0.220971 0.220971 -v 11.250000 -0.000000 0.312500 -v 11.250000 -0.220971 0.220971 -v 11.250000 -0.312500 -0.000000 -v 11.250000 -0.220971 -0.220971 -v 11.562500 0.000000 -0.312500 -v 11.562500 0.220971 -0.220971 -v 11.562500 0.312500 0.000000 -v 11.562500 0.220971 0.220971 -v 11.562500 0.000000 0.312500 -v 11.562500 -0.220971 0.220971 -v 11.562500 -0.312500 -0.000000 -v 11.562500 -0.220971 -0.220971 -v 11.562500 0.000000 -0.500000 -v 11.562500 0.353554 -0.353553 -v 11.562500 0.500000 0.000000 -v 11.562500 0.353554 0.353553 -v 11.562500 0.000000 0.500000 -v 11.562500 -0.353553 0.353553 -v 11.562500 -0.500000 -0.000000 -v 11.562500 -0.353553 -0.353553 -v 15.312500 0.000000 -0.500000 -v 15.312500 0.353554 -0.353553 -v 15.312500 0.500000 0.000000 -v 15.312500 0.353554 0.353553 -v 15.312500 0.000000 0.500000 -v 15.312500 -0.353553 0.353553 -v 15.312500 -0.500000 -0.000000 -v 15.312500 -0.353553 -0.353553 -v 15.312500 0.000000 -0.093750 -v 15.312500 0.066292 -0.066291 -v 15.312500 0.093750 0.000000 -v 15.312500 0.066292 0.066291 -v 15.312500 0.000000 0.093750 -v 15.312500 -0.066291 0.066291 -v 15.312500 -0.093750 -0.000000 -v 15.312500 -0.066291 -0.066291 -v 14.812500 0.000000 -0.093750 -v 14.812500 0.066292 -0.066291 -v 14.812500 0.093750 0.000000 -v 14.812500 0.066292 0.066291 -v 14.812500 0.000000 0.093750 -v 14.812500 -0.066291 0.066291 -v 14.812500 -0.093750 -0.000000 -v 14.812500 -0.066291 -0.066291 -vt 0.865111 0.565111 -vt 0.853846 0.592308 -vt 0.930769 0.592308 -vt 1.000000 0.715385 -vt 0.961538 0.684615 -vt 1.000000 0.684615 -vt 1.000000 0.961538 -vt 0.961538 0.992308 -vt 0.961538 0.961538 -vt 1.000000 0.869231 -vt 0.961538 0.900000 -vt 0.961538 0.869231 -vt 1.000000 0.807692 -vt 0.961538 0.776923 -vt 1.000000 0.776923 -vt 1.000000 0.669231 -vt 0.961538 0.638462 -vt 1.000000 0.638462 -vt 1.000000 0.915385 -vt 0.961538 0.946154 -vt 0.961538 0.915385 -vt 1.000000 0.823077 -vt 0.961538 0.853846 -vt 0.961538 0.823077 -vt 1.000000 0.761538 -vt 0.961538 0.730769 -vt 1.000000 0.730769 -vt 0.476923 0.676923 -vt 0.938462 0.630769 -vt 0.938462 0.676923 -vt 0.476923 0.953846 -vt 0.938462 0.907692 -vt 0.938462 0.953846 -vt 0.476923 0.861538 -vt 0.938462 0.815385 -vt 0.938462 0.861538 -vt 0.476923 0.769231 -vt 0.938462 0.723077 -vt 0.938462 0.769231 -vt 0.476923 0.723077 -vt 0.476923 1.000000 -vt 0.938462 1.000000 -vt 0.476923 0.907692 -vt 0.476923 0.815385 -vt 0.961538 0.807692 -vt 0.430769 0.742308 -vt 0.430769 0.788462 -vt 0.430769 0.842308 -vt 0.430769 0.834615 -vt 0.430769 0.880769 -vt 0.430769 0.926923 -vt 0.430769 0.973077 -vt 0.430769 0.650000 -vt 0.476923 0.630769 -vt 0.430769 0.696154 -vt 0.930769 0.569231 -vt 0.992308 0.576923 -vt 0.930769 0.576923 -vt 0.930769 0.584615 -vt 0.992308 0.592308 -vt 0.930769 0.592308 -vt 0.930769 0.600000 -vt 0.992308 0.607692 -vt 0.930769 0.607692 -vt 0.930769 0.623077 -vt 0.992308 0.630769 -vt 0.930769 0.630769 -vt 0.992308 0.584615 -vt 0.992308 0.600000 -vt 0.992308 0.615385 -vt 0.930769 0.615385 -vt 0.992308 0.623077 -vt 0.980769 0.546154 -vt 0.992308 0.557692 -vt 0.980769 0.569231 -vt 0.865111 0.619504 -vt 0.892308 0.630769 -vt 0.919504 0.619504 -vt 0.919504 0.565111 -vt 0.892308 0.553846 -vt 0.961538 0.715385 -vt 1.000000 0.992308 -vt 1.000000 0.900000 -vt 0.961538 0.669231 -vt 1.000000 0.946154 -vt 1.000000 0.853846 -vt 0.961538 0.761538 -vt 0.430769 0.750000 -vt 0.430769 0.796154 -vt 0.430769 0.888462 -vt 0.430769 0.934615 -vt 0.430769 0.980769 -vt 0.430769 0.657692 -vt 0.430769 0.703846 -vt 0.992308 0.569231 -vt 0.972610 0.565851 -vt 0.969231 0.557692 -vt 0.972610 0.549533 -vt 0.988928 0.549533 -vt 0.988928 0.565851 -vn -1.0000 -0.0000 0.0000 -vn -0.0000 0.0000 -1.0000 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 -1.0000 0.0000 -vn -0.0000 0.7071 0.7071 vn -0.0000 0.0000 1.0000 -vn -0.0000 1.0000 0.0000 -vn -0.0000 0.7071 -0.7071 -vn 1.0000 -0.0000 0.0000 -s 1 -f 1260/2379/532 1259/2380/532 1263/2381/532 -f 1257/2382/533 1272/2383/534 1264/2384/534 -f 1262/2385/535 1271/2386/536 1270/2387/535 -f 1260/2388/537 1269/2389/538 1268/2390/537 -f 1259/2391/539 1266/2392/540 1258/2393/540 -f 1264/2394/534 1271/2395/536 1263/2396/536 -f 1261/2397/538 1270/2398/535 1269/2399/538 -f 1259/2400/539 1268/2401/537 1267/2402/539 -f 1258/2403/540 1265/2404/533 1257/2405/533 -f 1288/2406/534 1279/2407/536 1280/2408/534 -f 1286/2409/535 1277/2410/538 1278/2411/535 -f 1284/2412/537 1275/2413/539 1276/2414/537 -f 1282/2415/540 1273/2416/533 1274/2417/540 -f 1281/2418/533 1280/2408/534 1273/2416/533 -f 1287/2419/536 1278/2411/535 1279/2420/536 -f 1285/2421/538 1276/2414/537 1277/2410/538 -f 1283/2422/539 1274/2417/540 1275/2413/539 -f 1271/2395/532 1280/2408/532 1279/2407/532 -f 1272/2383/532 1273/2416/532 1280/2408/532 -f 1265/2404/532 1274/2417/532 1273/2416/532 -f 1267/2423/532 1274/2417/532 1266/2392/532 -f 1268/2401/532 1275/2413/532 1267/2402/532 -f 1269/2389/532 1276/2414/532 1268/2390/532 -f 1270/2398/532 1277/2410/532 1269/2399/532 -f 1271/2386/532 1278/2411/532 1270/2387/532 -f 1282/2415/541 1289/2424/541 1281/2418/541 -f 1283/2422/541 1290/2425/541 1282/2415/541 -f 1283/2422/541 1292/2426/541 1291/2427/541 -f 1285/2421/541 1292/2428/541 1284/2412/541 -f 1286/2409/541 1293/2429/541 1285/2421/541 -f 1287/2419/541 1294/2430/541 1286/2409/541 -f 1288/2406/541 1295/2431/541 1287/2432/541 -f 1281/2418/541 1296/2433/541 1288/2406/541 -f 1295/2434/539 1302/2435/540 1294/2436/540 -f 1293/2437/533 1300/2438/534 1292/2439/534 -f 1291/2440/536 1298/2441/535 1290/2442/535 -f 1296/2443/537 1303/2444/539 1295/2445/539 -f 1294/2436/540 1301/2446/533 1293/2437/533 -f 1292/2439/534 1299/2447/536 1291/2440/536 -f 1290/2442/535 1297/2448/538 1289/2449/538 -f 1289/2449/538 1304/2450/537 1296/2443/537 -f 1301/2451/541 1303/2452/541 1297/2453/541 -f 1259/2380/532 1258/2454/532 1263/2381/532 -f 1258/2454/532 1257/2455/532 1263/2381/532 -f 1257/2455/532 1264/2456/532 1263/2381/532 -f 1263/2381/532 1262/2457/532 1261/2458/532 -f 1261/2458/532 1260/2379/532 1263/2381/532 -f 1257/2382/533 1265/2459/533 1272/2383/534 -f 1262/2385/535 1263/2460/536 1271/2386/536 -f 1260/2388/537 1261/2461/538 1269/2389/538 -f 1259/2391/539 1267/2423/539 1266/2392/540 -f 1264/2394/534 1272/2462/534 1271/2395/536 -f 1261/2397/538 1262/2463/535 1270/2398/535 -f 1259/2400/539 1260/2464/537 1268/2401/537 -f 1258/2403/540 1266/2465/540 1265/2404/533 -f 1288/2406/534 1287/2432/536 1279/2407/536 -f 1286/2409/535 1285/2421/538 1277/2410/538 -f 1284/2412/537 1283/2422/539 1275/2413/539 -f 1282/2415/540 1281/2418/533 1273/2416/533 -f 1281/2418/533 1288/2406/534 1280/2408/534 -f 1287/2419/536 1286/2409/535 1278/2411/535 -f 1285/2421/538 1284/2412/537 1276/2414/537 -f 1283/2422/539 1282/2415/540 1274/2417/540 -f 1271/2395/532 1272/2462/532 1280/2408/532 -f 1272/2383/532 1265/2459/532 1273/2416/532 -f 1265/2404/532 1266/2465/532 1274/2417/532 -f 1267/2423/532 1275/2413/532 1274/2417/532 -f 1268/2401/532 1276/2414/532 1275/2413/532 -f 1269/2389/532 1277/2410/532 1276/2414/532 -f 1270/2398/532 1278/2411/532 1277/2410/532 -f 1271/2386/532 1279/2420/532 1278/2411/532 -f 1282/2415/541 1290/2466/541 1289/2424/541 -f 1283/2422/541 1291/2467/541 1290/2425/541 -f 1283/2422/541 1284/2412/541 1292/2426/541 -f 1285/2421/541 1293/2468/541 1292/2428/541 -f 1286/2409/541 1294/2469/541 1293/2429/541 -f 1287/2419/541 1295/2470/541 1294/2430/541 -f 1288/2406/541 1296/2471/541 1295/2431/541 -f 1281/2418/541 1289/2472/541 1296/2433/541 -f 1295/2434/539 1303/2473/539 1302/2435/540 -f 1293/2437/533 1301/2446/533 1300/2438/534 -f 1291/2440/536 1299/2447/536 1298/2441/535 -f 1296/2443/537 1304/2450/537 1303/2444/539 -f 1294/2436/540 1302/2435/540 1301/2446/533 -f 1292/2439/534 1300/2438/534 1299/2447/536 -f 1290/2442/535 1298/2441/535 1297/2448/538 -f 1289/2449/538 1297/2448/538 1304/2450/537 -f 1297/2453/541 1298/2474/541 1299/2475/541 -f 1299/2475/541 1300/2476/541 1297/2453/541 -f 1300/2476/541 1301/2451/541 1297/2453/541 -f 1301/2451/541 1302/2477/541 1303/2452/541 -f 1303/2452/541 1304/2478/541 1297/2453/541 -o Selector_Rifle.001 -v -4.000000 -0.843753 -0.343750 -v -4.125000 -1.000003 -0.343750 -v -4.187500 -0.937503 -0.343750 -v -4.062500 -0.718753 -0.343750 -v -3.500000 -0.718753 -0.343750 -v -3.500000 -0.968753 -0.343750 -v -3.411612 -0.932141 -0.343750 -v -3.375000 -0.843753 -0.343750 -v -3.411612 -0.755365 -0.343750 -v -3.500000 -0.718753 -0.406250 -v -3.500000 -0.968753 -0.406250 -v -3.411612 -0.932141 -0.406250 -v -3.375000 -0.843753 -0.406250 -v -3.411612 -0.755365 -0.406250 -v -4.000000 -0.843753 -0.468750 -v -4.062500 -0.718753 -0.468750 -v -4.125000 -1.000003 -0.468750 -v -4.187500 -0.937503 -0.468750 -v -3.750000 -0.718753 -0.468750 -v -3.750000 -0.906253 -0.468750 -vt 0.725869 0.474903 -vt 0.722008 0.471042 -vt 0.725869 0.471042 -vt 0.725869 0.482625 -vt 0.722008 0.478764 -vt 0.725869 0.478764 -vt 0.722008 0.474903 -vt 0.725869 0.486486 -vt 0.722008 0.482625 -vt 0.725869 0.420849 -vt 0.718147 0.416988 -vt 0.725869 0.416988 -vt 0.718147 0.420849 -vt 0.725869 0.436293 -vt 0.718147 0.436293 -vt 0.718147 0.405405 -vt 0.710425 0.432432 -vt 0.712686 0.420849 -vt 0.718147 0.455598 -vt 0.718147 0.389961 -vt 0.722008 0.374517 -vt 0.725869 0.374517 -vt 0.710425 0.440154 -vt 0.706564 0.455598 -vt 0.718147 0.471042 -vt 0.715885 0.476503 -vt 0.710425 0.478764 -vt 0.722008 0.486486 -vt 0.725869 0.405405 -vt 0.704964 0.476503 -vt 0.702703 0.471042 -vn 0.7071 0.7071 0.0000 -vn 0.1810 0.9835 0.0000 -vn 0.1951 0.9808 0.0000 -vn 0.7071 -0.7071 0.0000 -vn 1.0000 -0.0000 0.0000 -vn 0.0738 -0.9973 0.0000 -vn -0.7071 -0.7071 0.0000 -vn 0.0553 -0.9985 0.0000 -vn -0.8682 0.4961 0.0000 -vn -0.5019 0.8649 0.0000 -vn 0.7809 -0.6247 0.0000 -vn 0.0000 0.0000 -1.0000 -vn -0.0000 1.0000 0.0000 -vn -0.2425 -0.9701 0.0000 -vn 0.0506 -0.9987 0.0000 -vn 0.1222 0.0000 -0.9925 -vn 0.1410 0.0000 -0.9900 -vn 0.1396 0.0000 -0.9902 -vn 0.1297 0.0000 -0.9916 -s 1 -f 1313/2479/542 1314/2480/543 1309/2481/544 -f 1311/2482/545 1317/2483/546 1312/2484/546 -f 1312/2484/546 1318/2485/542 1313/2479/542 -f 1310/2486/547 1316/2487/545 1311/2482/545 -f 1307/2488/548 1321/2489/549 1306/2490/549 -f 1322/2491/550 1308/2492/551 1320/2493/551 -f 1319/2494/552 1306/2490/549 1321/2489/549 -f 1322/2491/553 1319/2495/553 1321/2496/553 -f 1309/2481/544 1314/2480/543 1323/2497/554 -f 1324/2498/555 1315/2499/556 1310/2500/547 -f 1319/2501/553 1323/2497/557 1324/2502/558 -f 1314/2503/559 1318/2504/553 1317/2505/553 -f 1314/2503/559 1324/2502/558 1323/2497/557 -f 1313/2479/542 1318/2485/542 1314/2480/543 -f 1311/2482/545 1316/2487/545 1317/2483/546 -f 1312/2484/546 1317/2483/546 1318/2485/542 -f 1310/2486/547 1315/2506/556 1316/2487/545 -f 1307/2488/548 1322/2491/548 1321/2489/549 -f 1322/2491/550 1307/2488/550 1308/2492/551 -f 1319/2494/552 1305/2507/552 1306/2490/549 -f 1322/2491/553 1320/2493/553 1319/2495/553 -f 1320/2493/551 1308/2492/551 1323/2497/554 -f 1308/2492/551 1309/2481/544 1323/2497/554 -f 1310/2500/547 1305/2507/555 1324/2498/555 -f 1305/2507/555 1319/2494/555 1324/2498/555 -f 1319/2501/553 1320/2493/553 1323/2497/557 -f 1317/2505/553 1316/2508/553 1315/2509/560 -f 1315/2509/560 1314/2503/559 1317/2505/553 -f 1314/2503/559 1315/2509/560 1324/2502/558 -o Trigger_Rifle.002 -v -3.000000 -1.218750 -0.125000 -v -3.187500 -1.593750 -0.125000 -v -3.187500 -1.781250 -0.125000 -v -3.125000 -1.968750 -0.125000 -v -3.000000 -2.093750 -0.125000 -v -3.062500 -2.093750 -0.125000 -v -3.250000 -1.968750 -0.125000 -v -3.312500 -1.781250 -0.125000 -v -3.312500 -1.406250 -0.125000 -v -3.375000 -1.343750 -0.125000 -v -3.000000 -1.218750 0.125000 -v -3.187500 -1.593750 0.125000 -v -3.187500 -1.781250 0.125000 -v -3.125000 -1.968750 0.125000 -v -3.000000 -2.093750 0.125000 -v -3.062500 -2.093750 0.125000 -v -3.250000 -1.968750 0.125000 -v -3.312500 -1.781250 0.125000 -v -3.312500 -1.406250 0.125000 -v -3.375000 -1.343750 0.125000 -vt 0.656371 0.559846 -vt 0.667954 0.563707 -vt 0.656371 0.563707 -vt 0.629344 0.555985 -vt 0.640927 0.563707 -vt 0.629344 0.563707 -vt 0.617761 0.555985 -vt 0.606178 0.563707 -vt 0.691120 0.563707 -vt 0.698842 0.552124 -vt 0.718147 0.563707 -vt 0.602317 0.563707 -vt 0.606178 0.540541 -vt 0.667954 0.579151 -vt 0.656371 0.583012 -vt 0.656371 0.579151 -vt 0.629344 0.586873 -vt 0.640927 0.579151 -vt 0.640927 0.586873 -vt 0.617761 0.586873 -vt 0.629344 0.579151 -vt 0.691120 0.579151 -vt 0.718147 0.579151 -vt 0.698842 0.590734 -vt 0.606178 0.579151 -vt 0.606178 0.602317 -vt 0.602317 0.579151 -vt 0.667954 0.555985 -vt 0.640927 0.555985 -vt 0.667954 0.586873 -vt 0.652510 0.579151 -vt 0.652510 0.563707 -vt 0.679537 0.579151 -vt 0.679537 0.563707 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 0.8944 -0.4472 0.0000 -vn 0.9732 -0.2298 0.0000 -vn -0.9871 -0.1602 0.0000 -vn -0.9239 -0.3827 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn 0.0000 -0.2290 -0.9734 +vn 0.0000 -0.9389 0.3443 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn 0.3827 -0.9239 -0.0000 vn 0.9239 -0.3827 0.0000 -vn -0.2898 -0.9571 0.0000 +vn -0.3827 0.9239 -0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0073 +vn -0.2298 -0.9732 -0.0000 +vn -0.2295 -0.9733 0.0076 +vn 0.5626 0.8267 0.0078 +vn 0.8369 0.5474 0.0000 +vn 0.5563 0.8310 0.0000 +vn 0.9314 -0.3640 0.0000 +vn 0.9733 -0.2295 0.0076 +vn -0.9314 -0.3640 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 0.2298 -0.9732 0.0000 +vn 0.7071 -0.7071 0.0073 +vn 0.2295 -0.9733 0.0076 +vn 0.7071 -0.7071 0.0000 +vn 0.9733 0.2295 0.0076 +vn 0.9621 0.2728 0.0000 +vn -0.9733 -0.2295 0.0076 +vn -0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn -0.0000 -0.3358 -0.9419 +vn -0.0000 0.3827 -0.9239 +vn -0.0000 -0.9077 0.4197 +vn -0.0000 -0.3827 0.9239 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.9239 -0.3827 +vn 0.0000 -0.9077 -0.4197 +vn -0.0000 -0.3827 -0.9239 +vn -0.0000 0.3827 0.9239 +vn -0.0000 -0.3358 0.9419 +vn -0.9732 0.2298 -0.0000 +vn -0.9732 -0.2298 -0.0000 +vn -0.7501 0.6613 0.0078 +vn -0.5563 0.8310 -0.0000 +vn -0.7503 0.6611 0.0000 +vn -0.8369 0.5474 -0.0000 +vn -0.9906 0.1368 -0.0000 +vn -0.9239 -0.3827 -0.0000 +vn -0.8944 0.4472 0.0000 +vn -0.9621 0.2728 -0.0000 +vn -0.9733 0.2295 0.0076 +vn 0.0000 -0.9909 -0.1343 +vn 0.0000 -0.9808 0.1951 +vn 0.0000 -0.8660 -0.5000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 -0.9914 -0.1305 +vn 0.0000 -0.2744 -0.9616 +vn 0.0000 -0.8008 -0.5989 +vn 0.0000 -0.1305 -0.9914 +vn 0.0000 0.8822 0.4709 +vn 0.0000 0.4719 0.8817 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 vn 0.9871 0.1602 0.0000 -vn -0.7071 -0.7071 0.0000 -vn -0.7947 -0.6070 0.0000 -vn 0.8507 0.5257 0.0000 +vn 0.9224 0.3863 0.0000 +vn 0.3827 0.9239 -0.0000 +vn -0.3827 -0.9239 -0.0000 +vn 0.9675 -0.2527 0.0000 +vn -0.9239 0.3827 -0.0000 +vn 0.7497 -0.6618 0.0000 +vn 0.9285 0.3714 0.0000 +vn 0.5547 -0.8321 0.0000 +vn -0.7497 -0.6618 -0.0000 +vn -0.9871 0.1602 -0.0000 +vn -0.9285 0.3714 -0.0000 +vn -0.5547 -0.8321 -0.0000 +vn -0.9906 0.1367 -0.0000 +vn -0.7972 -0.6037 -0.0000 +vn 0.7972 -0.6037 0.0000 +vn -0.6037 -0.7972 -0.0000 +vn 0.9239 0.3827 -0.0000 +vn 0.9239 0.3826 0.0000 +vn 0.6901 -0.6901 0.2181 +vn -0.6901 -0.6901 0.2181 +vn -0.6901 0.6901 0.2181 +vn 0.6901 0.6901 0.2181 +vn 0.9759 0.0000 0.2181 +vn -0.0000 -0.9759 0.2181 +vn -0.9759 0.0000 0.2181 +vn 0.0000 0.9759 0.2181 +vn -0.6858 0.6859 0.2434 +vn 0.6858 0.6859 0.2434 +vn 0.9699 0.0000 0.2434 +vn -0.0000 -0.9699 0.2434 +vn 0.0000 0.9699 0.2434 +vn 0.6858 -0.6859 0.2434 +vn -0.9699 0.0000 0.2434 +vn -0.6858 -0.6859 0.2434 +vn 0.9808 -0.1951 0.0000 +vn -0.9808 0.1951 -0.0000 +vn -0.9808 -0.1951 -0.0000 +vn 0.9808 0.1951 0.0000 +vn 0.9732 -0.2298 0.0000 +vn 0.9732 0.2298 0.0000 +vn 0.7501 0.6613 0.0078 +vn 0.8944 0.4472 0.0000 +vn 0.9675 0.2527 0.0000 +vn -0.9675 0.2527 -0.0000 +vn -0.9675 -0.2527 -0.0000 +vn -0.2587 -0.9658 0.0164 +vn 0.2587 -0.9658 0.0164 +vn 0.9658 -0.2587 0.0164 +vn 0.7070 -0.7070 0.0165 +vn 0.9658 0.2587 0.0164 +vn 0.9529 0.3034 0.0013 +vn 0.9972 0.0737 -0.0141 +vn -0.7070 -0.7070 0.0165 +vn -0.9658 -0.2587 0.0164 +vn -0.9658 0.2587 0.0164 +vn -0.9529 0.3034 0.0013 +vn -0.5626 0.8267 0.0078 +vn -0.9972 0.0737 -0.0141 +vn -0.9005 0.4348 -0.0073 +vn 0.9005 0.4348 -0.0073 +vn 0.9135 0.4060 -0.0262 +vn -0.1452 -0.3671 0.9188 +vn 0.1981 -0.5913 0.7817 +vn 0.1452 -0.3671 0.9188 +vn 0.3316 0.5046 -0.7971 +vn -0.2171 0.6491 -0.7290 +vn 0.2171 0.6491 -0.7290 +vn -0.1981 -0.5913 0.7817 +vn 0.1909 -0.2085 0.9592 +vn 0.1257 0.3641 -0.9228 +vn -0.1909 -0.2085 0.9592 +vn -0.0577 -0.2625 -0.9632 +vn 0.0577 -0.2625 -0.9632 +vn 0.0000 -0.5735 0.8192 +vn 0.0000 -0.6407 -0.7678 +vn -0.2221 -0.8356 0.5024 +vn 0.1664 -0.6204 0.7665 +vn 0.2221 -0.8356 0.5024 +vn 0.0000 -0.4472 -0.8944 +vn 0.3162 0.0000 0.9487 +vn 0.1251 0.0000 0.9921 +vn -0.1664 -0.6204 0.7665 +vn -0.1647 -0.8707 -0.4634 +vn 0.1574 -0.8728 -0.4621 +vn 0.1647 -0.8707 -0.4634 +vn -0.3158 0.4243 -0.8487 +vn 0.3158 0.4243 -0.8487 +vn 0.4257 -0.6798 0.5972 +vn 0.3781 -0.2402 0.8941 +vn 0.3421 -0.4253 0.8379 +vn 0.4258 -0.6015 0.6760 +vn 0.8970 0.1977 -0.3953 +vn 0.8992 0.2330 -0.3704 +vn 0.8599 0.3129 -0.4032 +vn 0.8941 0.1096 -0.4342 +vn 0.4212 -0.8013 -0.4248 +vn 0.3942 -0.8092 -0.4357 +vn -0.1251 0.0000 0.9921 +vn -0.8970 0.1977 -0.3953 +vn -0.8992 0.2330 -0.3704 +vn -0.8599 0.3129 -0.4032 +vn -0.8941 0.1096 -0.4342 +vn -0.4212 -0.8013 -0.4248 +vn -0.1574 -0.8728 -0.4621 +vn -0.3942 -0.8092 -0.4357 +vn -0.3162 0.0000 0.9487 +vn -0.3781 -0.2402 0.8941 +vn -0.4258 -0.6015 0.6760 +vn -0.3421 -0.4253 0.8379 +vn -0.4257 -0.6798 0.5972 +vn -0.3316 0.5046 -0.7971 +vn -0.1257 0.3641 -0.9228 +vn 0.0000 -0.1602 0.9871 +vn 0.0000 -0.5257 0.8507 +vn 0.0000 -0.9871 0.1602 +vn 0.0000 -0.9571 -0.2898 +vn 0.0000 -0.8507 0.5257 +vn 0.0000 -0.8321 -0.5547 +vn 0.0000 0.1602 -0.9871 +vn 0.0000 0.5257 -0.8507 +vn 0.0000 0.8507 -0.5257 +vn 0.0000 0.9871 -0.1602 +vn 0.0000 0.9571 0.2898 +vn 0.0000 0.8321 0.5547 +vn 0.6763 0.7307 -0.0931 +vn 0.0000 0.9915 -0.1298 +vn -0.6763 0.7307 -0.0931 +vn -0.6906 0.7182 -0.0846 +vn 0.0000 0.9864 -0.1644 +vn 0.6906 0.7182 -0.0846 +vn -0.9135 0.4060 -0.0262 +vn 0.8315 0.5556 -0.0000 +vn -0.8315 0.5556 -0.0000 +vn -0.8315 -0.5556 -0.0000 +vn 0.8315 -0.5556 0.0000 +vn 0.0000 0.3770 -0.9262 +vn 0.0000 0.3714 -0.9285 +vn 0.0000 0.3770 0.9262 +vn 0.0000 0.3714 0.9285 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 0.9239 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn 0.2298 0.9732 0.0000 +vn 0.4472 0.8944 0.0000 +vn -0.4472 0.8944 0.0000 +vn -0.2298 0.9732 0.0000 +usemtl None s off -f 1330/2510/561 1328/2511/561 1329/2512/561 -f 1327/2513/561 1331/2514/561 1332/2515/561 -f 1326/2516/561 1332/2515/561 1333/2517/561 -f 1326/2518/561 1333/2519/561 1325/2520/561 -f 1333/2517/561 1334/2521/561 1325/2522/561 -f 1338/2523/562 1340/2524/562 1339/2525/562 -f 1337/2526/562 1341/2527/562 1338/2528/562 -f 1336/2529/562 1342/2530/562 1337/2526/562 -f 1336/2531/562 1335/2532/562 1343/2533/562 -f 1343/2534/562 1335/2535/562 1344/2536/562 -f 1330/2510/561 1331/2537/561 1328/2511/561 -f 1327/2513/561 1328/2538/561 1331/2514/561 -f 1326/2516/561 1327/2513/561 1332/2515/561 -f 1338/2523/562 1341/2539/562 1340/2524/562 -f 1337/2526/562 1342/2530/562 1341/2527/562 -f 1336/2529/562 1343/2534/562 1342/2530/562 +f 764/1429/365 765/1430/365 766/1431/365 +f 767/1432/366 768/1433/366 769/1434/366 +f 770/1435/367 764/1429/367 766/1431/367 +f 769/1436/368 770/1435/368 767/1437/368 +f 771/1438/369 768/1439/369 764/1440/369 +f 772/1441/370 773/1442/370 774/1443/370 +f 775/1444/367 776/1445/367 773/1442/367 +f 777/1446/366 778/1447/366 779/1448/366 +f 780/1449/366 781/1450/366 782/1451/366 +f 783/1452/368 784/1453/368 780/1454/368 +f 785/1455/366 786/1456/366 787/1457/366 +f 781/1450/371 784/1458/371 788/1459/371 +f 783/1460/370 782/1451/370 789/1461/370 +f 789/1462/365 781/1450/365 790/1463/365 +f 791/1464/370 792/1465/370 793/1466/370 +f 794/1467/370 791/1464/370 795/1468/370 +f 796/1469/372 797/1470/372 798/1471/372 +f 799/1472/373 800/1473/373 801/1474/373 +f 802/1475/373 803/1476/373 796/1477/373 +f 804/1478/372 805/1479/372 802/1480/372 +f 806/1481/372 802/1482/372 801/1483/372 +f 806/1481/374 800/1484/374 807/1485/374 +f 797/1470/375 808/1486/375 798/1471/375 +f 809/1487/365 810/1488/365 811/1489/365 +f 812/1490/365 813/1491/365 814/1492/365 +f 815/1493/372 816/1494/372 817/1495/372 +f 807/1485/365 812/1496/365 814/1492/365 +f 818/1497/365 819/1498/365 820/1499/365 +f 821/1500/365 819/1498/365 822/1501/365 +f 823/1502/372 824/1503/372 825/1504/372 +f 826/1505/372 827/1506/372 828/1507/372 +f 824/1503/372 828/1507/372 827/1506/372 +f 823/1502/371 829/1508/371 828/1507/371 +f 825/1509/367 830/1510/367 823/1502/367 +f 828/1507/366 831/1511/366 826/1512/366 +f 830/1510/365 832/1513/365 833/1514/365 +f 834/1515/365 831/1516/365 829/1508/365 +f 830/1510/365 834/1515/365 829/1508/365 +f 835/1517/366 836/1518/366 837/1519/366 +f 838/1520/366 835/1517/366 837/1519/366 +f 839/1521/366 838/1520/366 840/1522/366 +f 841/1523/366 840/1522/366 842/1524/366 +f 843/1525/366 842/1524/366 844/1526/366 +f 845/1527/366 843/1525/366 844/1526/366 +f 846/1528/367 847/1529/367 848/1530/367 +f 849/1531/367 848/1530/367 850/1532/367 +f 851/1533/367 849/1531/367 850/1532/367 +f 852/1534/367 853/1535/367 854/1536/367 +f 855/1537/367 853/1535/367 856/1538/367 +f 855/1537/367 857/1539/367 858/1540/367 +f 859/1541/365 860/1542/365 861/1543/365 +f 860/1542/371 862/1544/371 861/1543/371 +f 859/1541/365 863/1545/365 864/1546/365 +f 865/1547/372 866/1548/372 862/1544/372 +f 862/1544/367 859/1549/367 861/1543/367 +f 867/1550/366 860/1542/366 864/1551/366 +f 867/1552/372 868/1553/372 866/1548/372 +f 859/1549/376 868/1554/376 869/1555/376 +f 870/1556/377 864/1551/377 863/1557/377 +f 871/1558/366 872/1559/366 873/1560/366 +f 874/1561/367 875/1562/367 876/1563/367 +f 877/1564/366 872/1559/366 878/1565/366 +f 875/1562/367 879/1566/367 876/1563/367 +f 873/1560/366 880/1567/366 881/1568/366 +f 882/1569/367 883/1570/367 874/1561/367 +f 884/1571/366 885/1572/366 886/1573/366 +f 887/1574/367 888/1575/367 889/1576/367 +f 890/1577/366 891/1578/366 884/1571/366 +f 892/1579/367 893/1580/367 887/1574/367 +f 891/1581/372 894/1582/372 895/1583/372 +f 893/1580/371 891/1578/371 896/1584/371 +f 897/1585/371 898/1586/371 899/1587/371 +f 900/1588/371 901/1589/371 902/1590/371 +f 903/1591/372 897/1592/372 904/1593/372 +f 905/1594/372 900/1595/372 902/1596/372 +f 906/1597/372 907/1598/372 905/1594/372 +f 906/1597/372 903/1591/372 904/1593/372 +f 904/1593/372 908/1599/372 909/1600/372 +f 910/1601/372 911/1602/372 907/1598/372 +f 907/1598/372 912/1603/372 904/1593/372 +f 913/1604/372 906/1597/372 914/1605/372 +f 904/1593/372 914/1605/372 906/1597/372 +f 907/1598/372 906/1597/372 915/1606/372 +f 916/1607/371 917/1608/371 918/1609/371 +f 919/1610/371 917/1608/371 920/1611/371 +f 921/1612/365 899/1613/365 898/1614/365 +f 922/1615/365 923/1616/365 901/1589/365 +f 923/1616/365 916/1617/365 924/1618/365 +f 921/1612/365 924/1618/365 918/1619/365 +f 918/1619/365 924/1618/365 916/1617/365 +f 925/1620/370 926/1621/370 927/1622/370 +f 925/1620/370 928/1623/370 929/1624/370 +f 930/1625/365 931/1626/365 932/1627/365 +f 933/1628/365 934/1629/365 928/1623/365 +f 935/1630/365 928/1623/365 934/1629/365 +f 930/1625/365 936/1631/365 931/1626/365 +f 937/1632/365 932/1627/365 931/1626/365 +f 933/1628/365 938/1633/365 934/1629/365 +f 933/1628/365 932/1627/365 939/1634/365 +f 928/1623/365 940/1635/365 930/1625/365 +f 900/1636/367 916/1637/367 922/1638/367 +f 918/1639/366 897/1640/366 899/1641/366 +f 896/1642/365 879/1566/365 877/1564/365 +f 941/1643/371 942/1644/371 943/1645/371 +f 944/1646/372 945/1647/372 942/1644/372 +f 946/1648/365 947/1649/365 948/1650/365 +f 942/1651/366 947/1649/366 949/1652/366 +f 946/1648/367 950/1653/367 944/1646/367 +f 764/1429/365 768/1433/365 765/1430/365 +f 767/1432/366 765/1430/366 768/1433/366 +f 770/1435/367 771/1654/367 764/1429/367 +f 769/1436/368 771/1438/368 770/1435/368 +f 771/1438/369 769/1436/369 768/1439/369 +f 772/1441/370 779/1448/370 773/1442/370 +f 951/1655/367 776/1445/367 775/1444/367 +f 776/1445/367 774/1443/367 773/1442/367 +f 779/1448/366 772/1441/366 777/1446/366 +f 777/1446/366 952/1656/366 778/1447/366 +f 780/1449/366 784/1458/366 781/1450/366 +f 783/1452/368 788/1657/368 784/1453/368 +f 953/1658/366 954/1659/366 787/1457/366 +f 954/1659/366 788/1660/366 785/1455/366 +f 787/1457/366 954/1659/366 785/1455/366 +f 788/1660/366 783/1661/366 785/1455/366 +f 954/1662/371 955/1663/371 788/1459/371 +f 955/1663/371 790/1664/371 788/1459/371 +f 790/1664/371 781/1450/371 788/1459/371 +f 789/1461/370 956/1665/370 783/1460/370 +f 956/1665/370 785/1666/370 783/1460/370 +f 783/1460/370 780/1449/370 782/1451/370 +f 789/1462/365 782/1451/365 781/1450/365 +f 791/1464/370 957/1667/370 792/1465/370 +f 794/1467/370 957/1667/370 791/1464/370 +f 796/1469/372 803/1668/372 797/1470/372 +f 816/1669/373 958/1670/373 801/1474/373 +f 958/1670/373 799/1472/373 801/1474/373 +f 799/1472/373 959/1671/373 800/1473/373 +f 802/1475/373 805/1672/373 803/1476/373 +f 806/1481/372 804/1478/372 802/1482/372 +f 806/1481/374 801/1673/374 800/1484/374 +f 797/1470/375 813/1491/375 808/1486/375 +f 811/1489/365 960/1674/365 961/1675/365 +f 961/1675/365 959/1676/365 811/1489/365 +f 959/1676/365 799/1677/365 811/1489/365 +f 799/1677/365 962/1678/365 811/1489/365 +f 962/1678/365 809/1487/365 811/1489/365 +f 812/1490/365 808/1679/365 813/1491/365 +f 815/1493/372 958/1680/372 816/1494/372 +f 816/1494/372 963/1681/372 817/1495/372 +f 817/1495/372 964/1682/372 815/1493/372 +f 964/1682/372 965/1683/372 815/1493/372 +f 965/1683/372 966/1684/372 815/1493/372 +f 807/1485/365 800/1685/365 812/1496/365 +f 818/1497/365 967/1686/365 819/1498/365 +f 821/1500/365 820/1499/365 819/1498/365 +f 819/1498/365 968/1687/365 822/1501/365 +f 822/1501/365 969/1688/365 970/1689/365 +f 970/1689/365 821/1500/365 822/1501/365 +f 824/1503/372 823/1502/372 828/1507/372 +f 823/1502/371 830/1510/371 829/1508/371 +f 825/1509/367 832/1690/367 830/1510/367 +f 828/1507/366 829/1508/366 831/1511/366 +f 830/1510/365 833/1514/365 834/1515/365 +f 835/1517/366 971/1691/366 836/1518/366 +f 838/1520/366 972/1692/366 835/1517/366 +f 839/1521/366 972/1693/366 838/1520/366 +f 841/1523/366 839/1694/366 840/1522/366 +f 843/1525/366 841/1523/366 842/1524/366 +f 845/1527/366 973/1695/366 843/1525/366 +f 846/1528/367 974/1696/367 847/1529/367 +f 849/1531/367 846/1528/367 848/1530/367 +f 851/1533/367 852/1697/367 849/1531/367 +f 852/1534/367 851/1533/367 853/1535/367 +f 855/1537/367 854/1698/367 853/1535/367 +f 855/1537/367 856/1538/367 857/1539/367 +f 859/1541/365 864/1546/365 860/1542/365 +f 860/1542/371 865/1547/371 862/1544/371 +f 859/1541/365 869/1699/365 863/1545/365 +f 865/1547/372 867/1552/372 866/1548/372 +f 862/1544/367 866/1700/367 859/1549/367 +f 867/1550/366 865/1547/366 860/1542/366 +f 867/1552/372 870/1701/372 868/1553/372 +f 859/1549/376 866/1700/376 868/1554/376 +f 870/1556/377 867/1550/377 864/1551/377 +f 871/1558/366 878/1565/366 872/1559/366 +f 874/1561/367 883/1570/367 875/1562/367 +f 877/1564/366 895/1583/366 872/1559/366 +f 875/1562/367 975/1702/367 879/1566/367 +f 881/1568/366 976/1703/366 871/1558/366 +f 871/1558/366 873/1560/366 881/1568/366 +f 874/1561/367 977/1704/367 882/1569/367 +f 882/1569/367 978/1705/367 883/1570/367 +f 886/1573/366 979/1706/366 890/1577/366 +f 890/1577/366 884/1571/366 886/1573/366 +f 889/1576/367 980/1707/367 892/1579/367 +f 892/1579/367 887/1574/367 889/1576/367 +f 890/1577/366 896/1584/366 891/1578/366 +f 892/1579/367 894/1708/367 893/1580/367 +f 894/1582/372 872/1559/372 895/1583/372 +f 895/1583/372 975/1709/372 891/1581/372 +f 975/1709/372 875/1710/372 891/1581/372 +f 893/1580/371 894/1708/371 891/1578/371 +f 897/1585/371 981/1711/371 898/1586/371 +f 900/1588/371 922/1615/371 901/1589/371 +f 903/1591/372 981/1712/372 897/1592/372 +f 905/1594/372 907/1598/372 900/1595/372 +f 909/1600/372 914/1605/372 904/1593/372 +f 904/1593/372 912/1603/372 908/1599/372 +f 911/1602/372 912/1603/372 907/1598/372 +f 907/1598/372 915/1606/372 910/1601/372 +f 913/1604/372 915/1606/372 906/1597/372 +f 916/1607/371 920/1611/371 917/1608/371 +f 919/1610/371 982/1713/371 917/1608/371 +f 921/1612/365 918/1619/365 899/1613/365 +f 922/1615/365 916/1617/365 923/1616/365 +f 925/1620/370 929/1624/370 926/1621/370 +f 925/1620/370 933/1628/370 928/1623/370 +f 935/1630/365 940/1635/365 928/1623/365 +f 930/1625/365 940/1635/365 936/1631/365 +f 937/1632/365 939/1634/365 932/1627/365 +f 933/1628/365 939/1634/365 938/1633/365 +f 900/1636/367 907/1714/367 916/1637/367 +f 918/1639/366 904/1715/366 897/1640/366 +f 877/1564/365 878/1565/365 893/1716/365 +f 896/1642/365 876/1563/365 879/1566/365 +f 877/1564/365 893/1716/365 896/1642/365 +f 941/1643/371 944/1646/371 942/1644/371 +f 944/1646/372 983/1717/372 945/1647/372 +f 947/1649/365 984/1718/365 948/1650/365 +f 948/1650/365 985/1719/365 946/1648/365 +f 985/1719/365 950/1653/365 946/1648/365 +f 949/1652/366 943/1720/366 942/1651/366 +f 942/1651/366 984/1718/366 947/1649/366 +f 944/1646/367 941/1643/367 986/1721/367 +f 986/1721/367 946/1648/367 944/1646/367 s 1 -f 1325/2520/563 1336/2531/564 1326/2518/564 -f 1332/2515/565 1343/2534/566 1333/2517/566 -f 1329/2512/567 1340/2540/568 1330/2541/568 -f 1326/2518/564 1337/2542/569 1327/2543/569 -f 1333/2517/566 1344/2536/570 1334/2521/570 -f 1330/2541/568 1341/2527/571 1331/2514/571 -f 1327/2543/569 1338/2523/572 1328/2511/572 -f 1331/2514/571 1342/2530/565 1332/2515/565 -f 1328/2511/572 1339/2525/567 1329/2512/567 -f 1325/2520/563 1335/2532/563 1336/2531/564 -f 1332/2515/565 1342/2530/565 1343/2534/566 -f 1329/2512/567 1339/2525/567 1340/2540/568 -f 1326/2518/564 1336/2531/564 1337/2542/569 -f 1333/2517/566 1343/2534/566 1344/2536/570 -f 1330/2541/568 1340/2540/568 1341/2527/571 -f 1327/2543/569 1337/2542/569 1338/2523/572 -f 1331/2514/571 1341/2527/571 1342/2530/565 -f 1328/2511/572 1338/2523/572 1339/2525/567 +f 987/1722/378 988/1723/379 989/1724/380 +f 990/1725/381 991/1726/382 992/1727/383 +f 993/1728/384 994/1729/366 995/1730/385 +f 996/1731/386 997/1732/386 998/1733/387 +f 999/1734/388 1000/1735/389 1001/1736/390 +f 1002/1737/384 993/1728/384 1003/1738/391 +f 1004/1739/392 994/1729/366 1005/1740/393 +f 988/1723/379 1001/1736/390 989/1724/380 +f 1006/1741/367 996/1731/386 1007/1742/394 +f 996/1743/395 1008/1744/396 997/1745/396 +f 1009/1746/397 1010/1747/398 1006/1748/398 +f 1011/1749/399 1012/1750/400 1013/1751/401 +f 1011/1749/399 1014/1752/402 1015/1753/403 +f 1015/1754/403 1016/1755/404 1009/1746/397 +f 1006/1748/398 1017/1756/395 996/1743/395 +f 1018/1757/405 1019/1758/406 1020/1759/405 +f 997/1745/396 1018/1757/405 1020/1759/405 +f 1012/1760/367 1018/1761/367 1008/1762/367 +f 1020/1763/367 1021/1764/407 1022/1765/408 +f 1023/1766/409 1024/1767/410 1025/1768/411 +f 1026/1769/412 1027/1770/410 1028/1771/410 +f 793/1772/413 1028/1773/414 1027/1774/414 +f 1025/1768/411 1029/1775/415 1009/1776/416 +f 1019/1777/416 1026/1769/412 1021/1764/407 +f 1030/1778/411 1011/1779/415 1031/1780/415 +f 1015/1781/415 1031/1780/415 1011/1779/415 +f 1032/1782/417 1006/1741/367 1007/1742/394 +f 1033/1783/418 1034/1784/419 1035/1785/418 +f 1036/1786/420 1037/1787/421 1038/1788/420 +f 1039/1789/422 1038/1788/420 1040/1790/422 +f 1041/1791/423 1042/1792/424 1043/1793/423 +f 1044/1794/370 1040/1790/422 1045/1795/370 +f 1046/1796/421 1047/1797/425 1037/1787/421 +f 1048/1798/425 1043/1793/423 1047/1797/425 +f 1035/1785/418 1049/1799/424 1033/1783/418 +f 1037/1800/367 1035/1785/367 1050/1801/367 +f 1051/1802/426 1052/1803/427 1053/1804/426 +f 1054/1805/365 1055/1806/428 1056/1807/365 +f 1057/1808/427 1050/1809/365 1052/1803/427 +f 1058/1810/428 1053/1804/426 1055/1806/428 +f 1059/1811/429 1056/1807/365 1060/1812/429 +f 1046/1813/366 1036/1814/366 1061/1815/366 +f 1062/1816/419 1060/1812/429 1034/1784/419 +f 1063/1817/428 1064/1818/365 1065/1819/428 +f 1066/1820/429 1067/1821/370 1068/1822/429 +f 1069/1823/430 1070/1824/372 1071/1825/430 +f 1072/1826/431 1073/1827/371 1074/1828/431 +f 1075/1829/371 1065/1819/428 1073/1827/371 +f 1076/1830/365 1068/1822/429 1064/1818/365 +f 1077/1831/370 1071/1825/430 1067/1832/370 +f 1078/1833/372 1074/1828/431 1070/1824/372 +f 1063/1834/367 1075/1835/367 1077/1836/367 +f 954/1662/395 1079/1837/431 955/1663/395 +f 1079/1837/431 787/1838/372 1080/1839/372 +f 786/1840/430 956/1665/402 1081/1841/430 +f 1080/1842/372 786/1840/430 1081/1841/430 +f 1025/1843/372 1082/1844/372 1083/1845/372 +f 1084/1846/372 1085/1847/372 1086/1848/372 +f 1024/1849/372 957/1850/372 1082/1844/372 +f 1087/1851/372 1088/1852/372 1089/1853/372 +f 1090/1854/377 1091/1855/432 1092/1856/433 +f 1093/1857/375 827/1858/434 1094/1859/434 +f 1095/1860/435 1088/1861/373 1085/1862/435 +f 1088/1861/373 1096/1863/374 1089/1864/436 +f 1097/1865/437 824/1866/375 1093/1857/375 +f 1085/1862/435 1098/1867/414 1095/1860/435 +f 1099/1868/372 1098/1869/372 1093/1870/372 +f 1029/1871/372 1025/1843/372 1087/1851/372 +f 1088/1852/372 1025/1843/372 1083/1845/372 +f 1029/1872/371 1092/1856/371 1031/1873/371 +f 1030/1874/365 1092/1856/365 1100/1875/365 +f 1027/1876/365 1100/1875/365 1101/1877/365 +f 791/1878/365 1027/1876/365 1101/1877/365 +f 1092/1879/433 1102/1880/438 1100/1881/438 +f 1101/1882/439 795/1468/439 791/1464/439 +f 1100/1881/438 1103/1883/440 1101/1882/440 +f 1083/1884/441 1104/1885/442 1086/1886/442 +f 957/1667/443 1105/1887/443 1082/1888/443 +f 1086/1886/442 1106/1889/376 1084/1890/376 +f 1082/1888/444 1107/1891/441 1083/1884/441 +f 1108/1892/365 1106/1893/365 1109/1894/365 +f 1107/1895/365 1102/1896/365 1106/1893/365 +f 1107/1895/365 1103/1897/365 1102/1896/365 +f 795/1898/365 1105/1899/365 794/1900/365 +f 792/1901/445 1110/1902/367 1111/1903/376 +f 1112/1904/371 1111/1903/376 1113/1905/371 +f 792/1901/445 1024/1906/414 1114/1907/446 +f 1115/1908/366 1116/1909/391 990/1910/447 +f 798/1911/413 963/1912/387 796/1477/448 +f 810/1913/371 966/1914/377 965/1915/371 +f 962/1916/366 958/1670/374 815/1917/366 +f 811/1918/376 965/1915/371 964/1919/376 +f 809/1920/377 815/1917/366 966/1914/377 +f 804/1921/377 803/1922/449 805/1923/450 +f 797/1924/449 1117/1925/377 1115/1908/366 +f 813/1926/449 1115/1908/366 1118/1927/366 +f 1119/1928/377 813/1926/449 1118/1927/366 +f 1117/1925/377 806/1929/434 1113/1905/371 +f 807/1930/434 1119/1928/377 1112/1904/371 +f 1113/1905/371 807/1930/434 1112/1904/371 +f 801/1474/435 802/1475/435 796/1477/448 +f 800/1473/435 961/1931/387 812/1932/387 +f 812/1932/387 960/1933/367 808/1934/413 +f 811/1918/376 964/1919/376 798/1471/413 +f 1120/1935/365 1116/1936/365 1117/1937/365 +f 1121/1938/451 1122/1939/370 1123/1940/391 +f 1124/1941/452 1125/1942/367 1126/1943/387 +f 1127/1944/453 1128/1945/371 1129/1946/376 +f 1130/1947/454 1131/1948/366 1132/1949/377 +f 1133/1950/455 1123/1940/391 1131/1948/366 +f 1134/1951/456 1126/1943/387 1122/1952/370 +f 1135/1953/457 1129/1946/376 1125/1942/367 +f 1136/1954/458 1132/1949/377 1128/1945/371 +f 1137/1955/459 1136/1954/458 1127/1944/453 +f 1138/1956/460 1133/1950/455 1130/1947/454 +f 1139/1957/461 1121/1938/451 1133/1950/455 +f 1140/1958/462 1124/1941/452 1134/1951/456 +f 1135/1953/457 1137/1959/459 1127/1944/453 +f 1141/1960/463 1130/1947/454 1136/1954/458 +f 1142/1961/464 1134/1962/456 1121/1938/451 +f 1124/1941/452 1143/1963/465 1135/1953/457 +f 1144/1964/366 1142/1965/464 1139/1966/461 +f 1145/1967/370 1146/1968/466 1140/1969/462 +f 1147/1970/367 1137/1971/459 1143/1972/465 +f 1148/1973/371 1138/1974/460 1141/1975/463 +f 1149/1976/391 1140/1977/462 1142/1965/464 +f 1150/1978/387 1143/1972/465 1146/1968/466 +f 1151/1979/376 1141/1975/463 1137/1971/459 +f 1152/1980/377 1139/1966/461 1138/1974/460 +f 818/1981/467 1153/1982/366 1154/1983/366 +f 969/1984/370 1155/1985/391 970/1986/391 +f 1156/1987/376 1157/1988/367 1158/1989/367 +f 968/1990/367 1159/1991/468 1160/1992/367 +f 1158/1989/367 1161/1993/469 967/1994/469 +f 1154/1983/366 1162/1995/377 1163/1996/377 +f 968/1990/367 1164/1997/387 822/1998/387 +f 821/1999/366 1165/2000/470 820/2001/470 +f 970/1986/391 1166/2002/366 821/1999/366 +f 822/1998/387 1167/2003/370 969/2004/370 +f 1159/1991/468 967/1994/469 1161/1993/469 +f 820/2001/470 1168/2005/467 818/1981/467 +f 1169/2006/366 1170/2007/471 1171/2008/472 +f 1172/2009/473 1005/1740/393 1173/2010/474 +f 1173/2010/474 991/1726/382 1172/2009/473 +f 991/1726/382 1174/2011/393 1171/2008/472 +f 1174/2012/406 1175/2013/405 1169/2014/405 +f 1169/2014/405 1176/2015/396 1002/2016/396 +f 1002/2016/396 1177/2017/395 993/2018/395 +f 1173/2019/403 1178/2020/401 1179/2021/399 +f 994/2022/398 1180/2023/404 1005/2024/397 +f 993/2018/395 1181/2025/398 994/2022/398 +f 1180/2023/404 1173/2026/403 1005/2024/397 +f 1182/2027/366 1180/2028/366 1181/2029/366 +f 1179/2021/399 1183/2030/400 1174/2012/406 +f 1184/2031/428 1185/2032/365 1186/2033/428 +f 1187/2034/429 1188/2035/370 1189/2036/429 +f 1190/2037/430 1191/2038/372 1192/2039/430 +f 1193/2040/431 1194/2041/371 1195/2042/431 +f 1196/2043/371 1186/2033/428 1194/2041/371 +f 1197/2044/365 1189/2036/429 1185/2032/365 +f 1198/2045/370 1192/2039/430 1188/2046/370 +f 1199/2047/372 1195/2042/431 1191/2038/372 +f 1198/2048/367 1197/2049/367 1196/2050/367 +f 827/1858/434 1200/2051/449 1094/1859/434 +f 834/2052/434 1108/2053/375 1201/2054/434 +f 833/2055/375 1202/2056/437 1108/2053/375 +f 831/2057/475 1201/2054/434 1109/2058/449 +f 832/2059/476 825/2060/476 1084/1890/477 +f 1089/2061/436 826/2062/475 831/2063/475 +f 1001/2064/390 1203/2065/478 989/2066/380 +f 1000/2067/389 1204/2068/479 1001/2064/390 +f 1000/2067/389 1205/2069/480 1206/2070/481 +f 1004/2071/392 1205/2069/480 995/2072/385 +f 1172/2073/473 1207/2074/482 1004/2071/392 +f 990/2075/381 1208/2076/483 1172/2073/473 +f 1208/2076/483 990/2075/381 1209/2077/484 +f 987/2078/378 1203/2065/478 1210/2079/485 +f 987/2078/378 1211/2080/486 1007/2081/394 +f 1007/2081/394 1212/2082/487 1032/2083/417 +f 1023/2084/409 1212/2082/487 1213/2085/488 +f 1023/2084/409 1213/2085/488 1114/2086/489 +f 1213/2085/488 1214/2087/490 1114/2086/489 +f 1209/2088/371 1114/2089/371 1214/2090/371 +f 1213/2091/365 1210/2092/365 1205/2093/365 +f 818/1497/365 1154/2094/365 1215/2095/365 +f 1028/2096/365 1216/2097/365 1026/2098/365 +f 992/2099/365 991/2100/365 1118/2101/365 +f 1026/1769/412 1217/2102/491 1021/1764/407 +f 991/1726/382 1171/2008/472 1218/2103/492 +f 1118/2101/493 991/2100/382 1218/2104/492 +f 1219/2105/494 1220/2106/495 1221/2107/496 +f 1222/2108/497 1223/2109/498 1224/2110/499 +f 1225/2111/500 1226/2112/501 1220/2106/495 +f 1223/2109/498 1227/2113/502 1224/2110/499 +f 1228/2114/503 1229/2115/496 1226/2116/501 +f 1227/2113/502 1230/2117/504 1231/2118/505 +f 1232/2119/494 1233/2120/495 1229/2115/496 +f 1234/2121/506 1235/2122/506 1236/2123/506 +f 1231/2118/505 1237/2124/507 1238/2125/507 +f 1239/2126/500 1240/2127/501 1233/2120/495 +f 1241/2128/508 1242/2129/509 1235/2122/510 +f 1237/2124/507 1243/2130/511 1238/2125/507 +f 1244/2131/512 1240/2127/501 1245/2132/513 +f 1246/2133/514 1247/2134/501 1242/2129/509 +f 1248/2135/511 1249/2136/372 1243/2130/511 +f 1250/2137/515 1251/2138/516 1245/2132/517 +f 1252/2139/503 1221/2107/496 1247/2140/501 +f 1253/2141/518 1222/2108/497 1251/2138/519 +f 1242/2129/509 1254/2142/520 1235/2122/510 +f 1255/2143/521 1242/2129/509 1247/2134/501 +f 1221/2107/496 1256/2144/522 1247/2140/501 +f 1255/2143/521 1247/2140/501 1256/2144/522 +f 1257/2145/521 1220/2106/495 1226/2112/501 +f 1220/2106/495 1256/2144/522 1221/2107/496 +f 1258/2146/523 1256/2144/522 1220/2106/495 +f 1229/2115/496 1259/2147/522 1226/2116/501 +f 1226/2116/501 1259/2147/522 1257/2145/521 +f 1260/2148/521 1233/2120/495 1240/2127/501 +f 1233/2120/495 1259/2147/522 1229/2115/496 +f 1261/2149/523 1259/2147/522 1233/2120/495 +f 1244/2150/366 1262/2151/524 1260/2152/366 +f 1222/2108/497 1263/2153/525 1251/2138/519 +f 1262/2154/524 1251/2138/519 1263/2153/525 +f 1224/2110/499 1264/2155/526 1222/2108/497 +f 1263/2153/525 1222/2108/497 1264/2155/526 +f 1227/2113/502 1265/2156/527 1224/2110/499 +f 1264/2155/526 1224/2110/499 1265/2156/527 +f 1231/2118/505 1265/2156/527 1227/2113/502 +f 1262/2157/528 1244/2158/529 1245/2132/517 +f 1240/2127/501 1244/2131/512 1260/2148/521 +f 1259/2159/366 1261/2160/366 1257/2161/366 +f 1256/2162/366 1258/2163/366 1255/2164/366 +f 1260/2152/366 1262/2151/524 1261/2160/366 +f 1262/2151/524 1263/2165/525 1261/2160/366 +f 1261/2160/366 1263/2165/525 1257/2161/366 +f 1257/2161/366 1263/2165/525 1258/2163/366 +f 1258/2163/366 1263/2165/525 1255/2164/366 +f 1263/2165/525 1264/2166/526 1255/2164/366 +f 1255/2164/366 1264/2166/526 1254/2167/366 +f 1264/2166/526 1265/2168/527 1254/2167/366 +f 1265/2168/527 1231/2169/366 1236/2170/366 +f 1235/2171/366 1254/2167/366 1236/2170/366 +f 1243/2172/366 1249/2173/366 1238/2174/366 +f 1249/2173/366 1266/2175/366 1238/2174/366 +f 1266/2175/366 1236/2170/366 1231/2169/366 +f 1238/2174/366 1266/2175/366 1231/2169/366 +f 1254/2167/366 1265/2168/527 1236/2170/366 +f 1251/2138/516 1262/2157/528 1245/2132/517 +f 1250/2137/530 1240/2127/501 1267/2176/503 +f 1268/2177/367 1269/2178/367 1270/2179/531 +f 1271/2180/367 1272/2181/367 1273/2182/367 +f 1274/2183/367 1275/2184/367 1276/2185/367 +f 1269/2178/367 1273/2182/367 1270/2179/531 +f 1270/2179/531 1273/2182/367 1277/2186/532 +f 1273/2182/367 1272/2181/367 1277/2186/532 +f 1272/2181/367 1276/2185/367 1277/2186/532 +f 1276/2185/367 1275/2184/367 1277/2186/532 +f 1277/2186/532 1275/2184/367 1278/2187/533 +f 1275/2184/367 1279/2188/367 1278/2187/533 +f 1278/2187/533 1279/2188/367 1280/2189/534 +f 1270/2190/535 1253/2141/536 1250/2137/515 +f 1270/2190/535 1250/2137/515 1268/2191/537 +f 1250/2137/530 1267/2176/503 1268/2192/538 +f 1268/2192/538 1267/2176/503 1269/2193/539 +f 1239/2126/500 1269/2193/539 1267/2176/503 +f 1273/2194/540 1239/2126/500 1271/2195/541 +f 1239/2126/500 1232/2119/494 1271/2195/541 +f 1232/2119/494 1228/2114/503 1271/2195/541 +f 1271/2195/541 1228/2114/503 1272/2196/539 +f 1225/2111/500 1272/2196/539 1228/2197/503 +f 1276/2198/540 1225/2111/500 1274/2199/541 +f 1225/2111/500 1219/2105/494 1274/2199/541 +f 1219/2105/494 1252/2139/503 1274/2199/541 +f 1274/2199/541 1252/2139/503 1275/2200/539 +f 1246/2133/514 1275/2200/539 1252/2201/503 +f 1246/2133/514 1241/2128/508 1279/2202/542 +f 1270/2203/531 1277/2204/532 1253/2141/518 +f 1253/2141/518 1277/2204/532 1281/2205/543 +f 1277/2204/532 1278/2206/533 1281/2205/543 +f 1281/2205/543 1278/2206/533 1223/2109/498 +f 1278/2206/533 1280/2207/534 1223/2109/498 +f 1223/2109/498 1280/2207/534 1282/2208/544 +f 1230/2117/504 1282/2208/544 1280/2207/534 +f 1241/2209/367 1234/2210/367 1279/2188/367 +f 1279/2188/367 1234/2210/367 1280/2189/534 +f 1280/2189/534 1234/2210/367 1230/2211/367 +f 1234/2210/367 1283/2212/367 1230/2211/367 +f 1230/2211/367 1283/2212/367 1237/2213/367 +f 1248/2214/367 1237/2213/367 1284/2215/367 +f 1284/2215/367 1237/2213/367 1283/2212/367 +f 856/1538/545 838/1520/546 837/1519/545 +f 850/1532/547 844/1526/548 842/1524/547 +f 853/1535/546 840/1522/549 838/1520/546 +f 857/1539/365 837/1519/545 836/1518/365 +f 848/1530/548 845/1527/550 844/1526/548 +f 851/1533/549 842/1524/547 840/1522/549 +f 835/1517/551 858/2216/372 971/1691/372 +f 972/1692/552 855/2217/551 835/1517/551 +f 839/2218/553 854/2219/552 972/1692/552 +f 849/2220/554 839/2218/553 841/2221/554 +f 846/2222/555 841/2221/554 843/2223/555 +f 974/2224/556 843/2223/555 973/2225/556 +f 1118/2101/493 1218/2104/492 1285/2226/557 +f 1112/2227/558 1286/2228/559 1287/2229/560 +f 1286/2228/559 1112/2227/558 1288/2230/561 +f 1285/2226/557 1288/2230/561 1112/2227/558 +f 1112/2227/558 1119/2231/562 1285/2226/557 +f 1118/2101/493 1285/2226/557 1119/2231/562 +f 1026/2098/412 1216/2097/563 1217/2232/491 +f 1287/2229/560 1286/2228/559 1216/2097/563 +f 1217/2232/491 1216/2097/563 1286/2228/559 +f 1289/2233/564 1163/1996/377 1162/1995/377 +f 1156/1987/376 1290/2234/565 1291/2235/376 +f 1290/2236/372 1289/2237/372 1161/2238/372 +f 1292/2239/365 1293/2240/365 1294/2241/365 +f 1295/2242/367 1296/2243/387 1297/2244/367 +f 1298/2245/377 1292/2239/371 1299/2246/377 +f 1300/2247/391 1301/2248/366 1302/2249/391 +f 1303/2250/387 1304/2251/566 1296/2252/387 +f 1305/2253/371 1306/2254/376 1292/2239/371 +f 1307/2255/566 1308/2256/565 1304/2257/566 +f 1309/2258/376 1297/2244/367 1306/2254/376 +f 1310/2259/567 1302/2249/391 1311/2260/567 +f 1312/2261/366 1299/2246/377 1301/2248/366 +f 1313/2262/367 1314/2263/376 1315/2264/367 +f 1215/2265/564 1310/2259/567 1311/2260/567 +f 1306/2254/365 1316/2266/365 1293/2267/365 +f 1296/2243/365 1316/2268/365 1297/2244/365 +f 1292/2239/365 1317/2269/365 1299/2246/365 +f 1299/2246/365 1315/2270/365 1301/2248/365 +f 1301/2248/365 1314/2271/365 1302/2249/365 +f 1311/2272/365 1314/2273/365 1318/2274/365 +f 1304/2275/365 1319/2276/365 1296/2243/365 +f 1318/2277/365 1304/2278/365 1308/2279/365 +f 1320/2280/371 1319/2281/377 1318/2282/371 +f 1321/2283/366 1293/2284/391 1316/2285/366 +f 1322/2286/370 1317/2287/387 1294/2288/370 +f 1323/2289/376 1318/2290/371 1314/2263/376 +f 1324/2291/377 1316/2285/366 1319/2281/377 +f 1325/2292/391 1294/2288/370 1293/2284/391 +f 1326/2293/387 1315/2264/367 1317/2287/387 +f 1326/2294/372 1305/2253/372 1298/2245/372 +f 1313/2295/372 1298/2245/372 1312/2261/372 +f 1323/2296/372 1312/2261/372 1300/2247/372 +f 1305/2253/372 1325/2297/372 1309/2258/372 +f 1309/2258/372 1321/2298/372 1295/2242/372 +f 1321/2299/372 1303/2300/372 1295/2242/372 +f 1310/2301/372 1323/2302/372 1300/2247/372 +f 1324/2303/372 1307/2304/372 1303/2300/372 +f 1320/2305/372 1310/2306/372 1289/2237/372 +f 883/2307/568 891/2308/569 875/2309/569 +f 889/2310/371 976/2311/428 881/2312/371 +f 980/2313/431 881/2312/371 880/2314/431 +f 882/2315/371 885/2316/431 978/2317/431 +f 977/2318/428 886/2319/371 882/2315/371 +f 883/2307/568 885/2316/431 884/2320/568 +f 980/2313/431 873/2321/568 892/2322/568 +f 871/2323/570 888/2324/428 887/2325/570 +f 979/2326/428 874/2327/570 890/2328/570 +f 896/2329/571 874/2327/570 876/1563/571 +f 892/2322/568 872/2330/569 894/2331/569 +f 871/2323/570 893/2332/571 878/1565/571 +f 924/2333/371 905/2334/449 923/2335/449 +f 902/1590/366 923/2335/449 905/2334/449 +f 921/2336/437 981/1711/367 903/2337/437 +f 921/2336/437 906/2338/371 924/2333/371 +f 912/2339/371 936/2340/376 908/2341/376 +f 910/2342/366 937/2343/377 911/2344/377 +f 913/2345/370 938/2346/391 915/2347/391 +f 909/2348/367 935/2349/387 914/2350/387 +f 908/2341/376 940/2351/367 909/2348/367 +f 911/2344/377 931/2352/371 912/2353/371 +f 915/2347/391 939/2354/366 910/2342/366 +f 914/2350/387 934/2355/370 913/2345/370 +f 919/2356/572 926/1621/573 982/2357/573 +f 917/2358/574 926/1621/573 929/2359/574 +f 927/1622/572 920/2360/575 925/2361/575 +f 1021/2362/372 1217/2363/372 1218/2364/372 +f 945/2365/576 984/2366/577 942/2367/577 +f 944/2368/578 985/2369/579 983/2370/579 +f 985/2369/579 945/2365/576 983/2370/579 +f 990/1910/447 1327/2371/370 1328/2372/370 +f 1328/2372/370 1120/2373/387 1114/2374/446 +f 1329/2375/431 1330/2376/372 1331/2377/431 +f 1332/2378/430 1333/2379/370 1334/2380/430 +f 1335/2381/429 1336/2382/365 1337/2383/429 +f 1338/2384/428 1339/2385/371 1340/2386/428 +f 1341/2387/371 1331/2377/431 1339/2385/371 +f 1342/2388/372 1334/2380/430 1330/2376/372 +f 1343/2389/370 1337/2383/429 1333/2390/370 +f 1344/2391/365 1340/2386/428 1336/2382/365 +f 1329/2392/366 1341/2393/366 1343/2394/366 +f 987/1722/378 998/1733/387 988/1723/379 +f 990/1725/381 1172/2009/473 991/1726/382 +f 987/1722/378 1007/1742/394 996/1731/386 +f 997/1732/386 1022/1765/408 998/1733/387 +f 987/1722/378 996/1731/386 998/1733/387 +f 999/1734/388 1003/1738/391 1000/1735/389 +f 995/1730/385 1000/1735/389 993/1728/384 +f 1000/1735/389 1003/1738/391 993/1728/384 +f 1003/1738/391 1170/2007/471 1002/1737/384 +f 1004/1739/392 995/1730/385 994/1729/366 +f 988/1723/379 999/1734/388 1001/1736/390 +f 996/1743/395 1017/1756/395 1008/1744/396 +f 1009/1746/397 1016/1755/404 1010/1747/398 +f 1011/1749/399 1019/1758/406 1012/1750/400 +f 1011/1749/399 1013/1751/401 1014/1752/402 +f 1015/1754/403 1014/2395/402 1016/1755/404 +f 1006/1748/398 1010/1747/398 1017/1756/395 +f 1018/1757/405 1012/1750/400 1019/1758/406 +f 997/1745/396 1008/1744/396 1018/1757/405 +f 1008/1762/367 1017/2396/367 1014/2397/367 +f 1017/2396/367 1010/2398/367 1014/2397/367 +f 1010/2398/367 1016/2399/367 1014/2397/367 +f 1014/2397/367 1013/2400/367 1008/1762/367 +f 1013/2400/367 1012/1760/367 1008/1762/367 +f 1022/1765/408 997/1732/386 1020/1763/367 +f 1020/1763/367 1019/1777/416 1021/1764/407 +f 1023/1766/409 1114/2401/489 1024/1767/410 +f 1026/1769/412 1030/1778/411 1027/1770/410 +f 793/1772/413 1216/2402/367 1028/1773/414 +f 1032/1782/417 1023/1766/409 1009/1776/416 +f 1023/1766/409 1025/1768/411 1009/1776/416 +f 1029/1775/415 1015/1781/415 1009/1776/416 +f 1019/1777/416 1011/1779/415 1026/1769/412 +f 1030/1778/411 1026/1769/412 1011/1779/415 +f 1015/1781/415 1029/1775/415 1031/1780/415 +f 1032/1782/417 1009/1776/416 1006/1741/367 +f 1033/1783/418 1062/1816/419 1034/1784/419 +f 1036/1786/420 1046/1796/421 1037/1787/421 +f 1039/1789/422 1036/1786/420 1038/1788/420 +f 1041/1791/423 1049/1799/424 1042/1792/424 +f 1044/1794/370 1039/1789/422 1040/1790/422 +f 1046/1796/421 1048/1798/425 1047/1797/425 +f 1048/1798/425 1041/1791/423 1043/1793/423 +f 1035/1785/418 1042/1792/424 1049/1799/424 +f 1042/2403/367 1035/1785/367 1043/2404/367 +f 1035/1785/367 1034/1784/367 1052/2405/367 +f 1034/1784/367 1060/2406/367 1056/2407/367 +f 1056/2407/367 1055/2408/367 1053/2409/367 +f 1052/2405/367 1050/1801/367 1035/1785/367 +f 1050/1801/367 998/2410/367 1040/2411/367 +f 1056/2407/367 1053/2409/367 1034/1784/367 +f 1053/2409/367 1052/2405/367 1034/1784/367 +f 1047/2412/367 1043/2404/367 1035/1785/367 +f 1047/2412/367 1035/1785/367 1037/1800/367 +f 1050/1801/367 1040/2411/367 1038/2413/367 +f 998/2410/367 1045/2414/367 1040/2411/367 +f 1050/1801/367 1038/2413/367 1037/1800/367 +f 1051/1802/426 1057/1808/427 1052/1803/427 +f 1054/1805/365 1058/1810/428 1055/1806/428 +f 1057/1808/427 1061/2415/365 1050/1809/365 +f 1058/1810/428 1051/1802/426 1053/1804/426 +f 1059/1811/429 1054/1805/365 1056/1807/365 +f 1059/2416/366 1062/1816/366 1054/2417/366 +f 1062/1816/366 1033/1783/366 1057/2418/366 +f 1054/2417/366 1062/1816/366 1051/2419/366 +f 1033/1783/366 1049/2420/366 1041/2421/366 +f 1033/1783/366 1041/2421/366 1048/2422/366 +f 1051/2419/366 1058/2423/366 1054/2417/366 +f 1003/2424/366 1061/1815/366 1039/2425/366 +f 1061/1815/366 1057/2418/366 1033/1783/366 +f 1039/2425/366 1061/1815/366 1036/1814/366 +f 1057/2418/366 1051/2419/366 1062/1816/366 +f 1033/1783/366 1048/2422/366 1046/1813/366 +f 1033/1783/366 1046/1813/366 1061/1815/366 +f 1039/2425/366 1044/2426/366 1003/2424/366 +f 1062/1816/419 1059/1811/429 1060/1812/429 +f 1063/1817/428 1076/1830/365 1064/1818/365 +f 1066/1820/429 1077/2427/370 1067/1821/370 +f 1069/1823/430 1078/1833/372 1070/1824/372 +f 1072/1826/431 1075/1829/371 1073/1827/371 +f 1075/1829/371 1063/1817/428 1065/1819/428 +f 1076/1830/365 1066/1820/429 1068/1822/429 +f 1077/1831/370 1069/1823/430 1071/1825/430 +f 1078/1833/372 1072/1826/431 1074/1828/431 +f 1075/1835/367 1072/2428/367 1077/1836/367 +f 1072/2428/367 1078/2429/367 1077/1836/367 +f 1078/2429/367 1069/2430/367 1077/1836/367 +f 1077/1836/367 1066/2431/367 1076/2432/367 +f 1076/2432/367 1063/1834/367 1077/1836/367 +f 954/1662/395 953/2433/431 1079/1837/431 +f 1079/1837/431 953/2433/431 787/1838/372 +f 786/1840/430 785/1666/402 956/1665/402 +f 1080/1842/372 787/2434/372 786/1840/430 +f 1025/1843/372 1024/1849/372 1082/1844/372 +f 1024/1849/372 792/2435/372 957/1850/372 +f 1087/2436/377 1089/2061/377 1092/1856/433 +f 1089/2061/377 1090/1854/377 1092/1856/433 +f 1093/1857/375 824/1866/375 827/1858/434 +f 1095/1860/435 1099/2437/373 1088/1861/373 +f 1088/1861/373 1099/2437/373 1096/1863/374 +f 1097/1865/437 825/2438/476 824/1866/375 +f 1085/1862/435 1084/1890/477 1098/1867/414 +f 1093/1870/372 1094/2439/372 1200/2440/372 +f 1200/2440/372 1096/2441/372 1099/1868/372 +f 1099/1868/372 1095/2442/372 1098/1869/372 +f 1098/1869/372 1097/2443/372 1093/1870/372 +f 1093/1870/372 1200/2440/372 1099/1868/372 +f 1083/1845/372 1086/1848/372 1085/1847/372 +f 1088/1852/372 1087/1851/372 1025/1843/372 +f 1083/1845/372 1085/1847/372 1088/1852/372 +f 1029/1872/371 1087/2436/371 1092/1856/371 +f 1030/1874/365 1031/1873/365 1092/1856/365 +f 1027/1876/365 1030/1874/365 1100/1875/365 +f 791/1878/365 793/2444/365 1027/1876/365 +f 1092/1879/433 1091/2445/432 1102/1880/438 +f 1101/1882/439 1103/1883/439 795/1468/439 +f 1100/1881/438 1102/1880/438 1103/1883/440 +f 1083/1884/441 1107/1891/441 1104/1885/442 +f 957/1667/443 794/1467/443 1105/1887/443 +f 1086/1886/442 1104/1885/442 1106/1889/376 +f 1082/1888/444 1105/1887/444 1107/1891/441 +f 1109/1894/365 1201/2446/365 1108/1892/365 +f 1108/1892/365 1202/2447/365 1106/1893/365 +f 1106/1893/365 1090/2448/365 1109/1894/365 +f 1091/2449/365 1090/2448/365 1102/1896/365 +f 1090/2448/365 1106/1893/365 1102/1896/365 +f 1106/1893/365 1104/2450/365 1107/1895/365 +f 1107/1895/365 1105/1899/365 1103/1897/365 +f 795/1898/365 1103/1897/365 1105/1899/365 +f 1111/1903/376 1287/2451/376 792/1901/445 +f 1287/2451/376 1216/2402/367 793/1772/413 +f 793/1772/413 792/1901/413 1287/2451/376 +f 1112/1904/371 1287/2451/376 1111/1903/376 +f 1120/2452/387 1110/1902/367 1114/1907/446 +f 1110/1902/367 792/1901/445 1114/1907/446 +f 992/2453/374 1118/1927/366 990/1910/447 +f 1118/1927/366 1115/1908/366 990/1910/447 +f 798/1911/413 817/2454/367 963/1912/387 +f 810/1913/371 809/1920/377 966/1914/377 +f 962/1916/366 799/1472/374 958/1670/374 +f 811/1918/376 810/1913/371 965/1915/371 +f 809/1920/377 962/1916/366 815/1917/366 +f 804/1921/377 1117/1925/377 803/1922/449 +f 797/1924/449 803/1922/449 1117/1925/377 +f 813/1926/449 797/1924/449 1115/1908/366 +f 1119/1928/377 814/2455/377 813/1926/449 +f 1117/1925/377 804/1921/377 806/1929/434 +f 807/1930/434 814/2455/377 1119/1928/377 +f 1113/1905/371 806/1929/434 807/1930/434 +f 796/1477/448 963/1912/387 816/1669/435 +f 816/1669/435 801/1474/435 796/1477/448 +f 800/1473/435 959/1671/435 961/1931/387 +f 812/1932/387 961/1931/387 960/1933/367 +f 817/2456/367 798/1471/413 964/1919/376 +f 798/1471/413 808/1486/413 811/1918/376 +f 808/1486/413 960/2457/367 811/1918/376 +f 1111/2458/365 1110/2459/365 1120/1935/365 +f 1120/1935/365 1327/2460/365 1116/1936/365 +f 1116/1936/365 1115/2461/365 1117/1937/365 +f 1117/1937/365 1113/2462/365 1111/2458/365 +f 1111/2458/365 1120/1935/365 1117/1937/365 +f 1121/1938/451 1134/1962/456 1122/1939/370 +f 1124/1941/452 1135/1953/457 1125/1942/367 +f 1127/1944/453 1136/1954/458 1128/1945/371 +f 1130/1947/454 1133/1950/455 1131/1948/366 +f 1133/1950/455 1121/1938/451 1123/1940/391 +f 1134/1951/456 1124/1941/452 1126/1943/387 +f 1135/1953/457 1127/1944/453 1129/1946/376 +f 1136/1954/458 1130/1947/454 1132/1949/377 +f 1137/1955/459 1141/2463/463 1136/1954/458 +f 1138/1956/460 1139/2464/461 1133/1950/455 +f 1139/1957/461 1142/2465/464 1121/1938/451 +f 1140/1958/462 1146/2466/466 1124/1941/452 +f 1135/1953/457 1143/2467/465 1137/1959/459 +f 1141/1960/463 1138/2468/460 1130/1947/454 +f 1142/1961/464 1140/2469/462 1134/1962/456 +f 1124/1941/452 1146/2470/466 1143/1963/465 +f 1144/1964/366 1149/1976/391 1142/1965/464 +f 1145/1967/370 1150/1978/387 1146/1968/466 +f 1147/1970/367 1151/1979/376 1137/1971/459 +f 1148/1973/371 1152/1980/377 1138/1974/460 +f 1149/1976/391 1145/2471/370 1140/1977/462 +f 1150/1978/387 1147/1970/367 1143/1972/465 +f 1151/1979/376 1148/1973/371 1141/1975/463 +f 1152/1980/377 1144/1964/366 1139/1966/461 +f 818/1981/467 1168/2005/467 1153/1982/366 +f 969/1984/370 1167/2472/370 1155/1985/391 +f 1156/1987/376 1291/2235/376 1157/1988/367 +f 968/1990/367 819/2473/468 1159/1991/468 +f 1158/1989/367 1157/1988/367 1161/1993/469 +f 1154/1983/366 1153/1982/366 1162/1995/377 +f 968/1990/367 1160/1992/367 1164/1997/387 +f 821/1999/366 1166/2002/366 1165/2000/470 +f 970/1986/391 1155/1985/391 1166/2002/366 +f 822/1998/387 1164/1997/387 1167/2003/370 +f 1159/1991/468 819/2473/468 967/1994/469 +f 820/2001/470 1165/2000/470 1168/2005/467 +f 1171/2008/472 1174/2011/393 1169/2006/366 +f 1169/2006/366 1002/1737/384 1170/2007/471 +f 1172/2009/473 1004/1739/392 1005/1740/393 +f 1173/2010/474 1179/2474/474 991/1726/382 +f 991/1726/382 1179/2474/474 1174/2011/393 +f 1174/2012/406 1183/2030/400 1175/2013/405 +f 1169/2014/405 1175/2013/405 1176/2015/396 +f 1002/2016/396 1176/2015/396 1177/2017/395 +f 1173/2019/403 1182/2475/402 1178/2020/401 +f 994/2022/398 1181/2025/398 1180/2023/404 +f 993/2018/395 1177/2017/395 1181/2025/398 +f 1180/2023/404 1182/2476/402 1173/2026/403 +f 1181/2029/366 1177/2477/366 1182/2027/366 +f 1177/2477/366 1176/2478/366 1182/2027/366 +f 1176/2478/366 1175/2479/366 1183/2480/366 +f 1183/2480/366 1178/2481/366 1176/2478/366 +f 1178/2481/366 1182/2027/366 1176/2478/366 +f 1179/2021/399 1178/2020/401 1183/2030/400 +f 1184/2031/428 1197/2044/365 1185/2032/365 +f 1187/2034/429 1198/2482/370 1188/2035/370 +f 1190/2037/430 1199/2047/372 1191/2038/372 +f 1193/2040/431 1196/2043/371 1194/2041/371 +f 1196/2043/371 1184/2031/428 1186/2033/428 +f 1197/2044/365 1187/2034/429 1189/2036/429 +f 1198/2045/370 1190/2037/430 1192/2039/430 +f 1199/2047/372 1193/2040/431 1195/2042/431 +f 1196/2050/367 1193/2483/367 1199/2484/367 +f 1199/2484/367 1190/2485/367 1198/2048/367 +f 1198/2048/367 1187/2486/367 1197/2049/367 +f 1197/2049/367 1184/2487/367 1196/2050/367 +f 1196/2050/367 1199/2484/367 1198/2048/367 +f 827/1858/434 826/2488/475 1200/2051/449 +f 834/2052/434 833/2055/375 1108/2053/375 +f 833/2055/375 832/2059/476 1202/2056/437 +f 831/2057/475 834/2052/434 1201/2054/434 +f 825/2060/476 1097/1865/437 1098/1867/414 +f 1084/1890/477 1106/1889/367 832/2059/476 +f 1106/1889/367 1202/2056/437 832/2059/476 +f 825/2060/476 1098/1867/414 1084/1890/477 +f 1089/2061/436 1096/2489/374 826/2062/475 +f 1096/2489/374 1200/2051/449 826/2062/475 +f 1109/2058/449 1090/1854/366 831/2063/475 +f 1090/1854/366 1089/2061/436 831/2063/475 +f 1001/2064/390 1204/2068/479 1203/2065/478 +f 1000/2067/389 1206/2070/481 1204/2068/479 +f 1000/2067/389 995/2072/385 1205/2069/480 +f 1004/2071/392 1207/2074/482 1205/2069/480 +f 1172/2073/473 1208/2076/483 1207/2074/482 +f 987/2078/378 989/2066/380 1203/2065/478 +f 987/2078/378 1210/2079/485 1211/2080/486 +f 1007/2081/394 1211/2080/486 1212/2082/487 +f 1023/2084/409 1032/2083/417 1212/2082/487 +f 1209/2088/371 990/2490/371 1114/2089/371 +f 1208/2491/365 1209/2088/365 1214/2090/365 +f 1213/2091/365 1212/2492/365 1210/2092/365 +f 1212/2492/365 1211/2493/365 1210/2092/365 +f 1208/2491/365 1214/2090/365 1213/2091/365 +f 1205/2093/365 1207/2494/365 1208/2491/365 +f 1204/2495/365 1206/2496/365 1205/2093/365 +f 1210/2092/365 1203/2497/365 1205/2093/365 +f 1203/2497/365 1204/2495/365 1205/2093/365 +f 1205/2093/365 1208/2491/365 1213/2091/365 +f 1154/2094/365 1163/2498/365 1215/2095/365 +f 1215/2095/365 1308/2279/365 967/1686/365 +f 1308/2279/365 1156/2499/365 1158/2500/365 +f 967/1686/365 1308/2279/365 1158/2500/365 +f 967/1686/365 818/1497/365 1215/2095/365 +f 1219/2105/494 1225/2111/500 1220/2106/495 +f 1222/2108/497 1281/2205/543 1223/2109/498 +f 1225/2111/500 1228/2197/503 1226/2112/501 +f 1223/2109/498 1282/2208/544 1227/2113/502 +f 1228/2114/503 1232/2119/494 1229/2115/496 +f 1227/2113/502 1282/2208/544 1230/2117/504 +f 1232/2119/494 1239/2126/500 1233/2120/495 +f 1234/2121/506 1241/2128/506 1235/2122/506 +f 1231/2118/505 1230/2117/504 1237/2124/507 +f 1239/2126/500 1267/2176/503 1240/2127/501 +f 1241/2128/508 1246/2133/514 1242/2129/509 +f 1237/2124/507 1248/2135/511 1243/2130/511 +f 1246/2133/514 1252/2201/503 1247/2134/501 +f 1248/2135/511 1284/2501/372 1249/2136/372 +f 1250/2137/515 1253/2141/536 1251/2138/516 +f 1252/2139/503 1219/2105/494 1221/2107/496 +f 1253/2141/518 1281/2205/543 1222/2108/497 +f 1255/2143/521 1254/2142/520 1242/2129/509 +f 1257/2145/521 1258/2146/523 1220/2106/495 +f 1260/2148/521 1261/2149/523 1233/2120/495 +f 1250/2137/530 1245/2132/513 1240/2127/501 +f 1239/2126/500 1273/2194/540 1269/2193/539 +f 1225/2111/500 1276/2198/540 1272/2196/539 +f 1246/2133/514 1279/2202/542 1275/2200/539 +f 856/1538/545 853/1535/546 838/1520/546 +f 850/1532/547 848/1530/548 844/1526/548 +f 853/1535/546 851/1533/549 840/1522/549 +f 857/1539/365 856/1538/545 837/1519/545 +f 848/1530/548 847/1529/550 845/1527/550 +f 851/1533/549 850/1532/547 842/1524/547 +f 835/1517/551 855/2217/551 858/2216/372 +f 972/1692/552 854/2219/552 855/2217/551 +f 839/2218/553 852/2502/553 854/2219/552 +f 849/2220/554 852/2502/553 839/2218/553 +f 846/2222/555 849/2220/554 841/2221/554 +f 974/2224/556 846/2222/555 843/2223/555 +f 1289/2233/564 1215/2265/564 1163/1996/377 +f 1156/1987/376 1308/2256/565 1290/2234/565 +f 1289/2237/372 1162/2503/372 1153/2504/372 +f 1153/2504/372 1168/2505/372 1289/2237/372 +f 1168/2505/372 1161/2238/372 1289/2237/372 +f 1161/2238/372 1157/2506/372 1290/2236/372 +f 1157/2506/372 1291/2507/372 1290/2236/372 +f 1292/2239/365 1306/2254/365 1293/2240/365 +f 1295/2242/367 1303/2300/387 1296/2243/387 +f 1298/2245/377 1305/2253/371 1292/2239/371 +f 1300/2247/391 1312/2261/366 1301/2248/366 +f 1303/2250/387 1307/2508/566 1304/2251/566 +f 1305/2253/371 1309/2258/376 1306/2254/376 +f 1307/2255/566 1290/2234/565 1308/2256/565 +f 1309/2258/376 1295/2242/367 1297/2244/367 +f 1310/2259/567 1300/2247/391 1302/2249/391 +f 1312/2261/366 1298/2245/377 1299/2246/377 +f 1313/2262/367 1323/2289/376 1314/2263/376 +f 1215/2265/564 1289/2233/564 1310/2259/567 +f 1306/2254/365 1297/2244/365 1316/2266/365 +f 1296/2243/365 1319/2509/365 1316/2268/365 +f 1292/2239/365 1294/2510/365 1317/2269/365 +f 1299/2246/365 1317/2511/365 1315/2270/365 +f 1301/2248/365 1315/2512/365 1314/2271/365 +f 1311/2272/365 1302/2249/365 1314/2273/365 +f 1304/2275/365 1318/2513/365 1319/2276/365 +f 1308/2279/365 1215/2095/365 1318/2277/365 +f 1215/2095/365 1311/2514/365 1318/2277/365 +f 1320/2280/371 1324/2291/377 1319/2281/377 +f 1321/2283/366 1325/2292/391 1293/2284/391 +f 1322/2286/370 1326/2293/387 1317/2287/387 +f 1323/2289/376 1320/2515/371 1318/2290/371 +f 1324/2291/377 1321/2283/366 1316/2285/366 +f 1325/2292/391 1322/2286/370 1294/2288/370 +f 1326/2293/387 1313/2262/367 1315/2264/367 +f 1326/2294/372 1322/2516/372 1305/2253/372 +f 1313/2295/372 1326/2517/372 1298/2245/372 +f 1323/2296/372 1313/2518/372 1312/2261/372 +f 1305/2253/372 1322/2519/372 1325/2297/372 +f 1309/2258/372 1325/2520/372 1321/2298/372 +f 1321/2299/372 1324/2521/372 1303/2300/372 +f 1310/2301/372 1320/2522/372 1323/2302/372 +f 1324/2303/372 1320/2523/372 1307/2304/372 +f 1289/2237/372 1290/2236/372 1320/2305/372 +f 1290/2236/372 1307/2524/372 1320/2305/372 +f 883/2307/568 884/2320/568 891/2308/569 +f 889/2310/371 888/2324/428 976/2311/428 +f 980/2313/431 889/2310/371 881/2312/371 +f 882/2315/371 886/2319/371 885/2316/431 +f 977/2318/428 979/2326/428 886/2319/371 +f 883/2307/568 978/2317/431 885/2316/431 +f 980/2313/431 880/2314/431 873/2321/568 +f 871/2323/570 976/2311/428 888/2324/428 +f 979/2326/428 977/2318/428 874/2327/570 +f 896/2329/571 890/2328/570 874/2327/570 +f 892/2322/568 873/2321/568 872/2330/569 +f 871/2323/570 887/2325/570 893/2332/571 +f 924/2333/371 906/2338/371 905/2334/449 +f 902/1590/366 901/1589/366 923/2335/449 +f 921/2336/437 898/1586/367 981/1711/367 +f 921/2336/437 903/2337/437 906/2338/371 +f 912/2339/371 931/2525/371 936/2340/376 +f 910/2342/366 939/2354/366 937/2343/377 +f 913/2345/370 934/2355/370 938/2346/391 +f 909/2348/367 940/2351/367 935/2349/387 +f 908/2341/376 936/2340/376 940/2351/367 +f 911/2344/377 937/2343/377 931/2352/371 +f 915/2347/391 938/2346/391 939/2354/366 +f 914/2350/387 935/2349/387 934/2355/370 +f 919/2356/572 927/1622/572 926/1621/573 +f 917/2358/574 982/2357/573 926/1621/573 +f 927/1622/572 919/2356/572 920/2360/575 +f 1171/2526/372 1170/2527/372 1022/2528/372 +f 1170/2527/372 1003/2529/372 998/2530/372 +f 1003/2529/372 1044/2531/372 1045/2532/372 +f 998/2530/372 1022/2528/372 1170/2527/372 +f 1022/2528/372 1021/2362/372 1171/2526/372 +f 1003/2529/372 1045/2532/372 998/2530/372 +f 1218/2364/372 1171/2526/372 1021/2362/372 +f 1288/2533/372 1285/2534/372 1286/2535/372 +f 1285/2534/372 1218/2364/372 1217/2363/372 +f 1217/2363/372 1286/2535/372 1285/2534/372 +f 945/2365/576 948/2536/576 984/2366/577 +f 944/2368/578 950/2537/578 985/2369/579 +f 985/2369/579 948/2536/576 945/2365/576 +f 990/1910/447 1116/1909/391 1327/2371/370 +f 1328/2372/370 1327/2371/370 1120/2373/387 +f 1329/2375/431 1342/2388/372 1330/2376/372 +f 1332/2378/430 1343/2538/370 1333/2379/370 +f 1335/2381/429 1344/2391/365 1336/2382/365 +f 1338/2384/428 1341/2387/371 1339/2385/371 +f 1341/2387/371 1329/2375/431 1331/2377/431 +f 1342/2388/372 1332/2378/430 1334/2380/430 +f 1343/2389/370 1335/2381/429 1337/2383/429 +f 1344/2391/365 1338/2384/428 1340/2386/428 +f 1341/2393/366 1338/2539/366 1343/2394/366 +f 1338/2539/366 1344/2540/366 1343/2394/366 +f 1344/2540/366 1335/2541/366 1343/2394/366 +f 1343/2394/366 1332/2542/366 1342/2543/366 +f 1342/2543/366 1329/2392/366 1343/2394/366 diff --git a/src/main/resources/assets/hbm/textures/items/ammo_folly.png b/src/main/resources/assets/hbm/textures/items/ammo_folly.png deleted file mode 100644 index aa7e1cee2dc2362a530a6b30242b2f76ad5ca06b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmV-20?qx2P)iuE6vzKG4RU;fcCRx`e1IknGMe}qT--aEH0e@5LQ{7) zwys^=oJwN5)Rkxx0Vfa^I@F_g3I`YizT`!7ynFxOy?1Z`G;Go-ljgl7vAYvQQG_^- z5yvs^=MOL}sdB#SDx&ni-JPJ-YH`=!jWOo$p^Y>hj^hX+G6AUgxon>+ z6XFOUOZ=279L~`+Efa#-jdVlG&hHB+nla&6V_oVz`6ULXNRr0 zoC-7wP*?e>v2AF)0;LZl0MK3)A)l$Z zs;aqhPxeP)t`(LTpxt~6E(5@@BZK?Kbr+h%9j+=TU4}lJtV_ox=Q$--eCbFNF2^1YF;Yn*aa+07*qoM6N<$g2Gz% ArT_o{ diff --git a/src/main/resources/assets/hbm/textures/items/ammo_folly_du.png b/src/main/resources/assets/hbm/textures/items/ammo_folly_du.png deleted file mode 100644 index ca37c31ee6090bdf29195a2cb689e59349dc5eb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmV;k0ZjghP)>gRp_f z1|sz6-lMlRYgprHp;d-W=$1?WP#W6ipI^W4%NM}0j%+6;NusK%f|L?cN~CFO<>lEf z?)yF%W1y6RQi{oBq7DYor;Gubf8R$GoJZi;bi&MAfYbz!7`2{%@GsP?HU_Ycz*Nrl z_?>;)+L!^Hy<90m2nZo~I(g7_Fv1OpN8k|;r_bj`bzq!=rlxX^O})V#F0DO`0PgE+ z_|ylZ?9aQ~>OwcAZ)E!c_^p^ms8oeD*47@*Q((OdUd5Xp&%DLq0s4~B36^D<;+%tX zjxY>S6a~t%L|K*)Lg*`w&~~U3ko6j z2M`27s~h$q=dHN&p|M;pRWkwrS}6d~O2c?O?&RI+qt$AqnqlAGi=xoAumx&@L{apw dzw=$-TtBiTrwAx3_e&F@elm5GTPgs~T32@?ZC;t1^xN>5SIty70c zJwST_gw(M}^a$xhe#DS~Q^_5Q-53%lMHS(dtRQ25@8j=_;{>Q#${~~J=ZKCcZ4g3` zrYX`i#lu|$rRDxPUgZh&b41zi@uUr1*Rk1b_8@rRiZJJujaP1__cniUW(=EG2686* z({UV%l`8}uKixvtb!eK#ud1p-RaM;FUyCp+_b0|70FL8O&-2h3+Oqjlb%r)P&yzyr z0x+!m4ng&7$2qAmBVK$o;#+c9Ng0J)@ zJcc;Hf7iW8yQMgt4Acs6tn@Qw%TRj;O3#9<`u#pk(}Zc7uq+F493x2*BuRqxdd-_` z8|DJMJT`#UYw6&RuU~V^vI@t&KhH~J`4P~(I)M_L27uCX6Qz7 z4B7Mx0Chx2;loZmdho4-$xJx2*VIj6!De^k!KDR zJc^Z;t1RC@FB@XNVHm=rxT=cG0m(hkyn^CK;!3jStg$}BFnD9?3~i}7Q0>cz0>E@S z6*2%oIEVlU2hw0LsN_-U^J%eI&}`b-HI8F`A~K*XNVnT9jbHmVtX6anZcJ{j}? O00003u diff --git a/src/main/resources/assets/hbm/textures/items/ammo_fuel.png b/src/main/resources/assets/hbm/textures/items/ammo_fuel.png deleted file mode 100644 index d4bf581a46a6dba476f6bcf5ca9e049dd960f83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmV+}0nz@6P)1p=6hz;eG)CaUx_}C|+X%K6_zbCigA_i2@C|YX*FHiB zZ0%Bw3x>_*=ne`b{AP>qxK1tdt zB~o}FUFR1>C4v^BlK(^gl;rY(RQ9hkxN{C#Ckbx31Yn+J+`Q*-KC`K7)4Rf5J20PB z#W4ind!4&p##GsXp{lyr&il?A|Ejcg9-zi_@%07*qoM6N<$f^MLG A+yDRo diff --git a/src/main/resources/assets/hbm/textures/items/ammo_fuel_gas.png b/src/main/resources/assets/hbm/textures/items/ammo_fuel_gas.png deleted file mode 100644 index 6c11f21851425e1e7d586cb64b5846378a78e66c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmV+!0p|XRP)2|;kt+B0Q&BXPmp^4ab)EH;szbJ$E4%X*uY{e zxS`6Kq*mH70@U51c8pynuOQaJhD2(OAHRRyPQIB}ka`)Q7;M@O+lO8XC_(_(_cE>e fsXpx#puf)@oK1bk)|0hB00000NkvXXu0mjffA4mX diff --git a/src/main/resources/assets/hbm/textures/items/ammo_fuel_napalm.png b/src/main/resources/assets/hbm/textures/items/ammo_fuel_napalm.png deleted file mode 100644 index 44b359f1ed66889ba992d1f00d300de89ab1ac95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf}{g8i@A#H6bJH8f3_0Q4$@r>mdKI;Vst04h^?`2YX_ diff --git a/src/main/resources/assets/hbm/textures/items/ammo_fuel_phosphorus.png b/src/main/resources/assets/hbm/textures/items/ammo_fuel_phosphorus.png deleted file mode 100644 index bb94f482a80c09579132acfe3ae60ed674f76cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmV;O0b>4%P)Nae)XnCM9KXy5ll@&E1*d^*iHXk_00000NkvXX Hu0mjfJ~pjh diff --git a/src/main/resources/assets/hbm/textures/items/ammo_fuel_vaporizer.png b/src/main/resources/assets/hbm/textures/items/ammo_fuel_vaporizer.png deleted file mode 100644 index 837d2dd5fdf00ad631946c8f1e1da027de4dfd08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf$zsW$rExuRUP*$NZ@wHD7yIcDIZEElM=5lg#b9y_^IM0|Z;;2v+JX`BoBSx9fzn57u`rQrKbFVdQ&MBb@0Nl)R1^@s6 diff --git a/src/main/resources/assets/hbm/textures/items/ammo_grenade.png b/src/main/resources/assets/hbm/textures/items/ammo_grenade.png deleted file mode 100644 index fef56db60d1b5351d59a5fa0878a736f9c93fb79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmV-x0hIoUP)61y&W(r-LmM4X?F5RqSz zepS5Bmmc6Ai%)K%V^lI`Hk%R0F~0A+#bVKTCtH)FWatidk1)nCnM|t(``o3)1@us1RceWm%%NCW<2R zJSR=lKVPR75ph|TIT3Nw>C|m*ZuMO&Bn(50F;#or)9Ki4^9|+3b}H;TTNVHS002ov JPDHLkV1lGFl;HpX diff --git a/src/main/resources/assets/hbm/textures/items/ammo_grenade_FG.png b/src/main/resources/assets/hbm/textures/items/ammo_grenade_FG.png deleted file mode 100644 index 12db05159278139f0697a4530e202d607677caea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)$~QN=Xq$Y^Xu)Oy^dWs-*gOicy6Xwwg3PC07*qoM6N<$ Ef^2f09smFU diff --git a/src/main/resources/assets/hbm/textures/items/ammo_grenade_concussion.png b/src/main/resources/assets/hbm/textures/items/ammo_grenade_concussion.png deleted file mode 100644 index 1751e2c620a6ab08a28a7616b3a346bf1fc8f34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)_nS+oqgQIKLyg=W; zXK-|L=um<$aECrXws14psTTsebU98fktF5T#eX^n&i`@F`GNnIRc{_1Cw!#fxs zZ>o1FeBtnFd4cKu7{i-B<~5iR000*6*BD;)F&YikN zE&>r5ZE`##|8UtC4yS3#M8t6%a}WfbkjA5Y;qdKX2Bj2|B!Si%03fAAp68AE)=v`= zyRHk{wh=`UilTtlx)stHl_}(8)+UhNDL`44mQo5;RUykVc%BC-C4>;?r9(sbk~SOHma3MuuHLRaFik09lq1h9LmH@9#C~1kOPQhkz|&jA66ckYyRO*^Htn@O_`Y z>$IY^mLLd3Yb|M-wocpoQFalf6vmkCdgte?+Nb6R9#noT>E81U00000NkvXXu0mjf DbcC8< diff --git a/src/main/resources/assets/hbm/textures/items/ammo_grenade_he.png b/src/main/resources/assets/hbm/textures/items/ammo_grenade_he.png deleted file mode 100644 index 6392c9fbde831d6ad501886103cd9e1f8b7efb91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmV-t0hs=YP)$ihBZETM0ga zK7g&hfe#P_DfNO!fKx3pp9Hcd*NO4eJB|+&rDJ?Tm1o5s$auosd7k&#J_(N*=C1xVk&y^w>v4 zI=y7w#^=je{a~s|lBkGi9LGAF%{C&9LHWT{_je94#;{l{u+{>QWf{xmvQghUX%SJ+ z^Kf04D2gbG0&8t6vegFUc|HIXAWc)EC;}i1LjbKKtw0}SxCy8bV+>_klBOw>$%HJ+ z2*a@7c0@$y^SO%1dOOu!r|()Jp66kVsoLuwy`J4QegV8cb;eLg)Ik6M002ovPDHLk FV1oZNmHGex diff --git a/src/main/resources/assets/hbm/textures/items/ammo_grenade_incendiary.png b/src/main/resources/assets/hbm/textures/items/ammo_grenade_incendiary.png deleted file mode 100644 index 97d7bfa083c81ba26a8fe3ea80a3e214f5825efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmV-%0gnEOP)2W!bf}j%@SGwkNj07PP5*=ceYpGI!GFgpF8Tw{j0$`!{HFEH2_JHFr7|I z{gsmz5#u-xtyYUL3`x@zt#u``Q3cFqGYc>PQ4|q|AppMb1DGOG39N%ORslJplp@PA zqA0?3U6Lfh_x(R#XDK3Lf*>#=Vn(BpDQ>RyU30{79F$V|_14c?$F7@ihrM*@W2G9R P00000NkvXXu0mjficg@n diff --git a/src/main/resources/assets/hbm/textures/items/ammo_grenade_nuclear.png b/src/main/resources/assets/hbm/textures/items/ammo_grenade_nuclear.png deleted file mode 100644 index 4e165c9700d39561f576428f264b60c716bb0c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmV-W0k8gvP)d)9$)Sekx5RDV*t7<&^*soL^MrP zjiTrxpHBpgkeZomKbB^ZAU~jj$;*(<97PqB1qYiUAOTAqN*ywYLm&YsXTL%4 zn>afa6cofEOQuSOEFJ2a!rNMEg7gDCrfbC@j0h2T=k#*u&P&CORcpB>(_iUU^tk8c>u5UZSKDG3tj<1w-JB77(<@t2*VJ~W)pE7qup-*E*&D`-ENl?(ITBn7M3A~ mVSq7)G)*h-36MW6ey0yxhIi%HBmh5Je9!6=Wrvkgx)UXoFgZLnBD~1AGJDwn=r@RUsM# zX;xN%Dt4-P;RTw2>Qyt@nUgy^1OKgHn<%AZjhAH!_T_usHnIGCEM!?m6h#lPvjARR zp9#Ydr4(Op%W25nK^(`DWtqq)qLh-hZAEK+4f6et0Md1xXsxBLYsvHcPsq_nNm-V7 z?`fKbX_^3V&e8Y%uKu=bhroMJk|YenKv5J#QG_vuBPUNsw#IP`00FSpQdJcI#uxzE zIynSffgFwS0P)^4&okCq(lo_6hcSjr+tFG}S(c);zHeuJJ9VxrBuNsy_v?7qb@ixD Z=@&vqa49HXF0cRq002ovPDHLkV1nkTglzx- diff --git a/src/main/resources/assets/hbm/textures/items/ammo_grenade_toxic.png b/src/main/resources/assets/hbm/textures/items/ammo_grenade_toxic.png deleted file mode 100644 index 28e62d022480bba94baeab23e006c472fc1d9c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352 zcmV-m0iXVfP)fULPW^FGED6*Gsl- ztSU5&X1ZK1RYWw)GM&%ody&?l!f2+aN9R~;Su7Sf=K#p_oU$xi^_`Oz5%ql^&+|yr zl+9*?bFLFP=mOU3^$1V^V+?7U0uaYBfbJrlzz}4-4`>i;Ep=UEj3EdD@;oPw<6+wo y5lxarMP$33=C0RwZ4lr0vDP;24Ua+3?i;@vcy)~&!Vr7_0000Rr1KesZBwM&Dvb}|GuTYE zWnN&LwCPNmJivg}G+U&ZC<}rjTr1a&*^NO2Pjv_GcerNS0-LCH;$HN3R|RU>KJ2a+m@=Ta9x+Wu8E@P$Jg08iBd|e vwXz)^^<6(DzVBm zaB^>EX>4U6ba`-PAZ2)IW&i+q+Pzm>lH@21{O1&V1SAj=$H6=z<_3HGO&(QK{hIEc z>R1zHVIf132{PsSzrTk22NzTJE{a;pDS2Em$IJy4^ZUx{PCl;tdGNQ&3%|QJFkAsP z>_;spzQ8ZPU$~7y*Gs>%)53N-qI<{d3UlOHZ;v41=k2F>I?8=lQZ{{rdYz8y30zRl zFWzBoGoRfHhk~Uh7$`9JK*6uOZ3JQdC=}Sd?u0lB5%m~?+pg0Y2zfERJAwX@pcf?H zYVI}r_u4D+xg39Z#br7iq4I76$t!=j55tcGhdUyE*&yci&2-LhjAmo>J-ZSU7)@tI zEwXP6&A+^xWv&ov z`Yb4Cu3_thLW33RwP4V)a(5xX&37!c#?5QIN`{deA(RQ75nlPQxIZ<1r?@fdq=>xT zxdJYp>l!eoa`TQT2twoNCX3)(Ir965^@F7f1!d7}m|*eO?&1>qy|%*AIUr78_ZA|j z?Q{T&Ftz{;1t{PX1))S5Pd9QC zgpiPeLL2Nah!vw?{b)3-p&~(|h$K-lCs|4gDJDrNX_`r{XwaylNmWg=77G?lESZ{F zwvssqEt>xMUP#2>e{X6UIy0M2qO*|Y3Q(#N4cwZRDDyvp&A|4cqujG^sXAbPW9FW z&2%DDGbqN9ptw#2u%LNr=8a0pIL5ma1sY9Lfg(V<%jMY zRmK=_)UyL>13b(ChtbsIZK~8|tZBjbA+7IQ_gz{+VLK{z>evr?`Nb)YX}P7n8fr(r zIdY>GaIRc+$t8aR*8PC?3#5AoGLrT#A#>j7dm|F6(}{vd3S5{qhjx zSKhtOlk``t`#3<6_IJO*v?ML@VDtbWhoq1TA>Y!RnzX3+SF(W_8oti(GxC454BS%; zKM?GmV)((jrx<=9*geJYgLOZ$(Lk_!is1)>-BS!dSoik~ce2P#8wWJqHk0v~n9i(<9k1v@ z0DTxlP-d1fCrJtT*4I7tQr$&)mVe)$)uU!D1_VUnS!S3v@dokqrfqQECl0fMtP-CS zkC}8q;zzD49=~zUyDad`u$fBE6Nib#dw8tvvEzVl0!W#GF zFAQb%m1VBe8b%z8Sb_u*3Mwd~1RGJ>by6%O={)A+A9DQ?xfF60!N{?IGBn7pAN&t~ z&(_LKPIyV77|{OWI3FWG$1YH>I?ng80CNC@mZL?Z00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF-^x0TL?$xGm1!0003BNkljsU7WOwyM%&Uv-vTYQP32G+oge8nwaEG_r1$KoOijG zrrndK-4iOF+E*N7P7PH-7C^mzC}-zGqD4d)hQzOPtFS>DM2m=Ixx{r{Mi*@v7C{ovj{jm`l^dzpPv+Yf&%c%tR@X>`amQM;&RAS%ngC`9G8pa?|$Hz>Oxlj$8s zdpyr?i;sTbBlp*i1U@2fmlF7tU%*XB)$L`wcmPmTA`k!o002ovPDHLkV1iXv BpH=_> diff --git a/src/main/resources/assets/hbm/textures/items/ammo_luna_explosive.png b/src/main/resources/assets/hbm/textures/items/ammo_luna_explosive.png deleted file mode 100644 index 822eb02b1ebd0d94495916ef24ab83bb139805c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5457 zcmeHKXH-+!77hwhRa8J!zz{@12Jt=2K~dgKu&y_MTC4P0|{{}`S8Xgsudf{Gqy z&27o8yp9U2^78V&6xV+-D}8XA$f&e?XYGKHgSfeSG*(*4sPYjT_v< z9_y0lZGAZXy4vuhdXZ5S1w$#Fa9gkFQj>jVV z=1$CeD%z0ZZhWMMS~zghQMeYX)w9j3bY=34(aKXy6-{~ED z6&~@>|FB>3#eE&ZtJJ{@(X-akF+wx{840++k)7SOMdXF-6iR02qIHe>+~R51nEXEh zHRrJ4sBDjfv(G*Vp5F9A7vim!`cG5@8|{vcXd(6bhNS@1+FUjIgIP{(9?T`S}h=nKDw`8J@JgWg>_0&faa=Y#uc-=->}oCYljCF9<5*Q zh+J&9aQw>UMiu`!NAB}t7lS`dD+b$3nqQ~A+T^e=yy5;O@47slT3$dOZ!qP0UF&SC z*s&sS=^%%k<0!0+Q$PBC1n*F+y*aa?hY*yssp(qwI^*}Qt_%GIIh)C47mqWY>bhn= z`q!%G*MGNH-|D@2XL(by=KDpR?9r+dAD6t}mpE7)PmAN{75G(XPJg!W%+|*lKJ#;C z1kNtabiwqewYgS4Ek7Pr4RqI3+8}*bo%dh*(fdh}G}b4f>imSKcS{{|6|OadXEtb%6a*Tk?tbOw;pE?Yv5H zSk`gN%yik#erZwGWMG}=Ox2*Kkz32n-FGi4xjx3rlKYjJ*ECjHaN^qajZxSM+W6v> z9q;E{6=+0n&PWXtjxFdLDxH{b7-KuIu~waE1am*)mv?7QWm`)B zr20DT1Jrw6=7!k3yJt_`_SB0)(MN*k@V4$)QDJ?$ccNnFe5VTbt>4?~dgPtC>1l$j z@%|Avy|<@FU#u+fSTtwACu$;K*aGyvf7OaXxmfWiXW}4yNZ<8!GNJF|39ma=NiMfx zJX)i3=`5pX9UZ#is`ms}nqF6rzSwAYq0_f>aL)zH-Nr#FX?@QJHGatraeb|K_<`=^ z6+Mr$DQD%ADr3#oZ_c6@--p3el6f?m7oA4?y!t_FUct6Zd$+4jMol5UM}1Driq?&4 z_G-GEP`0bY@34kG^>pir#2ZH!Q?pW*G&Ok(k)*K-f2lC4qy6$)T~$XXqrw8c^`-Jj z^JD{ziP77>u7>MfE1b&m4sxaYRPy z!@ZPSlMjC>32F(_(by%&-9|_DN_)#04|*A~wLaecv(fS!Zi zxU3?xw7Gkmh<^7Ez;~PiaANw>{tE^1h%q(_}{?HTuqCV&(8Z%_>I@f7%Z(ppA z%Hj3J-r|B`_H|wX>~d(&YQeabbmP0M*MaVPja3>RG&V`yecx=qWn4UYBZF}-Cjp;K zRgpQC2yUuut8tRGKRaEUepek%TYr?lJ(0HYg4?}thvA`3!_T{MEg$1xKIcUFA59HM zplxa)5896W8EeRFL8J}95wJiTS)>r!u3#{Vqf7{}!$Aq01%~qY_K4y7O9(iRV~_;sYfEgeZ&+8WkCd`qo1%agByRJ|*190nwDh$If1h5H7I&KFAnJ{wd(LEtt#2#3q!64`bv7LtV};gNU@ zhK*zq@U}=UmW{`e06SYdTkbayo+2L9l|aO|St+165EQ`<0B~p=9*JQC1SFowA z3`8uT=u-$lDTity(?lR35r~)qL4-X*krG_tscdgJWol5|cw)$6v!dfa^}H__HT5<% z1tNG#6&$W?TQb0&3L*xgL5?yIvie$L0VK z!+16lK(mNQ7F0HdjU|A1(o}h0(8U6-BnA+H&Y@7HP&H5kDXW27D5~q0z*isE}=7A)d$qI z^sMy%-4P2y2VP6Mi!+mSt1zpw+q%<*(Wz=-@$>JW)=Q3^6{gu( zKUQSO ztn(gK^ma0jT`O-NwsAJr2U-Mq?%=_NU?|$yzb3gYpPrR#(y|%^@ z4G09H?dV|Z2L8@h-0G^}_lg(OObA4!I-KDtbz_FYMPebB7YM+mVIlwy$aq``MAlKd z#XGHLwbtK*upKJE%RP4NwRlgQ=byF#+sL@e&>Aqz5g5ktrl;<=Sjlo<+HS49%=WT#7kJA~C9j6YjJ`{L+DWfw@ zAN8gtTqC8Cl-^sCecFe6p*V}%A3+%`pFB}G`RC@WT`C1Zs9~R`HS#`aQ#JP6e8kbEQI-+L!!G0? zAo|eU=h%R*xtc9uH*?EUS-nn=ht#ibYaD;S(t>d7ohS@ZvbZernzsGiBzdPSf3b=@ z;_aqGDo2Oj>z~2Gw9>hCbE+&3#v8T0D($g1kLF6X8t(iFFTM|1eWerX7blNQu8l%? z1-Zms%C|YHMN6Rf={Q&${-u%8inEW)7c?hhY^usN1s+D+b?SleKxDMF{?B15#MddZ z=z0B@F2~MirREt%8&KZrv66J{pI*DtYvKS~kZJ7YbzU|3#}n(*2OjAfkz-)##&pyE zBuCsD|D@K(sV{nTEdO4xU)CVEr;4NA!F+Av?Gkd*oXX0?cDctZoZ52&1h=}KT28gG z(hHH*ojn1E&yLIM&9?3sesgR|w#mq;i3gKWdDw&sr|hTytoe?*B^ebH#Za>ey=rR*S6yR z0@D|igY_{2bPu_!-R_qt+-{q;QuzsAPx14posnrlrg3^6p%o>fQXgXHkshbU9Ex6S zXVDuRE$)EiLX6SKa_5&N+V($Wu?ZgT6WCWePsY*NSF93Vd$Os-t~%*}`pIMH7BU~s^zCNVeXHgFNXrs&rEySGUKp!n)N zWJb*1%PTZt>Q@QkgS4h0ea{!)b@=uVK%0u-HFH)*IZgcP726h{n4)GM_nSVmsugNq z`Fhpws*{nT;e+i#byFBpIn{GrhHr?MiG5=P`;S9bfobII4eI4p1>the7BBZglHLWx z-JJ~+(S9!$)NE1tHAPP~Y89SFf9sD&9c&rImv`>G9sl&dbSAKg_=#-dwtwrjkQ6YuX};p37wGnK@F~Tm-ifx%ik zc4BX1!3vx77~{ISO(G=ub%kfJDClPq zkE_KsqxrqTy~XtV-RCwM04820maCQ%hW6B^_-rwc=<|_!b!TtFr5`ccubWs$+}v>} zb3?K$ja(Q&?bq~5@o4qVtrlkz#v6V08b_`<`xH^)j2Hc`{yhT5sEEP_*7DjND^d%m z_NDB;^wRl}TSGN;{r)gU-nx*f?%hw%dY7OvVF8Z__7!c1~OdJ%9gFU9hwJtH^81@}?V8>Gv}C;G=DzGOK)H6Li-pYgzk9 z>FJc4YH-@t0zu?nn%`dz_qJP(j|Gg6KE$=WkAS%SF3x#xsP`P)X_oN79mSKrfyx&0 z&6pe^3ow)MMc|GDftXv#L`?Q}KniC8{yc#NV*Kny1f0jQKx`q<(R2|F*v4}R7X$9$ zE(~_~b~c5Bu(H%Jmr+3gJ|JbnW&A*agetQ@C~>LavqFqQz?CM_?G^}6x+|O}6a#R) z8Qu(yw3G2dun0>HxVf0arMlU!pM?P5ED+nIQV|t}3Jnc43&oiU#r`M^g+f80u_!DS z30fc}VFD>rh7?GQ6c95Qwt$2!=82>{p#ZMHWU_?8QVRqE)WbiFk1wLrKf((nvn+so zpkz!D3S)*w@%gCFJtR`Q5D;W`K>z3=VSpPm$_H|N4o1r4+RDOJibWj1(N-RrIg40MAjE$Q)rawd_EA+{Uh!d z)*o_L8iQ7JI@MOl4pt1$(bfW?h)?AR**p$a`A8kYpwfha|Ge9Do9_ z2^=EnGl-319$1ykz|TjefZ~8q6g&ru#WHb7G{6Orcp@H+WO6BJB%VT~pousZnagA; zp*U>ndZC!l1gDe7XZiyuk-%T6P!LXC=jv#Iz?z{yNn8V&QZDFVf!M$k1j{}t7(71U zE@dj%#1IK2JefekfESsB$9^)}42UIQB`Pp6XfrHcsZmS|6-)*smZ_*y5I`vhbD`42 z08=UyGlarG3xr}waD}I`yy50Elj6XWfEHnjil41{cOYoyZDt7s@{}q#Tv@hMCVM7` zgc$;Glz~9M85MgQQ{WGP>wC7KKFE3hFj)YRL*TGj1SFnC@%xRgZ*+YX17BtQt-8L^^;HafmGQUg`oGbo@#(+=2*7_qq2O_5ccpF>cob4) zIosPprWIG-`J!}C^1aBxO9Fvt{-C&_kepmSP^cz#q}!AA(XpEQJ=OE#=rwvoHT z_s_nefpe9_TBnk1dVS@xlxtPZG@e8*Ee_PG-hV zsA0;V?HiIY^!#;PNnUv;%QPz>#wPTa)QNrJ4SMW^UUTyYHw6S)*x7gbC(krY?&@Fm zXrb!kp$-o{INc1U+PJoA&2E@op}JW7X)N|uUAky`M(e8cQ~-^}bTTpLbXG7Q5*TRx8C*7~!=U1!$uarV?H zd|SPqqep69hLU>6*HuU@WH=r%9FJJVOHMD(Xx?hlG(~HT)|x!e?~ga7R(Z9?oi57~!13A$S(a@z z!p?V~;OiBd*BXBo;12?tqQ)Nt08YO=#u#G=!w>*t4Axq;pANb%`VRf|kq(bf^2uP> TH_MRT00000NkvXXu0mjffJugh diff --git a/src/main/resources/assets/hbm/textures/items/ammo_mirv_low.png b/src/main/resources/assets/hbm/textures/items/ammo_mirv_low.png deleted file mode 100644 index 8feece87e69ea697186ec27ab05cd5be4ada7e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmV-M0lEH(P)n zU%MBt1=U-{WIkmRuNjU<496oj@tV_%Gn$v0G)<9GBBdnH^Sk4Hu2o)bv5m{J1aQ2y zLY8HJTA}wH2>5t~=DEh71^9!2rl|1;0f392Rxw&@!Y~9tYmG5R{Lch-imsyXKGNaw Y4ln#+aew=!XaE2J07*qoM6N<$f);;>p8x;= diff --git a/src/main/resources/assets/hbm/textures/items/ammo_mirv_safe.png b/src/main/resources/assets/hbm/textures/items/ammo_mirv_safe.png deleted file mode 100644 index a90ebb3befb18069f91592967f81b76c86af1af7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmV-J0lfZ+P)S6otQu1rsPOvuIW=IAqb%C#XyJE<}77mp)T*=?mxs z1UDfFQ6&2E zoytSvp*`!kxw#w^zHFbr<%}@`z-h#8at^?Jy|CQGxA%7_r2tS$p_IaLoZ1>3gR^$^ z>?5Q2ESRqs?86S6otQuf(ewCSv0E_I;5cV33TZji1;ur`%JEV0eyhb zg&~DjkXa>=KM*D^Btt?IL0j-_&gI@Y=iWOra0=AC)ouO_MB7BL6aYaG^cqD`B>M85 z&O_p%nsvOsyBQR|KD`{|j4=YhX~b@F0l;iEx7@_{j}IuN08mPyl)`bG+8P{#vv&9F zBcu2%n62jQ!yV)4gzp%vJcnql@qHfvtu@9NaheI5DTWUH^pXA_U#|OR U{=*BK^Z)<=07*qoM6N<$g24lfr~m)} diff --git a/src/main/resources/assets/hbm/textures/items/ammo_nuke.png b/src/main/resources/assets/hbm/textures/items/ammo_nuke.png deleted file mode 100644 index 212010e521bc38cc1b00ca9170b454abee6a3b93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmV-g0j2(lP)!Ab)$6r9x6(uNw6FDQ5rMDSV`p_hdPLHr--vA@u7@ajoe z=%tsX;9c-1T8iv0$;%QCYh$AIeD&TBCS)WXWDU>h}?n zPp>Z?pL}paNi5M#(^NGk`P3z$*k}z)7C;h3Fj_~`>^55r`0z7=XPgH{AsG%M`)_Ln;bptQ1eE9rBzY@Ms{ z3%GKhp$p*!X(0U}35hnLuNf!lwGgdm>c+FWoVj!6&Y3eXBRrE9ve~SoltOEb)|z}i zKel&%l*nWj)u;$Kx)6TrP((X8IMjR_^%tK1521Wm)|7!0-2?wZ=DBneM^fMwvz5 z0#@?~+qO|kp_F2CxlG6I@$x!lf?6|5DA)ub5iap*cW8IMXxlwHcE9K8Z5?P#o}kj$ zM@q@TuI1uypLft&1Me<=Zq$PTZtjzuU-s+jLu|;eEj>;a7%}N6?7@XAA(uNwcPat>@MDSV`p_hdPL3|G%L3->f=qq^j zBrNpO%Tn+z_!2Eec9-PK5)W%*vg*N~lLI+?napH{1o$i1E7+gtSXaz$+r4iYbTQ5* zL7HX0U|;bci0fw&GF051)K^esc5P8z*9kIodRJSz(+_Y~+izQZQryL_r0uRFGz~T4TV6 z?-g{@KsQYwIzKwbXYkDcpf@WDri=jq5RoJN3Pj{qT~@9_T~=)Z-=r(>O^qg`FYP?w zLoD+JbFVNf3T8Ax>9)${$!Q=onu7m8L^!)h?XN%5Kfo)R)|I*G5cd)Q00008Ea3Q_{!T~ zxq8g<`<^#*4qNo)w`r=j2y8IldG%P7_N#^8|Mfa|pL`hOwKB-ECi#-A30LzbTm;v>0gA~{vP+whXHUgn>)}T%gS+kpEykbsBI1nvaF2LgeZyt=p7w9K%6GT zX%gIQv}W}1sOlSYyV1ZGpI%>FfAFEjX~LLln)Px;r{68>zS(Gv6${jZ2uAB*n#F8R zGirTCFhzkWiokSva>{q*!vJc-JXhLU07S$IegqM5YrR~#23`pm2#xzxWQlGAfi-65Ik^l=;YugIQc(1_IHT0 zOS>L)zPbs5Lw`jnUO1C4*EodaEFR81SfWK~)u0RRyNe;aLl`3j=`8 zG|!pT+KNP8cw4>JCL%uyQ33!8QKAr~P0)nw8k$h4G>$*)!wqUcBXmGq|%Ve twsL-Q5g4V?!G9nk+}&K6Uw@>3P+y*>izEK4jvD{~002ovPDHLkV1f^@Bf++rvblG3<8{E1O zq0mh?L&3e^PqY+iOY$;|i*aJ2Zi=qF5R%8uy?K{B_zPT>l>YuJlU<=|@uRBF0KH*9 zFq=z|cxAO%I-^mRmDBD%ahd?os4tDOtc=ryD2f0W934A@I8BJt zBzW0q&E)<;HEVIV)xsyAUSC{&@WI7t!j!6;?RrCR*e{#D*l3Lv3p9fWM(d!P)nZ9I z>U>5pMS&@bKy-O>%1`jk02<>wSK3+tM8pw(1QBs-yWY46+x4dEz&H6S@J+1|25(i} zjylXIGv$6^oaf3KL7OVd&DnV%v_^t?5D_k}2W2n^HFg=Ke}H!pZJI89rFc&O0000< KMNUMnLSTZ-dz*Iv diff --git a/src/main/resources/assets/hbm/textures/items/ammo_nuke_tots.png b/src/main/resources/assets/hbm/textures/items/ammo_nuke_tots.png deleted file mode 100644 index 5ba9c2c7462d79a117d8053682d995e41baf26e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmV-70m%M|P)k^!5QRTi3=J6&s4!$;V`R^kF~2!uw(N{-jLb; z+ipg(m@ql8f)w~F7NJ80rJo4^BI0s7-Q{#P03XkoMTG13jlS);kHUQv+Mk})W=)bV z9Z^t3O-?)Qj|ZEiOIOpk9hcMDcvpxi{&*d4g1jtjOz}_yZ-S8G&n(T$!ZuZHW-dG` z9<$WB&{VaVDy}1r!{7l$#B1{MDXa1d*nMqXP8&r3Ldep$#xD_ljP|xvZW{mq002ov JPDHLkV1mC5fNlT) diff --git a/src/main/resources/assets/hbm/textures/items/ammo_rocket.png b/src/main/resources/assets/hbm/textures/items/ammo_rocket.png deleted file mode 100644 index 7fec643532ca3f27fe10eb2a05d06f55b3a0ee98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmV-D0mA-?P)kLcG_8NC%ml^#%SEE&HmMU5B`sT<~{gt1x=ADC9mT#0L$Ys=yi1T;x~)c zinrN}G7RM@!1-|C`*dP58j&Q)U`VS>DfyaCr6>xis!E1Hl;3<@E`grUC2|gcIF13t z7}NVFsyndO27mz6b^R;k2H-=YD8f1S5ONpLP2xXC=lRu|djVa@WV`lnn zLOPSS5OrE)Y$@1dUY_tgPuc+fObKITFnVVF*2fq_k|gALe)T06ms)G_eIM6#F~;yP zUv|pm2nm8f#;KAhisafls;*g8mD8K<*t`!Y%MxpCV3QXn%wM8K`_z>l zF+@#MEsag?VZ5*{_rBfpr2F47%Tboxu zn{`G6Bf*9BVCrv_X1J&2I>v=TQ{JpW_@DG?@T9ll9}% z-kBQ>T$8dadA+{HT1$U6>2zk`Yq3!jiJmVdj$<*#NGHg6x{xMFCkq$SDeOW{3b)lK XI=6K;Xrc_$00000NkvXXu0mjfHp__x diff --git a/src/main/resources/assets/hbm/textures/items/ammo_rocket_glare.png b/src/main/resources/assets/hbm/textures/items/ammo_rocket_glare.png deleted file mode 100644 index 2da9af3c18a0f82bdf6b6c3160d187045b350ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmV-F0l@x=P)KhF8@fqP5+7Ma%a=y?D}*a$~MeVof{KT0UnpI=+wbeKxBVlllDLdu;;@>RLs+oeY2aAPiZ6 zyd=rVH(LP!uW70P83JAu5u_;_AWsr;xs{8VIE9;OEiS<}f;gGaAvc+A`UXWAeK^D9 R?JEEP002ovPDHLkV1kO~g)#sD diff --git a/src/main/resources/assets/hbm/textures/items/ammo_rocket_he.png b/src/main/resources/assets/hbm/textures/items/ammo_rocket_he.png deleted file mode 100644 index be341237de25244e76e2706b314023fde0b7e1a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmV-T0kZyyP)07lOj@ z5E%3jGgp=H0M}Gjlr%w20Tmaqbgb(-x*2|T?n%y<|NiH|e=Dep;Q+7pXZ7{XZ~rg# z79aioF-M2HJU-yJ0(^ZIe3w&{f+&hQLFRzbJ;CeSl(K~J;#xY&d-wCntRRBI>b3g zQ4}2P-60}8Jx8@QcRH9V*wd32-al@!)>1iH>!8x*MTT>Z@g%M}*+|0yUTf{+IQE-d f>PpB~!)^Kjza3?;m1+a$00000NkvXXu0mjfO!ADn diff --git a/src/main/resources/assets/hbm/textures/items/ammo_rocket_incendiary.png b/src/main/resources/assets/hbm/textures/items/ammo_rocket_incendiary.png deleted file mode 100644 index 06c6ad7896ff9d420366b5697d7d36fcf7acbef2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmV-R0kr;!P)T7|xf+R^=K{kNlJCU6)Sbf7Z^wCjc<9o`kKexl=P+fjH;z z-g7-0p|xi0lggS~9ZVVQ!}%K@cP|)YD4iU1P^#a}an3ParWGegY0x7`DMOm3;h0OU dg`70pq#vU&W(V54O0@t0002ovPDHLkV1hA$i(LQ! diff --git a/src/main/resources/assets/hbm/textures/items/ammo_rocket_nuclear.png b/src/main/resources/assets/hbm/textures/items/ammo_rocket_nuclear.png deleted file mode 100644 index 7a8112095503caa68fadcdb7123a790f3b5d3147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#X#z`!Wz>Eak- z(VLtgk#T?{IYd73ufC4bkpn;wu;k+;!R34=2U^Y;27XKpn0PV$#csua^L3c*{!|?K z@bh^#TO6ZbTVJNDi!>AaRriSh=j#@JsK37P>Hqb2ZGX;}a5nfeYsTx}_itTma`bcS zbaad9Ogx@%zbElfi=ILKr?g{>+x-n}s*3tSqHO%vd@J@gUw-mRdCh;(`KAYAH)THe zYU^5K$MaQZ2T#VBjg6h#l4wFuIn7SqvnB>V;r*Q811y0Lg9e^3hvNt59( zsIP3`2U+O*xlJI)by&klXp+v%!U7!w>XPZ3V^=vJ@@#f_Dho_3D#NwSqs@M zjkT6>90`H|t+lM(VkwE^Sn9f#uIuFEc(@7Kop~>cB8Fk$-aHY8A-5pTcfLR0iSPT& z^UUYtD^1f-mZfv{d;HGBg3YuKr80_Jv8 Tf6R)Q00000NkvXXu0mjfRcMMO diff --git a/src/main/resources/assets/hbm/textures/items/ammo_rocket_rpc.png b/src/main/resources/assets/hbm/textures/items/ammo_rocket_rpc.png deleted file mode 100644 index 0b16c97583130f0ecf9c19b9594d1d03f1b6f3b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmV-<0fzpGP)qwA_+|AZ|$M;>^0HkRu#u(uRDPxQTK>)xo3=~D7<^a6KVgbNv zwPLwkGS`V$6otCoZnSL+KoA6^X=)++{r)M?11QT<4a4w~lZScTJm5Q%V_maun#o)| zci}n#IMy|%Fyse*;1WgRHUhRe%Q68t91dy{@C*42 zLpFWSdy)X)`#xH0Ta)LxdYb~Qn?_wg)=i_fNg@FE`yH({d7j&Yy(xfe+xLCD*LB@P z&A-n!%QDegBO>%ad7RH@0II5*9>JA}u-okvKpe;RO5-?|rz5~$+GDD!YSzcIa$S4@ XuY`SYm{5FNs^=!Q_Cr~g3J`!i&;Nup0GkkF3`J4wh3o`uI|$vj@i^D3 z!A4KPnmZkg)>@1)%-^qha3yJ)^5bN$gSC^v9o~D~*(`K&kVa$CT8nc|4!P8wkmHJ5 Z^bP+tWuCDrG1UM7002ovPDHLkV1i?Aj3)p9 diff --git a/src/main/resources/assets/hbm/textures/items/ammo_rocket_sleek.png b/src/main/resources/assets/hbm/textures/items/ammo_rocket_sleek.png deleted file mode 100644 index 8eff0d768e190bb55558c0b8343fca2101a70d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfT-;%za{IKd$^5u)7TT}(|R79C%%Bp3~Ic#R! zv2HeZ5j)Q@!|1h*kL6zQuMY5f+Gf*P?6>dzSqRwHpp99e}% z?L&}&8iT8V45kmTO)GG0LYm#d&<*Xjo9-GuHFJ}Da%S#@|Bk2*!*OW$4`%>8To}>W z(a7NM#Xt5r@b|cW3hYLJY5B=?_QlT8oG6NVK^B0=t2Z%uFJUg2j6#%By&y|(l~URu z2yk5&&-2h)lO##!pKLV?MNtT2j0H&36r~h^?Sc&2ioXyX$05tImCso+Xfpv8CZ~7b zwK2CEG)?k6r#yQ`DaGsUZf(rH7N+{xlbeF=mvgk%R3QTuXB_r#Wd}=KNli^X1!hRYOCC`Hxu|^+HSyBvsAR#FUsO zWvrdLdYN6;JsqVJscHRFujH^XOu9Vb)w|Xdula2``M#>}_>7%@6+S;1P{Djtwc45S zj?=69Mc-K@dTnP-mVLnU=v}~7*(b#;9v*UKQ@8@NCM2Z1-2PC9-BZhSEFtBwM|FGk?+6c9)*=Bni-$B4qkar=~0bCHCV`y;lZ z_>{|r+U^-2*1Qh1_jyqSrUWL_614;k?(%INm**R3Z{9r0dCzPg=-T{YcEsSKinwg{ z3xV8H*MtY&O0SHM;C)5nFT@!QV~;dHIT7rtXKA3|* z*`HM`v9WO>F_i74TAy5w&ffS&p$Tz(1{hb%rXL1@$^%<}H#U|mA%0It?gbuXep#99 ziVIsFGvyro$k;^?7oCG1%Ywi)_fXeQoF#l)r`4|GkHRxRpfi>(Df!gC6#cI4HRC3( zA<*mLv3^hWU(Nb|ihxkBh}IVgp5Zm(?ZTjkK0T95$o3_{0PX15uLFF*E3?B+R}1a8 z#IVX19HMYYu>JVE5H6A08Tb-}_Uw3$j8-HLyV zC{uZejh%4q9>3D27mtTVLbLcmC$mN2Os&4#1ib&DDf|Q#IT1>h>cYM{q4;BOmt|Tb zS5*A9WB8`NhsF%uNH6NG>)F>N3XK}Xz zi9|$J$$|%K=V$p0jRU-7dx+ zhPr5VmU>Q5sV}Dw^mG1)CvdfmVj4RQ!iF)r z98Y_FKR^V{5`!=&Q+8Q={776A+U1MG{bdd1WTz-JS;MsYC{xIm&NHPSxZ^3YUfg8nYK$0O@>fruEPGGh^oz8TI^& z0j<<9Os!QOl+yKSH|@Hy9E1ERZjnnn1P3YKbRozwjKav`;kv=U^3lbd?eCRpq`1~5 zJw_C$P4w0pBnz$gO`@Cpm!76BeD{DO2?h_J z-y&z>mSkWhz3{o5QT5vyn6y4hh==K-z7(;H2HnGR7p}l2itt=5SvEy0-D+ikE1QLfv|w}A}k9z+dQBtRdnX~4;jP9 zQBIcAy9mxbrxjCi2I%i6vCK1H4aI63R#_jDYZ8L_pPtx8i~PusfZ<);7jjIRXk^WV zbaPqI^Vjmxpk|K`x*O}gLnQEiBv4T#9B*z~w?Wt##{2nkCAi@{kEbvRot4c&vVd_a zGO_%nclZ7GT5-pj1Ot!|3c{ZN<_BX`x6!NF|&`Z)uAlkB1{@5>({ zDTTe`t^#48%g3b`X0;Lw$AHM|dl=BwF(R>mPzWkXK1G|X0)i^uGdacR&~WW4Gdemt zB(5!zjq%BfJzq(dSTOO3340O$edc|JD+h^_3tbjIS+)!7;JxK{>CM0Bm{ml zU+H9gaIy%nF0)ezBz@iIKI^Ao_(LEGJblV7U)X*Or8lY5{*(PQytx3O+9nJqOV(}~ zPYQdG&??gldBP_PNplqJ=D`M8R-5Smv-sKePxWx)ANdUs0#AhEJ2691UO4lSE0y*D zhtmYljWOf^Z~Yna0c2xl$`7Pn5V4V`lw*9Wo~qw#(q}dm?72b8{lgn554X zmG2Ru#|2qfPWLy_GYwRAh^qq|ac%SBXA**bNoh|FS;1waHKGZpeKVR(vX^#u-bpJe zHnr{=@GO0SBO+Hh`egoprbEue`nt6&Ni2Zk4Z?^Lzu|yWxLA0yg#1S0A8uGgK(4z@ z(vzPVcK7UuccroUK>yHa$0;JUvFx89mITkyuakf1x;YiD8cR+bTS%vSfeFPadF8Qq z*RPHJ{X;LPeUO4)-a+;C1O6skiv(%Iw601`8up`k(LiAESs*^nC{lRdyokEJGt~Y_ zo8~3}zjg`8$|;=^EWlZh>_7X@Tu{TS(UQ--04Hbcn+~i^BN+YlSrr*v38eY9R~^+6 z(mWY=P>_-vF!pwK9&;Amm&6ZR`vQop%<;@ZEJiJS<0*CD&+Xug+h~<;pOZYL!fy{O zP{Q6}YG*bFhQZ&nj8$B>#XzFZw_};L7GnA-vdkd-I$O0Vr zZ2YA17R6n+Fn!6T1elVzz~%tW4JP}t$mL#!`Cz@J3=-qT(RSfQ#}RbEred)T?4vld zBM&S&v=Rl{ym6B-Ah#v%Y<0hao}wIpxiGRE1xkMbYc8-|Z>JlnRC~ElUdLiarTtn>s95_+lhYR+?1#Z-6-YvV!LdbwC-Zi@>bS*I}8(`YJ+Z z(%Wds>Jv6n!bkBSkj?zy0{rG zL?awlu?vn_jj6QWnsdBaC_fT<-I>bqQVn}hDhp>y41O@4Ez~aE0#-rRJ~&4~W&qj+ zruC!9!H6dYV}Q<#6G~(lvz0a$B4@Y78qISeLK`?pYX%$F*r+TrFfctb@`@ZHS6K8V zOC;`O+)l@C7j%OyGLzBDeYLY9!U+l51IMxp&NF13(Ok;bl(W+|+gkU&8AIO>TE}m8 zfJ<479fQH3o}9}%8xdj04lhYAMHM34mS-UlqY~~#GF|SQEqBYhf4%(WSbTjwsS0$! zkqrqqiJr~xx3b)^a)Ox(gPy7Y`nW+Bz=g<(*|k3t=o|^p+{jT>8>oi}=ll#iEU&vGvkGtq!K<-C1B^Dh|({6)KQToo#Ztr4Go8c1Zhop8V2>X?`ncf&4_X(%yEOhwF}q<@6GM1D7^YK(%@OK|Xq|Fy^duk4n*DQ7HdS&mIL3?} zxptITrFVmn`Qtd6x9t;Y10ug;4a)5yAq!wLZpQe2Xg|j*UwUF^Jt<|c5#)dSfhl_^ z%Tly2mA@M~tzI}5RtSvQhan(dYVod1v=Cbl&n=p-TXM>X^O&H& zN`CiF@%J=mL^pT4XgyB8Zm;86ifaHZ#4eUC4Wl-)`F-{`q}N(yzM$1od5$FjSX;^k z)@c(3u7wAY07N?~+{GLC$^PL*6eR1-tQdBrqY6R3oY@c0vy!i6m@45EUf?u}h=hCw zm0Hu32V?0DIS`63zbB_ZyJG|i&kxxt0JAWe7As!4pr(#-+HJ^3y?^1NjPhKfKa&n8ia7hxwZPHeQ|;9>U{cJFmda=QMa`8 z;MnJ)SY}G9=3vNZS?IH6WZ<$%bNZpsj%z~qpp$`vS+ea~-kLX=7EAMUx{orKC7%V) z1W0uh0q%GIwBefzjdYhcwfRf>!nh_t;175)j=g1Nq(@7Fuy@8}AYf@g$R8E@He|U4 zWj@30F2Ns|vG9!jH09MP9MLm5XgCwdh!W{?ial<^MmhKP05hX>X3|_aZ)zQr>Cp7o zTAi+ss+4Ke|Ijm7egM+1<Z9X?Cfn%>(QZ@JA_{_>_}z>t0d{dFR>cj050`C;QjW zM$&s|m#Xw>zX&Gr&udMbj$UEr%mmNluKoi|nt;nY4F&{ymr)x zJYrZeh%wD+hZd?w9Kx|Eu1EHdn(^_Af68~0z#`)SBMH`P0MLs_m{=?Bjilh=4XX@2 zcxLpY;ONNk@NYkt5Nlqgx{+60nx&Q4zswV&a-2JGXMrHjIrmt$$1c#rIvd-5Oq-M; zweJenF@KGf^-aiVC})74$^##O>r{vamt2z=FK zVzdPx)>>At(o`_4B-Js_&!t!`P?e%$)|*d|Pgn2jjQ?7MnaQjPVIX=kPd}{Ers%1( z0cp`p4VgP;06{ErApdPnbw|oWWde~W@*({P@NbPg!FUylN!&7FXy`j z#TI7K3DHI{emCloAWnUe?dHJ0x@N|Y-`ClkbqT6N48<((MvofZyN{m7+1sR3u(};? zmW~zhZO%UWZCQQBElf7n%$_;^(jB#Czmfh)Q$fd8g)?r{JvS z>-xJjw$%_lfv~pt5sOue__3H@!4jW7GD`zq6$yQ3Q_AXRE?;#im|fhbMII%tLs_zy zr)03E{mHX1%Vw%Jz__gVy~&V8V(rrXW;S?9&5qGRe9Ea>BCueYEq7aUsF0@vq!SZR z|BE_VMu|tlSL^du=v{I(0Y~5fumW!@wB}!FXnxYX*eI88MK@2zdhzeD`(1KaWm=@m z^912PmAg}LS38hf$hkiK)?)YS;HD+=8(k6<0B7KTd`&uatF`I|=V*W_a1okRn6&?) z^}qH}wNT+qr-~Mp~ntIqpjIwDIZpkhsy8G6Jv^E#$y$3)D@5 zaHzHMb3=WT^pFEO;)4|)CDyr`IRGgaTFrkeb33TkHoaQ26V($mSnVMFQPJCXmIU!l;$-_IILlwt)}y~app+rf6D_KnvZEpJpcOBmloYgoC zd387HW56N!0!3+1Zb3u;lZlX0*pWHG^{4IMC0JoX%Rj4#cCiC!pxmL~I6{zEPzaA{ z`Hc82ZX}^bYfNadeFA58mwMW39sX-Qp}NBSpa-=6shCqWxG9HxjHR3+vB3U4_SyK& z;H0|+O8VA1g!s>_r(Fnb_pI&s?AsNDoLaD(-Mv1j3L!Z}eWiMHpZ3>eso(wuoj=;I zf&5$q2KEQlXHx=~78t_;2C7F5@3efzZ55u?R0t@>E-m|>D^I|V0G+UXalU^rD7%BN z--uz4K|0(5P-*kkkk%>evVzhZQrX!I$}Y(K{3Od3hN1$zzzbBG~jAw9b_Z#d|Muy%$-2heR z;Zl5P`qbyO=U-we)VQxlh%bIx%q2t4tsXoe>I7^DW1H7*zm+%qpabuet6b}-=100G zV>bE^Ys+WGg+@iKEPc~VIuN%8vG1Fcf!D`sHWAtYc7HOll7ki*Ef9(<#;xJz|D<}c zB88E~Y2Z3rD(9{K<6>!;-NGAmCQgs?j%3LxoLgjQuy-;{?G0SQQj_gl-?-Kh=RWmP z<~BxmO>XhOYMjCSUI@S?H*DwX`L4PeE7Zv+PdzJ8U7%nMWVX(r?I3|RW4j7bCFI+I zd?$nUBRKRRCmXC4)6q4zOrS;ozPXjo=Nk83zsVFts?0ZFiz2-@6VixRY$I9FN@P%K zb5opv0(~=`#54UGz{x)y-X|ZCDARO3jy8Sa&9Q&kG2MK}@Bs5cC-7j@(C^iP$04+= zQ1^g32Pfg{px;hERsS6G_5xc3E$*!ms(p&a!E}*C+-f}5U|zpnqfWOi2J1C_mtg?| zHWF=MkKD8?!jGjjddEml(reg@K_mToG|otze=?SavA@>e5vP?i5r$PKh($Y@Zh;-# zlCYY9vxhfwDF}=5I-RdObiQkTlh18_QBBu!z70N$&JopK4-iwMxp_S9pZki#x>N@f zb@z8wHy_z(6xh$e;Nr5dBso>jugEATij#$cBp+pSltMo?;r49C{63IPfk!AqA4420 ztyQ22-GVa}EV`D3a_}z^z*gE$EK1woN{x4qp9OTKrSkM-CXnGWfGP_RPHxE9(BSu8 z9+dg5PN+*=%*xi-cIzN2FLLN|Q42_x29y*{V8wi=cf$+6$Q@T5^CfatHO^{35{guB8=^Q!E-D-{^~GsyTmwjVjm z6%frz`RJajx6oHIRQ4oibsWhdfjgt!C{E(}pKK4PYqO$L^`1r`=Ua}(#K@-GfK5K? zrL*=Y?{kKm=Jx@Ycp}kOo(upn?XaMg#$7|ZJDJAj8#sCJYkgjdNqSz$^J?QS-*rPu z0*cI2WIvTBV{gDs*+&x%I)zQq1C3d-$^f--?w9!ZpD9VYHhmjlZecP-y8#`wb7yyL z6TRct8DEf$6tGMS@C}exrV;F30P!hrkmP?#rjKmZ;`M}<0dieQb_Lik`hXL zm2%313iq71!9n|#)be@HB|-XN{nQP7E#nXHTuI#>rSO`vbyB;t|3{}=1bqD+zJfg2 zs4Fq3(PiW-$tZ;7Z~AWeKW@zAv`w@4vyY@cKm#f!>2HD1Dbu9@iKa-E^k5U*dl+Y; z9kk~;M}f_bUCsZgXkvEmriF1R^|sw)?Q40gdM8S2`qrF-yRAWD9;S87Aj}Lailmpb zgPn%5aEnjuGeuMq(+<4^m#sgaIAt;Ok;^l!bPpvBENv{7>856&?7D59_ziWRvfJk4 z3}6#c1Cr_Z#L}l$V1~N{dbsSg*5s75Dn7^WTt&T$G?`(G<6gG(zer$>#TI&4T{TZ? z*$N#0AAl@UTbv9;RYK&CYS=GLv@Fj`z6nBY(wa!d;j73KAL3tla;i*$!TM97m+@!9 zvFAcj)JK8L2W~k)-UQAyst#|w-QT)227t7X7I~B`Kv+L8`uz(EAX3jlIOI0E{)agJ zX^nfRrXr$*m_C>JC}m!*xeCb5e)bpFx2d{GshXHLSH6oj60p~WvI_{EglIUI0$Gz| z9ez0`(xsBfHwEI|(+y9ReIlWlyjS;I;6R9e=1$VaCHPcAP-ltbgLFa>HzO7QZ$5bL}9 zRa(xgvUPRHTD%&8U6K^b^r>7?eSvAtbPztYp3BG%QMnG}mkD#b^G9l&6CS!zem|EgjgMAM;m;XY(?On(0EO5f23{% zRH~DNfKnW`A@M7a)KDD*2p@;$xSs7b9A3-ERiUZXF}NmT`iU4P0!eIc{e+Fy@*3JT z6kT9!+YGm`w5NB6w$W(~S;yQi{T)j{86UxzKGe`UO&awVfCIVxW*JQgC6YY#F6{(M zH=)J49L@x11$6NqI4s6uA9&<{2=3Ad9I<6LBpY3st<#*>XAe#mZ(%z43Lzr*{XcSO zvt`rZp#7Rd+J>@EfzpTCq2U4Vp}(T3k+I=D?$%EL)97PNL9%ZXq6Ny64B$-r#dF7U zJ}Y-7-ua<2w^-+O|HzqJmBE_oq$&m>kRhczHnzQe!MQLnY0+NRu(XFZ>F$gYK~~CR zMQTG|-ELbXHcs*Q%nEKeSm1z=w6lnc*LD`EOIRdUN1W6|ci>3iru{P$p|W=kA>+I0 zlt(+Ag5l~&4TnfsL#5>g#lW}$G;eC6aJU^Zuq;#78PJ|tGkCIApG4gUHsPK%TQRJ1K5fQeq_l|ci3k=PJ^(EOkKs0Sbc z7r{Zo*~(X_Bi|g|2*Qnziy&EzlD)#bqV@p3Dc}DlpCREohyim4S@`$o^=?(yWLq|eM&oHhW?r9oFOU$?9^_k8?+Qf5i7 literal 0 HcmV?d00001 From dc6f30ba6ce9281d55298b7c9e1edce79cdb92fa Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:27:47 -0600 Subject: [PATCH 67/70] Fix TileEntityBroadcaster. --- .../com/hbm/tileentity/machine/TileEntityBroadcaster.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java index 4cebc8174..e1b261544 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityBroadcaster.java @@ -10,10 +10,9 @@ import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.TileEntityLoadedBase; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; @@ -55,7 +54,7 @@ public class TileEntityBroadcaster extends TileEntityLoadedBase { int intendedVolume = 25; - EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + EntityPlayer player = MainRegistry.proxy.me(); float volume; if(player != null) { float f = (float)Math.sqrt(Math.pow(xCoord - player.posX, 2) + Math.pow(yCoord - player.posY, 2) + Math.pow(zCoord - player.posZ, 2)); From 34e818b83a60e0077631fafd3f98401b09c54c7a Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 5 Jan 2025 19:19:02 -0600 Subject: [PATCH 68/70] Wow, that was bad. Fix fluids randomly disappearing/appearing in the Heat Exchanging Heater in rare circumstances due to packet compilation times. --- .../machine/TileEntityHeaterHeatex.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java index 8189eee30..7a1a9a18c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterHeatex.java @@ -19,6 +19,7 @@ import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; @@ -46,16 +47,29 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe return "container.heaterHeatex"; } + ByteBuf buf; + @Override public void updateEntity() { if(!worldObj.isRemote) { + + if(this.buf != null) + this.buf.release(); + this.buf = Unpooled.buffer(); + this.tanks[0].setType(0, slots); this.setupTanks(); this.updateConnections(); this.heatEnergy *= 0.999; + tanks[0].serialize(buf); + + this.tryConvert(); + + tanks[1].serialize(buf); + networkPackNT(25); for(DirPos pos : getConPos()) { @@ -66,9 +80,7 @@ public class TileEntityHeaterHeatex extends TileEntityMachineBase implements IHe @Override public void serialize(ByteBuf buf) { - tanks[0].serialize(buf); - this.tryConvert(); - tanks[1].serialize(buf); + buf.writeBytes(this.buf); buf.writeInt(this.heatEnergy); buf.writeInt(this.amountToCool); buf.writeInt(this.tickDelay); From 6bc70ae105f6b855b5570104152570046df9bbc7 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 6 Jan 2025 00:09:36 -0600 Subject: [PATCH 69/70] Small fix for upgrades on TileEntityElectrolyser. --- .../machine/TileEntityElectrolyser.java | 1210 ++++++++--------- 1 file changed, 605 insertions(+), 605 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index f42270518..2626569a2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -1,605 +1,605 @@ -package com.hbm.tileentity.machine; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import com.hbm.blocks.BlockDummyable; -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.UpgradeManagerNT; -import com.hbm.inventory.container.ContainerElectrolyserFluid; -import com.hbm.inventory.container.ContainerElectrolyserMetal; -import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.gui.GUIElectrolyserFluid; -import com.hbm.inventory.gui.GUIElectrolyserMetal; -import com.hbm.inventory.material.MaterialShapes; -import com.hbm.inventory.material.Mats; -import com.hbm.inventory.material.Mats.MaterialStack; -import com.hbm.inventory.recipes.ElectrolyserFluidRecipes; -import com.hbm.inventory.recipes.ElectrolyserFluidRecipes.ElectrolysisRecipe; -import com.hbm.inventory.recipes.ElectrolyserMetalRecipes; -import com.hbm.inventory.recipes.ElectrolyserMetalRecipes.ElectrolysisMetalRecipe; -import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; -import com.hbm.lib.Library; -import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.tileentity.*; -import com.hbm.packet.toclient.AuxParticlePacketNT; -import com.hbm.util.BobMathUtil; -import com.hbm.util.CrucibleUtil; -import com.hbm.util.I18nUtil; -import com.hbm.util.fauxpointtwelve.DirPos; - -import api.hbm.energymk2.IEnergyReceiverMK2; -import api.hbm.fluid.IFluidStandardTransceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -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.AxisAlignedBB; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable, IMetalCopiable { - - public long power; - public static final long maxPower = 20000000; - public static final int usageOreBase = 10_000; - public static final int usageFluidBase = 10_000; - public int usageOre; - public int usageFluid; - - public int progressFluid; - public int processFluidTime = 100; - public int progressOre; - public int processOreTime = 600; - - public MaterialStack leftStack; - public MaterialStack rightStack; - public int maxMaterial = MaterialShapes.BLOCK.q(16); - - public FluidTank[] tanks; - - public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); - - public TileEntityElectrolyser() { - //0: Battery - //1-2: Upgrades - //// FLUID - //3-4: Fluid ID - //5-10: Fluid IO - //11-13: Byproducts - //// METAL - //14: Crystal - //15-20: Outputs - super(21); - tanks = new FluidTank[4]; - tanks[0] = new FluidTank(Fluids.WATER, 16000); - tanks[1] = new FluidTank(Fluids.HYDROGEN, 16000); - tanks[2] = new FluidTank(Fluids.OXYGEN, 16000); - tanks[3] = new FluidTank(Fluids.NITRIC_ACID, 16000); - } - - @Override - public int[] getAccessibleSlotsFromSide(int meta) { - return new int[] { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - if(i == 14) return ElectrolyserMetalRecipes.getRecipe(itemStack) != null; - return false; - } - - @Override - public boolean canExtractItem(int i, ItemStack itemStack, int j) { - return i != 14; - } - - @Override - public String getName() { - return "container.machineElectrolyser"; - } - - @Override - public void updateEntity() { - - if(!worldObj.isRemote) { - - this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); - this.tanks[0].setType(3, 4, slots); - this.tanks[0].loadTank(5, 6, slots); - this.tanks[1].unloadTank(7, 8, slots); - this.tanks[2].unloadTank(9, 10, slots); - - if(worldObj.getTotalWorldTime() % 20 == 0) { - for(DirPos pos : this.getConPos()) { - this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - this.trySubscribe(tanks[3].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - - if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - } - } - - upgradeManager.checkSlots(this, slots, 1, 2); - int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); - int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); - - usageOre = usageOreBase - usageOreBase * powerLevel / 4 + usageOreBase * speedLevel; - usageFluid = usageFluidBase - usageFluidBase * powerLevel / 4 + usageFluidBase * speedLevel; - - for(int i = 0; i < getCycleCount(); i++) { - if (this.canProcessFluid()) { - this.progressFluid++; - this.power -= this.usageFluid; - - if (this.progressFluid >= this.getDurationFluid()) { - this.processFluids(); - this.progressFluid = 0; - this.markChanged(); - } - } - - if (this.canProcessMetal()) { - this.progressOre++; - this.power -= this.usageOre; - - if (this.progressOre >= this.getDurationMetal()) { - this.processMetal(); - this.progressOre = 0; - this.markChanged(); - } - } - } - - if(this.leftStack != null) { - - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); - List toCast = new ArrayList(); - toCast.add(this.leftStack); - - Vec3 impact = Vec3.createVectorHelper(0, 0, 0); - MaterialStack didPour = CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2D, zCoord + 0.5D + dir.offsetZ * 5.875D, 6, true, toCast, MaterialShapes.NUGGET.q(3) * Math.max (getCycleCount() * speedLevel, 1), impact); - - if(didPour != null) { - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "foundry"); - data.setInteger("color", didPour.material.moltenColor); - data.setByte("dir", (byte) dir.ordinal()); - data.setFloat("off", 0.625F); - data.setFloat("base", 0.625F); - data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875) + 2)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); - - if(this.leftStack.amount <= 0) this.leftStack = null; - } - } - - if(this.rightStack != null) { - - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - List toCast = new ArrayList(); - toCast.add(this.rightStack); - - Vec3 impact = Vec3.createVectorHelper(0, 0, 0); - MaterialStack didPour = CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2D, zCoord + 0.5D + dir.offsetZ * 5.875D, 6, true, toCast, MaterialShapes.NUGGET.q(3) * Math.max (getCycleCount() * speedLevel, 1), impact); - - if(didPour != null) { - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "foundry"); - data.setInteger("color", didPour.material.moltenColor); - data.setByte("dir", (byte) dir.ordinal()); - data.setFloat("off", 0.625F); - data.setFloat("base", 0.625F); - data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875) + 2)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); - - if(this.rightStack.amount <= 0) this.rightStack = null; - } - } - - this.networkPackNT(50); - } - } - - public DirPos[] getConPos() { - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - - return new DirPos[] { - new DirPos(xCoord - dir.offsetX * 6, yCoord, zCoord - dir.offsetZ * 6, dir.getOpposite()), - new DirPos(xCoord - dir.offsetX * 6 + rot.offsetX, yCoord, zCoord - dir.offsetZ * 6 + rot.offsetZ, dir.getOpposite()), - new DirPos(xCoord - dir.offsetX * 6 - rot.offsetX, yCoord, zCoord - dir.offsetZ * 6 - rot.offsetZ, dir.getOpposite()), - new DirPos(xCoord + dir.offsetX * 6, yCoord, zCoord + dir.offsetZ * 6, dir), - new DirPos(xCoord + dir.offsetX * 6 + rot.offsetX, yCoord, zCoord + dir.offsetZ * 6 + rot.offsetZ, dir), - new DirPos(xCoord + dir.offsetX * 6 - rot.offsetX, yCoord, zCoord + dir.offsetZ * 6 - rot.offsetZ, dir) - }; - } - - @Override - public void serialize(ByteBuf buf) { - super.serialize(buf); - buf.writeLong(this.power); - buf.writeInt(this.progressFluid); - buf.writeInt(this.progressOre); - buf.writeInt(this.usageOre); - buf.writeInt(this.usageFluid); - buf.writeInt(this.getDurationFluid()); - buf.writeInt(this.getDurationMetal()); - for(int i = 0; i < 4; i++) tanks[i].serialize(buf); - buf.writeBoolean(this.leftStack != null); - buf.writeBoolean(this.rightStack != null); - if(this.leftStack != null) { - buf.writeInt(leftStack.material.id); - buf.writeInt(leftStack.amount); - } - if(this.rightStack != null) { - buf.writeInt(rightStack.material.id); - buf.writeInt(rightStack.amount); - } - } - - @Override - public void deserialize(ByteBuf buf) { - super.deserialize(buf); - this.power = buf.readLong(); - this.progressFluid = buf.readInt(); - this.progressOre = buf.readInt(); - this.usageOre = buf.readInt(); - this.usageFluid = buf.readInt(); - this.processFluidTime = buf.readInt(); - this.processOreTime = buf.readInt(); - for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); - boolean left = buf.readBoolean(); - boolean right = buf.readBoolean(); - if(left) { - this.leftStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); - } - if(right) { - this.rightStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); - } - } - - public boolean canProcessFluid() { - - if(this.power < usageFluid) return false; - - ElectrolysisRecipe recipe = ElectrolyserFluidRecipes.recipes.get(tanks[0].getTankType()); - - if(recipe == null) return false; - if(recipe.amount > tanks[0].getFill()) return false; - if(recipe.output1.type == tanks[1].getTankType() && recipe.output1.fill + tanks[1].getFill() > tanks[1].getMaxFill()) return false; - if(recipe.output2.type == tanks[2].getTankType() && recipe.output2.fill + tanks[2].getFill() > tanks[2].getMaxFill()) return false; - - if(recipe.byproduct != null) { - - for(int i = 0; i < recipe.byproduct.length; i++) { - ItemStack slot = slots[11 + i]; - ItemStack byproduct = recipe.byproduct[i]; - - if(slot == null) continue; - if(!slot.isItemEqual(byproduct)) return false; - if(slot.stackSize + byproduct.stackSize > slot.getMaxStackSize()) return false; - } - } - - return true; - } - - public void processFluids() { - - ElectrolysisRecipe recipe = ElectrolyserFluidRecipes.recipes.get(tanks[0].getTankType()); - tanks[0].setFill(tanks[0].getFill() - recipe.amount); - tanks[1].setTankType(recipe.output1.type); - tanks[2].setTankType(recipe.output2.type); - tanks[1].setFill(tanks[1].getFill() + recipe.output1.fill); - tanks[2].setFill(tanks[2].getFill() + recipe.output2.fill); - - if(recipe.byproduct != null) { - - for(int i = 0; i < recipe.byproduct.length; i++) { - ItemStack slot = slots[11 + i]; - ItemStack byproduct = recipe.byproduct[i]; - - if(slot == null) { - slots[11 + i] = byproduct.copy(); - } else { - slots[11 + i].stackSize += byproduct.stackSize; - } - } - } - } - - public boolean canProcessMetal() { - - if(slots[14] == null) return false; - if(this.power < usageOre) return false; - if(this.tanks[3].getFill() < 100) return false; - - ElectrolysisMetalRecipe recipe = ElectrolyserMetalRecipes.getRecipe(slots[14]); - if(recipe == null) return false; - - if(leftStack != null && recipe.output1 != null) { - if(recipe.output1.material != leftStack.material) return false; - if(recipe.output1.amount + leftStack.amount > this.maxMaterial) return false; - } - - if(rightStack != null && recipe.output2 != null) { - if(recipe.output2.material != rightStack.material) return false; - if(recipe.output2.amount + rightStack.amount > this.maxMaterial) return false; - } - - if(recipe.byproduct != null) { - - for(int i = 0; i < recipe.byproduct.length; i++) { - ItemStack slot = slots[15 + i]; - ItemStack byproduct = recipe.byproduct[i]; - - if(slot == null) continue; - if(!slot.isItemEqual(byproduct)) return false; - if(slot.stackSize + byproduct.stackSize > slot.getMaxStackSize()) return false; - } - } - - return true; - } - - public void processMetal() { - - ElectrolysisMetalRecipe recipe = ElectrolyserMetalRecipes.getRecipe(slots[14]); - if(recipe.output1 != null) - if(leftStack == null) { - leftStack = new MaterialStack(recipe.output1.material, recipe.output1.amount); - } else { - leftStack.amount += recipe.output1.amount; - } - - if(recipe.output2 != null) - if(rightStack == null ) { - rightStack = new MaterialStack(recipe.output2.material, recipe.output2.amount); - } else { - rightStack.amount += recipe.output2.amount; - } - - if(recipe.byproduct != null) { - - for(int i = 0; i < recipe.byproduct.length; i++) { - ItemStack slot = slots[15 + i]; - ItemStack byproduct = recipe.byproduct[i]; - - if(slot == null) { - slots[15 + i] = byproduct.copy(); - } else { - slots[15 + i].stackSize += byproduct.stackSize; - } - } - } - - this.tanks[3].setFill(this.tanks[3].getFill() - 100); - this.decrStackSize(14, 1); - } - - public int getDurationMetal() { - ElectrolysisMetalRecipe result = ElectrolyserMetalRecipes.getRecipe(slots[14]); - int base = result != null ? result.duration : 600; - int speed = upgradeManager.getLevel(UpgradeType.SPEED) - upgradeManager.getLevel(UpgradeType.POWER); - return (int) Math.ceil((base * Math.max(1F - 0.25F * speed, 0.2))); - } - public int getDurationFluid() { - ElectrolysisRecipe result = ElectrolyserFluidRecipes.getRecipe(tanks[0].getTankType()); - int base = result != null ? result.duration : 100; - int speed = upgradeManager.getLevel(UpgradeType.SPEED) - upgradeManager.getLevel(UpgradeType.POWER); - return (int) Math.ceil((base * Math.max(1F - 0.25F * speed, 0.2))); - - } - - public int getCycleCount() { - int speed = upgradeManager.getLevel(UpgradeType.OVERDRIVE); - return Math.min(1 + speed * 2, 7); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - this.power = nbt.getLong("power"); - this.progressFluid = nbt.getInteger("progressFluid"); - this.progressOre = nbt.getInteger("progressOre"); - this.processFluidTime = nbt.getInteger("processFluidTime"); - this.processOreTime = nbt.getInteger("processOreTime"); - if(nbt.hasKey("leftType")) this.leftStack = new MaterialStack(Mats.matById.get(nbt.getInteger("leftType")), nbt.getInteger("leftAmount")); - else this.leftStack = null; - if(nbt.hasKey("rightType")) this.rightStack = new MaterialStack(Mats.matById.get(nbt.getInteger("rightType")), nbt.getInteger("rightAmount")); - else this.rightStack = null; - for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setLong("power", this.power); - nbt.setInteger("progressFluid", this.progressFluid); - nbt.setInteger("progressOre", this.progressOre); - nbt.setInteger("processFluidTime", getDurationFluid()); - nbt.setInteger("processOreTime", getDurationMetal()); - if(this.leftStack != null) { - nbt.setInteger("leftType", leftStack.material.id); - nbt.setInteger("leftAmount", leftStack.amount); - } - if(this.rightStack != null) { - nbt.setInteger("rightType", rightStack.material.id); - nbt.setInteger("rightAmount", rightStack.amount); - } - for(int i = 0; i < 4; i++) tanks[i].writeToNBT(nbt, "t" + i); - - } - - AxisAlignedBB bb = null; - - @Override - public AxisAlignedBB getRenderBoundingBox() { - - if(bb == null) { - bb = AxisAlignedBB.getBoundingBox( - xCoord - 5, - yCoord - 0, - zCoord - 5, - xCoord + 6, - yCoord + 4, - zCoord + 6 - ); - } - - return bb; - } - - @Override - @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() { - return 65536.0D; - } - - @Override - public long getPower() { - return this.power; - } - - @Override - public long getMaxPower() { - return maxPower; - } - - @Override - public void setPower(long power) { - this.power = power; - } - - @Override - public FluidTank[] getAllTanks() { - return tanks; - } - - @Override - public FluidTank[] getSendingTanks() { - return new FluidTank[] {tanks[1], tanks[2]}; - } - - @Override - public FluidTank[] getReceivingTanks() { - return new FluidTank[] {tanks[0], tanks[3]}; - } - - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - if(ID == 0) return new ContainerElectrolyserFluid(player.inventory, this); - return new ContainerElectrolyserMetal(player.inventory, this); - } - - @Override - @SideOnly(Side.CLIENT) - public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - if(ID == 0) return new GUIElectrolyserFluid(player.inventory, this); - return new GUIElectrolyserMetal(player.inventory, this); - } - - @Override - public void receiveControl(NBTTagCompound data) { } - - @Override - public void receiveControl(EntityPlayer player, NBTTagCompound data) { - - if(data.hasKey("sgm")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); - if(data.hasKey("sgf")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, worldObj, xCoord, yCoord, zCoord); - } - - @Override - public boolean hasPermission(EntityPlayer player) { - return this.isUseableByPlayer(player); - } - - @Override - public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { - return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; - } - - @Override - public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { - info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_electrolyser)); - if(type == UpgradeType.SPEED) { - info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (level * 25) + "%")); - info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%")); - } - if(type == UpgradeType.POWER) { - info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 25) + "%")); - info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_DELAY, "+" + (25) + "%")); - } - if(type == UpgradeType.OVERDRIVE) { - info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); - } - } - - @Override - public HashMap getValidUpgrades() { - HashMap upgrades = new HashMap<>(); - upgrades.put(UpgradeType.SPEED, 3); - upgrades.put(UpgradeType.POWER, 3); - upgrades.put(UpgradeType.OVERDRIVE, 3); - return upgrades; - } - - @Override - public FluidTank getTankToPaste() { - return tanks[0]; - } - - @Override - public NBTTagCompound getSettings(World world, int x, int y, int z) { - NBTTagCompound tag = new NBTTagCompound(); - if(getFluidIDToCopy().length > 0) - tag.setIntArray("fluidID", getFluidIDToCopy()); - if(getMatsToCopy().length > 0) - tag.setIntArray("matFilter", getMatsToCopy()); - return tag; - } - - @Override - public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { - IFluidCopiable.super.pasteSettings(nbt, index, world, player, x, y, z); - } - - @Override - public String[] infoForDisplay(World world, int x, int y, int z) { - ArrayList names = new ArrayList<>(); - int[] fluidIDs = getFluidIDToCopy(); - int[] matIDs = getMatsToCopy(); - - for (int fluidID : fluidIDs) { - names.add(Fluids.fromID(fluidID).getUnlocalizedName()); - } - for (int matID : matIDs) { - names.add(Mats.matById.get(matID).getUnlocalizedName()); - } - - return names.toArray(new String[0]); - } - - @Override - public int[] getMatsToCopy() { - ArrayList types = new ArrayList<>(); - if(leftStack != null) types.add(leftStack.material.id); - if(rightStack != null) types.add(rightStack.material.id); - return BobMathUtil.intCollectionToArray(types); - } -} +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.UpgradeManagerNT; +import com.hbm.inventory.container.ContainerElectrolyserFluid; +import com.hbm.inventory.container.ContainerElectrolyserMetal; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIElectrolyserFluid; +import com.hbm.inventory.gui.GUIElectrolyserMetal; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.ElectrolyserFluidRecipes; +import com.hbm.inventory.recipes.ElectrolyserFluidRecipes.ElectrolysisRecipe; +import com.hbm.inventory.recipes.ElectrolyserMetalRecipes; +import com.hbm.inventory.recipes.ElectrolyserMetalRecipes.ElectrolysisMetalRecipe; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.*; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.util.BobMathUtil; +import com.hbm.util.CrucibleUtil; +import com.hbm.util.I18nUtil; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluid.IFluidStandardTransceiver; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +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.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable, IMetalCopiable { + + public long power; + public static final long maxPower = 20000000; + public static final int usageOreBase = 10_000; + public static final int usageFluidBase = 10_000; + public int usageOre; + public int usageFluid; + + public int progressFluid; + public int processFluidTime = 100; + public int progressOre; + public int processOreTime = 600; + + public MaterialStack leftStack; + public MaterialStack rightStack; + public int maxMaterial = MaterialShapes.BLOCK.q(16); + + public FluidTank[] tanks; + + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + + public TileEntityElectrolyser() { + //0: Battery + //1-2: Upgrades + //// FLUID + //3-4: Fluid ID + //5-10: Fluid IO + //11-13: Byproducts + //// METAL + //14: Crystal + //15-20: Outputs + super(21); + tanks = new FluidTank[4]; + tanks[0] = new FluidTank(Fluids.WATER, 16000); + tanks[1] = new FluidTank(Fluids.HYDROGEN, 16000); + tanks[2] = new FluidTank(Fluids.OXYGEN, 16000); + tanks[3] = new FluidTank(Fluids.NITRIC_ACID, 16000); + } + + @Override + public int[] getAccessibleSlotsFromSide(int meta) { + return new int[] { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + if(i == 14) return ElectrolyserMetalRecipes.getRecipe(itemStack) != null; + return false; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i != 14; + } + + @Override + public String getName() { + return "container.machineElectrolyser"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); + this.tanks[0].setType(3, 4, slots); + this.tanks[0].loadTank(5, 6, slots); + this.tanks[1].unloadTank(7, 8, slots); + this.tanks[2].unloadTank(9, 10, slots); + + if(worldObj.getTotalWorldTime() % 20 == 0) { + for(DirPos pos : this.getConPos()) { + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[3].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + + if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + upgradeManager.checkSlots(this, slots, 1, 2); + int speedLevel = upgradeManager.getLevel(UpgradeType.SPEED); + int powerLevel = upgradeManager.getLevel(UpgradeType.POWER); + + usageOre = usageOreBase - usageOreBase * powerLevel / 4 + usageOreBase * speedLevel; + usageFluid = usageFluidBase - usageFluidBase * powerLevel / 4 + usageFluidBase * speedLevel; + + for(int i = 0; i < getCycleCount(); i++) { + if (this.canProcessFluid()) { + this.progressFluid++; + this.power -= this.usageFluid; + + if (this.progressFluid >= this.getDurationFluid()) { + this.processFluids(); + this.progressFluid = 0; + this.markChanged(); + } + } + + if (this.canProcessMetal()) { + this.progressOre++; + this.power -= this.usageOre; + + if (this.progressOre >= this.getDurationMetal()) { + this.processMetal(); + this.progressOre = 0; + this.markChanged(); + } + } + } + + if(this.leftStack != null) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); + List toCast = new ArrayList(); + toCast.add(this.leftStack); + + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); + MaterialStack didPour = CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2D, zCoord + 0.5D + dir.offsetZ * 5.875D, 6, true, toCast, MaterialShapes.NUGGET.q(3) * Math.max (getCycleCount() * speedLevel, 1), impact); + + if(didPour != null) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "foundry"); + data.setInteger("color", didPour.material.moltenColor); + data.setByte("dir", (byte) dir.ordinal()); + data.setFloat("off", 0.625F); + data.setFloat("base", 0.625F); + data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875) + 2)); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + + if(this.leftStack.amount <= 0) this.leftStack = null; + } + } + + if(this.rightStack != null) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + List toCast = new ArrayList(); + toCast.add(this.rightStack); + + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); + MaterialStack didPour = CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2D, zCoord + 0.5D + dir.offsetZ * 5.875D, 6, true, toCast, MaterialShapes.NUGGET.q(3) * Math.max (getCycleCount() * speedLevel, 1), impact); + + if(didPour != null) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "foundry"); + data.setInteger("color", didPour.material.moltenColor); + data.setByte("dir", (byte) dir.ordinal()); + data.setFloat("off", 0.625F); + data.setFloat("base", 0.625F); + data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875) + 2)); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + + if(this.rightStack.amount <= 0) this.rightStack = null; + } + } + + this.networkPackNT(50); + } + } + + public DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + return new DirPos[] { + new DirPos(xCoord - dir.offsetX * 6, yCoord, zCoord - dir.offsetZ * 6, dir.getOpposite()), + new DirPos(xCoord - dir.offsetX * 6 + rot.offsetX, yCoord, zCoord - dir.offsetZ * 6 + rot.offsetZ, dir.getOpposite()), + new DirPos(xCoord - dir.offsetX * 6 - rot.offsetX, yCoord, zCoord - dir.offsetZ * 6 - rot.offsetZ, dir.getOpposite()), + new DirPos(xCoord + dir.offsetX * 6, yCoord, zCoord + dir.offsetZ * 6, dir), + new DirPos(xCoord + dir.offsetX * 6 + rot.offsetX, yCoord, zCoord + dir.offsetZ * 6 + rot.offsetZ, dir), + new DirPos(xCoord + dir.offsetX * 6 - rot.offsetX, yCoord, zCoord + dir.offsetZ * 6 - rot.offsetZ, dir) + }; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeLong(this.power); + buf.writeInt(this.progressFluid); + buf.writeInt(this.progressOre); + buf.writeInt(this.usageOre); + buf.writeInt(this.usageFluid); + buf.writeInt(this.getDurationFluid()); + buf.writeInt(this.getDurationMetal()); + for(int i = 0; i < 4; i++) tanks[i].serialize(buf); + buf.writeBoolean(this.leftStack != null); + buf.writeBoolean(this.rightStack != null); + if(this.leftStack != null) { + buf.writeInt(leftStack.material.id); + buf.writeInt(leftStack.amount); + } + if(this.rightStack != null) { + buf.writeInt(rightStack.material.id); + buf.writeInt(rightStack.amount); + } + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.power = buf.readLong(); + this.progressFluid = buf.readInt(); + this.progressOre = buf.readInt(); + this.usageOre = buf.readInt(); + this.usageFluid = buf.readInt(); + this.processFluidTime = buf.readInt(); + this.processOreTime = buf.readInt(); + for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); + boolean left = buf.readBoolean(); + boolean right = buf.readBoolean(); + if(left) { + this.leftStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); + } + if(right) { + this.rightStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); + } + } + + public boolean canProcessFluid() { + + if(this.power < usageFluid) return false; + + ElectrolysisRecipe recipe = ElectrolyserFluidRecipes.recipes.get(tanks[0].getTankType()); + + if(recipe == null) return false; + if(recipe.amount > tanks[0].getFill()) return false; + if(recipe.output1.type == tanks[1].getTankType() && recipe.output1.fill + tanks[1].getFill() > tanks[1].getMaxFill()) return false; + if(recipe.output2.type == tanks[2].getTankType() && recipe.output2.fill + tanks[2].getFill() > tanks[2].getMaxFill()) return false; + + if(recipe.byproduct != null) { + + for(int i = 0; i < recipe.byproduct.length; i++) { + ItemStack slot = slots[11 + i]; + ItemStack byproduct = recipe.byproduct[i]; + + if(slot == null) continue; + if(!slot.isItemEqual(byproduct)) return false; + if(slot.stackSize + byproduct.stackSize > slot.getMaxStackSize()) return false; + } + } + + return true; + } + + public void processFluids() { + + ElectrolysisRecipe recipe = ElectrolyserFluidRecipes.recipes.get(tanks[0].getTankType()); + tanks[0].setFill(tanks[0].getFill() - recipe.amount); + tanks[1].setTankType(recipe.output1.type); + tanks[2].setTankType(recipe.output2.type); + tanks[1].setFill(tanks[1].getFill() + recipe.output1.fill); + tanks[2].setFill(tanks[2].getFill() + recipe.output2.fill); + + if(recipe.byproduct != null) { + + for(int i = 0; i < recipe.byproduct.length; i++) { + ItemStack slot = slots[11 + i]; + ItemStack byproduct = recipe.byproduct[i]; + + if(slot == null) { + slots[11 + i] = byproduct.copy(); + } else { + slots[11 + i].stackSize += byproduct.stackSize; + } + } + } + } + + public boolean canProcessMetal() { + + if(slots[14] == null) return false; + if(this.power < usageOre) return false; + if(this.tanks[3].getFill() < 100) return false; + + ElectrolysisMetalRecipe recipe = ElectrolyserMetalRecipes.getRecipe(slots[14]); + if(recipe == null) return false; + + if(leftStack != null && recipe.output1 != null) { + if(recipe.output1.material != leftStack.material) return false; + if(recipe.output1.amount + leftStack.amount > this.maxMaterial) return false; + } + + if(rightStack != null && recipe.output2 != null) { + if(recipe.output2.material != rightStack.material) return false; + if(recipe.output2.amount + rightStack.amount > this.maxMaterial) return false; + } + + if(recipe.byproduct != null) { + + for(int i = 0; i < recipe.byproduct.length; i++) { + ItemStack slot = slots[15 + i]; + ItemStack byproduct = recipe.byproduct[i]; + + if(slot == null) continue; + if(!slot.isItemEqual(byproduct)) return false; + if(slot.stackSize + byproduct.stackSize > slot.getMaxStackSize()) return false; + } + } + + return true; + } + + public void processMetal() { + + ElectrolysisMetalRecipe recipe = ElectrolyserMetalRecipes.getRecipe(slots[14]); + if(recipe.output1 != null) + if(leftStack == null) { + leftStack = new MaterialStack(recipe.output1.material, recipe.output1.amount); + } else { + leftStack.amount += recipe.output1.amount; + } + + if(recipe.output2 != null) + if(rightStack == null ) { + rightStack = new MaterialStack(recipe.output2.material, recipe.output2.amount); + } else { + rightStack.amount += recipe.output2.amount; + } + + if(recipe.byproduct != null) { + + for(int i = 0; i < recipe.byproduct.length; i++) { + ItemStack slot = slots[15 + i]; + ItemStack byproduct = recipe.byproduct[i]; + + if(slot == null) { + slots[15 + i] = byproduct.copy(); + } else { + slots[15 + i].stackSize += byproduct.stackSize; + } + } + } + + this.tanks[3].setFill(this.tanks[3].getFill() - 100); + this.decrStackSize(14, 1); + } + + public int getDurationMetal() { + ElectrolysisMetalRecipe result = ElectrolyserMetalRecipes.getRecipe(slots[14]); + int base = result != null ? result.duration : 600; + int speed = upgradeManager.getLevel(UpgradeType.SPEED) - Math.min(upgradeManager.getLevel(UpgradeType.POWER), 1); + return (int) Math.ceil((base * Math.max(1F - 0.25F * speed, 0.2))); + } + public int getDurationFluid() { + ElectrolysisRecipe result = ElectrolyserFluidRecipes.getRecipe(tanks[0].getTankType()); + int base = result != null ? result.duration : 100; + int speed = upgradeManager.getLevel(UpgradeType.SPEED) - Math.min(upgradeManager.getLevel(UpgradeType.POWER), 1); + return (int) Math.ceil((base * Math.max(1F - 0.25F * speed, 0.2))); + + } + + public int getCycleCount() { + int speed = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + return Math.min(1 + speed * 2, 7); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.power = nbt.getLong("power"); + this.progressFluid = nbt.getInteger("progressFluid"); + this.progressOre = nbt.getInteger("progressOre"); + this.processFluidTime = nbt.getInteger("processFluidTime"); + this.processOreTime = nbt.getInteger("processOreTime"); + if(nbt.hasKey("leftType")) this.leftStack = new MaterialStack(Mats.matById.get(nbt.getInteger("leftType")), nbt.getInteger("leftAmount")); + else this.leftStack = null; + if(nbt.hasKey("rightType")) this.rightStack = new MaterialStack(Mats.matById.get(nbt.getInteger("rightType")), nbt.getInteger("rightAmount")); + else this.rightStack = null; + for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setLong("power", this.power); + nbt.setInteger("progressFluid", this.progressFluid); + nbt.setInteger("progressOre", this.progressOre); + nbt.setInteger("processFluidTime", getDurationFluid()); + nbt.setInteger("processOreTime", getDurationMetal()); + if(this.leftStack != null) { + nbt.setInteger("leftType", leftStack.material.id); + nbt.setInteger("leftAmount", leftStack.amount); + } + if(this.rightStack != null) { + nbt.setInteger("rightType", rightStack.material.id); + nbt.setInteger("rightAmount", rightStack.amount); + } + for(int i = 0; i < 4; i++) tanks[i].writeToNBT(nbt, "t" + i); + + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 5, + yCoord - 0, + zCoord - 5, + xCoord + 6, + yCoord + 4, + zCoord + 6 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public long getPower() { + return this.power; + } + + @Override + public long getMaxPower() { + return maxPower; + } + + @Override + public void setPower(long power) { + this.power = power; + } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] {tanks[1], tanks[2]}; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] {tanks[0], tanks[3]}; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == 0) return new ContainerElectrolyserFluid(player.inventory, this); + return new ContainerElectrolyserMetal(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == 0) return new GUIElectrolyserFluid(player.inventory, this); + return new GUIElectrolyserMetal(player.inventory, this); + } + + @Override + public void receiveControl(NBTTagCompound data) { } + + @Override + public void receiveControl(EntityPlayer player, NBTTagCompound data) { + + if(data.hasKey("sgm")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); + if(data.hasKey("sgf")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, worldObj, xCoord, yCoord, zCoord); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_electrolyser)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (level * 25) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 25) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_DELAY, "+" + (25) + "%")); + } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } + } + + @Override + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; + } + + @Override + public FluidTank getTankToPaste() { + return tanks[0]; + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound tag = new NBTTagCompound(); + if(getFluidIDToCopy().length > 0) + tag.setIntArray("fluidID", getFluidIDToCopy()); + if(getMatsToCopy().length > 0) + tag.setIntArray("matFilter", getMatsToCopy()); + return tag; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + IFluidCopiable.super.pasteSettings(nbt, index, world, player, x, y, z); + } + + @Override + public String[] infoForDisplay(World world, int x, int y, int z) { + ArrayList names = new ArrayList<>(); + int[] fluidIDs = getFluidIDToCopy(); + int[] matIDs = getMatsToCopy(); + + for (int fluidID : fluidIDs) { + names.add(Fluids.fromID(fluidID).getUnlocalizedName()); + } + for (int matID : matIDs) { + names.add(Mats.matById.get(matID).getUnlocalizedName()); + } + + return names.toArray(new String[0]); + } + + @Override + public int[] getMatsToCopy() { + ArrayList types = new ArrayList<>(); + if(leftStack != null) types.add(leftStack.material.id); + if(rightStack != null) types.add(rightStack.material.id); + return BobMathUtil.intCollectionToArray(types); + } +} From ae431a3a9bf1a81f4661a4c3749d8b86f1e443a9 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 6 Jan 2025 18:19:56 +0100 Subject: [PATCH 70/70] can a special weapon have a b-side? --- changelog | 10 +- src/main/java/api/hbm/fluid/PipeNet.java | 3 - .../java/com/hbm/crafting/WeaponRecipes.java | 5 +- .../hbm/entity/mob/glyphid/EntityGlyphid.java | 1 + .../com/hbm/handler/EntityEffectHandler.java | 3 - .../ChunkRadiationHandlerSimple.java | 3 - src/main/java/com/hbm/items/ModItems.java | 4 +- .../sedna/factory/GunFactoryClient.java | 184 +++++++++--------- .../weapon/sedna/factory/XFactory10ga.java | 10 + .../java/com/hbm/main/CraftingManager.java | 4 - .../java/com/hbm/main/ModEventHandler.java | 3 - .../java/com/hbm/main/NetworkHandler.java | 3 - .../java/com/hbm/main/ResourceManager.java | 3 +- .../java/com/hbm/packet/PacketDispatcher.java | 3 - .../com/hbm/particle/ParticlePlasmaBlast.java | 1 + .../weapon/sedna/ItemRenderDoubleBarrel.java | 43 +++- .../TileEntityMachineAssemblerBase.java | 1 - .../machine/pile/TileEntityPileFuel.java | 1 - .../java/com/hbm/util/CompatExternal.java | 6 - src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../{sacred_dragon.png => double_barrel.png} | Bin .../weapons/double_barrel_sacred_dragon.png | Bin 0 -> 11772 bytes 23 files changed, 157 insertions(+), 136 deletions(-) rename src/main/resources/assets/hbm/textures/models/weapons/{sacred_dragon.png => double_barrel.png} (100%) create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/double_barrel_sacred_dragon.png diff --git a/changelog b/changelog index d0f049ef9..01f21f200 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,8 @@ +## The performance update +* my boy gammawave basically did the entire thing +* packet sending should be more performant now, which affects most machines +* RBMKs are now *much* more performant with their simulation and packets + ## Added * 10 gauge slug * Shredder @@ -5,6 +10,7 @@ * Fires 12 gauge, accelerated by plasma, which bursts on impact * Fragments move slowly and have damaging ricochet effects * Fragments keep the effects of the original shell (e.g. explosive shell will spawn a single explosive fragment) +* Other gun stuff ## Changed * Black powder bullets now have 75% base damage instead of 50% @@ -24,4 +30,6 @@ * Fixed rotary furnace not always properly showing the metal pouring effect * Fixed T45 model not lifting its arms when a new gun is held * Like previously, due to the archaic nature of the model, the rotations are not very precise, and will most likely break when holding an akimbo gun -* Potentially fixed an issue where cargo planes do not successfully spawn on lower render distances \ No newline at end of file +* Potentially fixed an issue where cargo planes do not successfully spawn on lower render distances +* Fixed glyphids not calling their `onDeath` function properly, causing them to not drop anything and preventing the appropriate forge events from firing +* Fixed GL state leak caused by plasma blast particles, causing other particles (especially bones) to render weird \ No newline at end of file diff --git a/src/main/java/api/hbm/fluid/PipeNet.java b/src/main/java/api/hbm/fluid/PipeNet.java index f459ee32d..d8a219497 100644 --- a/src/main/java/api/hbm/fluid/PipeNet.java +++ b/src/main/java/api/hbm/fluid/PipeNet.java @@ -1,12 +1,9 @@ package api.hbm.fluid; import java.math.BigInteger; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.HashSet; import java.util.List; -import java.util.TimeZone; import com.hbm.inventory.fluid.FluidType; diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 669a39f54..49777c12d 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -74,7 +74,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_chemthrower, 1), new Object[] { "MHW", "PSS", 'M', WEAPONSTEEL.mechanism(), 'H', RUBBER.pipe(), 'W', ModItems.wrench, 'P', WEAPONSTEEL.heavyBarrel(), 'S', WEAPONSTEEL.shell() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_m2, 1), new Object[] { " G", "BRM", " G", 'G', WOOD.grip(), 'B', FERRO.heavyBarrel(), 'R', FERRO.heavyReceiver(), 'M', WEAPONSTEEL.mechanism() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_autoshotgun, 1), new Object[] { "BRM", "G G", 'B', FERRO.heavyBarrel(), 'R', FERRO.heavyReceiver(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_autoshotgun_shredder, 1), new Object[] { " M ", "MSM", " M ", 'M', BIGMT.mechanism(), 'A', ModItems.gun_autoshotgun }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_autoshotgun_shredder, 1), new Object[] { " M ", "MAM", " M ", 'M', BIGMT.mechanism(), 'A', ModItems.gun_autoshotgun }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_quadro, 1), new Object[] { "BCB", "BMB", "GG ", 'B', FERRO.heavyBarrel(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_lag, 1), new Object[] { "BRM", " G", 'B', ANY_RESISTANTALLOY.lightBarrel(), 'R', ANY_RESISTANTALLOY.lightReceiver(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_minigun, 1), new Object[] { "BMG", "BRE", "BGM", 'B', ANY_RESISTANTALLOY.lightBarrel(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip(), 'R', ANY_RESISTANTALLOY.heavyReceiver(), 'E', ModItems.motor_desh }); @@ -84,7 +84,8 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_fatman, 1), new Object[] { "PPP", "BSR", "G M", 'P', BIGMT.plate(), 'B', BIGMT.heavyBarrel(), 'S', BIGMT.shell(), 'R', BIGMT.heavyReceiver(), 'G', ANY_HARDPLASTIC.grip(), 'M', BIGMT.mechanism() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_tau, 1), new Object[] { " RD", "CTT", "GMS", 'D', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'C', CU.pipe(), 'T', ModItems.coil_advanced_torus, 'G', ANY_HARDPLASTIC.grip(), 'R', BIGMT.lightReceiver(), 'M', BIGMT.mechanism(), 'S', ANY_HARDPLASTIC.stock() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_lasrifle, 1), new Object[] { "LC ", "BRS", "MG ", 'L', ModItems.crystal_redstone, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'B', ANY_BISMOIDBRONZE.lightBarrel(), 'R', ANY_BISMOIDBRONZE.lightReceiver(), 'S', ANY_HARDPLASTIC.stock(), 'M', BIGMT.mechanism(), 'G', ANY_HARDPLASTIC.grip() }); - + CraftingManager.addShapelessAuto(new ItemStack(ModItems.gun_double_barrel_sacred_dragon, 1), new Object[] { ModItems.gun_double_barrel, DictFrame.fromOne(ModItems.item_secret, EnumSecretType.SELENIUM_STEEL) }); + //SEDNA Ammo CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE, 6), new Object[] { "C", "P", "G", 'C', KEY_COBBLESTONE, 'P', Items.paper, 'G', Items.gunpowder }); CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE_AP, 6), new Object[] { "C", "P", "G", 'C', Items.flint, 'P', Items.paper, 'G', Items.gunpowder }); diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java index e335f0614..00162795a 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java @@ -321,6 +321,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { @Override public void onDeath(DamageSource source) { + super.onDeath(source); if(doesInfectedSpawnMaggots() && this.dataWatcher.getWatchableObjectByte(DW_SUBTYPE) == TYPE_INFECTED) { diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index e32fb95ab..19536eace 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -37,9 +37,6 @@ import com.hbm.util.ContaminationUtil.HazardType; import com.hbm.world.biome.BiomeGenCraterBase; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; -import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java b/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java index b63c54b56..d77c6b34b 100644 --- a/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java +++ b/src/main/java/com/hbm/handler/radiation/ChunkRadiationHandlerSimple.java @@ -6,10 +6,7 @@ import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; import com.hbm.config.RadiationConfig; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.AuxParticlePacketNT; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d9ae3f60a..8e563aee3 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -64,8 +64,6 @@ import net.minecraftforge.common.util.EnumHelper; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; -import java.util.function.BiFunction; - public class ModItems { public static void mainRegistry() @@ -1521,6 +1519,7 @@ public class ModItems { public static Item gun_bolter; public static Item gun_folly; public static Item gun_double_barrel; + public static Item gun_double_barrel_sacred_dragon; public static Item ammo_standard; public static Item ammo_secret; @@ -6546,6 +6545,7 @@ public class ModItems { GameRegistry.registerItem(gun_bolter, gun_bolter.getUnlocalizedName()); GameRegistry.registerItem(gun_folly, gun_folly.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel, gun_double_barrel.getUnlocalizedName()); + GameRegistry.registerItem(gun_double_barrel_sacred_dragon, gun_double_barrel_sacred_dragon.getUnlocalizedName()); GameRegistry.registerItem(ammo_standard, ammo_standard.getUnlocalizedName()); GameRegistry.registerItem(ammo_secret, ammo_secret.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index fddf948c1..600dfbd19 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -36,53 +36,54 @@ public class GunFactoryClient { public static void init() { //GUNS - MinecraftForgeClient.registerItemRenderer(ModItems.gun_debug, new ItemRenderDebug()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_pepperbox, new ItemRenderPepperbox()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_light_revolver, new ItemRenderAtlas(ResourceManager.bio_revolver_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_light_revolver_atlas, new ItemRenderAtlas(ResourceManager.bio_revolver_atlas_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_light_revolver_dani, new ItemRenderDANI()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_henry, new ItemRenderHenry()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_greasegun, new ItemRenderGreasegun()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_maresleg, new ItemRenderMaresleg(ResourceManager.maresleg_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_maresleg_akimbo, new ItemRenderMareslegAkimbo()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_maresleg_broken, new ItemRenderMaresleg(ResourceManager.maresleg_broken_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_flaregun, new ItemRenderFlaregun()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_heavy_revolver, new ItemRenderHeavyRevolver(ResourceManager.heavy_revolver_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_heavy_revolver_lilmac, new ItemRenderHeavyRevolver(ResourceManager.lilmac_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_heavy_revolver_protege, new ItemRenderHeavyRevolver(ResourceManager.heavy_revolver_protege_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_carbine, new ItemRenderCarbine()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_am180, new ItemRenderAm180()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_liberator, new ItemRenderLiberator()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_congolake, new ItemRenderCongoLake()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_flamer, new ItemRenderFlamer(ResourceManager.flamethrower_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_flamer_topaz, new ItemRenderFlamer(ResourceManager.flamethrower_topaz_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_flamer_daybreaker, new ItemRenderFlamer(ResourceManager.flamethrower_daybreaker_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_lag, new ItemRenderLAG()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_uzi, new ItemRenderUzi()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_uzi_akimbo, new ItemRenderUziAkimbo()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_spas12, new ItemRenderSPAS12()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_panzerschreck, new ItemRenderPanzerschreck()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_g3, new ItemRenderG3()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_stinger, new ItemRenderStinger()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_chemthrower, new ItemRenderChemthrower()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_m2, new ItemRenderM2()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun, new ItemRenderShredder(ResourceManager.shredder_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_shredder, new ItemRenderShredder(ResourceManager.shredder_orig_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_sexy, new ItemRenderShredder(ResourceManager.sexy_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_quadro, new ItemRenderQuadro()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun, new ItemRenderMinigun(ResourceManager.minigun_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun_lacunae, new ItemRenderMinigun(ResourceManager.minigun_lacunae_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_missile_launcher, new ItemRenderMissileLauncher()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_tesla_cannon, new ItemRenderTeslaCannon()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_stg77, new ItemRenderSTG77()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_tau, new ItemRenderTau()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_fatman, new ItemRenderFatMan()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_lasrifle, new ItemRenderLasrifle()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_coilgun, new ItemRenderCoilgun()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_hangman, new ItemRenderHangman()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_bolter, new ItemRenderBolter()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_folly, new ItemRenderFolly()); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_debug, new ItemRenderDebug()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_pepperbox, new ItemRenderPepperbox()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_light_revolver, new ItemRenderAtlas(ResourceManager.bio_revolver_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_light_revolver_atlas, new ItemRenderAtlas(ResourceManager.bio_revolver_atlas_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_light_revolver_dani, new ItemRenderDANI()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_henry, new ItemRenderHenry()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_greasegun, new ItemRenderGreasegun()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_maresleg, new ItemRenderMaresleg(ResourceManager.maresleg_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_maresleg_akimbo, new ItemRenderMareslegAkimbo()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_maresleg_broken, new ItemRenderMaresleg(ResourceManager.maresleg_broken_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_flaregun, new ItemRenderFlaregun()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_heavy_revolver, new ItemRenderHeavyRevolver(ResourceManager.heavy_revolver_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_heavy_revolver_lilmac, new ItemRenderHeavyRevolver(ResourceManager.lilmac_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_heavy_revolver_protege, new ItemRenderHeavyRevolver(ResourceManager.heavy_revolver_protege_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_carbine, new ItemRenderCarbine()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_am180, new ItemRenderAm180()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_liberator, new ItemRenderLiberator()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_congolake, new ItemRenderCongoLake()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_flamer, new ItemRenderFlamer(ResourceManager.flamethrower_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_flamer_topaz, new ItemRenderFlamer(ResourceManager.flamethrower_topaz_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_flamer_daybreaker, new ItemRenderFlamer(ResourceManager.flamethrower_daybreaker_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_lag, new ItemRenderLAG()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_uzi, new ItemRenderUzi()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_uzi_akimbo, new ItemRenderUziAkimbo()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_spas12, new ItemRenderSPAS12()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_panzerschreck, new ItemRenderPanzerschreck()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_g3, new ItemRenderG3()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_stinger, new ItemRenderStinger()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_chemthrower, new ItemRenderChemthrower()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_m2, new ItemRenderM2()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun, new ItemRenderShredder(ResourceManager.shredder_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_shredder, new ItemRenderShredder(ResourceManager.shredder_orig_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_sexy, new ItemRenderShredder(ResourceManager.sexy_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_quadro, new ItemRenderQuadro()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun, new ItemRenderMinigun(ResourceManager.minigun_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun_lacunae, new ItemRenderMinigun(ResourceManager.minigun_lacunae_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_missile_launcher, new ItemRenderMissileLauncher()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_tesla_cannon, new ItemRenderTeslaCannon()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_stg77, new ItemRenderSTG77()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_tau, new ItemRenderTau()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_fatman, new ItemRenderFatMan()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_lasrifle, new ItemRenderLasrifle()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_coilgun, new ItemRenderCoilgun()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_hangman, new ItemRenderHangman()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_bolter, new ItemRenderBolter()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_folly, new ItemRenderFolly()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex)); //PROJECTILES ammo_debug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); @@ -192,50 +193,51 @@ public class GunFactoryClient { setRendererBulk(LegoClient.RENDER_GRENADE, shell_normal, shell_explosive, shell_ap, shell_du, shell_w9); //TODO: change the sabots //HUDS - ((ItemGunBaseNT) ModItems.gun_debug) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_pepperbox) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_light_revolver) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_light_revolver_atlas) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_henry) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_greasegun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_maresleg) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_maresleg_broken) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_flaregun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_heavy_revolver) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_heavy_revolver_lilmac) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_heavy_revolver_protege) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_carbine) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_am180) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_liberator) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_congolake) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_flamer) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO_NOCOUNTER); - ((ItemGunBaseNT) ModItems.gun_flamer_topaz) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO_NOCOUNTER); - ((ItemGunBaseNT) ModItems.gun_flamer_daybreaker) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO_NOCOUNTER); - ((ItemGunBaseNT) ModItems.gun_uzi) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_spas12) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_panzerschreck) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_g3) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_stinger) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_chemthrower) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_m2) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_autoshotgun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_autoshotgun_shredder) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_autoshotgun_sexy) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_quadro) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_lag) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_minigun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_minigun_lacunae) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_missile_launcher) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_tesla_cannon) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_stg77) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_tau) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_fatman) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_lasrifle) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_coilgun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_hangman) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_bolter) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_folly) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); - ((ItemGunBaseNT) ModItems.gun_double_barrel) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_debug) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_pepperbox) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_light_revolver) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_light_revolver_atlas) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_henry) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_greasegun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_maresleg) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_maresleg_broken) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_flaregun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_heavy_revolver) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_heavy_revolver_lilmac) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_heavy_revolver_protege) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_carbine) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_am180) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_liberator) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_congolake) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_flamer) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO_NOCOUNTER); + ((ItemGunBaseNT) ModItems.gun_flamer_topaz) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO_NOCOUNTER); + ((ItemGunBaseNT) ModItems.gun_flamer_daybreaker) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO_NOCOUNTER); + ((ItemGunBaseNT) ModItems.gun_uzi) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_spas12) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_panzerschreck) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_g3) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_stinger) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_chemthrower) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_m2) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_autoshotgun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_autoshotgun_shredder) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_autoshotgun_sexy) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_quadro) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_lag) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_minigun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_minigun_lacunae) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_missile_launcher) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_tesla_cannon) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_stg77) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_tau) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_fatman) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_lasrifle) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_coilgun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_hangman) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_bolter) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_folly) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_double_barrel) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_double_barrel_sacred_dragon) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_light_revolver_dani) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY_MIRROR, LegoClient.HUD_COMPONENT_AMMO_MIRROR); ((ItemGunBaseNT) ModItems.gun_light_revolver_dani) .getConfig(null, 1).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java index 08fa1c34a..9df3a3a63 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java @@ -46,6 +46,16 @@ public class XFactory10ga { .setupStandardConfiguration() .anim(LAMBDA_DOUBLE_BARREL_ANIMS).orchestra(Orchestras.ORCHESTRA_DOUBLE_BARREL) ).setUnlocalizedName("gun_double_barrel"); + ModItems.gun_double_barrel_sacred_dragon = new ItemGunBaseNT(WeaponQuality.B_SIDE, new GunConfig() + .dura(6000).draw(10).inspect(39).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .rec(new Receiver(0) + .dmg(45F).rounds(2).delay(10).reload(41).reloadOnEmpty(true).sound("hbm:weapon.fire.shotgun", 1.0F, 0.9F) + .mag(new MagazineFullReload(0, 2).addConfigs(g10, g10_shrapnel, g10_du, g10_slug)) + .offset(0.75, -0.0625, -0.1875) + .setupStandardFire().recoil(LAMBDA_RECOIL_DOUBLE_BARREL)) + .setupStandardConfiguration() + .anim(LAMBDA_DOUBLE_BARREL_ANIMS).orchestra(Orchestras.ORCHESTRA_DOUBLE_BARREL) + ).setUnlocalizedName("gun_double_barrel_sacred_dragon"); } public static BiConsumer LAMBDA_RECOIL_DOUBLE_BARREL = (stack, ctx) -> { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index c5eb93ed5..e18be7120 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -23,7 +23,6 @@ import com.hbm.items.ItemEnums.EnumLegendaryType; import com.hbm.items.ItemEnums.EnumPages; import com.hbm.items.ItemEnums.EnumPlantType; import com.hbm.items.ItemGenericPart.EnumPartType; -import com.hbm.items.ModItems; import com.hbm.items.food.ItemConserve.EnumFoodType; import com.hbm.items.machine.ItemArcElectrode.EnumElectrodeType; import com.hbm.items.machine.ItemBattery; @@ -33,7 +32,6 @@ import com.hbm.items.special.ItemHolotapeImage.EnumHoloImage; import com.hbm.items.special.ItemPlasticScrap.ScrapType; import com.hbm.items.tool.ItemDrone.EnumDroneType; import com.hbm.items.tool.ItemGuideBook.BookType; -import com.hbm.util.EnchantmentUtil; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; @@ -50,8 +48,6 @@ import net.minecraftforge.oredict.ShapelessOreRecipe; import java.util.ArrayList; import java.util.List; -import static com.hbm.inventory.OreDictManager.*; - public class CraftingManager { public static void mainRegistry() { diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 878da2f7b..9debc9d25 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -29,8 +29,6 @@ import com.hbm.handler.neutron.NeutronNodeWorld; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.handler.threading.PacketThreading; -import com.hbm.hazard.HazardSystem; -import com.hbm.interfaces.IBomb; import com.hbm.items.IEquipReceiver; import com.hbm.items.ModItems; import com.hbm.items.armor.*; @@ -65,7 +63,6 @@ import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; import cpw.mods.fml.relauncher.ReflectionHelper; import io.netty.buffer.ByteBuf; import io.netty.buffer.PooledByteBufAllocator; -import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.command.CommandGameRule; import net.minecraft.command.ICommand; diff --git a/src/main/java/com/hbm/main/NetworkHandler.java b/src/main/java/com/hbm/main/NetworkHandler.java index e7dad9ced..06ff25dc1 100644 --- a/src/main/java/com/hbm/main/NetworkHandler.java +++ b/src/main/java/com/hbm/main/NetworkHandler.java @@ -21,9 +21,6 @@ import io.netty.handler.codec.CodecException; import io.netty.handler.codec.MessageToMessageCodec; import net.minecraft.entity.player.EntityPlayerMP; -import javax.management.MXBean; -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadInfo; import java.lang.ref.WeakReference; import java.util.EnumMap; import java.util.List; diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 61d0f6441..4efabb02f 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1016,7 +1016,8 @@ public class ResourceManager { public static final ResourceLocation lasrifle_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lasrifle.png"); public static final ResourceLocation hangman_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/hangman.png"); public static final ResourceLocation folly_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/moonlight.png"); - public static final ResourceLocation double_barrel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/sacred_dragon.png"); + public static final ResourceLocation double_barrel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel.png"); + public static final ResourceLocation double_barrel_sacred_dragon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel_sacred_dragon.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 7509d411d..b749cfdd3 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -5,9 +5,6 @@ import com.hbm.main.NetworkHandler; import com.hbm.packet.toclient.*; import com.hbm.packet.toserver.*; -import cpw.mods.fml.common.network.FMLEventChannel; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; public class PacketDispatcher { diff --git a/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java b/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java index 7031aafa5..8f449ef14 100644 --- a/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java +++ b/src/main/java/com/hbm/particle/ParticlePlasmaBlast.java @@ -87,6 +87,7 @@ public class ParticlePlasmaBlast extends EntityFX { GL11.glPolygonOffset(0.0F, 0.0F); GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthMask(true); OpenGlHelper.glBlendFunc(770, 771, 1, 0); GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java index c83cfb1a6..5647da9ae 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java @@ -2,14 +2,22 @@ package com.hbm.render.item.weapon.sedna; import org.lwjgl.opengl.GL11; +import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; public class ItemRenderDoubleBarrel extends ItemRenderWeaponBase { + + protected ResourceLocation texture; + + public ItemRenderDoubleBarrel(ResourceLocation texture) { + this.texture = texture; + } @Override protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.5F; } @@ -34,7 +42,7 @@ public class ItemRenderDoubleBarrel extends ItemRenderWeaponBase { public void renderFirstPerson(ItemStack stack) { ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.double_barrel_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(texture); double scale = 0.375D; GL11.glScaled(scale, scale, scale); @@ -75,7 +83,7 @@ public class ItemRenderDoubleBarrel extends ItemRenderWeaponBase { GL11.glTranslated(0, 0.4375, 0.875); ResourceManager.double_barrel.renderPart("BarrelShort"); - ResourceManager.double_barrel.renderPart("Barrel"); + if(!isSawedOff(stack)) ResourceManager.double_barrel.renderPart("Barrel"); GL11.glPushMatrix(); GL11.glTranslated(0.75, 0, -0.6875); @@ -126,11 +134,19 @@ public class ItemRenderDoubleBarrel extends ItemRenderWeaponBase { @Override public void setupInv(ItemStack stack) { super.setupInv(stack); - double scale = 1.375D; - GL11.glScaled(scale, scale, scale); - GL11.glRotated(25, 1, 0, 0); - GL11.glRotated(45, 0, 1, 0); - GL11.glTranslated(0, 0.5, 0); + if(isSawedOff(stack)) { + double scale = 2D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(-2, 0.5, 0); + } else { + double scale = 1.375D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(0, 0.5, 0); + } } @Override @@ -138,8 +154,17 @@ public class ItemRenderDoubleBarrel extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.double_barrel_tex); - ResourceManager.double_barrel.renderAll(); + Minecraft.getMinecraft().renderEngine.bindTexture(texture); + ResourceManager.double_barrel.renderPart("Stock"); + ResourceManager.double_barrel.renderPart("BarrelShort"); + if(!isSawedOff(stack)) ResourceManager.double_barrel.renderPart("Barrel"); + ResourceManager.double_barrel.renderPart("Buckle"); + ResourceManager.double_barrel.renderPart("Lever"); + ResourceManager.double_barrel.renderPart("Shells"); GL11.glShadeModel(GL11.GL_FLAT); } + + public boolean isSawedOff(ItemStack stack) { + return stack.getItem() == ModItems.gun_double_barrel_sacred_dragon; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java index 8d3e0153d..d0d58dfb4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java @@ -1,6 +1,5 @@ package com.hbm.tileentity.machine; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index b920da829..2d44341e6 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -2,7 +2,6 @@ package com.hbm.tileentity.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; -import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; diff --git a/src/main/java/com/hbm/util/CompatExternal.java b/src/main/java/com/hbm/util/CompatExternal.java index 2bb276490..2a7f1177c 100644 --- a/src/main/java/com/hbm/util/CompatExternal.java +++ b/src/main/java/com/hbm/util/CompatExternal.java @@ -27,12 +27,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.function.BiFunction; - /** * EXTERNAL COMPATIBILITY CLASS - DO NOT CHANGE METHOD NAMES/PARAMS ONCE CREATED * Is there a smarter way to do this? Most likely. Is there an easier one? Probably not. diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 4e4cd8b34..6cd397b09 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2212,6 +2212,7 @@ item.gun_defabricator.name=Defabrikator item.gun_defabricator_ammo.name=Defabrikator-Energiezelle item.gun_detonator.name=Laserzünder item.gun_double_barrel.name=Ein alter Klassiker +item.gun_double_barrel_sacred_dragon.name=Sacred Dragon item.gun_emp.name=EMP-Waffe item.gun_emp_ammo.name=Energiezelle item.gun_euthanasia.name=Euthanasia diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 218b03ef1..4b90f99f7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3020,6 +3020,7 @@ item.gun_defabricator.name=Defabricator item.gun_defabricator_ammo.name=Defabricator Energy Cell item.gun_detonator.name=Laser Detonator item.gun_double_barrel.name=An Old Classic +item.gun_double_barrel_sacred_dragon.name=Sacred Dragon item.gun_emp.name=EMP Gun item.gun_emp_ammo.name=Energy Cell item.gun_euthanasia.name=Euthanasia diff --git a/src/main/resources/assets/hbm/textures/models/weapons/sacred_dragon.png b/src/main/resources/assets/hbm/textures/models/weapons/double_barrel.png similarity index 100% rename from src/main/resources/assets/hbm/textures/models/weapons/sacred_dragon.png rename to src/main/resources/assets/hbm/textures/models/weapons/double_barrel.png diff --git a/src/main/resources/assets/hbm/textures/models/weapons/double_barrel_sacred_dragon.png b/src/main/resources/assets/hbm/textures/models/weapons/double_barrel_sacred_dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccf01cb15abf8989044ff67eeaa5d3c5e674f5a GIT binary patch literal 11772 zcmbVyWl$VZ7v&5N!6CT2TW}8$0uzD-1_?fBfDnQN88kS95AGJ+-EDA!B{&QgEVx6k z<@>6(YIlEZZEaU|zpB?=w{O39?|tW;KH-|`Z}D)bZ~y=Ro~nwH_H$eEeD-5uJYV@Y zr}3W~G#3R`9jxaAie(uF05AYlm0s(3WE}c9mRs%UBF}vfea1Up<%a9DnJ+Ig(%D!@ zLE64qV8W_nzYJ%CnTYV^a$VW;rg>k_h-&5qds60_&v+hpzTC z;#BQ{XwVr~6>okrWts(c+~IwE4Y?dNJZ`&|a5)}(=)6NN#0aOIw@h^Ily@L6Ps?|7 zkNu9{V!aKE@jLtemqX5}cQ{n$h=hU~i-WuZ<@e`fKie-)ef}u^1VFgc>h446sn`mZ z#zT`_(P(mZen3mCoB2@8rcmX!nbSt8?I5~@IKBWt9xv{`*M#Y@3_UX7bY=IIlly#MG*OJ?whY$t zP#Lc`*vy%7b##ZeD6aFI{^7g*Bl23t{n}Rg?vH9ycdboZ*3RKcB9DQ1a%4-Hs(wLFEwRJ^Naa!YF-@&K5ZjCpM@T| z^|F>m?GCBz?a5>QxFprg{T(@eMA9EgEO_l2uST+W-JnZfR37uj$lUhxA6$O%?u~gI zYWsHojoxdczR`WP_u+Z)s^y$}?fP=5_U=~ih+4mHE!fjZjZI{H`6tj{K%yKotild^ z{^0-3i4>S?@2>M7x9P3;-$B@7y}8tTmhizC)4LP?q@}L=TvNG$R}0i^8j{-WPaX8R z4GniA*9}Wod#Yk%jQBGua*x9Vr40=lQ)iG5b9-M-?dc!;Nt{v?)kYsU5&V9;bL<+D z2ors2NJfX>zb*FYJ5qd7#Xjjh45_FX7%7y|MZbPE@*fM;HsPRk0m1Sq#bIJ!DmpIy z4P2eKmR+V~z{^3owbA`FZOl(h{Qc;86!Gv1TUsB&u5F1O`|alf%*2JAO_*Tk3h$MW z&q<%0?;hc}Wrnz@Mr(FW?DLpPH9E)ib-U+|qJEQBUXpwIwPbQIy6_NgdQ_CQwTDm@ z8LAKI30VTrgZ%7P>*mw?KEC7t-*XZ< z0>GDX00RX?o|BPCp7S+la0)SOw)k(_suCKLLSE3!ZN{piJPe4$ydj+QjDcg>UoWf9 z8ftoB2x<{2FaZWAIM697%qs#2h&Wj(AUTO4vp675LRRUoqdue%G(Z8I@B<0}p(GFy zvxrUr;ekzs3HDIp6^gur0d3pxLDUraQ*N~N?fgWqxp|vNpkV-_`dJmufUvcU@7nS( zY(q}jZxy+T3h|pCBAU+<v)*t^x2@1%_bsp(j`5PE898du$6b^(&&tMqumh zsSY(B=DT{F9z(Ms`FW30dGH(<2G%5KIOcVZk|wCf;Drqy>HPk`$sYYHeVm{XgWqoG z$1)bM6T#k4eB-%pNz5IZdN2di&18=OCPZX$02T1J)w-$(5CH_)7a#`o3@~4%4}03_ zLt?d+KtUrC-IC%qTY)4oOYUKUIrhvsr1i65q&bO!7-ki~Laf4m&2U1O*8-l|5^76eVsG67@ zT!|6>O&3QqVzPnPTcA2X8>A8!p@pER>8xQyM#Xl&;|1u9=eoaCfH9!JoUw*cH8mFl zwNYS!b@;|72Z9y-%D)s)zeE!HYSfHX8fUJF?8U0-e1%Z5)M4S zZKsKp@sropoiyyb^QT}o&6$Z-vx0nF?`u6CK$#Qqic#rBS61Zp>XWl*) z1DpOnz%l3Lnqts35RS!0#Zedw@12>O%WX(BCKmsL6+YjLt*P7>+8v(Kz(DA2sXA++ zrn!dT&bC(zy8MX;h;2@jll$QwOG89Vw8&T8)Che|d|5VOzV_rhb9~$3cQP}vBzW&Y>inH_i?nv>WTv|%R=*^(R1sR~z$E`zpvLPdUZk!S5vHSQ!3HxT+gW$Y7 zIY{Ax86BUZyeC%G?XQuZzsQoemlgJ764q}lvXZj&;51*~AG)sd z?yx~JzwA~6n$5DB{qZ*>ZFgkmz5g`B0zUdGxAS1BFd$-c+!UC4ZB^76oAHAPUbzJ)9rzV_cxID^N(p6{^o=VwZI6nGT;=RLg-d8g&WDMv$NiJf{IAC-;4{YD-yu@C=0Z*EM+iQbdg& zg40>HSkyxfP)t3hA;9Q zmK;QBKfa4lInH$_igJdcCYEU$VA|kX*GbTMp7?%R#L$p!bIZJ(?%2Wp>acCgMN#nr z$a0O4yDPMD`UEk(%3<$+L5IczP)`Y3bEpTZ^i-608-5HU4MID9NenD2E3;i96X~vR zP)ey1*nFGMF2y~gVE;Yw7FX`35;NsMEeMXq=&|R=%|=6wYR@Z=X5Y-79Zn;tEPb}- zgUC?t{X2pK#k%R6koEjPaiqR6ePB>`dgS)UQ!c~*{&qB9#&h1~mgXDI-GuKRJwMIK z9bI#JMx6x%$8TXkaVgGosh^z_)106g&yx5KXIh-iKa^zS(|ai@hHCxF`tWX-=!1V9 z8K^l8aIW6g_*|?V$wzkP68qT#REI$3qGd1Wg~g~Ium0)+x|s<~3T~m%6baSI8ztw> z3-Sb9bPs-2KA3=$A0IpIR|h4zj1+&}W@~g+pD@e0uA)<&WKOvO-!J9b89J1UVF?O8 z{lXNtF|QAap<_IGxhInlTGpyyECIj)+q2|MZsgp!0jd{r5S<{-F-gHILY$oheyaYg z>yNAEKS%%^YgtlHvi*eS+?W-B3fwHuQ)>3%5>5Nq|EJqd)_1 zlSNr67lgtvU{I%ioe)8xv%v|85EwXhne8@UGk0?M3`&Jbn{Sl<(d5_wB5q(aI%5Fb4xf8k8l05JWt}i;-!E-zJYI5Da zQRp`{LFvG5OI%i29AX9!si7Lb zEXr%(mU9vy%FNI)f;RU;Z%1H6!#wO_+>E>Zb}K#XpgX z<9By+pd^M5$Ol)KCuDPqJuO|(YFxqFg7Sg87-XoZp2!SHUt3CFvL8{{2- ztP4%)pWLi4&yjY`N}jPO^Q0t?nbJ~CUEN!0z~rpFqUy`n zst2QkDhTHJ&OmC(^-awmFpdbZz?BEJBWk`Ua%FI6gOqf={LK~( zY%6F`0uv(ar>w;zSZI+0#~8l%*46djFsLlu5VYChVR&^u%&KJp1cPnPXhLZjuM)E1 z`ZGazbMV2l;J4F;_>6EirC$weWsyXPJMM~;$p>=fx1L7hf2(%hyzN?c3e7OXlX^37 zfn>+`y^tOMvkH2rhF#q{tY$*4%_E|f6}6+aNl2Xb1D!#Q@4}emSmtk9RD<2z)(sSY zf8RLO_Yz4i5}$&_sa&E~4SJymC^iBx2F1gi^8+BJglmP$8H%VCFQIGaKkFWDrNWKn zRNG#L)a;tH|5b0_1E)UJP8oOJ^Y9tBRxNiT?Fpzt`Sg>dj>0dq_qg z7dyNNv$2D;V@B^uD783+?A~YZtB+AKPICd0Jg{+jQ1`R-QjYGsI(75caVA@Kb#vhR*m zq`oMVp~Nj#)E^YuI`IqZRjl)3&HcyTG1&fOZ84H8vw8Igga8lG!JUrBHT^E$B0Gw{ z&R?eC5B8hWR>WCDHxs+SfNJ*%PY?nMer3v8q2?cX3bGr|i3?vKv&l&CsGAeNMDin^ zF@_E3L6n$L*f_hJ@*^?rK5qQQsCa@#`2e{-pNd`o@UI*X^ToLfzXpP4 z5)+w9sg2{)$`xU>76n3#OK!B^#?^R;lOlO|`0VyttF{dLs0v#St_u0P3iwvMvzT66 zSQ$$bQn4MCFfReocIj)l zJ2y8Hosy3<(Hf-;<*#((&#utxESb+tvEX7Z%=|lb5~9~OiTi{^%mUdH2-F`!GSnz9 zK7HBp$7`|wNKr;q_qG1FLt7=J^EEgdiJ_?2Vc@(06W%;a?)m{(+gL&>C>M}*Tno&8 zwb$`LQEe_Vp8IOS8Zl|e`MZuP)=~wPsYSh zWt(3M3?T&K6{wtalE?zt6=hw^Wf+)O)8C7ER4MFy527V9Y&8U&H0f0- zaL6}@P9ifh*9VHfEPtqsN7$MmTP=&^AV3BcCzHK`dcb*P*4 zzl{%iwgEr?VE}qVwh047YT!KQRK|k?5bn<%+Ib2JC8ao^y3p|z^&{|UJQBR1GMB4M zPe({pu1V!W!ua_E`_FeiY^lrTAznPn|I)Bdx-jxS;!kP<*E|_{SKS8FhbdpIdOCcL zg=OQavc&%5#=dPGa1ed_`SFI(yg!AL2zsJ0Hp|-f*0L&NRNWBB#RkBbc*0Je1aH5p zHx8XMHRT_C*B4Kc>)O`XTbql7iGO8&*ft9d`z|`kXySESm2&L$v{d3~*c?$fZct<3 z^3~EKgJodoofMIE9py3V8m@Iia19yKyFQ9j=HFJl)<_0Q-@B(TMe$x>ph_|KW2rYY zyZAoH^S~>`Vw!oNLi4YH%$`sdbi0hWE{mPj=bu{9epD1UAlxGX!+!)i1FftUDyxyq z2IANn^8Z8a=($}>9m7)y!|nq^VOkMa92o}tG_a9G)Zi5S_D?RQny`!KMew~;MStdV z%pl zsj^P?Y|;mwszRl@0YcpYn^p8dtpk0~!j6=GRg%OoDg~|Jp|Xs3=>w%04vfi9}?2@8t#6?C+$OJbv3ndGviD*SoEykVi9i(+~jiqZHSo|-`shA0uOOp zT#VN^pIyA>I7ogSnK z;FPHLYLqRkxy7fA$Ql-4GV)Y3ZAK))Pb%i=COlhFS0Yu$W-2%(MX;(qBqT5yLAVEFqy1lP<)=)Xn(_wxPU;~3$#PYOB?+v^<$EjPuecuP6iBbWb6%_Fj-J zBPGQE0HImy(@zob(pF&3C-y9#qfFvEwjjpPQiy#I zQH?%?z2-htt-uPaxt2Wh+d&mg#~2W2w7L=6!vG$#19e16JT{t^ z&$3Xb#_j2HG0!MoJvoSS8?))oS-o?E)YI(zUL3Bm7_C36dfHy94bl<}VzXxlPJbh- zRbq;($8Oi6)H1+g9j4wx6K(AF7k?yqF5MyU1IM$*8 zpGH60ak@g^5)S>{ZV|^sg^f|?{XxJWv~O|m^U0}(uO_b^aDXrdWr?E16W_IzokAYT>D9kknqi`8(#HA&IGyMBPxZqJ7dMozU3Mxq%=Gq{6bgR3OsAGU6i$ zdw+l5N{1=Izk*OAUPT5!@y0{pS0psr;}lN#5|F|~1*Bl1k5#f13&BFq@|kdUgb|g* zzVm2AdK2)6^dGQ-^P&;7OsvkQ4x);zCKN1;{tBksYOKL0#5dbA(czs zv+)csKukvu*t$A~DoGDe(*}s9Ga29m_Nl1_(!^$2&50cy94tgPB^XfwhKzRTA9TaA zBDX7R1%$rC`O%I_UQn{cd3fs%DCF5nv10Rj8T%ScsKz{9JkEX*zk%bsC2tAO$dVIT?g)+c zI5Kfs07qZK8zT|YV?;-!^>7=Bp&J{A&uZ1u>Rw2SnS*($MD2f#dD}kv0gp&C(NkLcv$w+nF^rl9}-y+n$ zpc2bH5G5gykwxdF%?y_^fb1FEvhFAAkv~kmvH_1kByu+?QY{}%z88}(_W$Mjid!mj z4DN+76CeL%R0Y$mcLnE=_E0o2{LK-myLG|FiH#lFo{G!eH85=*rL$|B7nbY#D7xrA zZ|^Q=%|o#_G6K!P?WJQui}~SbRv#kxQeiiuQ43ajPcd%r+mN}i)iy-*J*vrq-Rs}n z0}NRlz2Dl26itMdtm{0gaCy00Z`PSK8sqkktop_+%7NUWEEkCoEi{iE-~Qhz~c_~Bw+=wlCN7&`Mq z{)B1EXPUF!>#C_QA?!~%iZaZ6!)P2O^iD028~2xp-;gRa^d8EYBGl;tz%NXPg*wX4_<4$*?>2F7)wj- zwG6Ixhk)FZEHii%{3QD9eXRyqNa9R-E&4^$^M}h1ro)a#YmPmF#I0c~0AHee$fR46@!Rd%_5v=%$DQ7mc6CjQ(p2K|% z37((2&}lg^?yxzM&+-5s^OkBX>N7z7k10XXxGiU(xkMp=OtaAF=3-T#J|Ks=Lr6CBc*Leq2}>xbsGcu3T>F#e zeRlQ7Vsqn(J58Z&9+P)9d5_`Gnt`JKXaRa9BYHzN42h|^US)X5a?~XVy~JCyj0lR& zYv2m3HQrzUZljG+%*Mdv6RTm$Q!i@D&3Hnrtq$+>{5MpfeMWrLAY2DcKy(pu`e z5D`Kht9eq@m9CX$mOJ+?C z%gF&jDYb(Vqo3(%M^FifGs#w1Q$YD;lqY0iX`m7{dAOVcJ9a<&enIt9ZhQG1p$8>7 z5mrSCJ7GSD_=oIf&*RYutr?NOtyRhh($ODyfCP(s2})DgEWhWK6lgUlx4QCjW+ ziyVNNB9_2ncW9#rN*+raBQ+;HlBlE;BQ>sWDP!fk_+1soJI|duu}GuZI1?{UbE1N} zg2+(U0YGU2Pqrx{JCo3YBdhuYEqpk?zjr+EjSp+ZZG)j5#hg>WqIPeo<##MFGj^d% z5|+wu_$?bUO6hVvRy00{(#Yq*4M9j`;Xg$+dumPm%m-T?7!W8#2r_w3!uF%8oL-{b zkCX6E-qE$)bt|H}omNV5u#+Z^e*E?2F3t+K#d}k+J>+NBsBWUmZhJDUW7UZ>Au@5> zvFBViE0tBG9Zz6YSd0JdW^naEhLvFT0c-GBoPA~Hwa=7^(9ybd`?Z#Zb|3+^K{VH~ z@uHWh`!*y~o69df{?P}CRQ|qTB3~tDsH>Yxf3?;0_-$(@Am;i6m7SSwg%|%-NJCv~ z2(c9&y>xrbMhQZt5Ir@45cxZDQ%{?!;&=os+CsKh&+BY}MU)$dN94e7k#1iLeVxNz zhXv`%nmH&`ly_*$vm6Yu1Jz_7CgH8TYhfSEu#$YGRBx>3b?g}o5Z~J@(Xf8~np;yv zB_g4WREB>?=(`*)JIqB|Wb#&F71bY&D?J6sLB8XjSuAMQ*3+IDE%%?`pESoVTeyW{ z9hl{%9JDM^9L5aWnOx?Z{6~}P8Q*7l8gu%;#3%b4Gn&|)i2UhD z5ISY1&UYb8q!1qrqFSUdx9~)^M|v6bQ^;^MeAVFtZt>EPxCOJ$a2dnIw77B=kVKL; zdx}0q(?!R7=x3=uxm{H}gr+J5WO&~!=bbt(1QMSPPDaJ1i>?HjJdTaKjtSg_0lHM0spc<&X!v-E$FO7^-NVJhLq5(K?lwokJ{r&d~R|2n&qNZ%6 zHqw{`Tf`Hj;$z}*UG84>bT9grDO9|qap)?;yu3qvO5Bv=>bT25P}mEU|75c;zJuig z6O1SZz9h-An7DWVog1O*vl6~eAOTVKw>}9BK>&!(-qMbPY~ivaWb>%CQtoX9(XZxr zn%!3iB@GRcVwPZ9ut;~MlS7V{VUm@x&=DNUIroP)p3#JZ7}T3ETKM|k+&C47qvdRv zjI&yk8W8oSbU$lK3aq?GdW)37gg>{w@Ma|by@ zX;$@&F$uS|o^aDY2L-Ms<+PQVd}P!&HYCR*xB4yf?CVI4NmbaG_QtKq?tYSXrv(`a zqaKvQTio+Ko3IO$^{7p4B_JmL&-;-OhSP0p!jIO>KQE_zEByq2OvF@mJQQ7@NjXM- zA2}kRzB4>JKcbcDA&|KT80ZaWrDRMB1Spuh6~P9vf^wi$d{RDZic(h_r{3u=G(+fE+Tv1#Zt3)xQ4RNtmLNsDCEN z_xUn&;YPy1f|53B=9b3DYA8Ivzv$_v#J+Q>p(&fLFy89T0QCxzo9w0_`N)&|@*OGY zj8H*-&h2Kl>5)vg|Bh8+Cun)>!HphE9!#@d6V1Ujq-9vhGqX~baH9MX$1~D-{6|3L zW_kNwD|#=+@dOK{mj(04G&1h_XTf?D8PD~&C&82uK7e~cGA5I-Nri;bl}Og3B}XSb zhQwLOu7WcrxLX>-a$2q6>>7a}FL1$U#J#qY%$!$0_*}*0v1Hz(vU(CC#xpMDM*FN^ z<35*8oG#{?-P3u7GW-yBAT=kBU_W4TNQ%q;z4rF$2`8hl$=~Xhq*Ox4$1om1fxNor zND_r0F|Z}%o&Pmc#Zkmj_3oGgo9J;u(A}_~9a#CZ&b*zAjuP zNcVT47y%$xW!^R=Whr;evNm4V`}oDR_V@krOs6#;G}dTVmy9J*$GAnH2Ok&v+i|Mh zAx=*uaKSqUbfI|H%UxsLjq~A7autZ!A$}vedyrc99cIKr)u6B=Lr4yJhYkq-QxVsl zi%AqpX=o>JU!Q4O{E)@skeK^4uqju9KeBceh|at+?-21D*J*b|RRLD>v>_rdYv%L4 z`FnxT684uw$RZW1Jdq9@(Q7MiUtO#HiZ(VL=3?s~&vQ!qtW?r%VKPe^m1RV$Hxb^c zcw>C6&>*1`CTQ+b*E3V5mm4(zwL(vHyGKUf7Tf6UgrRlBjeqL_m^0AvXW=g2XOd-YyfjlN$%0Kp==mo>1 zQf(yFXm)OmTFz*)d~d_4DePJadA@9Rk*V)SNL8xz|Frhj;7H?F5?5&WItI3P zPyV;gOZk{4(`SbcesBLsaSeSYO8a`$EvAPPj))W3WyJs6eUTzS_HqkWlQ}_{5J!hP zzT$o)uS9~61Ch$MQd9QA6<6b(=rD8Gse}Dja`<9F=F2_y@3Vs^lZhSjr^~91|Hxgk zZzue!^9R3q$==CSmGgG3Zqod|cGcgh`*mGjVQe%hI1ehgrb>;f!B#rBhBkUXnbUrg z9PjDNs&_1mdGYJoRe1idcVnN=6~)bHq?9&E>4R|2c45TU28*nE*EJDG@cuT7}p~=4}ED^kghu)PYd~F-J$?< z?lH%tm{ZPFNzmv!Df*>bOI!%VTl151(X*7~`Ndl9euf~;mipTJ$3wc+y<3{!o`=`s zMY(7VAJqO8NFfR|yiQUsRM|7A)Y29PgC1(5`P$w0dmqT1Znrz5#jMGGTNVuZyEJ8@ zR*UuNKdTc4uPw^&B(n3n|I^=59o=}IF&cB+uRk~*m^Sd%J#3SXUgEll8{n^Zyu5b3 ze(ZP)9r&9WIYEDMOGD}|A{+0#H*Hxw*XP@n?F7BMG^Rg3_=Tf2o0RcC9$%u^S6-ZMSob~~5aY$`Jlyu!NwYcm zd*GX4-x;m=7k zviiL)@!IE0zRGR(+Ba4u9_DN+wSP+MbziIvvyV~KFu9v0$9APLY8@#KC z;JME$jjT8{P<}tPl*K%D+)>Ageaa)d9?JrDv{B`jOy?{%g0$y^!0vOWyAY%&l?rBo{{xP_qw4?w literal 0 HcmV?d00001