diff --git a/gradle.properties b/gradle.properties index d5345eb..4ce95e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,4 +5,4 @@ version_minecraft=1.16.4 version_forge_minecraft=1.16.4-35.0.2 version_fml_mappings=20201028-1.16.3 version_jei=1.16.4:7.6.0.58 -version_engineersdecor=1.1.4-b2 +version_engineersdecor=1.1.4 diff --git a/readme.md b/readme.md index 20ed613..27ae7bb 100644 --- a/readme.md +++ b/readme.md @@ -11,6 +11,9 @@ Mod sources for Minecraft version 1.16.x. ## Version history + ~ v1.1.4 [R] Release build v1.1.4. + [F] Solar Panel balancing threshold tuned. + - v1.1.4-b2 [A] Steel Catwalks added (top and bottom aligned). [A] Steel Railings added. [F] Fixed Empty Fluid Barrel crafting crash (ty inflamedsebi). diff --git a/src/main/java/wile/engineersdecor/blocks/EdSolarPanel.java b/src/main/java/wile/engineersdecor/blocks/EdSolarPanel.java index 217a3cc..5dfd9b8 100644 --- a/src/main/java/wile/engineersdecor/blocks/EdSolarPanel.java +++ b/src/main/java/wile/engineersdecor/blocks/EdSolarPanel.java @@ -36,6 +36,8 @@ import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.util.LazyOptional; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; public class EdSolarPanel @@ -83,13 +85,14 @@ public class EdSolarPanel public static class SolarPanelTileEntity extends TileEntity implements ITickableTileEntity, ICapabilityProvider, IEnergyStorage { public static final int DEFAULT_PEAK_POWER = 40; - public static final int TICK_INTERVAL = 8; - public static final int ACCUMULATION_INTERVAL = 4; + public static final int TICK_INTERVAL = 4; + public static final int ACCUMULATION_INTERVAL = 8; private static final Direction transfer_directions_[] = {Direction.DOWN, Direction.EAST, Direction.SOUTH, Direction.WEST, Direction.NORTH }; private static int peak_power_per_tick_ = DEFAULT_PEAK_POWER; private static int max_power_storage_ = 64000; private static int max_feed_power = 8192; private static int feeding_threshold = max_power_storage_/5; + private static int balancing_threshold = max_power_storage_/10; private int tick_timer_ = 0; private int recalc_timer_ = 0; private int accumulated_power_ = 0; @@ -100,8 +103,8 @@ public class EdSolarPanel public static void on_config(int peak_power_per_tick) { peak_power_per_tick_ = MathHelper.clamp(peak_power_per_tick, 2, 8192); - max_feed_power = MathHelper.clamp(peak_power_per_tick_ * 16, 10, 256); feeding_threshold = Math.max(max_power_storage_/5, 1000); + balancing_threshold = Math.max(max_power_storage_/10, 1000); ModEngineersDecor.logger().info("Config small solar panel: Peak production:" + peak_power_per_tick_ + "/tick"); } @@ -191,6 +194,7 @@ public class EdSolarPanel BlockState state = world.getBlockState(pos); if(!(state.getBlock() instanceof SolarPanelBlock)) return; current_feedin_ = 0; + final List adjacent_panels = new ArrayList<>(); if(output_enabled_) { for(int i=0; (i0); ++i) { final Direction f = transfer_directions_[i]; @@ -199,30 +203,33 @@ public class EdSolarPanel IEnergyStorage es = te.getCapability(CapabilityEnergy.ENERGY, f.getOpposite()).orElse(null); if(es==null) continue; if(!es.canReceive()) { - // Ok, implemented power forwarding between panels because some people just don't get it. - if(accumulated_power_ < (feeding_threshold * 2)) continue; if(!(te instanceof SolarPanelTileEntity)) continue; - SolarPanelTileEntity panel = (SolarPanelTileEntity)te; - if(panel.accumulated_power_ >= (accumulated_power_-feeding_threshold)) continue; - panel.accumulated_power_ += feeding_threshold; - accumulated_power_ -= feeding_threshold; - current_feedin_ += feeding_threshold/TICK_INTERVAL; + adjacent_panels.add((SolarPanelTileEntity)te); continue; } - final int feed_power = (accumulated_power_ < (max_power_storage_/10)) ? Math.max((current_production_ * 2), (peak_power_per_tick_/5)) : max_feed_power; + final int feed_power = (accumulated_power_ > (max_power_storage_/10)) ? max_feed_power : Math.max(current_production_*2, (peak_power_per_tick_/4)); int fed = es.receiveEnergy(Math.min(accumulated_power_, feed_power * TICK_INTERVAL), false); accumulated_power_ = MathHelper.clamp(accumulated_power_-fed,0, accumulated_power_); current_feedin_ += fed; } } current_feedin_ /= TICK_INTERVAL; - if((accumulated_power_ <= 0) || (current_feedin_ <= 0)) output_enabled_ = false; // feed-in power: no need to waste CPU if noone needs power. + if((current_feedin_ <= 0) && ((accumulated_power_ >= balancing_threshold) || (current_production_ <= 0))) { + for(SolarPanelTileEntity panel: adjacent_panels) { + if(panel.accumulated_power_ >= (accumulated_power_-balancing_threshold)) continue; + panel.accumulated_power_ += balancing_threshold; + accumulated_power_ -= balancing_threshold; + if(accumulated_power_ < balancing_threshold) break; + } + } if(!world.canBlockSeeSky(pos)) { - tick_timer_ = TICK_INTERVAL * 5; + tick_timer_ = TICK_INTERVAL * 10; current_production_ = 0; + if((accumulated_power_ > 0)) output_enabled_ = true; if(state.get((SolarPanelBlock.EXPOSITION))!=2) world.setBlockState(pos, state.with(SolarPanelBlock.EXPOSITION, 2)); return; } + if(accumulated_power_ <= 0) output_enabled_ = false; if(--recalc_timer_ > 0) return; recalc_timer_ = ACCUMULATION_INTERVAL + ((int)(Math.random()+.5)); int theta = ((((int)(world.getCelestialAngleRadians(1f) * (180.0/Math.PI)))+90) % 360);