Skip to content

Commit ca8a972

Browse files
committed
Make Wire posts placeable on fences and chains; fix wires chunk loading and unloading; [WIP]: fix grid chunk loading and unloading
1 parent ed299c4 commit ca8a972

15 files changed

Lines changed: 214 additions & 119 deletions

src/main/java/falseresync/vivatech/client/ClientWireManager.java

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,56 +2,76 @@
22

33
import falseresync.vivatech.common.power.Wire;
44
import falseresync.vivatech.network.c2s.RequestWiresC2SPayload;
5+
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
56
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
67
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
8+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents;
9+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientWorldEvents;
710
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
811
import net.minecraft.client.MinecraftClient;
12+
import net.minecraft.registry.RegistryKey;
913
import net.minecraft.util.math.ChunkPos;
14+
import net.minecraft.world.World;
1015

1116
import java.util.List;
17+
import java.util.Map;
1218
import java.util.Set;
1319

1420
public class ClientWireManager {
1521
private final MinecraftClient client;
16-
private final Set<Wire> wires = new ObjectOpenHashSet<>();
17-
private final List<ChunkPos> unsyncedChunks = new ObjectArrayList<>();
22+
private final Map<RegistryKey<World>, Tracker> trackers = new Object2ObjectArrayMap<>();
1823

1924
public ClientWireManager(MinecraftClient client) {
2025
this.client = client;
21-
}
2226

23-
public void onWiresAdded(Set<Wire> wires) {
24-
this.wires.addAll(wires);
27+
ClientWorldEvents.AFTER_CLIENT_WORLD_CHANGE.register((_ignored, world) -> {
28+
trackers.putIfAbsent(world.getRegistryKey(), new Tracker());
29+
});
30+
31+
ClientChunkEvents.CHUNK_LOAD.register((world, chunk) -> {
32+
trackers.get(world.getRegistryKey()).unsyncedChunks.add(chunk.getPos());
33+
});
34+
35+
ClientChunkEvents.CHUNK_UNLOAD.register((world, chunk) -> {
36+
trackers.get(world.getRegistryKey()).wires.removeIf(wire -> wire.chunkPos().equals(chunk.getPos()));
37+
});
2538
}
2639

27-
public void onWiresRemoved(Set<Wire> wires) {
28-
this.wires.removeAll(wires);
40+
public void onWiresAdded(RegistryKey<World> world, Set<Wire> wires) {
41+
trackers.get(world).wires.addAll(wires);
2942
}
3043

31-
public Set<Wire> getWires() {
32-
return wires;
44+
public void onWiresRemoved(RegistryKey<World> world, Set<Wire> wires) {
45+
trackers.get(world).wires.removeAll(wires);
3346
}
3447

35-
public void queueUnsyncedChunk(ChunkPos pos) {
36-
unsyncedChunks.add(pos);
48+
public Set<Wire> getWires(RegistryKey<World> world) {
49+
return trackers.get(world).wires;
3750
}
3851

3952
public void tick() {
4053
if (client.player == null) {
41-
clear();
54+
trackers.values().forEach(Tracker::clear);
4255
return;
4356
}
4457

45-
if (!unsyncedChunks.isEmpty()) {
46-
ClientPlayNetworking.send(new RequestWiresC2SPayload(List.copyOf(unsyncedChunks)));
47-
unsyncedChunks.clear();
48-
}
49-
50-
wires.removeIf(wire ->
51-
!client.player.getPos().isInRange(wire.middle(), client.options.getClampedViewDistance() * 16));
58+
trackers.values().forEach(Tracker::sync);
5259
}
5360

54-
public void clear() {
55-
wires.clear();
61+
public static class Tracker {
62+
private final Set<Wire> wires = new ObjectOpenHashSet<>();
63+
private final List<ChunkPos> unsyncedChunks = new ObjectArrayList<>();
64+
65+
public void sync() {
66+
if (!unsyncedChunks.isEmpty()) {
67+
ClientPlayNetworking.send(new RequestWiresC2SPayload(List.copyOf(unsyncedChunks)));
68+
unsyncedChunks.clear();
69+
}
70+
}
71+
72+
public void clear() {
73+
wires.clear();
74+
unsyncedChunks.clear();
75+
}
5676
}
5777
}

src/main/java/falseresync/vivatech/client/VivatechClient.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@ public void onInitializeClient() {
4242
ClientTickEvents.END_CLIENT_TICK.register(client -> {
4343
clientWireManager.tick();
4444
});
45-
46-
ClientChunkEvents.CHUNK_LOAD.register((world, chunk) -> {
47-
if (clientWireManager != null) {
48-
clientWireManager.queueUnsyncedChunk(chunk.getPos());
49-
}
50-
});
5145
}
5246

5347
public static ClientWireManager getClientWireManager() {

src/main/java/falseresync/vivatech/client/rendering/entity/EnergyVeilFeatureRenderer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers,
4949
for (int i = 0; i < 4; i++) {
5050
matrices.push();
5151
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(i * 45));
52-
matrices.translate(-veil.getVeilVisibleRadius(), -1, 0);
52+
matrices.translate(-veil.getVisibleRadius(), -1, 0);
5353
model.render(matrices, buffer, light, OverlayTexture.DEFAULT_UV);
54-
matrices.translate(veil.getVeilVisibleRadius() * 2, 0, 0);
54+
matrices.translate(veil.getVisibleRadius() * 2, 0, 0);
5555
model.render(matrices, buffer, light, OverlayTexture.DEFAULT_UV);
5656
matrices.pop();
5757
}
@@ -76,7 +76,7 @@ public void renderInFirstPerson(MatrixStack matrices, VertexConsumerProvider ver
7676
for (int i = 0; i < 3; i++) {
7777
matrices.push();
7878
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(45 + i * 45));
79-
matrices.translate(veil.getVeilVisibleRadius(), -1, 0);
79+
matrices.translate(veil.getVisibleRadius(), -1, 0);
8080
model.render(matrices, buffer, light, OverlayTexture.DEFAULT_UV, ((int) (0x44 / Vivatech.getConfig().fullscreenEffectsTransparency.modifier)) << 24 | 0x00_FF_FF_FF);
8181
matrices.pop();
8282
}

src/main/java/falseresync/vivatech/client/rendering/world/WireRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class WireRenderer implements WorldRenderEvents.AfterEntities {
5353

5454
@Override
5555
public void afterEntities(WorldRenderContext context) {
56-
var wires = VivatechClient.getClientWireManager().getWires();
56+
var wires = VivatechClient.getClientWireManager().getWires(context.world().getRegistryKey());
5757
if (wires.isEmpty()) {
5858
return;
5959
}
Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package falseresync.vivatech.common;
22

3+
import falseresync.lib.registry.AutoRegistry;
34
import falseresync.vivatech.common.block.VivatechBlocks;
45
import falseresync.vivatech.common.blockentity.VivatechBlockEntities;
56
import falseresync.vivatech.common.config.VivatechConfig;
67
import falseresync.vivatech.common.data.VivatechAttachments;
78
import falseresync.vivatech.common.data.VivatechComponents;
89
import falseresync.vivatech.common.entity.VivatechEntities;
9-
import falseresync.vivatech.common.entity.VivatechEntityTags;
1010
import falseresync.vivatech.common.item.VivatechItemGroups;
11-
import falseresync.vivatech.common.item.VivatechItemTags;
1211
import falseresync.vivatech.common.item.VivatechItems;
13-
import falseresync.lib.registry.AutoRegistry;
1412
import falseresync.vivatech.common.item.focus.TransmutationFocusBehavior;
1513
import falseresync.vivatech.common.power.Grid;
1614
import falseresync.vivatech.common.power.PowerSystem;
@@ -22,7 +20,6 @@
2220
import me.shedaniel.autoconfig.AutoConfig;
2321
import me.shedaniel.autoconfig.serializer.JanksonConfigSerializer;
2422
import net.fabricmc.api.ModInitializer;
25-
2623
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
2724
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
2825
import net.minecraft.registry.Registries;
@@ -31,63 +28,58 @@
3128
import org.slf4j.LoggerFactory;
3229

3330
public class Vivatech implements ModInitializer {
34-
public static final String MOD_ID = "vivatech";
35-
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
36-
private static ChargeManager chargeManager;
37-
private static VivatechConfig config;
38-
private static ServerGridsLoader serverGridsLoader;
39-
40-
@Override
41-
public void onInitialize() {
42-
config = AutoConfig.register(VivatechConfig.class, JanksonConfigSerializer::new).getConfig();
31+
public static final String MOD_ID = "vivatech";
32+
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
33+
private static ChargeManager chargeManager;
34+
private static VivatechConfig config;
35+
private static ServerGridsLoader serverGridsLoader;
4336

44-
VivatechBlocks.registerAll();
45-
VivatechItems.registerAll();
46-
new AutoRegistry(MOD_ID, LOGGER)
47-
.link(Registries.BLOCK_ENTITY_TYPE, VivatechBlockEntities.class)
48-
.link(Registries.ITEM_GROUP, VivatechItemGroups.class)
49-
.link(Registries.DATA_COMPONENT_TYPE, VivatechComponents.class)
50-
.link(Registries.ENTITY_TYPE, VivatechEntities.class)
51-
.link(Registries.PARTICLE_TYPE, VivatechParticleTypes.class)
52-
.link(Reports.REGISTRY, Reports.class)
53-
.link(WireType.REGISTRY, WireType.class);
54-
VivatechAttachments.init();
55-
VivatechSounds.init();
56-
PowerSystem.registerAll();
57-
VivatechNetworking.registerAll();
58-
VivatechServerReceivers.registerAll();
37+
public static ServerGridsLoader getServerGridsLoader() {
38+
return serverGridsLoader;
39+
}
5940

60-
chargeManager = new ChargeManager();
41+
public static ChargeManager getChargeManager() {
42+
return chargeManager;
43+
}
6144

62-
TransmutationFocusBehavior.register();
45+
public static VivatechConfig getConfig() {
46+
return config;
47+
}
6348

64-
ServerLifecycleEvents.SERVER_STARTED.register(server -> {
65-
serverGridsLoader = new ServerGridsLoader(server);
66-
});
49+
public static Identifier vtId(String path) {
50+
return Identifier.of(MOD_ID, path);
51+
}
6752

68-
ServerLifecycleEvents.AFTER_SAVE.register((server, flush, force) -> {
69-
serverGridsLoader.save();
70-
});
53+
@Override
54+
public void onInitialize() {
55+
config = AutoConfig.register(VivatechConfig.class, JanksonConfigSerializer::new).getConfig();
7156

72-
ServerTickEvents.END_WORLD_TICK.register(world -> {
73-
serverGridsLoader.getGridsManager(world).getGrids().forEach(Grid::tick);
74-
serverGridsLoader.sendWires();
75-
});
76-
}
57+
VivatechBlocks.registerAll();
58+
VivatechItems.registerAll();
59+
new AutoRegistry(MOD_ID, LOGGER)
60+
.link(Registries.BLOCK_ENTITY_TYPE, VivatechBlockEntities.class)
61+
.link(Registries.ITEM_GROUP, VivatechItemGroups.class)
62+
.link(Registries.DATA_COMPONENT_TYPE, VivatechComponents.class)
63+
.link(Registries.ENTITY_TYPE, VivatechEntities.class)
64+
.link(Registries.PARTICLE_TYPE, VivatechParticleTypes.class)
65+
.link(Reports.REGISTRY, Reports.class)
66+
.link(WireType.REGISTRY, WireType.class);
67+
VivatechAttachments.init();
68+
VivatechSounds.init();
69+
PowerSystem.registerAll();
70+
VivatechNetworking.registerAll();
71+
VivatechServerReceivers.registerAll();
7772

78-
public static ServerGridsLoader getServerGridsLoader() {
79-
return serverGridsLoader;
80-
}
73+
chargeManager = new ChargeManager();
8174

82-
public static ChargeManager getChargeManager() {
83-
return chargeManager;
84-
}
75+
TransmutationFocusBehavior.register();
8576

86-
public static VivatechConfig getConfig() {
87-
return config;
88-
}
77+
ServerLifecycleEvents.SERVER_STARTED.register(server -> {
78+
serverGridsLoader = new ServerGridsLoader(server);
79+
});
8980

90-
public static Identifier vtId(String path) {
91-
return Identifier.of(MOD_ID, path);
92-
}
81+
ServerTickEvents.END_WORLD_TICK.register(world -> {
82+
serverGridsLoader.tick(world);
83+
});
84+
}
9385
}

src/main/java/falseresync/vivatech/common/block/WirePostBlock.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import falseresync.vivatech.common.power.GridVertex;
55
import falseresync.vivatech.common.power.GridVertexProvider;
66
import falseresync.vivatech.common.power.PowerSystem;
7-
import net.minecraft.block.Block;
8-
import net.minecraft.block.BlockState;
9-
import net.minecraft.block.Blocks;
10-
import net.minecraft.block.ShapeContext;
7+
import net.minecraft.block.*;
118
import net.minecraft.item.ItemPlacementContext;
129
import net.minecraft.state.StateManager;
1310
import net.minecraft.state.property.DirectionProperty;
@@ -65,7 +62,7 @@ public BlockState getPlacementState(ItemPlacementContext ctx) {
6562
protected boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
6663
var facing = state.get(FACING);
6764
var otherPos = pos.offset(facing);
68-
return world.getBlockState(otherPos).isSideSolidFullSquare(world, otherPos, facing.getOpposite());
65+
return world.getBlockState(otherPos).isSideSolid(world, otherPos, facing.getOpposite(), SideShapeType.CENTER);
6966
}
7067

7168
@Override

src/main/java/falseresync/vivatech/common/blockentity/ChargerBlockEntity.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
import net.minecraft.network.packet.Packet;
1515
import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket;
1616
import net.minecraft.registry.RegistryWrapper;
17+
import net.minecraft.server.world.ServerWorld;
1718
import net.minecraft.util.Hand;
1819
import net.minecraft.util.math.BlockPos;
20+
import net.minecraft.util.math.ChunkSectionPos;
1921
import org.jetbrains.annotations.Nullable;
2022

2123
public class ChargerBlockEntity extends BlockEntity implements Ticking, Appliance {
@@ -63,6 +65,11 @@ public void onGridDisconnected() {
6365
connected = false;
6466
}
6567

68+
@Override
69+
public void onGridFrozen() {
70+
operational = false;
71+
}
72+
6673
@Override
6774
public float getElectricalCurrent() {
6875
return charging ? - 0.5f : 0;

src/main/java/falseresync/vivatech/common/blockentity/HeaterBlockEntity.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package falseresync.vivatech.common.blockentity;
22

3+
import falseresync.vivatech.common.Vivatech;
34
import falseresync.vivatech.common.power.Appliance;
45
import it.unimi.dsi.fastutil.longs.LongArrayList;
56
import net.minecraft.block.AbstractFurnaceBlock;
@@ -10,7 +11,9 @@
1011
import net.minecraft.nbt.NbtCompound;
1112
import net.minecraft.nbt.NbtElement;
1213
import net.minecraft.registry.RegistryWrapper;
14+
import net.minecraft.server.world.ServerWorld;
1315
import net.minecraft.util.math.BlockPos;
16+
import net.minecraft.util.math.ChunkSectionPos;
1417

1518
import java.util.*;
1619

@@ -81,6 +84,11 @@ public void onGridDisconnected() {
8184
enabled = false;
8285
}
8386

87+
@Override
88+
public void onGridFrozen() {
89+
enabled = false;
90+
}
91+
8492
@Override
8593
public float getElectricalCurrent() {
8694
return - (1f + cachedFurnaces.size()) / 2;
@@ -89,6 +97,8 @@ public float getElectricalCurrent() {
8997
@Override
9098
public void gridTick(float voltage) {
9199
enabled = voltage > 210 && voltage < 250;
100+
if (getPos().getZ() == -180)
101+
Vivatech.LOGGER.info("I grid ticked %s".formatted((world instanceof ServerWorld serverWorld) ? serverWorld.getChunkManager().isChunkLoaded(ChunkSectionPos.getSectionCoord(getPos().getX()), ChunkSectionPos.getSectionCoord(getPos().getZ())) : "nada"));
92102
}
93103

94104
@Override

0 commit comments

Comments
 (0)