diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java index a125bbd8b0..b279660a9e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java @@ -44,7 +44,7 @@ public ServerPastelNetwork(ServerLevel world, UUID uuid, int color) { } public ServerPastelNetwork(ServerLevel world, PastelNodeBlockEntity initialNode) { - this(world, initialNode.getNodeId(), initialNode.getPastelNetworkColor(), new TickLooper(10)); + this(world, UUID.randomUUID(), initialNode.getPastelNetworkColor(), new TickLooper(10)); addNode(initialNode); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java index 91fb02aab7..cf1386fb9b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java @@ -61,6 +61,7 @@ public CompoundTag save(CompoundTag nbt, HolderLookup.Provider registryLookup) { var wrapper = new CompoundTag(); wrapper.put("network", opt.get()); wrapper.put("scheduler", transgender(network.getTransmissions())); + wrapper.put("graph", network.graphToNbt()); // Trans missions?... do... do they really? networkList.add(wrapper); } @@ -75,10 +76,12 @@ public static ServerPastelNetworkManager fromNbt(CompoundTag nbt) { var comp = (CompoundTag) element; var netNbt = comp.get("network"); var schedulerNbt = comp.getCompound("scheduler"); + var graphNbt = comp.getCompound("graph"); Optional network = CodecHelper.fromNbt(ServerPastelNetwork.CODEC, netNbt); if (network.isPresent()) { network.get().getTransmissions().putAll(transDecode(schedulerNbt, network.get())); + network.get().setGraph(ServerPastelNetwork.graphFromNbt(graphNbt)); manager.networks.add(network.get()); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java index 350adf6d2a..082559081f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java @@ -168,6 +168,8 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level world.playLocalSound(pos, SpectrumSoundEvents.MEDIUM_CRYSTAL_RING, SoundSource.BLOCKS, 0.25F, 0.9F + world.getRandom().nextFloat() * 0.2F, true); return ItemInteractionResult.sidedSuccess(world.isClientSide()); + } else if (tryColorUsingStackInHand(stack, world, pos, player, hand)) { + return ItemInteractionResult.sidedSuccess(world.isClientSide()); } else if (this.pastelNodeType.usesFilters()) { if (!world.isClientSide) { player.openMenu(blockEntity); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java index b58f29a100..5744310fe3 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java @@ -74,6 +74,8 @@ public class PastelNodeBlockEntity extends BlockEntity implements FilterConfigur protected BlockApiCache, Direction> connectedStorageCache = null; protected Direction cachedDirection = null; + + protected Boolean isInitialized = false; private final List filterItems; float rotationTarget, crystalRotation, lastRotationTarget, heightTarget, crystalHeight, lastHeightTarget, alphaTarget, ringAlpha, lastAlphaTarget; @@ -101,6 +103,11 @@ public PastelNodeBlockEntity(BlockPos blockPos, BlockState blockState) { } public static void tick(@NotNull Level world, BlockPos pos, BlockState state, PastelNodeBlockEntity node) { + if (!node.isInitialized && !world.isClientSide()) { // kinda onLoad()? + node.getServerNetwork().ifPresent(network -> network.initializeNode(node)); + node.isInitialized = true; + } + if (node.lamp && state.getValue(BlockStateProperties.LIT) != node.canTransfer()) { world.setBlockAndUpdate(pos, state.setValue(BlockStateProperties.LIT, node.cachedUnpowered)); } @@ -333,6 +340,7 @@ protected void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLoo this.creationStamp = nbt.contains("creationStamp") ? nbt.getLong("creationStamp") : 0; this.lastTransferTick = nbt.contains("LastTransferTick", Tag.TAG_LONG) ? nbt.getLong("LastTransferTick") : 0; this.itemCountUnderway = nbt.contains("ItemCountUnderway", Tag.TAG_LONG) ? nbt.getLong("ItemCountUnderway") : 0; + this.color = nbt.contains("ColorId", Tag.TAG_INT) ? Optional.of(DyeColor.byId(nbt.getInt("ColorId"))) : Optional.empty(); this.outerRing = nbt.contains("OuterRing") ? Optional.ofNullable(SpectrumRegistries.PASTEL_UPGRADE.get(ResourceLocation.tryParse(nbt.getString("OuterRing")))) : Optional.empty(); this.innerRing = nbt.contains("InnerRing") ? Optional.ofNullable(SpectrumRegistries.PASTEL_UPGRADE.get(ResourceLocation.tryParse(nbt.getString("InnerRing")))) : Optional.empty(); this.redstoneRing = nbt.contains("RedstoneRing") ? Optional.ofNullable(SpectrumRegistries.PASTEL_UPGRADE.get(ResourceLocation.tryParse(nbt.getString("RedstoneRing")))) : Optional.empty(); @@ -351,6 +359,9 @@ protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLoo if (this.networkUUID.isPresent()) { nbt.putUUID("NetworkUUID", this.networkUUID.get()); } + if (this.color.isPresent()) { + nbt.putInt("ColorId", this.color.get().getId()); + } nbt.putUUID("NodeID", this.nodeId); nbt.putBoolean("Triggered", this.triggered); nbt.putBoolean("Waiting", this.waiting); @@ -546,6 +557,7 @@ public boolean setColor(Optional color, @Nullable Entity user) { public void connectToNearbyNodes(@Nullable Entity user) { // remove from existing network, if it had one and join new networks Pastel.getServerInstance().removeNode(this, NodeRemovalReason.DISCONNECT); + this.setNetworkUUID(null); // scan for all connectable nearby nodes Map, List> connectableNodes = new Object2ObjectArrayMap<>(); @@ -584,7 +596,12 @@ public void connectToNearbyNodes(@Nullable Entity user) { network = Pastel.getServerInstance().createNetwork((ServerLevel) level, this); for (PastelNodeBlockEntity entry : connectableNodes.get(Optional.empty())) { - network.addEdge(this, entry); + try { + network.addEdge(this, entry); // Sometimes throws 'IllegalStateException("Attempted to add an edge to a foreign network")' (why? idk. better safe than sorry) + } catch (Exception e) { + SpectrumCommon.logWarning("PastelNodeBlockEntity can't connectToNearbyNodes: " + e.getMessage()); + e.printStackTrace(); + } } } else if (foundNetworkCount == 1) { // there is exactly one other network diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java index 2ff5550fb9..5b60a69e5b 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java @@ -134,7 +134,7 @@ private boolean tryColorBlock(UseOnContext context) { context.getLevel().playSound(null, context.getClickedPos(), SpectrumSoundEvents.USE_FAIL, SoundSource.BLOCKS, 1.0F, 1.0F); } } - return false; + return true; } return cursedColor(context);