API improvements

This commit is contained in:
raoulvdberge
2017-02-14 20:38:50 +01:00
parent 6a43371482
commit a8a0a1082c
8 changed files with 38 additions and 33 deletions

View File

@@ -42,6 +42,13 @@ public interface IRSAPI {
*/
INetworkNodeManager getNetworkNodeManager(int dimension);
/**
* Marks the network node saved data dirty for a given world.
*
* @param world the world
*/
void markNetworkNodesDirty(World world);
/**
* @return the default storage disk behavior
*/

View File

@@ -1,7 +1,6 @@
package com.raoulvdberge.refinedstorage.api.network.node;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nullable;
import java.util.Collection;
@@ -22,9 +21,10 @@ public interface INetworkNodeManager {
/**
* Removes a node from the registry at a given position.
*
* @param pos the position
* @param pos the position
* @param notifyClient whether to notify the client of the removal
*/
void removeNode(BlockPos pos);
void removeNode(BlockPos pos, boolean notifyClient);
/**
* Sets a node in the registry at a given position.
@@ -43,11 +43,4 @@ public interface INetworkNodeManager {
* Clears all the nodes.
*/
void clear();
/**
* Marks the nodes dirty.
*
* @param world the world
*/
void markDirty(World world);
}

View File

@@ -23,6 +23,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPrev
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeManager;
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.WorldSavedDataNetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterChannel;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRegistry;
@@ -44,10 +45,8 @@ import net.minecraftforge.fml.relauncher.Side;
import javax.annotation.Nonnull;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.BiPredicate;
public class API implements IRSAPI {
private static final IRSAPI INSTANCE = new API();
@@ -98,10 +97,15 @@ public class API implements IRSAPI {
}
@Override
public INetworkNodeManager getNetworkNodeManager(int dimension) {
public INetworkNodeManager getNetworkNodeManager(final int dimension) {
Map<Integer, INetworkNodeManager> provider = FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? networkNodeProviderClient : networkNodeProviderServer;
return provider.computeIfAbsent(dimension, r -> new NetworkNodeManager());
return provider.computeIfAbsent(dimension, r -> new NetworkNodeManager(dimension));
}
@Override
public void markNetworkNodesDirty(World world) {
WorldSavedDataNetworkNode.getOrLoadData(world).markDirty();
}
@Override

View File

@@ -1,10 +1,10 @@
package com.raoulvdberge.refinedstorage.apiimpl.network;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.WorldSavedDataNetworkNode;
import com.raoulvdberge.refinedstorage.network.MessageNodeRemove;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nullable;
import java.util.Collection;
@@ -14,6 +14,12 @@ import java.util.Map;
public class NetworkNodeManager implements INetworkNodeManager {
private Map<BlockPos, INetworkNode> nodes = new HashMap<>();
private int dimension;
public NetworkNodeManager(int dimension) {
this.dimension = dimension;
}
@Override
@Nullable
public INetworkNode getNode(BlockPos pos) {
@@ -21,8 +27,12 @@ public class NetworkNodeManager implements INetworkNodeManager {
}
@Override
public void removeNode(BlockPos pos) {
public void removeNode(BlockPos pos, boolean notifyClient) {
nodes.remove(pos);
if (notifyClient) {
RS.INSTANCE.network.sendToAll(new MessageNodeRemove(dimension, pos));
}
}
@Override
@@ -39,9 +49,4 @@ public class NetworkNodeManager implements INetworkNodeManager {
public void clear() {
nodes.clear();
}
@Override
public void markDirty(World world) {
WorldSavedDataNetworkNode.getOrLoadData(world).markDirty();
}
}

View File

@@ -85,7 +85,7 @@ public abstract class NetworkNode implements INetworkNode, INetworkNeighborhoodA
@Override
public void markDirty() {
if (holder.world() != null) {
API.instance().getNetworkNodeManager(holder.world().provider.getDimension()).markDirty(holder.world());
API.instance().markNetworkNodesDirty(holder.world());
}
}

View File

@@ -1,10 +1,8 @@
package com.raoulvdberge.refinedstorage.block;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.network.MessageNodeRemove;
import com.raoulvdberge.refinedstorage.tile.TileNode;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.state.BlockStateContainer;
@@ -56,15 +54,13 @@ public abstract class BlockNode extends BlockBase {
INetworkNode node = manager.getNode(pos);
manager.removeNode(pos);
manager.markDirty(world);
manager.removeNode(pos, true);
API.instance().markNetworkNodesDirty(world);
if (node.getNetwork() != null) {
node.getNetwork().getNodeGraph().rebuild();
}
// Since Block#breakBlock is only called on the server and we can't trust TileEntity#invalidate:
RS.INSTANCE.network.sendToAll(new MessageNodeRemove(world.provider.getDimension(), pos));
}
@Override

View File

@@ -31,9 +31,9 @@ public class BlockStorageMonitor extends BlockNode {
if (!world.isRemote) {
ItemStack holding = player.inventory.getCurrentItem();
if (player.isSneaking() || holding.isEmpty()) {
if (player.isSneaking()) {
tryOpenNetworkGui(RSGui.STORAGE_MONITOR, player, world, pos, side);
} else {
} else if (!holding.isEmpty()) {
NetworkNodeStorageMonitor storageMonitor = ((TileStorageMonitor) world.getTileEntity(pos)).getNode();
if (storageMonitor.getType() != IType.ITEMS) {

View File

@@ -38,7 +38,7 @@ public class MessageNodeRemove implements IMessage, IMessageHandler<MessageNodeR
Minecraft.getMinecraft().addScheduledTask(() -> {
INetworkNodeManager manager = API.instance().getNetworkNodeManager(message.dim);
manager.removeNode(message.pos);
manager.removeNode(message.pos, false);
});
return null;