Skip to content

Commit

Permalink
Fix a few javadocs/comments and minorly cleanup a couple things inclu…
Browse files Browse the repository at this point in the history
…ding tests
  • Loading branch information
pupnewfster committed May 18, 2021
1 parent ef82bac commit 962698e
Show file tree
Hide file tree
Showing 18 changed files with 122 additions and 159 deletions.
Expand Up @@ -4,7 +4,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand Down Expand Up @@ -42,7 +41,6 @@
import mekanism.common.util.EmitUtils;
import mekanism.common.util.MekanismUtils;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.LazyOptional;
Expand Down Expand Up @@ -224,14 +222,13 @@ public void clampBuffer() {
@Override
protected void updateSaveShares(@Nullable BoxedPressurizedTube triggerTransmitter) {
super.updateSaveShares(triggerTransmitter);
int size = transmittersSize();
if (size > 0) {
if (!isEmpty()) {
updateSaveShares(triggerTransmitter, getCurrentTankWithFallback().getStack());
}
}

private <CHEMICAL extends Chemical<CHEMICAL>, STACK extends ChemicalStack<CHEMICAL>> void updateSaveShares(@Nullable BoxedPressurizedTube triggerTransmitter,
STACK chemical) {
STACK chemical) {
STACK empty = ChemicalUtil.getEmptyStack(chemical);
BoxedChemicalTransmitterSaveTarget<CHEMICAL, STACK> saveTarget = new BoxedChemicalTransmitterSaveTarget<>(empty, chemical, transmitters);
long sent = EmitUtils.sendToAcceptors(saveTarget, chemical.getAmount(), chemical);
Expand All @@ -258,14 +255,17 @@ protected <CHEMICAL extends Chemical<CHEMICAL>, STACK extends ChemicalStack<CHEM

private <CHEMICAL extends Chemical<CHEMICAL>, STACK extends ChemicalStack<CHEMICAL>> long tickEmit(@Nonnull STACK stack) {
ChemicalType chemicalType = ChemicalType.getTypeFor(stack);
ChemicalHandlerTarget<CHEMICAL, STACK, IChemicalHandler<CHEMICAL, STACK>> target = new ChemicalHandlerTarget<>(stack, acceptorCache.getAcceptorEntrySet().size()*2);
for (Entry<BlockPos, Map<Direction, LazyOptional<BoxedChemicalHandler>>> entry : acceptorCache.getAcceptorEntrySet()) {
entry.getValue().forEach((side, lazyAcceptor) -> lazyAcceptor.ifPresent(acceptor -> {
IChemicalHandler<CHEMICAL, STACK> handler = acceptor.getHandlerFor(chemicalType);
if (handler != null && ChemicalUtil.canInsert(handler, stack)) {
target.addHandler(handler);
}
}));
Collection<Map<Direction, LazyOptional<BoxedChemicalHandler>>> acceptorValues = acceptorCache.getAcceptorValues();
ChemicalHandlerTarget<CHEMICAL, STACK, IChemicalHandler<CHEMICAL, STACK>> target = new ChemicalHandlerTarget<>(stack, acceptorValues.size() * 2);
for (Map<Direction, LazyOptional<BoxedChemicalHandler>> acceptors : acceptorValues) {
for (LazyOptional<BoxedChemicalHandler> lazyAcceptor : acceptors.values()) {
lazyAcceptor.ifPresent(acceptor -> {
IChemicalHandler<CHEMICAL, STACK> handler = acceptor.getHandlerFor(chemicalType);
if (handler != null && ChemicalUtil.canInsert(handler, stack)) {
target.addHandler(handler);
}
});
}
}
return EmitUtils.sendToAcceptors(target, stack.getAmount(), stack);
}
Expand Down
23 changes: 11 additions & 12 deletions src/main/java/mekanism/common/content/network/EnergyNetwork.java
Expand Up @@ -4,7 +4,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand All @@ -24,7 +23,6 @@
import mekanism.common.util.EmitUtils;
import mekanism.common.util.text.EnergyDisplay;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.LazyOptional;
Expand Down Expand Up @@ -127,23 +125,24 @@ public FloatingLong getCapacityAsFloatingLong() {
@Override
protected void updateSaveShares(@Nullable UniversalCable triggerTransmitter) {
super.updateSaveShares(triggerTransmitter);
int size = transmittersSize();
if (size > 0) {
//Just pretend we are always accessing it from the north
if (!isEmpty()) {
EnergyTransmitterSaveTarget saveTarget = new EnergyTransmitterSaveTarget(transmitters);
EmitUtils.sendToAcceptors(saveTarget, energyContainer.getEnergy().copy());
saveTarget.saveShare();
}
}

private FloatingLong tickEmit(FloatingLong energyToSend) {
EnergyAcceptorTarget target = new EnergyAcceptorTarget(acceptorCache.getAcceptorEntrySet().size()*2);
for (Entry<BlockPos, Map<Direction, LazyOptional<IStrictEnergyHandler>>> entry : acceptorCache.getAcceptorEntrySet()) {
entry.getValue().forEach((side, lazyAcceptor) -> lazyAcceptor.ifPresent(acceptor -> {
if (acceptor.insertEnergy(energyToSend, Action.SIMULATE).smallerThan(energyToSend)) {
target.addHandler(acceptor);
}
}));
Collection<Map<Direction, LazyOptional<IStrictEnergyHandler>>> acceptorValues = acceptorCache.getAcceptorValues();
EnergyAcceptorTarget target = new EnergyAcceptorTarget(acceptorValues.size() * 2);
for (Map<Direction, LazyOptional<IStrictEnergyHandler>> acceptors : acceptorValues) {
for (LazyOptional<IStrictEnergyHandler> lazyAcceptor : acceptors.values()) {
lazyAcceptor.ifPresent(acceptor -> {
if (acceptor.insertEnergy(energyToSend, Action.SIMULATE).smallerThan(energyToSend)) {
target.addHandler(acceptor);
}
});
}
}
return EmitUtils.sendToAcceptors(target, energyToSend.copy());
}
Expand Down
23 changes: 11 additions & 12 deletions src/main/java/mekanism/common/content/network/FluidNetwork.java
Expand Up @@ -4,7 +4,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand All @@ -24,7 +23,6 @@
import mekanism.common.util.FluidUtils;
import mekanism.common.util.MekanismUtils;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.LazyOptional;
Expand Down Expand Up @@ -148,24 +146,25 @@ public int getCapacityAsInt() {
@Override
protected void updateSaveShares(@Nullable MechanicalPipe triggerTransmitter) {
super.updateSaveShares(triggerTransmitter);
int size = transmittersSize();
if (size > 0) {
if (!isEmpty()) {
FluidStack fluidType = fluidTank.getFluid();
//Just pretend we are always accessing it from the north
FluidTransmitterSaveTarget saveTarget = new FluidTransmitterSaveTarget(fluidType, transmitters);
EmitUtils.sendToAcceptors(saveTarget, fluidType.getAmount(), fluidType);
saveTarget.saveShare();
}
}

private int tickEmit(@Nonnull FluidStack fluidToSend) {
FluidHandlerTarget target = new FluidHandlerTarget(fluidToSend, acceptorCache.getAcceptorEntrySet().size()*2);
for (Entry<BlockPos, Map<Direction, LazyOptional<IFluidHandler>>> entry : acceptorCache.getAcceptorEntrySet()) {
entry.getValue().forEach((side, lazyAcceptor) -> lazyAcceptor.ifPresent(acceptor -> {
if (FluidUtils.canFill(acceptor, fluidToSend)) {
target.addHandler(acceptor);
}
}));
Collection<Map<Direction, LazyOptional<IFluidHandler>>> acceptorValues = acceptorCache.getAcceptorValues();
FluidHandlerTarget target = new FluidHandlerTarget(fluidToSend, acceptorValues.size() * 2);
for (Map<Direction, LazyOptional<IFluidHandler>> acceptors : acceptorValues) {
for (LazyOptional<IFluidHandler> lazyAcceptor : acceptors.values()) {
lazyAcceptor.ifPresent(acceptor -> {
if (FluidUtils.canFill(acceptor, fluidToSend)) {
target.addHandler(acceptor);
}
});
}
}
return EmitUtils.sendToAcceptors(target, fluidToSend.getAmount(), fluidToSend);
}
Expand Down
@@ -1,5 +1,6 @@
package mekanism.common.content.network.distribution;

import java.util.Collection;
import javax.annotation.Nonnull;
import mekanism.api.annotations.NonNull;
import mekanism.api.chemical.Chemical;
Expand All @@ -10,9 +11,6 @@
import mekanism.common.lib.distribution.SplitInfo;
import mekanism.common.lib.distribution.Target;
import mekanism.common.util.ChemicalUtil;
import net.minecraft.util.Direction;

import java.util.Collection;

public class BoxedChemicalTransmitterSaveTarget<CHEMICAL extends Chemical<CHEMICAL>, STACK extends ChemicalStack<CHEMICAL>>
extends Target<BoxedPressurizedTube, Long, @NonNull STACK> {
Expand Down Expand Up @@ -52,8 +50,7 @@ public void saveShare() {
shouldSave = true;
} else if (!currentStored.isEmpty()) {
ChemicalType chemicalType = ChemicalType.getTypeFor(currentStored);
shouldSave = chemicalType != tube.saveShare.getChemicalType() || !currentStored.isStackIdentical((STACK) tube.saveShare
.getChemicalStack());
shouldSave = chemicalType != tube.saveShare.getChemicalType() || !currentStored.isStackIdentical((STACK) tube.saveShare.getChemicalStack());
}
if (shouldSave) {
tube.saveShare = currentStored.isEmpty() ? BoxedChemicalStack.EMPTY : BoxedChemicalStack.box(currentStored);
Expand Down
@@ -1,29 +1,27 @@
package mekanism.common.content.network.distribution;

import java.util.Collection;
import mekanism.api.math.FloatingLong;
import mekanism.common.content.network.transmitter.UniversalCable;
import mekanism.common.lib.distribution.SplitInfo;
import mekanism.common.lib.distribution.Target;
import net.minecraft.util.Direction;

import java.util.Collection;

public class EnergyTransmitterSaveTarget extends Target<UniversalCable, FloatingLong, FloatingLong> {

private FloatingLong currentStored = FloatingLong.ZERO;

public EnergyTransmitterSaveTarget() {
}
public EnergyTransmitterSaveTarget() {
}

public EnergyTransmitterSaveTarget(Collection<UniversalCable> allHandlers) {
super(allHandlers);
}
public EnergyTransmitterSaveTarget(Collection<UniversalCable> allHandlers) {
super(allHandlers);
}

public EnergyTransmitterSaveTarget(int expectedSize) {
super(expectedSize);
}
public EnergyTransmitterSaveTarget(int expectedSize) {
super(expectedSize);
}

@Override
@Override
protected void acceptAmount(UniversalCable transmitter, SplitInfo<FloatingLong> splitInfo, FloatingLong amount) {
amount = amount.min(transmitter.getCapacityAsFloatingLong().subtract(currentStored));
currentStored = currentStored.plusEqual(amount);
Expand All @@ -37,10 +35,10 @@ protected FloatingLong simulate(UniversalCable transmitter, FloatingLong energyT

public void saveShare() {
for (UniversalCable cable : handlers) {
if (!currentStored.isZero() || !cable.lastWrite.isZero()) {
cable.lastWrite = currentStored;
cable.getTransmitterTile().markDirty(false);
}
}
if (!currentStored.isZero() || !cable.lastWrite.isZero()) {
cable.lastWrite = currentStored;
cable.getTransmitterTile().markDirty(false);
}
}
}
}
9 changes: 2 additions & 7 deletions src/main/java/mekanism/common/lib/distribution/Target.java
Expand Up @@ -3,13 +3,8 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.util.Direction;
import org.apache.commons.lang3.tuple.ImmutablePair;

/**
Expand All @@ -22,11 +17,11 @@
public abstract class Target<HANDLER, TYPE extends Number & Comparable<TYPE>, EXTRA> {

/**
* Map of the sides to the handler for that side.
* Collection of handlers
*/
protected final Collection<HANDLER> handlers;
/**
* Map of sides that want more than we can/are willing to provide. Value is the amount they want.
* Collection of handler type pairs that want more than we can/are willing to provide. Value is the amount they want.
*/
protected final Collection<ImmutablePair<HANDLER, TYPE>> needed;

Expand Down
@@ -1,6 +1,7 @@
package mekanism.common.lib.transmitter.acceptor;

import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import java.util.Collection;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Map;
Expand Down Expand Up @@ -72,6 +73,13 @@ public Set<Map.Entry<BlockPos, Map<Direction, LazyOptional<ACCEPTOR>>>> getAccep
return cachedAcceptors.entrySet();
}

/**
* @apiNote Listeners should not be added to these LazyOptionals here as they may not correspond to an actual handler and may not get invalidated.
*/
public Collection<Map<Direction, LazyOptional<ACCEPTOR>>> getAcceptorValues() {
return cachedAcceptors.values();
}

public int getAcceptorCount() {
//Count multiple connections to the same position as multiple acceptors
return cachedAcceptors.values().stream().mapToInt(Map::size).sum();
Expand Down
10 changes: 3 additions & 7 deletions src/main/java/mekanism/common/util/CableUtils.java
Expand Up @@ -45,14 +45,10 @@ public static FloatingLong emit(Set<Direction> sides, FloatingLong energyToSend,
}
EnergyAcceptorTarget target = new EnergyAcceptorTarget(6);
EmitUtils.forEachSide(from.getLevel(), from.getBlockPos(), sides, (acceptor, side) -> {
//Insert to access side
Direction accessSide = side.getOpposite();
//Collect cap
EnergyCompatUtils.getLazyStrictEnergyHandler(acceptor, accessSide).ifPresent(target::addHandler);
//Insert to access side and collect the cap if it is present
EnergyCompatUtils.getLazyStrictEnergyHandler(acceptor, side.getOpposite()).ifPresent(target::addHandler);
});

int curHandlers = target.getHandlerCount();
if (curHandlers > 0) {
if (target.getHandlerCount() > 0) {
return EmitUtils.sendToAcceptors(target, energyToSend);
}
return FloatingLong.ZERO;
Expand Down
11 changes: 3 additions & 8 deletions src/main/java/mekanism/common/util/ChemicalUtil.java
Expand Up @@ -282,21 +282,16 @@ public static <CHEMICAL extends Chemical<CHEMICAL>, STACK extends ChemicalStack<
return 0;
}
Capability<IChemicalHandler<CHEMICAL, STACK>> capability = getCapabilityForChemical(stack);
//Fake that we have one target given we know that no sides will overlap
// This allows us to have slightly better performance
ChemicalHandlerTarget<CHEMICAL, STACK, IChemicalHandler<CHEMICAL, STACK>> target = new ChemicalHandlerTarget<>(stack, 6);
EmitUtils.forEachSide(from.getLevel(), from.getBlockPos(), sides, (acceptor, side) -> {
//Insert to access side
Direction accessSide = side.getOpposite();
//Collect cap
CapabilityUtils.getCapability(acceptor, capability, accessSide).ifPresent(handler -> {
//Insert to access side and collect the cap if it is present and we can insert the type of the stack into it
CapabilityUtils.getCapability(acceptor, capability, side.getOpposite()).ifPresent(handler -> {
if (canInsert(handler, stack)) {
target.addHandler(handler);
}
});
});
int curHandlers = target.getHandlerCount();
if (curHandlers > 0) {
if (target.getHandlerCount() > 0) {
return EmitUtils.sendToAcceptors(target, stack.getAmount(), ChemicalUtil.copy(stack));
}
return 0;
Expand Down
13 changes: 5 additions & 8 deletions src/main/java/mekanism/common/util/EmitUtils.java
Expand Up @@ -29,8 +29,8 @@ private EmitUtils() {
* @return The amount that actually got sent.
*/
private static <HANDLER, TYPE extends Number & Comparable<TYPE>, EXTRA, TARGET extends Target<HANDLER, TYPE, EXTRA>> TYPE sendToAcceptors(
TARGET availableTargets, SplitInfo<TYPE> splitInfo, EXTRA toSend) {
if ( availableTargets.getHandlerCount() == 0) {
TARGET availableTargets, SplitInfo<TYPE> splitInfo, EXTRA toSend) {
if (availableTargets.getHandlerCount() == 0) {
return splitInfo.getTotalSent();
}

Expand Down Expand Up @@ -62,8 +62,7 @@ private static <HANDLER, TYPE extends Number & Comparable<TYPE>, EXTRA, TARGET e
*
* @return The amount that actually got sent.
*/
public static <HANDLER, EXTRA, TARGET extends Target<HANDLER, Integer, EXTRA>> int sendToAcceptors(TARGET availableTargets, int amountToSplit,
EXTRA toSend) {
public static <HANDLER, EXTRA, TARGET extends Target<HANDLER, Integer, EXTRA>> int sendToAcceptors(TARGET availableTargets, int amountToSplit, EXTRA toSend) {
return sendToAcceptors(availableTargets, new IntegerSplitInfo(amountToSplit, availableTargets.getHandlerCount()), toSend);
}

Expand All @@ -77,8 +76,7 @@ public static <HANDLER, EXTRA, TARGET extends Target<HANDLER, Integer, EXTRA>> i
*
* @return The amount that actually got sent.
*/
public static <HANDLER, EXTRA, TARGET extends Target<HANDLER, Long, EXTRA>> long sendToAcceptors(TARGET availableTargets, long amountToSplit,
EXTRA toSend) {
public static <HANDLER, EXTRA, TARGET extends Target<HANDLER, Long, EXTRA>> long sendToAcceptors(TARGET availableTargets, long amountToSplit, EXTRA toSend) {
return sendToAcceptors(availableTargets, new LongSplitInfo(amountToSplit, availableTargets.getHandlerCount()), toSend);
}

Expand All @@ -88,8 +86,7 @@ public static <HANDLER, EXTRA, TARGET extends Target<HANDLER, Long, EXTRA>> long
*
* @return The amount that actually got sent
*/
public static <HANDLER, TARGET extends Target<HANDLER, FloatingLong, FloatingLong>> FloatingLong sendToAcceptors(TARGET availableTargets,
FloatingLong amountToSplit) {
public static <HANDLER, TARGET extends Target<HANDLER, FloatingLong, FloatingLong>> FloatingLong sendToAcceptors(TARGET availableTargets, FloatingLong amountToSplit) {
return sendToAcceptors(availableTargets, new FloatingLongSplitInfo(amountToSplit, availableTargets.getHandlerCount()), amountToSplit);
}

Expand Down

0 comments on commit 962698e

Please sign in to comment.