2020-07-13 20:37:21 +00:00
|
|
|
package com.thebrokenrail.energonrelics.energy.core;
|
|
|
|
|
|
|
|
import com.thebrokenrail.energonrelics.component.NetworkComponent;
|
|
|
|
import com.thebrokenrail.energonrelics.energy.core.util.Action;
|
2020-07-26 22:31:05 +00:00
|
|
|
import com.thebrokenrail.energonrelics.energy.core.util.EnergyTickable;
|
2020-07-13 20:37:21 +00:00
|
|
|
import net.minecraft.block.BlockState;
|
|
|
|
import net.minecraft.block.entity.BlockEntityType;
|
|
|
|
import net.minecraft.nbt.CompoundTag;
|
|
|
|
import net.minecraft.nbt.IntArrayTag;
|
|
|
|
import net.minecraft.server.world.ServerWorld;
|
|
|
|
import net.minecraft.util.math.Vec3d;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
|
|
|
|
2020-07-27 18:11:24 +00:00
|
|
|
public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntity {
|
2020-07-13 20:37:21 +00:00
|
|
|
public EnergyReceiverBlockEntity(BlockEntityType<?> type) {
|
|
|
|
super(type);
|
|
|
|
}
|
|
|
|
|
2020-07-24 17:25:50 +00:00
|
|
|
private final List<EnergyProviderBlockEntity> providers = new ArrayList<>();
|
2020-07-13 20:37:21 +00:00
|
|
|
private final List<Integer> networks = new ArrayList<>();
|
|
|
|
|
|
|
|
private long totalCost = 0;
|
2020-07-24 17:25:50 +00:00
|
|
|
private long previousTotalCost = 0;
|
2020-07-13 20:37:21 +00:00
|
|
|
|
2020-07-25 21:58:36 +00:00
|
|
|
private final List<Action.PropagatedAction> sent = new ArrayList<>();
|
|
|
|
|
2020-07-13 20:37:21 +00:00
|
|
|
protected void propagateAction(Action.PropagatedAction action) {
|
2020-07-25 21:58:36 +00:00
|
|
|
sent.add(action);
|
|
|
|
|
2020-07-13 20:37:21 +00:00
|
|
|
totalCost = totalCost + action.amountOwed();
|
2020-07-24 17:25:50 +00:00
|
|
|
if (providers.size() > 0) {
|
|
|
|
action.expandPayments(providers.size());
|
|
|
|
for (EnergyProviderBlockEntity provider : providers) {
|
|
|
|
provider.addPropagatedAction(action);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
action.pay(0);
|
|
|
|
}
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void addAction(Action action) {
|
2020-07-27 18:06:46 +00:00
|
|
|
propagateAction(new Action.PropagatedActionImpl(action, getWorld(), getPos(), getCachedState()));
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-07-26 22:31:05 +00:00
|
|
|
public List<EnergyTickable> startTick() {
|
2020-07-25 21:58:36 +00:00
|
|
|
sent.clear();
|
|
|
|
|
2020-07-26 22:31:05 +00:00
|
|
|
List<EnergyTickable> list = new ArrayList<>(super.startTick());
|
2020-07-24 17:25:50 +00:00
|
|
|
|
2020-07-22 23:51:42 +00:00
|
|
|
ServerWorld world = (ServerWorld) getWorld();
|
|
|
|
assert world != null;
|
|
|
|
NetworkComponent component = NetworkComponent.getInstance(world);
|
|
|
|
|
|
|
|
providers.clear();
|
|
|
|
for (int network : networks) {
|
2020-07-27 18:06:46 +00:00
|
|
|
List<EnergyProviderBlockEntity> potentialProviders = component.getSources(world, network);
|
2020-07-24 17:25:50 +00:00
|
|
|
for (EnergyProviderBlockEntity provider : potentialProviders) {
|
2020-07-22 23:51:42 +00:00
|
|
|
if (provider.getRegistryKey().equals(getWorld().getRegistryKey())) {
|
|
|
|
Vec3d pos = new Vec3d(getPos().getX() + 0.5d, getPos().getY() + 0.5d, getPos().getZ() + 0.5d);
|
|
|
|
if (provider.isWithinDistance(pos)) {
|
|
|
|
providers.add(provider);
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-07-22 23:51:42 +00:00
|
|
|
}
|
2020-07-13 20:37:21 +00:00
|
|
|
|
2020-07-24 17:25:50 +00:00
|
|
|
previousTotalCost = totalCost;
|
2020-07-22 23:51:42 +00:00
|
|
|
totalCost = 0;
|
2020-07-13 20:37:21 +00:00
|
|
|
|
2020-07-24 17:25:50 +00:00
|
|
|
list.addAll(providers);
|
2020-07-23 17:39:40 +00:00
|
|
|
|
2020-07-24 17:25:50 +00:00
|
|
|
return list;
|
|
|
|
}
|
2020-07-13 20:37:21 +00:00
|
|
|
|
2020-07-24 17:25:50 +00:00
|
|
|
@Override
|
|
|
|
public void logicTick() {
|
|
|
|
super.logicTick();
|
2020-07-27 18:06:46 +00:00
|
|
|
assert getWorld() != null;
|
|
|
|
getWorld().getProfiler().push("energyTick");
|
|
|
|
energyTick();
|
|
|
|
getWorld().getProfiler().pop();
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public long getTotalCost() {
|
2020-07-24 17:25:50 +00:00
|
|
|
return previousTotalCost;
|
2020-07-13 20:37:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void handlePropagatedAction(Action.PropagatedAction action) {
|
2020-07-22 23:51:42 +00:00
|
|
|
super.handlePropagatedAction(action);
|
2020-07-13 20:37:21 +00:00
|
|
|
// Propagate Action To Energy Providers
|
2020-07-25 21:58:36 +00:00
|
|
|
if (isEnergyProviderActive() && !sent.contains(action)) {
|
2020-07-24 17:25:50 +00:00
|
|
|
propagateAction(action);
|
2020-07-13 20:37:21 +00:00
|
|
|
} else {
|
|
|
|
action.pay(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public CompoundTag toTag(CompoundTag tag) {
|
|
|
|
super.toTag(tag);
|
|
|
|
tag.put("Networks", new IntArrayTag(networks));
|
|
|
|
return tag;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void fromTag(BlockState state, CompoundTag tag) {
|
|
|
|
super.fromTag(state, tag);
|
|
|
|
int[] networksArray = tag.getIntArray("Networks");
|
|
|
|
networks.clear();
|
|
|
|
for (int network : networksArray) {
|
|
|
|
networks.add(network);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected boolean isEnergyProviderActive() {
|
|
|
|
throw new UnsupportedOperationException();
|
|
|
|
}
|
|
|
|
|
2020-07-27 18:06:46 +00:00
|
|
|
protected abstract void energyTick();
|
2020-07-13 20:37:21 +00:00
|
|
|
|
|
|
|
public void toggle(int network) {
|
|
|
|
if (contains(network)) {
|
|
|
|
networks.removeAll(Collections.singletonList(network));
|
|
|
|
} else {
|
|
|
|
networks.add(network);
|
|
|
|
}
|
|
|
|
markDirty();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean contains(int network) {
|
|
|
|
return networks.contains(network);
|
|
|
|
}
|
|
|
|
}
|