Skip to content

Commit

Permalink
attempt #1 of bufferless lasers
Browse files Browse the repository at this point in the history
(doesnt work :trollface:)
  • Loading branch information
htmlcsjs committed Jul 9, 2023
1 parent 5ad7845 commit 2b21aa1
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 56 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package gregtech.api.capability.impl;

import gregtech.api.capability.ILaserContainer;
import net.minecraft.util.EnumFacing;

public class ActiveTransformerBuffer implements ILaserContainer {
private final long capacity;
private long stored = 0L;

public ActiveTransformerBuffer(long capacity) {
this.capacity = capacity;
}

@Override
public long acceptEnergy(EnumFacing side, long amount) {
return changeEnergy(amount);
}

@Override
public long changeEnergy(long amount) {
if (amount > capacity - stored) {
amount = capacity - stored;
} else if (-amount > stored) {
amount = -stored;
}
stored += amount;
return amount;
}

@Override
public boolean inputsEnergy(EnumFacing side) {
return true;
}

@Override
public boolean outputsEnergy(EnumFacing side) {
return true;
}

@Override
public long getEnergyStored() {
return stored;
}

@Override
public long getEnergyCapacity() {
return capacity;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import codechicken.lib.render.pipeline.IVertexOperation;
import codechicken.lib.vec.Matrix4;
import gregtech.api.capability.*;
import gregtech.api.capability.impl.ActiveTransformerBuffer;
import gregtech.api.capability.impl.EnergyContainerList;
import gregtech.api.capability.impl.LaserContainerList;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
import gregtech.api.metatileentity.multiblock.IMultiblockPart;
Expand All @@ -15,6 +15,7 @@
import gregtech.api.pattern.FactoryBlockPattern;
import gregtech.api.pattern.PatternMatchContext;
import gregtech.api.pattern.TraceabilityPredicate;
import gregtech.api.util.TextFormattingUtil;
import gregtech.client.renderer.ICubeRenderer;
import gregtech.client.renderer.texture.Textures;
import gregtech.common.blocks.BlockComputerCasing;
Expand Down Expand Up @@ -43,16 +44,16 @@ public class MetaTileEntityActiveTransformer extends MultiblockWithDisplayBase i
private boolean isWorkingEnabled = true;
private IEnergyContainer energyInputContainer;
private IEnergyContainer energyOutputContainer;
private ILaserContainer laserInputContainer;
private ILaserContainer laserOutputContainer;
private ActiveTransformerBuffer buffer;
private ILaserContainer laserInContainer;
private boolean isActive = true;

public MetaTileEntityActiveTransformer(ResourceLocation metaTileEntityId) {
super(metaTileEntityId);
this.energyInputContainer = new EnergyContainerList(new ArrayList<>());
this.energyOutputContainer = new EnergyContainerList(new ArrayList<>());
this.laserInputContainer = new LaserContainerList(new ArrayList<>());
this.laserOutputContainer = new LaserContainerList(new ArrayList<>());
this.buffer = null;
this.laserInContainer = null;
}

@Override
Expand All @@ -64,31 +65,25 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) {
protected void updateFormedValid() {
double maintenancePenalty = getMaintenancePenalty();
if (maintenancePenalty <= 0) {
setActive(false);
return;
}
long maxEnergyInput = (long) (energyInputContainer.getEnergyStored() * maintenancePenalty);
long maxLaserInput = (long) (laserInputContainer.getEnergyStored() * maintenancePenalty);

if (maxLaserInput == 0 && maxEnergyInput == 0) {
setActive(false);
if (buffer == null) {
return;
}

long energyUsed = 0;
long laserUsed = 0;

energyUsed += energyOutputContainer.addEnergy(maxEnergyInput - energyUsed);
laserUsed += energyOutputContainer.addEnergy(maxLaserInput - laserUsed);
energyUsed += laserOutputContainer.addEnergy(maxEnergyInput - energyUsed);
laserUsed += laserOutputContainer.addEnergy(maxLaserInput - laserUsed);
long maxEnergyInput = (long) (energyInputContainer.getEnergyStored() * maintenancePenalty);
long maxLaserInput = 0;
if (laserInContainer != null) {
maxLaserInput = (long) (laserInContainer.getEnergyStored() * maintenancePenalty);
}

if (energyUsed == 0 && laserUsed == 0) {
setActive(false);
} else {
setActive(true);
energyInputContainer.removeEnergy(energyUsed);
laserInputContainer.removeEnergy(laserUsed);
energyInputContainer.removeEnergy(buffer.changeEnergy(maxEnergyInput));
if (laserInContainer != null) {
laserInContainer.removeEnergy(buffer.changeEnergy(maxLaserInput));
}

buffer.removeEnergy(energyOutputContainer.removeEnergy(buffer.getEnergyStored()));
}

private double getMaintenancePenalty() {
Expand All @@ -105,17 +100,23 @@ protected void formStructure(PatternMatchContext context) {
super.formStructure(context);
this.energyInputContainer = new EnergyContainerList(getAbilities(MultiblockAbility.INPUT_ENERGY));
this.energyOutputContainer = new EnergyContainerList(getAbilities(MultiblockAbility.OUTPUT_ENERGY));
this.laserInputContainer = new LaserContainerList(getAbilities(MultiblockAbility.INPUT_LASER));
this.laserOutputContainer = new LaserContainerList(getAbilities(MultiblockAbility.OUTPUT_LASER));
if (this.energyInputContainer.getEnergyCapacity() > 0) {
this.buffer = new ActiveTransformerBuffer(this.energyInputContainer.getEnergyCapacity());
} else if (this.energyOutputContainer.getEnergyCapacity() > 0) {
this.buffer = new ActiveTransformerBuffer(this.energyOutputContainer.getEnergyCapacity());
}
if (getAbilities(MultiblockAbility.INPUT_LASER).size() > 0) {
this.laserInContainer = getAbilities(MultiblockAbility.INPUT_LASER).get(0);
}
}

@Override
public void invalidateStructure() {
super.invalidateStructure();
this.energyInputContainer = new EnergyContainerList(new ArrayList<>());
this.energyOutputContainer = new EnergyContainerList(new ArrayList<>());
this.laserInputContainer = new LaserContainerList(new ArrayList<>());
this.laserOutputContainer = new LaserContainerList(new ArrayList<>());
this.buffer = null;
this.laserInContainer = null;
}

@NotNull
Expand All @@ -134,8 +135,8 @@ protected BlockPattern createStructurePattern() {
private TraceabilityPredicate getHatchPredicates() {
return abilities(MultiblockAbility.INPUT_ENERGY).setMaxGlobalLimited(3, 1)
.or(abilities(MultiblockAbility.OUTPUT_ENERGY).setMaxGlobalLimited(3, 1))
.or(abilities(MultiblockAbility.INPUT_LASER).setMaxGlobalLimited(3, 1))
.or(abilities(MultiblockAbility.OUTPUT_LASER).setMaxGlobalLimited(3, 1))
.or(abilities(MultiblockAbility.INPUT_LASER).setMaxGlobalLimited(1))
.or(abilities(MultiblockAbility.OUTPUT_LASER).setMaxGlobalLimited(1))
// Disallow the config maintenance hatch because that would probably break the conservation of energy
.or(metaTileEntities(MetaTileEntities.MAINTENANCE_HATCH,
MetaTileEntities.AUTO_MAINTENANCE_HATCH, MetaTileEntities.CLEANING_MAINTENANCE_HATCH).setExactLimit(1));
Expand All @@ -144,7 +145,15 @@ private TraceabilityPredicate getHatchPredicates() {
@Override
protected void addDisplayText(List<ITextComponent> textList) {
super.addDisplayText(textList);
textList.add(new TextComponentTranslation("gregtech.machine.active_transformer.rate", getMaintenancePenalty()));
double maintenancePenalty = getMaintenancePenalty();
if (maintenancePenalty < 1.0) {
textList.add(new TextComponentTranslation("gregtech.machine.active_transformer.rate", maintenancePenalty));
}
if (isStructureFormed() && buffer != null) {
textList.add(new TextComponentTranslation("gregtech.machine.active_transformer.buffer_size", TextFormattingUtil.formatNumbers(buffer.getEnergyCapacity())));
textList.add(new TextComponentTranslation("gregtech.machine.active_transformer.buffer_full",
(buffer.getEnergyStored() / buffer.getEnergyCapacity()) * 100.0, TextFormattingUtil.formatNumbers(buffer.getEnergyStored())));
}
}

@Override
Expand Down Expand Up @@ -204,6 +213,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
data.setBoolean("isActive", this.isActive);
data.setBoolean("isWorkingEnabled", this.isWorkingEnabled);
data.setLong("bufferEnergyStored", this.buffer != null ? this.buffer.getEnergyStored() : 0L);
return data;
}

Expand All @@ -212,6 +222,9 @@ public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
this.isActive = data.getBoolean("isActive");
this.isWorkingEnabled = data.getBoolean("isWorkingEnabled");
if (data.getLong("bufferEnergyStored") != 0 && buffer != null) {
this.buffer.changeEnergy(data.getLong("bufferEnergyStored"));
}
}

@Override
Expand Down Expand Up @@ -253,4 +266,13 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List
super.addInformation(stack, world, tooltip, advanced);
tooltip.add(I18n.format("gregtech.machine.active_transformer.tooltip.1"));
}

public ILaserContainer getBuffer() {
if (buffer != null) {
return buffer;
} else if (isStructureFormed() && getAbilities(MultiblockAbility.INPUT_LASER).size() == 1) {
return getAbilities(MultiblockAbility.INPUT_LASER).get(1);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,27 @@
import codechicken.lib.render.pipeline.IVertexOperation;
import codechicken.lib.vec.Matrix4;
import gregtech.api.GTValues;
import gregtech.api.capability.GregtechTileCapabilities;
import gregtech.api.capability.ILaserContainer;
import gregtech.api.capability.impl.LaserContainerHandler;
import gregtech.api.gui.ModularUI;
import gregtech.api.metatileentity.IDataInfoProvider;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart;
import gregtech.api.metatileentity.multiblock.MultiblockAbility;
import gregtech.client.renderer.texture.Textures;
import net.minecraft.client.resources.I18n;
import gregtech.common.metatileentities.multi.electric.MetaTileEntityActiveTransformer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;

public class MetaTileEntityLaserHatch extends MetaTileEntityMultiblockPart implements IMultiblockAbilityPart<ILaserContainer>, IDataInfoProvider {
public class MetaTileEntityLaserHatch extends MetaTileEntityMultiblockPart implements IMultiblockAbilityPart<ILaserContainer> {
private final boolean isOutput;
private final ILaserContainer laserContainer;
public MetaTileEntityLaserHatch(ResourceLocation metaTileEntityId, boolean isOutput) {
super(metaTileEntityId, GTValues.ZPM);
this.isOutput = isOutput;
this.laserContainer = new LaserContainerHandler(this, GTValues.V[GTValues.UV] * 4, isOutput);
}

@Override
Expand All @@ -50,14 +42,35 @@ protected boolean openGUIOnRightClick() {
return false;
}

@Override
public boolean canPartShare() {
return false;
}

@Override
public MultiblockAbility<ILaserContainer> getAbility() {
return isOutput ? MultiblockAbility.OUTPUT_LASER : MultiblockAbility.INPUT_LASER;
}

@Override
public void registerAbilities(List<ILaserContainer> abilityList) {
abilityList.add(laserContainer);
if (isOutput && getController() instanceof MetaTileEntityActiveTransformer activeTransformer) {
ILaserContainer buffer = activeTransformer.getBuffer();
if (buffer != null) {
// TODO: Handle null values by propagating up the net
abilityList.add(buffer);
}
} else if (!isOutput) {
EnumFacing side = getFrontFacing();
TileEntity tileEntity = getWorld().getTileEntity(getPos().offset(side));
EnumFacing oppositeSide = side.getOpposite();
if (tileEntity != null && tileEntity.hasCapability(GregtechTileCapabilities.CAPABILITY_LASER, oppositeSide)) {
ILaserContainer laserContainer = tileEntity.getCapability(GregtechTileCapabilities.CAPABILITY_LASER, oppositeSide);
if (laserContainer != null && !laserContainer.inputsEnergy(oppositeSide)) {
abilityList.add(laserContainer);
}
}
}
}

@Override
Expand All @@ -73,16 +86,4 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation,
}

// TODO: add tooltips
@Override
public void addInformation(ItemStack stack, @Nullable World world, @NotNull List<String> tooltip, boolean advanced) {
tooltip.add(I18n.format("gregtech.universal.tooltip.energy_storage_capacity", laserContainer.getEnergyCapacity()));
}

@NotNull
@Override
public List<ITextComponent> getDataInfo() {
List<ITextComponent> info = new ArrayList<>();
info.add(new TextComponentTranslation("behavior.tricorder.energy_container_storage", laserContainer.getEnergyStored(), laserContainer.getEnergyCapacity()));
return info;
}
}
2 changes: 2 additions & 0 deletions src/main/resources/assets/gregtech/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -4631,6 +4631,8 @@ gregtech.multiblock.power_substation.description=
gregtech.machine.active_transformer.name=Active Transformer
gregtech.machine.active_transformer.tooltip.1=Transformers: Lasers in Disguise
gregtech.machine.active_transformer.rate=Ratio: %1.4f EU in to 1 EU out
gregtech.machine.active_transformer.buffer_size=Buffer is %s EU in size
gregtech.machine.active_transformer.buffer_full=Buffer is %.1f%% full (%s EU)

gregtech.machine.central_monitor.name=Central Monitor
gregtech.multiblock.central_monitor.low_power=Low Power
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package gregtech.api.capability.impl;

import org.hamcrest.MatcherAssert;
import org.junit.jupiter.api.Test;

import static org.hamcrest.CoreMatchers.is;

class ActiveTransformerBufferTest {

@Test
void changeEnergy() {
ActiveTransformerBuffer buffer = new ActiveTransformerBuffer(1024L);
MatcherAssert.assertThat(buffer.getEnergyCapacity(), is(1024L));

MatcherAssert.assertThat(buffer.changeEnergy(128), is(128L));
MatcherAssert.assertThat(buffer.getEnergyStored(), is(128L));

MatcherAssert.assertThat(buffer.changeEnergy(-64), is(-64L));
MatcherAssert.assertThat(buffer.getEnergyStored(), is(64L));

MatcherAssert.assertThat(buffer.changeEnergy(-16384), is(-64L));
MatcherAssert.assertThat(buffer.getEnergyStored(), is(0L));

MatcherAssert.assertThat(buffer.changeEnergy(2048), is(1024L));
MatcherAssert.assertThat(buffer.getEnergyStored(), is(1024L));
}
}

0 comments on commit 2b21aa1

Please sign in to comment.