Files
Applied-Energistics-2/src/main/java/appeng/tile/networking/ControllerBlockEntity.java
T
Sebastian Hartte 1478e4c378 Lots more moved
2020-07-04 21:03:30 +02:00

193 lines
6.8 KiB
Java

/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.tile.networking;
import java.util.EnumSet;
import net.minecraft.item.ItemStack;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import alexiil.mc.lib.attributes.item.FixedItemInv;
import alexiil.mc.lib.attributes.item.impl.EmptyFixedItemInv;
import appeng.api.config.Actionable;
import appeng.api.networking.GridFlags;
import appeng.api.networking.energy.IEnergyGrid;
import appeng.api.networking.events.MENetworkControllerChange;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.events.MENetworkPowerStatusChange;
import appeng.api.networking.events.MENetworkPowerStorage;
import appeng.api.networking.events.MENetworkPowerStorage.PowerEventType;
import appeng.api.networking.pathing.ControllerState;
import appeng.api.util.AECableType;
import appeng.api.util.AEPartLocation;
import appeng.block.networking.ControllerBlock;
import appeng.block.networking.ControllerBlock.ControllerBlockState;
import appeng.me.GridAccessException;
import appeng.tile.grid.AENetworkPowerBlockEntity;
import appeng.util.inv.InvOperation;
public class ControllerBlockEntity extends AENetworkPowerBlockEntity {
private boolean isValid = false;
public ControllerBlockEntity(BlockEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
this.setInternalMaxPower(8000);
this.setInternalPublicPowerStorage(true);
this.getProxy().setIdlePowerUsage(3);
this.getProxy().setFlags(GridFlags.CANNOT_CARRY, GridFlags.DENSE_CAPACITY);
}
@Override
public AECableType getCableConnectionType(final AEPartLocation dir) {
return AECableType.DENSE_SMART;
}
@Override
public void onReady() {
this.onNeighborChange(true);
super.onReady();
}
public void onNeighborChange(final boolean force) {
final boolean xx = this.checkController(this.pos.offset(Direction.EAST))
&& this.checkController(this.pos.offset(Direction.WEST));
final boolean yy = this.checkController(this.pos.offset(Direction.UP))
&& this.checkController(this.pos.offset(Direction.DOWN));
final boolean zz = this.checkController(this.pos.offset(Direction.NORTH))
&& this.checkController(this.pos.offset(Direction.SOUTH));
// int meta = world.getBlockMetadata( xCoord, yCoord, zCoord );
// boolean hasPower = meta > 0;
// boolean isConflict = meta == 2;
final boolean oldValid = this.isValid;
this.isValid = (xx && !yy && !zz) || (!xx && yy && !zz) || (!xx && !yy && zz)
|| ((xx ? 1 : 0) + (yy ? 1 : 0) + (zz ? 1 : 0) <= 1);
if (oldValid != this.isValid || force) {
if (this.isValid) {
this.getProxy().setValidSides(EnumSet.allOf(Direction.class));
} else {
this.getProxy().setValidSides(EnumSet.noneOf(Direction.class));
}
this.updateMeta();
}
}
private void updateMeta() {
if (!this.getProxy().isReady()) {
return;
}
ControllerBlockState metaState = ControllerBlockState.offline;
try {
if (this.getProxy().getEnergy().isNetworkPowered()) {
metaState = ControllerBlockState.online;
if (this.getProxy().getPath().getControllerState() == ControllerState.CONTROLLER_CONFLICT) {
metaState = ControllerBlockState.conflicted;
}
}
} catch (final GridAccessException e) {
metaState = ControllerBlockState.offline;
}
if (this.checkController(this.pos)
&& this.world.getBlockState(this.pos).get(ControllerBlock.CONTROLLER_STATE) != metaState) {
this.world.setBlockState(this.pos,
this.world.getBlockState(this.pos).with(ControllerBlock.CONTROLLER_STATE, metaState));
}
}
@Override
protected double getFunnelPowerDemand(final double maxReceived) {
try {
final IEnergyGrid grid = this.getProxy().getEnergy();
return grid.getEnergyDemand(maxReceived);
} catch (final GridAccessException e) {
// no grid? use local...
return super.getFunnelPowerDemand(maxReceived);
}
}
@Override
protected double funnelPowerIntoStorage(final double power, final Actionable mode) {
try {
final IEnergyGrid grid = this.getProxy().getEnergy();
final double leftOver = grid.injectPower(power, mode);
return leftOver;
} catch (final GridAccessException e) {
// no grid? use local...
return super.funnelPowerIntoStorage(power, mode);
}
}
@Override
protected void PowerEvent(final PowerEventType x) {
try {
this.getProxy().getGrid().postEvent(new MENetworkPowerStorage(this, x));
} catch (final GridAccessException e) {
// not ready!
}
}
@MENetworkEventSubscribe
public void onControllerChange(final MENetworkControllerChange status) {
this.updateMeta();
}
@MENetworkEventSubscribe
public void onPowerChange(final MENetworkPowerStatusChange status) {
this.updateMeta();
}
@Override
public FixedItemInv getInternalInventory() {
return EmptyFixedItemInv.INSTANCE;
}
@Override
public void onChangeInventory(final FixedItemInv inv, final int slot, final InvOperation mc,
final ItemStack removed, final ItemStack added) {
}
/**
* Check for a controller at this coordinates as well as is it loaded.
*
* @return true if there is a loaded controller
*/
private boolean checkController(final BlockPos pos) {
if (this.world.getChunkManager().isChunkLoaded(pos.getX() >> 4, pos.getZ() >> 4)) {
return this.world.getBlockEntity(pos) instanceof ControllerBlockEntity;
}
return false;
}
}