From ca9d8e74e0a52a5844a5c105ae5ace8111c348aa Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 4 Nov 2023 23:31:20 +0100 Subject: [PATCH] i wonder if the sky people like me --- changelog | 3 + .../blocks/generic/BlockLanternBehemoth.java | 10 ++- .../hbm/blocks/machine/MachineWoodBurner.java | 21 +++++- .../java/com/hbm/extprop/HbmPlayerProps.java | 4 ++ .../HazardTransformerRadiationContainer.java | 17 ++++- .../inventory/gui/GUIMachineWoodBurner.java | 4 +- .../java/com/hbm/items/tool/ItemWandD.java | 12 ++-- .../java/com/hbm/main/CraftingManager.java | 3 +- src/main/java/com/hbm/main/MainRegistry.java | 5 +- .../com/hbm/main/ModEventHandlerImpact.java | 16 +++++ .../deco/TileEntityLanternBehemoth.java | 17 ++++- .../machine/TileEntityMachineRadar.java | 37 ++++------- .../machine/TileEntityMachineWoodBurner.java | 57 +++++++++++++++- .../storage/TileEntityMachineBattery.java | 61 +++++++++++++----- .../storage/TileEntityMachineFENSU.java | 6 +- src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../models/machines/strand_caster.png | Bin 0 -> 10757 bytes 18 files changed, 218 insertions(+), 61 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/models/machines/strand_caster.png diff --git a/changelog b/changelog index 6f1c1771c..f25cb1cf0 100644 --- a/changelog +++ b/changelog @@ -25,6 +25,9 @@ * the industrial generator now has three additional ports on its underside, meaning it is now a lot easier to properly automate all necessary IO * Neodymium is now a valid crucible material * Particle accelerators will now evenly distribute items using IO if both inputs are equal, making the antischrabidium recipe a lot easier to automate +* Due to multiple complaints regarding the plastic bag's ability to contain radiation, plastic bags now *double* the radiation of the item they contain +* The post impact spawning restrictions have changed, meaning that spawning things with spawn eggs is no longer broken. Due to technical limitations, this means that post impact, no mobs will spawn as part of world gen, only via random spawns. +* All energy storage blocks now have a fixed transfer limit of 5% of their capacity per tick, reducing the impact of ping-ponging considerably ## Fixed * Pipe and power networks now force the chunk to be saved on transfer, ensuring that rapid changes in the fluid/energy level aren't lost when the tile entity is unloaded diff --git a/src/main/java/com/hbm/blocks/generic/BlockLanternBehemoth.java b/src/main/java/com/hbm/blocks/generic/BlockLanternBehemoth.java index b90c1ad44..843a7c7b7 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockLanternBehemoth.java +++ b/src/main/java/com/hbm/blocks/generic/BlockLanternBehemoth.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; +import com.hbm.extprop.HbmPlayerProps; import com.hbm.tileentity.IRepairable; import com.hbm.tileentity.deco.TileEntityLanternBehemoth; @@ -48,7 +49,14 @@ public class BlockLanternBehemoth extends BlockDummyable implements IToolable, I 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.TORCH) return false; - return IRepairable.tryRepairMultiblock(world, x, y, z, this, player); + boolean didRepair = IRepairable.tryRepairMultiblock(world, x, y, z, this, player); + + if(didRepair) { + HbmPlayerProps data = HbmPlayerProps.getData(player); + data.reputation++; + } + + return didRepair; } @Override diff --git a/src/main/java/com/hbm/blocks/machine/MachineWoodBurner.java b/src/main/java/com/hbm/blocks/machine/MachineWoodBurner.java index acc5658a2..246fb20b0 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineWoodBurner.java +++ b/src/main/java/com/hbm/blocks/machine/MachineWoodBurner.java @@ -1,15 +1,20 @@ 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.TileEntityMachineWoodBurner; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class MachineWoodBurner extends BlockDummyable { +public class MachineWoodBurner extends BlockDummyable implements ITooltipProvider { public MachineWoodBurner(Material mat) { super(mat); @@ -36,4 +41,18 @@ public class MachineWoodBurner extends BlockDummyable { 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 - dir.offsetX, y, z - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX + rot.offsetX, y, z - dir.offsetZ + rot.offsetZ); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/extprop/HbmPlayerProps.java b/src/main/java/com/hbm/extprop/HbmPlayerProps.java index 46d4c4a95..f51905229 100644 --- a/src/main/java/com/hbm/extprop/HbmPlayerProps.java +++ b/src/main/java/com/hbm/extprop/HbmPlayerProps.java @@ -41,6 +41,8 @@ public class HbmPlayerProps implements IExtendedEntityProperties { public int lastDamage = 0; public static final float shieldCap = 100; + public int reputation; + public HbmPlayerProps(EntityPlayer player) { this.player = player; } @@ -157,6 +159,7 @@ public class HbmPlayerProps implements IExtendedEntityProperties { props.setFloat("maxShield", maxShield); props.setBoolean("enableBackpack", enableBackpack); props.setBoolean("enableHUD", enableHUD); + props.setInteger("reputation", reputation); nbt.setTag("HbmPlayerProps", props); } @@ -172,6 +175,7 @@ public class HbmPlayerProps implements IExtendedEntityProperties { this.maxShield = props.getFloat("maxShield"); this.enableBackpack = props.getBoolean("enableBackpack"); this.enableHUD = props.getBoolean("enableHUD"); + this.reputation = props.getInteger("reputation"); } } } diff --git a/src/main/java/com/hbm/hazard/transformer/HazardTransformerRadiationContainer.java b/src/main/java/com/hbm/hazard/transformer/HazardTransformerRadiationContainer.java index f91e4e51f..a60d2ff38 100644 --- a/src/main/java/com/hbm/hazard/transformer/HazardTransformerRadiationContainer.java +++ b/src/main/java/com/hbm/hazard/transformer/HazardTransformerRadiationContainer.java @@ -23,8 +23,9 @@ public class HazardTransformerRadiationContainer extends HazardTransformerBase { boolean isCrate = Block.getBlockFromItem(stack.getItem()) instanceof BlockStorageCrate; boolean isBox = stack.getItem() == ModItems.containment_box; + boolean isBag = stack.getItem() == ModItems.plastic_bag; - if(!isCrate && !isBox) return; + if(!isCrate && !isBox && !isBag) return; if(!stack.hasTagCompound()) return; float radiation = 0; @@ -54,6 +55,20 @@ public class HazardTransformerRadiationContainer extends HazardTransformerBase { radiation = (float) BobMathUtil.squirt(radiation); } + if(isBag) { + + ItemStack[] fromNBT = ItemStackUtil.readStacksFromNBT(stack, 1); + if(fromNBT == null) return; + + for(ItemStack held : fromNBT) { + if(held != null) { + radiation += HazardSystem.getHazardLevelFromStack(held, HazardRegistry.RADIATION) * held.stackSize; + } + } + + radiation *= 2F; + } + if(radiation > 0) { entries.add(new HazardEntry(HazardRegistry.RADIATION, radiation)); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java b/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java index fbf3f19cc..977f11d20 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineWoodBurner.java @@ -49,7 +49,7 @@ public class GUIMachineWoodBurner extends GuiInfoContainer { } } - if(burner.liquidBurn) burner.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 70, guiTop + 28, 34, 52); + if(burner.liquidBurn) burner.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 18, 16, 52); if(!burner.liquidBurn && guiLeft + 16 <= mouseX && guiLeft + 16 + 8 > mouseX && guiTop + 17 < mouseY && guiTop + 17 + 54 >= mouseY) { func_146283_a(Arrays.asList(new String[] { (burner.burnTime / 20) + "s" }), mouseX, mouseY); @@ -110,6 +110,6 @@ public class GUIMachineWoodBurner extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 17, guiTop + 70 - b, 192, 52 - b, 4, b); } - if(burner.liquidBurn) burner.tank.renderTank(guiLeft + 70, guiTop + 80, this.zLevel, 34, 52); + if(burner.liquidBurn) burner.tank.renderTank(guiLeft + 80, guiTop + 70, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 88a0522c8..2c76d2e96 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -4,6 +4,7 @@ import java.util.List; import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.lib.Library; +import com.hbm.saveddata.TomSaveData; import com.hbm.util.TrackerUtil; import net.minecraft.entity.player.EntityPlayer; @@ -41,11 +42,11 @@ public class ItemWandD extends Item { TimeAnalyzer.endCount(); TimeAnalyzer.dump();*/ - /*TomSaveData data = TomSaveData.forWorld(world); - data.impact = false; + TomSaveData data = TomSaveData.forWorld(world); + data.impact = true; data.fire = 0F; data.dust = 0F; - data.markDirty();*/ + data.markDirty(); /*EntityTomBlast tom = new EntityTomBlast(world); tom.posX = pos.blockX; @@ -54,16 +55,17 @@ public class ItemWandD extends Item { tom.destructionRange = 600; world.spawnEntityInWorld(tom);*/ - EntityNukeTorex torex = new EntityNukeTorex(world); + /*EntityNukeTorex torex = new EntityNukeTorex(world); torex.setPositionAndRotation(pos.blockX, pos.blockY + 1, pos.blockZ, 0, 0); torex.setScale(1.5F); torex.setType(1); world.spawnEntityInWorld(torex); + TrackerUtil.setTrackingRange(world, torex, 1000);*/ + /*EntityTracker entitytracker = ((WorldServer) world).getEntityTracker(); IntHashMap map = ReflectionHelper.getPrivateValue(EntityTracker.class, entitytracker, "trackedEntityIDs", "field_72794_c"); EntityTrackerEntry entry = (EntityTrackerEntry) map.lookup(torex.getEntityId()); entry.blocksDistanceThreshold = 1000;*/ - TrackerUtil.setTrackingRange(world, torex, 1000); //world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, 150, pos.blockX, pos.blockY + 1, pos.blockZ)); //DungeonToolbox.generateBedrockOreWithChance(world, world.rand, pos.blockX, pos.blockZ, EnumBedrockOre.TITANIUM, new FluidStack(Fluids.SULFURIC_ACID, 500), 2, 1); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 4c7e39863..e7ee854ca 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -292,7 +292,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.capacitor_niobium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', RUBBER.ingot(), 'C', NB.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_tantalium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', TA.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_schrabidate, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', SBD.block(), 'W', STEEL.ingot() }); - addRecipeAuto(new ItemStack(ModBlocks.machine_coal_off, 1), new Object[] { "STS", "SCS", "SFS", 'S', STEEL.ingot(), 'T', ModItems.tank_steel, 'C', MINGRADE.ingot(), 'F', Blocks.furnace }); + //addRecipeAuto(new ItemStack(ModBlocks.machine_coal_off, 1), new Object[] { "STS", "SCS", "SFS", 'S', STEEL.ingot(), 'T', ModItems.tank_steel, 'C', MINGRADE.ingot(), 'F', Blocks.furnace }); + addRecipeAuto(new ItemStack(ModBlocks.machine_wood_burner, 1), new Object[] { "PPP", "CSC", "IFI" , 'P', STEEL.plate528(), 'C', ModItems.coil_copper, 'S', ModItems.hull_small_steel, 'I', IRON.ingot(), 'F', Blocks.furnace}); addRecipeAuto(new ItemStack(ModBlocks.machine_boiler_off, 1), new Object[] { "SPS", "TFT", "SPS", 'S', STEEL.ingot(), 'P', ModItems.board_copper, 'T', ModItems.tank_steel, 'F', Blocks.furnace }); addRecipeAuto(new ItemStack(ModBlocks.machine_boiler_electric_off, 1), new Object[] { "SPS", "TFT", "SPS", 'S', DESH.ingot(), 'P', ModItems.board_copper, 'T', ModItems.tank_steel, 'F', ModBlocks.machine_electric_furnace_off }); addRecipeAuto(new ItemStack(ModBlocks.machine_turbine, 1), new Object[] { "SMS", "PTP", "SMS", 'S', STEEL.ingot(), 'T', ModItems.turbine_titanium, 'M', ModItems.coil_copper, 'P', ANY_PLASTIC.ingot() }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 9dc506768..8d392574b 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -5,9 +5,7 @@ import com.hbm.blocks.BlockEnums.EnumStoneType; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockMotherOfAllOres; import com.hbm.blocks.generic.BlockToolConversion; -import com.hbm.commands.CommandDebugChunkLoad; -import com.hbm.commands.CommandReloadRecipes; -import com.hbm.commands.CommandSatellites; +import com.hbm.commands.*; import com.hbm.config.*; import com.hbm.crafting.RodRecipes; import com.hbm.creativetabs.*; @@ -924,6 +922,7 @@ public class MainRegistry { event.registerServerCommand(new CommandReloadRecipes()); event.registerServerCommand(new CommandDebugChunkLoad()); event.registerServerCommand(new CommandSatellites()); + event.registerServerCommand(new CommandRadiation()); } @EventHandler diff --git a/src/main/java/com/hbm/main/ModEventHandlerImpact.java b/src/main/java/com/hbm/main/ModEventHandlerImpact.java index d371296af..7f178531f 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerImpact.java +++ b/src/main/java/com/hbm/main/ModEventHandlerImpact.java @@ -35,6 +35,7 @@ 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.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate; import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType; import net.minecraftforge.event.world.WorldEvent; @@ -109,17 +110,32 @@ public class ModEventHandlerImpact { if(event.world.provider.dimensionId == 0) { if(event.entityLiving.height >= 0.85F || event.entityLiving.width >= 0.85F && !(event.entity instanceof EntityWaterMob) && !event.entityLiving.isChild()) { event.setResult(Result.DENY); + event.entityLiving.setDead(); } } if(event.entityLiving instanceof EntityWaterMob) { Random rand = new Random(); if(rand.nextInt(5) != 0) { event.setResult(Result.DENY); + event.entityLiving.setDead(); } } } } } + + @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) { diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java index ca5731bb2..3a4b8a49e 100644 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java +++ b/src/main/java/com/hbm/tileentity/deco/TileEntityLanternBehemoth.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.hbm.entity.missile.EntityBobmazon; +import com.hbm.extprop.HbmPlayerProps; import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; @@ -15,6 +16,7 @@ import com.hbm.tileentity.IRepairable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -39,6 +41,9 @@ public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketR 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); + boolean bonus = first == null ? false : (HbmPlayerProps.getData(first).reputation >= 10); EntityBobmazon shuttle = new EntityBobmazon(worldObj); shuttle.posX = xCoord + 0.5 + worldObj.rand.nextGaussian() * 10; shuttle.posY = 300; @@ -48,7 +53,7 @@ public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketR new ItemStack(ModItems.circuit_copper, 4 + worldObj.rand.nextInt(2)), new ItemStack(ModItems.circuit_red_copper, 2 + worldObj.rand.nextInt(3)), new ItemStack(ModItems.circuit_gold, 1 + worldObj.rand.nextInt(2)), - worldObj.rand.nextInt(3) == 0 ? new ItemStack(ModItems.gem_alexandrite) : new ItemStack(Items.diamond, 6 + worldObj.rand.nextInt(6)), + bonus ? new ItemStack(ModItems.gem_alexandrite) : new ItemStack(Items.diamond, 6 + worldObj.rand.nextInt(6)), new ItemStack(Blocks.red_flower)); shuttle.payload = payload; @@ -64,6 +69,16 @@ public class TileEntityLanternBehemoth extends TileEntity implements INBTPacketR INBTPacketReceiver.networkPack(this, data, 250); } } + + @Override + public void invalidate() { + super.invalidate(); + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord - 50, yCoord - 50, zCoord - 50, xCoord + 51, yCoord + 51, zCoord + 51)); + for(EntityPlayer player : players) { + HbmPlayerProps props = HbmPlayerProps.getData(player); + if(props.reputation > -10) props.reputation--; + } + } @Override public void networkUnpack(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadar.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadar.java index 074ce8f29..e543f4fd5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadar.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadar.java @@ -34,7 +34,7 @@ import li.cil.oc.api.network.SimpleComponent; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityMachineRadar extends TileEntityTickingBase implements IEnergyUser, IGUIProvider, SimpleComponent { - public List entList = new ArrayList(); + public List detectedEntities = new ArrayList(); public List nearbyMissiles = new ArrayList(); int pingTimer = 0; int lastPower; @@ -61,8 +61,7 @@ public class TileEntityMachineRadar extends TileEntityTickingBase implements IEn @Override public void updateEntity() { - if(this.yCoord < WeaponConfig.radarAltitude) - return; + if(this.yCoord < WeaponConfig.radarAltitude) return; if(!worldObj.isRemote) { @@ -71,17 +70,13 @@ public class TileEntityMachineRadar extends TileEntityTickingBase implements IEn nearbyMissiles.clear(); if(power > 0) { - allocateMissiles(); - power -= 500; - if(power < 0) - power = 0; + if(power < 0) power = 0; } - if(this.lastPower != getRedPower()) - worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); + if(this.lastPower != getRedPower()) worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); sendMissileData(); lastPower = getRedPower(); @@ -96,12 +91,8 @@ public class TileEntityMachineRadar extends TileEntityTickingBase implements IEn } } } else { - prevRotation = rotation; - - if(power > 0) { - rotation += 5F; - } + if(power > 0) rotation += 5F; if(rotation >= 360) { rotation -= 360F; @@ -123,7 +114,7 @@ public class TileEntityMachineRadar extends TileEntityTickingBase implements IEn private void allocateMissiles() { nearbyMissiles.clear(); - entList.clear(); + detectedEntities.clear(); jammed = false; List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, AxisAlignedBB.getBoundingBox(xCoord + 0.5 - WeaponConfig.radarRange, 0, zCoord + 0.5 - WeaponConfig.radarRange, xCoord + 0.5 + WeaponConfig.radarRange, 5000, zCoord + 0.5 + WeaponConfig.radarRange)); @@ -136,27 +127,27 @@ public class TileEntityMachineRadar extends TileEntityTickingBase implements IEn if(e instanceof EntityLivingBase && HbmLivingProps.getDigamma((EntityLivingBase) e) > 0.001) { this.jammed = true; nearbyMissiles.clear(); - entList.clear(); + detectedEntities.clear(); return; } if(e instanceof EntityPlayer && this.scanPlayers) { nearbyMissiles.add(new int[] { (int)e.posX, (int)e.posZ, RadarTargetType.PLAYER.ordinal(), (int)e.posY }); - entList.add(e); + detectedEntities.add(e); } if(e instanceof IRadarDetectable && this.scanMissiles) { nearbyMissiles.add(new int[] { (int)e.posX, (int)e.posZ, ((IRadarDetectable)e).getTargetType().ordinal(), (int)e.posY }); if(!this.smartMode || e.motionY <= 0) - entList.add(e); + detectedEntities.add(e); } } } public int getRedPower() { - if(!entList.isEmpty()) { + if(!detectedEntities.isEmpty()) { /// PROXIMITY /// if(redMode) { @@ -165,9 +156,9 @@ public class TileEntityMachineRadar extends TileEntityTickingBase implements IEn int power = 0; - for(int i = 0; i < entList.size(); i++) { + for(int i = 0; i < detectedEntities.size(); i++) { - Entity e = entList.get(i); + Entity e = detectedEntities.get(i); 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); @@ -315,8 +306,8 @@ public class TileEntityMachineRadar extends TileEntityTickingBase implements IEn public Object[] getEntities(Context context, Arguments args) { //fuck fuck fuck if(!jammed) { List list = new ArrayList(); - list.add(entList.size()); // small header of how many entities in the list - for (Entity e : entList) { + list.add(detectedEntities.size()); // small header of how many entities in the list + for (Entity e : detectedEntities) { list.add(e.posX); // positions list.add(e.posY); list.add(e.posZ); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java index a818bb0ef..287c0c592 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java @@ -5,6 +5,7 @@ import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.container.ContainerMachineWoodBurner; +import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Flammable; @@ -40,6 +41,7 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement public boolean isOn = false; public FluidTank tank; + public int millis = 0; public static ModuleBurnTime burnModule = new ModuleBurnTime().setLogTimeMod(4).setWoodTimeMod(2); @@ -106,19 +108,32 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement FT_Flammable trait = tank.getTankType().getTrait(FT_Flammable.class); if(trait != null) { - this.power += trait.getHeatEnergy() / 2L; - tank.setFill(tank.getFill() - 1); - if(worldObj.getTotalWorldTime() % 20 == 0) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND); + + if(millis <= 900) { + this.tank.setFill(tank.getFill() - 1); + this.millis += 100; + } + + int toBurn = Math.min(millis, 5); + + if(toBurn > 0) { + this.power += trait.getHeatEnergy() * toBurn / 4_000L; + this.millis -= toBurn; + if(worldObj.getTotalWorldTime() % 20 == 0) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND); + } } } } + if(this.power > this.maxPower) this.power = this.maxPower; + NBTTagCompound data = new NBTTagCompound(); data.setLong("power", power); data.setInteger("burnTime", burnTime); data.setInteger("maxBurnTime", maxBurnTime); data.setBoolean("isOn", isOn); data.setBoolean("liquidBurn", liquidBurn); + tank.writeToNBT(data, "t"); this.networkPack(data, 25); } else { @@ -146,6 +161,30 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement this.maxBurnTime = nbt.getInteger("maxBurnTime"); this.isOn = nbt.getBoolean("isOn"); this.liquidBurn = nbt.getBoolean("liquidBurn"); + tank.readFromNBT(nbt, "t"); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.power = nbt.getLong("power"); + this.burnTime = nbt.getInteger("burnTime"); + this.maxBurnTime = nbt.getInteger("maxBurnTime"); + this.isOn = nbt.getBoolean("isOn"); + this.liquidBurn = nbt.getBoolean("liquidBurn"); + tank.readFromNBT(nbt, "t"); + this.millis = nbt.getInteger("millis"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + nbt.setLong("power", power); + nbt.setInteger("burnTime", burnTime); + nbt.setInteger("maxBurnTime", maxBurnTime); + nbt.setBoolean("isOn", isOn); + nbt.setBoolean("liquidBurn", liquidBurn); + tank.writeToNBT(nbt, "t"); + nbt.setInteger("millis", millis); } protected boolean processAsh(int level, EnumAshType type, int threshold) { @@ -222,6 +261,18 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement return maxPower; } + @Override + public boolean canConnect(ForgeDirection dir) { + ForgeDirection rot = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + return dir == rot.getOpposite(); + } + + @Override + public boolean canConnect(FluidType type, ForgeDirection dir) { + ForgeDirection rot = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + return dir == rot.getOpposite(); + } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {tank}; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 38371ad7f..dc6a60f44 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energy.*; import com.hbm.blocks.machine.MachineBattery; +import com.hbm.config.GeneralConfig; import com.hbm.inventory.container.ContainerMachineBattery; import com.hbm.inventory.gui.GUIMachineBattery; import com.hbm.lib.Library; @@ -36,6 +37,8 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public long[] log = new long[20]; public long delta = 0; public long power = 0; + public long prevPowerState = 0; + public int pingPongTicks = 0; //0: input only //1: buffer @@ -180,8 +183,23 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I this.log[i - 1] = this.log[i]; } + if(GeneralConfig.enable528) { + long threshold = this.getMaxPower() / 3; + if(Math.abs(prevPower - power) > threshold && Math.abs(prevPower - prevPowerState) > threshold) { + this.pingPongTicks++; + if(this.pingPongTicks > 10) { + worldObj.func_147480_a(xCoord, yCoord, zCoord, false); + worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 10F, false, false); + } + } else { + if(this.pingPongTicks > 0) this.pingPongTicks--; + } + } + this.log[19] = avg; + prevPowerState = power; + NBTTagCompound nbt = new NBTTagCompound(); nbt.setLong("power", avg); nbt.setLong("delta", delta); @@ -237,7 +255,9 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I if(x instanceof PowerNet) PowerNet.trackingInstances.add((PowerNet) x); }); - this.power = PowerNet.fairTransfer(con, this.power); + long toSend = Math.min(this.power, this.getMaxTransfer()); + long powerRemaining = this.power - toSend; + this.power = PowerNet.fairTransfer(con, toSend) + powerRemaining; } //resubscribe to buffered nets, if necessary @@ -246,7 +266,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I } } - protected void transmitPower() { + @Deprecated protected void transmitPower() { short mode = (short) this.getRelevantMode(); @@ -298,7 +318,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I } public long getMaxTransfer() { - return this.getMaxPower(); + return this.getMaxPower() / 20; } @Override @@ -342,24 +362,29 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I */ @Override public long transferPower(long power) { - - int mode = this.getRelevantMode(); - if(mode == mode_output || mode == mode_none) { - return power; + long overshoot = 0; + + // if power exceeds our transfer limit, truncate + if(power > getMaxTransfer()) { + overshoot += power - getMaxTransfer(); + power = getMaxTransfer(); } - this.power += power; + // this check is in essence the same as the default implementation, but re-arranged to never overflow the int64 range + // if the remaining power exceeds the power cap, truncate again + long freespace = this.getMaxPower() - this.getPower(); + + if(freespace < power) { + overshoot += power - freespace; + power = freespace; + } + + // what remains is sure to not exceed the transfer limit and the power cap (and therefore the int64 range) + this.setPower(this.getPower() + power); this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); - if(this.power > this.getMaxPower()) { - - long overshoot = this.power - this.getMaxPower(); - this.power = this.getMaxPower(); - return overshoot; - } - - return 0; + return overshoot; } @Override @@ -371,7 +396,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I return 0; } - return Math.max(getMaxPower() - getPower(), 0); + return Math.min(Math.max(getMaxPower() - getPower(), 0), this.getMaxTransfer()); } @Override @@ -411,6 +436,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public void writeNBT(NBTTagCompound nbt) { NBTTagCompound data = new NBTTagCompound(); data.setLong("power", power); + data.setLong("prevPowerState", prevPowerState); data.setShort("redLow", redLow); data.setShort("redHigh", redHigh); data.setInteger("priority", this.priority.ordinal()); @@ -421,6 +447,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public void readNBT(NBTTagCompound nbt) { NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); this.power = data.getLong("power"); + this.prevPowerState = data.getLong("prevPowerState"); this.redLow = data.getShort("redLow"); this.redHigh = data.getShort("redHigh"); this.priority = ConnectionPriority.values()[data.getInteger("priority")]; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java index 188b919e6..3ece44aca 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -35,7 +35,7 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); ////////////////////////////////////////////////////////////////////// - this.transmitPower(); + this.transmitPowerFairly(); ////////////////////////////////////////////////////////////////////// byte comp = this.getComparatorPower(); @@ -142,8 +142,8 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { } @Override - public long getTransferWeight() { - return Math.min(Math.max(this.getMaxPower() - getPower(), 0), maxTransfer); + public long getMaxTransfer() { + return maxTransfer; } public float getSpeed() { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2d4834860..7008cea84 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -360,6 +360,7 @@ container.machineSILEX=SILEX container.machineSolidifier=Verfestiger container.machineTurbine=Dampfturbine container.machineTurbofan=Turbofan +container.machineWoodBurner=Brennholzgenerator container.machine_schrabidium_transmutator=Schrabidium-Transmutationsgerät container.massStorage=Speicher container.microwave=Mikrowelle @@ -4167,6 +4168,8 @@ tile.machine_turbofan.name=Turbofan tile.machine_uf6_tank.name=Uranhexafluorid-Tank tile.machine_vacuum_distill.name=Vakuumraffinerie tile.machine_waste_drum.name=Abklingbecken-Trommel +tile.machine_wood_burner.name=Brennholzgenerator +tile.machine_wood_burner.desc=Erzeugt 100HE/t aus Items$Sammelt Asche$Kann 1mB/s Flüssigkeiten mit 25%% Effizienz verbrennen tile.machine_well.name=Ölbohrturm tile.machine_zirnox.name=ZIRNOX Atomreaktor tile.marker_structure.name=Multiblock-Strukturvorlage diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index eb2348566..780df69c2 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -718,6 +718,7 @@ container.machineSILEX=SILEX container.machineSolidifier=Solidifier container.machineTurbine=Steam Turbine container.machineTurbofan=Turbofan +container.machineWoodBurner=Wood-Burner container.machine_schrabidium_transmutator=Schrabidium Transmutation Device container.massStorage=Storage container.microwave=Microwave @@ -5146,6 +5147,8 @@ tile.machine_turbofan.name=Turbofan tile.machine_uf6_tank.name=Uranium Hexafluoride Tank tile.machine_vacuum_distill.name=Vacuum Refinery tile.machine_waste_drum.name=Spent Fuel Pool Drum +tile.machine_wood_burner.name=Wood-Burning Generator +tile.machine_wood_burner.desc=Generates 100HE/t when burning items$Collects ashes$Can burn fluids at 25%% efficiency at 1mB/s tile.machine_well.name=Oil Derrick tile.machine_zirnox.name=ZIRNOX Nuclear Reactor tile.marker_structure.name=Multiblock Structure Marker diff --git a/src/main/resources/assets/hbm/textures/models/machines/strand_caster.png b/src/main/resources/assets/hbm/textures/models/machines/strand_caster.png new file mode 100644 index 0000000000000000000000000000000000000000..96f371d955cc5574f5b8e5748c1a9dadcd2c0dde GIT binary patch literal 10757 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