Skip to content

Commit 6c6d63e

Browse files
committed
First pass at reactiveX implementation of chunk listener
1 parent 1413fb4 commit 6c6d63e

File tree

19 files changed

+224
-74
lines changed

19 files changed

+224
-74
lines changed

build.gradle

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@ buildscript {
66

77
dependencies {
88
classpath "net.minecraftforge.gradle:ForgeGradle:5.1.+"
9+
classpath 'com.github.jengelman.gradle.plugins:shadow:6.1.0'
910
}
1011
}
1112

1213
plugins {
1314
id "idea"
1415
id "eclipse"
1516
id "maven-publish"
17+
id 'com.github.johnrengelman.shadow' version '6.1.0'
1618
}
1719

1820
apply plugin: "net.minecraftforge.gradle"
21+
apply plugin: 'com.github.johnrengelman.shadow'
1922

2023
def gitCommitHash = 'git rev-parse --verify --short HEAD'.execute().text.trim()
2124
def isRelease = (System.getenv("CM_RELEASE") ?: "false").equalsIgnoreCase("true")
@@ -29,6 +32,11 @@ println("Version: ${version}");
2932

3033
java.toolchain.languageVersion = JavaLanguageVersion.of(8)
3134

35+
configurations {
36+
shadow.extendsFrom library
37+
implementation.extendsFrom library
38+
}
39+
3240
sourceSets {
3341
api {
3442
java {
@@ -81,6 +89,9 @@ minecraft {
8189
client {
8290
workingDirectory project.file('run/client')
8391

92+
property 'mixin.env.remapRefMap', 'true'
93+
property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg"
94+
8495
// Recommended logging data for a userdev environment
8596
property 'forge.logging.markers', '' // 'SCAN,REGISTRIES,REGISTRYDUMP'
8697

@@ -243,9 +254,14 @@ dependencies {
243254

244255
testImplementation fg.deobf("com.github.alcatrazEscapee:mcjunitlib:${mcunittest_version}")
245256

257+
library "io.reactivex.rxjava3:rxjava:3.1.1";
258+
246259
// Deobfuscate each dev mod for runtime
247260
dev_mods.each { implementation fg.deobf(it) }
248261

262+
runtimeOnly(fg.deobf("curse.maven:nicephore-401014:3318114"))
263+
runtimeOnly(fg.deobf("curse.maven:sues-407174:3188120"))
264+
249265
// JEI
250266
compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}:api")
251267
runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}")
@@ -263,12 +279,25 @@ processTestResources {
263279
duplicatesStrategy = DuplicatesStrategy.WARN
264280
}
265281

282+
reobf {
283+
shadowJar {}
284+
}
285+
286+
shadowJar {
287+
exclude "LICENSE*"
288+
finalizedBy 'reobfShadowJar'
289+
minimize()
290+
relocate 'io.reactivex', 'dev.compactmods.crafting.lib.reactivex'
291+
}
292+
266293
jar {
267294
from sourceSets.api.output
268295
from sourceSets.main.output
269296

270297
destinationDir = file("$rootDir/build-out")
271298
finalizedBy('reobfJar')
299+
finalizedBy('reobfShadowJar')
300+
272301
manifest {
273302
attributes([
274303
"Specification-Title" : "compactcrafting",

src/api/java/dev/compactmods/crafting/api/field/IActiveWorldFields.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.Optional;
44
import java.util.stream.Stream;
5+
import net.minecraft.util.RegistryKey;
56
import net.minecraft.util.math.BlockPos;
67
import net.minecraft.util.math.ChunkPos;
78
import net.minecraft.world.World;
@@ -32,4 +33,6 @@ default void addFieldInstance(IMiniaturizationField field) {}
3233
boolean hasActiveField(BlockPos center);
3334

3435
Stream<IMiniaturizationField> getFields(ChunkPos chunk);
36+
37+
RegistryKey<World> getLevel();
3538
}

src/main/java/dev/compactmods/crafting/CompactCrafting.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package dev.compactmods.crafting;
22

33
import dev.compactmods.crafting.client.ClientConfig;
4+
import dev.compactmods.crafting.client.ui.container.ContainerRegistration;
45
import dev.compactmods.crafting.network.NetworkHandler;
56
import dev.compactmods.crafting.recipes.components.ComponentRegistration;
67
import dev.compactmods.crafting.server.ServerConfig;
7-
import dev.compactmods.crafting.client.ui.container.ContainerRegistration;
88
import net.minecraft.item.ItemGroup;
99
import net.minecraft.item.ItemStack;
1010
import net.minecraftforge.eventbus.api.IEventBus;

src/main/java/dev/compactmods/crafting/client/ClientEventHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static void onTick(final TickEvent.ClientTickEvent evt) {
3939

4040
ClientWorld level = Minecraft.getInstance().level;
4141
if (level != null && !Minecraft.getInstance().isPaused()) {
42-
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
42+
level.getCapability(CapabilityActiveWorldFields.FIELDS)
4343
.ifPresent(IActiveWorldFields::tickFields);
4444
}
4545
}
@@ -59,7 +59,7 @@ public static void onWorldRender(final RenderWorldLastEvent event) {
5959

6060
double viewDistance = 64;
6161
final IRenderTypeBuffer.Impl buffers = mc.renderBuffers().bufferSource();
62-
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
62+
mc.level.getCapability(CapabilityActiveWorldFields.FIELDS)
6363
.ifPresent(fields -> {
6464
fields.getFields()
6565
.filter(field -> Vector3d.atCenterOf(field.getCenter()).closerThan(mainCamera.getPosition(), viewDistance))

src/main/java/dev/compactmods/crafting/client/ClientPacketHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static void handleFieldActivation(IMiniaturizationField field, CompoundNB
2828
field.setLevel(cw);
2929
field.loadClientData(fieldClientData);
3030

31-
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
31+
mc.level.getCapability(CapabilityActiveWorldFields.FIELDS)
3232
.ifPresent(fields -> fields.registerField(field));
3333
});
3434
}
@@ -37,7 +37,7 @@ public static void handleFieldDeactivation(BlockPos center) {
3737
Minecraft mc = Minecraft.getInstance();
3838
mc.submitAsync(() -> {
3939
ClientWorld cw = mc.level;
40-
cw.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS).ifPresent(fields -> {
40+
cw.getCapability(CapabilityActiveWorldFields.FIELDS).ifPresent(fields -> {
4141
fields.get(center).map(IMiniaturizationField::getProjectorPositions)
4242
.orElse(Stream.empty())
4343
.forEach(proj -> FieldProjectorBlock.deactivateProjector(cw, proj));
@@ -56,7 +56,7 @@ public static void handleFieldData(CompoundNBT fieldData) {
5656
field.setLevel(mc.level);
5757
field.loadClientData(fieldData);
5858

59-
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
59+
mc.level.getCapability(CapabilityActiveWorldFields.FIELDS)
6060
.ifPresent(fields -> {
6161
fields.setLevel(mc.level);
6262
CompactCrafting.LOGGER.debug("Registering field on client");
@@ -80,7 +80,7 @@ public static void removeField(BlockPos fieldCenter) {
8080
if (mc.level == null)
8181
return;
8282

83-
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
83+
mc.level.getCapability(CapabilityActiveWorldFields.FIELDS)
8484
.ifPresent(fields -> fields.unregisterField(fieldCenter));
8585
}
8686

@@ -89,7 +89,7 @@ public static void handleRecipeChanged(BlockPos center, @Nullable ResourceLocati
8989
if (mc.level == null)
9090
return;
9191

92-
mc.level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
92+
mc.level.getCapability(CapabilityActiveWorldFields.FIELDS)
9393
.lazyMap(af -> af.get(center))
9494
.ifPresent(field -> field.ifPresent(f -> f.setRecipe(recipe)));
9595
}

src/main/java/dev/compactmods/crafting/client/render/ClientProjectorRenderInfo.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void render(MatrixStack matrixStack) {
7373

7474
for (int y = -1; y > -10; y--) {
7575
BlockPos realPos = new BlockPos(pos.getX(), pos.getY() + y, pos.getZ());
76-
if(!level.isStateAtPosition(realPos, AbstractBlock.AbstractBlockState::isAir))
76+
if (!level.isStateAtPosition(realPos, AbstractBlock.AbstractBlockState::isAir))
7777
break;
7878

7979
matrixStack.pushPose();
@@ -108,16 +108,17 @@ public void resetRenderTime() {
108108
public void setProjector(World level, BlockPos initial) {
109109
remainingProjectors.clear();
110110

111-
Optional<MiniaturizationFieldSize> fieldSize = ProjectorHelper.getClosestOppositeSize(level, initial);
112111
final Direction initialFacing = FieldProjectorBlock.getDirection(level, initial).orElse(Direction.UP);
113-
if(fieldSize.isPresent()) {
112+
Optional<MiniaturizationFieldSize> fieldSize = ProjectorHelper.getClosestSize(level, initial, initialFacing);
113+
114+
if (fieldSize.isPresent()) {
114115
final BlockPos center = fieldSize.get().getCenterFromProjector(initial, initialFacing);
115116
Direction.Plane.HORIZONTAL.stream()
116117
.forEach(dir -> {
117-
if(dir == initialFacing) return;
118-
118+
if (dir.getOpposite() == initialFacing) return;
119119
final BlockPos location = fieldSize.get().getProjectorLocationForDirection(center, dir);
120-
remainingProjectors.put(location, dir.getOpposite());
120+
if (!(level.getBlockState(location).getBlock() instanceof FieldProjectorBlock))
121+
remainingProjectors.put(location, dir.getOpposite());
121122
});
122123
} else {
123124
ProjectorHelper.getValidOppositePositions(initial, initialFacing)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package dev.compactmods.crafting.command;
2+
3+
import java.util.concurrent.TimeUnit;
4+
import com.mojang.brigadier.CommandDispatcher;
5+
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
6+
import com.mojang.brigadier.context.CommandContext;
7+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
8+
import dev.compactmods.crafting.CompactCrafting;
9+
import io.reactivex.rxjava3.disposables.Disposable;
10+
import io.reactivex.rxjava3.subjects.PublishSubject;
11+
import net.minecraft.command.CommandSource;
12+
import net.minecraft.command.Commands;
13+
import net.minecraft.entity.player.ServerPlayerEntity;
14+
import net.minecraft.util.text.ChatType;
15+
import net.minecraft.util.text.StringTextComponent;
16+
import net.minecraftforge.event.RegisterCommandsEvent;
17+
import net.minecraftforge.eventbus.api.SubscribeEvent;
18+
import net.minecraftforge.fml.common.Mod;
19+
20+
@Mod.EventBusSubscriber(modid = CompactCrafting.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE)
21+
public class CraftingCommandRoot {
22+
23+
static Disposable PREV;
24+
25+
@SubscribeEvent
26+
public static void onCommandsRegister(final RegisterCommandsEvent event) {
27+
register(event.getDispatcher());
28+
}
29+
30+
private static void register(CommandDispatcher<CommandSource> dispatcher) {
31+
final LiteralArgumentBuilder<CommandSource> root = LiteralArgumentBuilder.literal(CompactCrafting.MOD_ID);
32+
root.then(Commands.literal("test")
33+
.requires(cs -> cs.hasPermission(2))
34+
.executes(CraftingCommandRoot::test));
35+
dispatcher.register(root);
36+
}
37+
38+
private static int test(CommandContext<CommandSource> ctx) throws CommandSyntaxException {
39+
final ServerPlayerEntity player = ctx.getSource().getPlayerOrException();
40+
41+
if(PREV != null && !PREV.isDisposed()) {
42+
PREV.dispose();
43+
PREV = null;
44+
}
45+
ctx.getSource().getServer().submitAsync(() -> {
46+
47+
PublishSubject<Integer> l = PublishSubject.create();
48+
PREV = l.buffer(500, TimeUnit.MILLISECONDS)
49+
.subscribe(times -> {
50+
if (!times.isEmpty())
51+
player.sendMessage(new StringTextComponent(String.join(",", times.stream()
52+
.map(Object::toString).toArray(String[]::new))), ChatType.CHAT, player.getUUID());
53+
}, err -> {
54+
CompactCrafting.LOGGER.debug("error");
55+
}, () -> {
56+
player.sendMessage(new StringTextComponent("done"), ChatType.CHAT, player.getUUID());
57+
});
58+
59+
player.server.submitAsync(() -> {
60+
for (int i = 1; i <= 100; i++) {
61+
l.onNext(i);
62+
try {
63+
Thread.sleep(50);
64+
} catch (InterruptedException e) {
65+
e.printStackTrace();
66+
}
67+
}
68+
});
69+
});
70+
71+
return 0;
72+
}
73+
}

0 commit comments

Comments
 (0)