Optimize
EnergonRelics/pipeline/head This commit looks good Details

This commit is contained in:
TheBrokenRail 2020-07-27 14:06:46 -04:00
parent a90dd215ff
commit f079823bfe
14 changed files with 118 additions and 49 deletions

View File

@ -39,7 +39,7 @@ public class BlockBreakerBlockEntity extends EnergyReceiverBlockEntity {
}
@Override
protected void tickEnergy() {
protected void energyTick() {
addAction(Action.createBlockStatePropertyAction(HardcodedConfig.BLOCK_BREAKER_ENERGY_REQUIRED_IDLE, BlockBreakerBlock.POWERED, true, false));
if (getCachedState().get(BlockBreakerBlock.POWERED)) {

View File

@ -220,7 +220,7 @@ public class DefensiveLaserBlockEntity extends EnergyReceiverBlockEntity {
}
@Override
protected void tickEnergy() {
protected void energyTick() {
assert getWorld() != null;
addAction(Action.createBlockStatePropertyAction(HardcodedConfig.DEFENSIVE_LASER_IDLE_ENERGY_REQUIRED, DefensiveLaserBlock.POWERED, true, false));
if (getCachedState().get(DefensiveLaserBlock.POWERED)) {

View File

@ -12,7 +12,7 @@ public class EnergonLightBlockEntity extends EnergyReceiverBlockEntity {
}
@Override
protected void tickEnergy() {
protected void energyTick() {
addAction(Action.createBlockStatePropertyAction(HardcodedConfig.ENERGON_LIGHT_ENERGY_REQUIRED, EnergonLightBlock.POWERED, true, false));
}
}

View File

@ -18,7 +18,7 @@ public class HolographicSkyBlockEntity extends EnergyReceiverBlockEntity {
}
@Override
protected void tickEnergy() {
protected void energyTick() {
addAction(Action.createBlockStatePropertyAction(HardcodedConfig.HOLOGRAPHIC_SKY_ENERGY_REQUIRED, HolographicSkyBlock.POWERED, true, false));
assert getWorld() != null;

View File

@ -1,7 +1,6 @@
package com.thebrokenrail.energonrelics.block.entity;
import com.thebrokenrail.energonrelics.config.HardcodedConfig;
import com.thebrokenrail.energonrelics.energy.core.EnergyProviderBlockEntity;
import com.thebrokenrail.energonrelics.energy.core.util.EnergyTickable;
import com.thebrokenrail.energonrelics.energy.helper.EnergyGeneratorBlockEntity;
import net.minecraft.block.entity.BlockEntityType;

View File

@ -10,7 +10,7 @@ public class SwitchBlockEntity extends EnergyReceiverBlockEntity {
}
@Override
protected void tickEnergy() {
protected void energyTick() {
}
@Override

View File

@ -11,7 +11,6 @@ import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEntity implements EnergyGenerator {
public PassiveBatteryControllerBlockEntity(BlockEntityType<?> type) {
@ -19,12 +18,10 @@ public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEnti
}
private static class UnlimitedAction implements Action.PropagatedAction {
private final World world;
private final BlockPos pos;
private final PassiveBatteryControllerBlockEntity battery;
private UnlimitedAction(World world, BlockPos pos) {
this.world = world;
this.pos = pos;
private UnlimitedAction(PassiveBatteryControllerBlockEntity battery) {
this.battery = battery;
}
@Override
@ -38,11 +35,7 @@ public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEnti
@Override
public void pay(long amount) {
BlockEntity entity = world.getBlockEntity(pos);
if (entity instanceof PassiveBatteryControllerBlockEntity) {
PassiveBatteryControllerBlockEntity battery = (PassiveBatteryControllerBlockEntity) entity;
battery.setEnergy(battery.getEnergy() + amount);
}
battery.setEnergy(battery.getEnergy() + amount);
}
@Override
@ -51,18 +44,12 @@ public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEnti
}
@Override
protected void tickEnergy() {
protected void energyTick() {
long charge = HardcodedConfig.BATTERY_CHARGE_RATE;
if (!isActiveController()) {
addAction(new Action(charge, (world, pos, state) -> {
BlockEntity entity = world.getBlockEntity(pos);
if (entity instanceof PassiveBatteryControllerBlockEntity) {
PassiveBatteryControllerBlockEntity battery = (PassiveBatteryControllerBlockEntity) entity;
battery.setEnergy(battery.getEnergy() + charge);
}
}, (world, pos, state) -> {}));
addAction(new Action(charge, (world, pos, state) -> PassiveBatteryControllerBlockEntity.this.setEnergy(PassiveBatteryControllerBlockEntity.this.getEnergy() + charge), (world, pos, state) -> {}));
} else {
propagateAction(new UnlimitedAction(getWorld(), getPos()));
propagateAction(new UnlimitedAction(this));
}
}

View File

@ -17,7 +17,7 @@ public class ForcefieldProjectorBlockEntity extends EnergyReceiverBlockEntity {
}
@Override
protected void tickEnergy() {
protected void energyTick() {
assert getWorld() != null;
addAction(Action.createBlockStatePropertyAction(HardcodedConfig.FORCEFIELD_PROJECTOR_ENERGY_REQUIRED, ForcefieldProjectorBlock.POWERED, true, false));

View File

@ -17,8 +17,10 @@ import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class NetworkComponent extends PersistentState {
@ -90,12 +92,12 @@ public class NetworkComponent extends PersistentState {
}
private Entry getOrCreate(int id) {
markDirty();
for (Entry entry : networks) {
if (entry.id == id) {
return entry;
}
}
markDirty();
Entry entry = new Entry();
entry.id = id;
entry.sources.clear();
@ -107,13 +109,47 @@ public class NetworkComponent extends PersistentState {
return Objects.requireNonNull(world.getServer().getWorld(World.OVERWORLD)).getPersistentStateManager().getOrCreate(NetworkComponent::new, EnergonRelics.NAMESPACE);
}
public List<BlockPosWithDimension> getSourcePos(int id) {
public List<BlockPosWithDimension> getSourcesPos(int id) {
Entry entry = getOrCreate(id);
return entry.sources;
}
public List<EnergyProviderBlockEntity> getSource(World world, int id) {
List<BlockPosWithDimension> sources = getSourcePos(id);
private final Map<Integer, List<EnergyProviderBlockEntity>> cache = new HashMap<>();
private List<EnergyProviderBlockEntity> getSourcesFromCache(World world, int id) {
if (cache.containsKey(id)) {
world.getProfiler().push("getSourcesFromCache");
List<EnergyProviderBlockEntity> list = cache.get(id);
boolean valid = true;
for (EnergyProviderBlockEntity entity : list) {
if (!entity.isNetwork(id) || entity.isRemoved()) {
valid = false;
break;
}
}
world.getProfiler().pop();
if (valid) {
Collections.shuffle(list);
return list;
} else {
cache.remove(id);
return null;
}
} else {
return null;
}
}
private List<EnergyProviderBlockEntity> getSourcesFromCacheMiss(World world, int id) {
world.getProfiler().push("getSourcesFromCacheMiss");
List<BlockPosWithDimension> sources = getSourcesPos(id);
List<BlockPosWithDimension> valid = new ArrayList<>();
Iterator<BlockPosWithDimension> iterator = sources.iterator();
List<EnergyProviderBlockEntity> providers = new ArrayList<>();
@ -138,9 +174,33 @@ public class NetworkComponent extends PersistentState {
markDirty();
}
Collections.shuffle(providers);
cache.put(id, providers);
world.getProfiler().pop();
return providers;
}
public List<EnergyProviderBlockEntity> getSources(World world, int id) {
world.getProfiler().push("getSources");
List<EnergyProviderBlockEntity> result;
List<EnergyProviderBlockEntity> cacheResult = getSourcesFromCache(world, id);
if (cacheResult != null) {
result = cacheResult;
} else {
result = getSourcesFromCacheMiss(world, id);
}
world.getProfiler().pop();
return result;
}
public void clearCache() {
cache.clear();
}
public void addSource(int id, BlockPosWithDimension pos) {
Entry entry = getOrCreate(id);
if (!entry.sources.contains(pos)) {

View File

@ -87,9 +87,9 @@ public class EnergyProviderBlockEntity extends BlockEntity implements BlockEntit
@Override
public List<EnergyTickable> startTick() {
if (isEnergyProvider()) {
if (isEnergyProvider() && stack.getItem() == EnergonRelics.NETWORK_CHIP_ITEM) {
NetworkComponent component = NetworkComponent.getInstance((ServerWorld) Objects.requireNonNull(getWorld()));
List<BlockPosWithDimension> sources = component.getSourcePos(EnergonRelics.NETWORK_CHIP_ITEM.getID(stack));
List<BlockPosWithDimension> sources = component.getSourcesPos(EnergonRelics.NETWORK_CHIP_ITEM.getID(stack));
if (!sources.contains(new BlockPosWithDimension(getPos(), getWorld().getRegistryKey()))) {
takeStack(getWorld());
}
@ -150,4 +150,9 @@ public class EnergyProviderBlockEntity extends BlockEntity implements BlockEntit
sync();
}
}
@Override
public String getID() {
return String.valueOf(BlockEntityType.getId(getType()));
}
}

View File

@ -45,7 +45,7 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit
}
protected void addAction(Action action) {
propagateAction(new Action.PropagatedActionImpl(action, getWorld(), getPos(), getCachedState().getBlock()));
propagateAction(new Action.PropagatedActionImpl(action, getWorld(), getPos(), getCachedState()));
}
@Override
@ -60,7 +60,7 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit
providers.clear();
for (int network : networks) {
List<EnergyProviderBlockEntity> potentialProviders = component.getSource(world, network);
List<EnergyProviderBlockEntity> potentialProviders = component.getSources(world, network);
for (EnergyProviderBlockEntity provider : potentialProviders) {
if (provider.getRegistryKey().equals(getWorld().getRegistryKey())) {
Vec3d pos = new Vec3d(getPos().getX() + 0.5d, getPos().getY() + 0.5d, getPos().getZ() + 0.5d);
@ -82,7 +82,10 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit
@Override
public void logicTick() {
super.logicTick();
tickEnergy();
assert getWorld() != null;
getWorld().getProfiler().push("energyTick");
energyTick();
getWorld().getProfiler().pop();
}
public long getTotalCost() {
@ -121,7 +124,7 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit
throw new UnsupportedOperationException();
}
protected abstract void tickEnergy();
protected abstract void energyTick();
public void toggle(int network) {
if (contains(network)) {

View File

@ -1,6 +1,5 @@
package com.thebrokenrail.energonrelics.energy.core.util;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.state.property.Property;
import net.minecraft.util.math.BlockPos;
@ -44,16 +43,16 @@ public class Action {
private final Action action;
private final World world;
private final BlockPos pos;
private final Block block;
private final BlockState state;
private int expectedPayments = 1;
private int payments = 0;
private long amountPaid = 0;
public PropagatedActionImpl(Action action, World world, BlockPos pos, Block block) {
public PropagatedActionImpl(Action action, World world, BlockPos pos, BlockState state) {
this.action = action;
this.world = world;
this.pos = pos;
this.block = block;
this.state = state;
}
@Override
@ -73,8 +72,7 @@ public class Action {
public void pay(long amount) {
amountPaid = amountPaid + amount;
payments++;
BlockState state = world.getBlockState(pos);
if (state != null && state.getBlock() == block) {
if (state != null) {
if (amountOwed() <= 0) {
action.success.run(world, pos, state);
} else if (payments >= expectedPayments) {

View File

@ -5,4 +5,5 @@ import java.util.List;
public interface EnergyTickable {
List<EnergyTickable> startTick();
void logicTick();
String getID();
}

View File

@ -1,5 +1,7 @@
package com.thebrokenrail.energonrelics.energy.core.util;
import com.thebrokenrail.energonrelics.component.NetworkComponent;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.World;
import java.util.ArrayList;
@ -16,15 +18,23 @@ public class EnergyTicker {
public static void tick(World world) {
if (Objects.requireNonNull(world.getServer()).getThread() == Thread.currentThread()) {
world.getProfiler().push("energyTicker");
NetworkComponent.getInstance((ServerWorld) world).clearCache();
List<EnergyTickable> started = new ArrayList<>();
List<EnergyTickable> temp = new ArrayList<>(scheduled);
List<EnergyTickable> temp2 = new ArrayList<>();
while (!temp.isEmpty()) {
for (EnergyTickable provider : temp) {
if (!started.contains(provider)) {
temp2.addAll(provider.startTick());
started.add(provider);
for (EnergyTickable tickable : temp) {
if (!started.contains(tickable)) {
world.getProfiler().push(() -> tickable.getID() + " startTick");
temp2.addAll(tickable.startTick());
started.add(tickable);
world.getProfiler().pop();
}
}
temp.clear();
@ -33,9 +43,15 @@ public class EnergyTicker {
}
Collections.shuffle(started);
for (EnergyTickable provider : started) {
provider.logicTick();
for (EnergyTickable tickable : started) {
world.getProfiler().push(() -> tickable.getID() + " logicTick");
tickable.logicTick();
world.getProfiler().pop();
}
world.getProfiler().pop();
}
scheduled.clear();
}