Skip to content

Commit 6314a28

Browse files
committed
- 尝试修复 particular 兼容问题
- 修复游戏卡顿时粒子计数可能产生偏差的问题 - 修复与 Effecticularity 的兼容问题 - 调整粒子雨/雪在瓦尔基里物理结构上的碰撞体积(不再穿过1/16方块厚度的墙) - 在 Forge 上重新添加调试命令
1 parent 0041298 commit 6314a28

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+519
-187
lines changed

Diff for: README.md

+18-17
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
## Features
66

77
- Vanilla Minecraft
8-
- Async ticking/rendering of particles.
9-
(Reduced frame-time and spikes.)
10-
- Async client block entity ticking.
11-
- Pretty Rain/Particle Rain
12-
- Async particle gen.
8+
- Async ticking/rendering of particles.
9+
- Async client block entity ticking.
1310
- Valkyrien Skies + Pretty Rain/Particle Rain
14-
- Weather particles no longer pass through ships.
11+
- Weather particles no longer pass through ships.
12+
- Pretty Rain/Particle Rain
13+
- Async particle gen.
1514
- Effectual
16-
- Async particle gen.
15+
- Async particle gen.
16+
- Particular
17+
- Async particle gen.
1718

1819
## Mods Recommended
1920

@@ -24,15 +25,14 @@
2425

2526
## Mod Compatability
2627

27-
###### ✅: Compatible
28-
###### 🔄️: Work in progress
29-
###### ⚠️: Need more testing
30-
###### ❔: Works fine, but not fully tested.
31-
###### ❌: Not Compatible
28+
✅: Compatible
29+
❔: Works fine, but not fully tested
30+
⚠️: More testing needed
31+
🔄️: Work in progress
32+
❌: Not Compatible
3233

3334
### Mods Tested
3435

35-
🔄️ Particular (Fabric/Forge)
3636
❔ Create (Fabric/Forge)
3737
✅ Forge + Sinytra Connector
3838
✅ Fabric
@@ -42,16 +42,17 @@
4242
✅ Brute force Rendering Culling (Fabric/Forge)
4343
✅ Iris/Oculus (Fabric/Forge)
4444
✅ Startlight (Fabric/Forge)
45+
✅ Valkyrien Skies (Fabric/Forge)
4546
✅ Particle Rain/Pretty Rain (Fabric/Forge)
4647
✅ Effectual (Fabric)
4748
✅ Effective/Effecticularity (Fabric/Forge)
48-
Valkyrien Skies (Fabric/Forge)
49+
Particular (Fabric/Forge)
4950
✅ MmmMmmMmmMmm (Target Dummy) (Fabric/Forge)
50-
✅ Hex Casting (Fabric/Forge)
51+
✅ Hex Casting (Fabric/Forge)
5152
❌ MadParticle (Forge)
52-
⬜ ...
53+
⬜ ...
5354

5455
## Credits
5556

5657
- [MixinSquared](https://github.com/Bawnorton/MixinSquared)
57-
58+
- [MixinExtras](https://github.com/LlamaLad7/MixinExtras)

Diff for: common/build.gradle

+4-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ dependencies {
3232

3333
/* Particle Rain/Pretty Rain */
3434
modCompileOnly "maven.modrinth:particle-rain:3.0.6-1.20"
35-
modCompileOnly "maven.modrinth:pretty-rain:96kQ9rp3"
35+
// modCompileOnly "maven.modrinth:pretty-rain:TGjK6ChS"
3636

3737
/* Effectual */
3838
modCompileOnly 'maven.modrinth:effectual:0.5.0-1.20.1'
@@ -55,4 +55,7 @@ dependencies {
5555

5656
/* Tombstone */
5757
// modCompileOnly fileTree(dir: '../libs', include: 'tombstone-1.20.1-8.9.0.jar')
58+
59+
/* Particular */
60+
modCompileOnly "maven.modrinth:particular:1.1.1"
5861
}

Diff for: common/src/main/java/fun/qu_an/minecraft/asyncparticles/client/APMixinPlugin.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ yield switch (split[1]) {
3838
case "create" -> ModListHelper.FABRIC_CREATE_LOADED;
3939
case "effective" -> ModListHelper.FABRIC_EFFECTIVE_LOADED;
4040
case "effectual" -> ModListHelper.FABRIC_EFFECTUAL_LOADED;
41-
default -> false;
41+
case "particular" -> ModListHelper.FABRIC_PARTICULAR_LOADED;
42+
default -> throw new IllegalArgumentException("Unknown fabric mixin: " + mixinClassName);
4243
};
4344
}
4445
case "vs2" -> ModListHelper.VS_LOADED;
@@ -47,6 +48,7 @@ yield switch (split[1]) {
4748
case "lodestone" -> ModListHelper.LODESTONE_LOADED;
4849
case "hexcasting" -> ModListHelper.HEXCASTING_LOADED;
4950
case "flywheel" -> ModListHelper.FLYWHEEL_LOADED;
51+
// case "enhancedblockentities" -> ModListHelper.ENHANCEDBLOCKENTITIES_LOADED;
5052
default -> true;
5153
};
5254
}

Diff for: common/src/main/java/fun/qu_an/minecraft/asyncparticles/client/AsyncRenderer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,8 @@ private static void tryDebug() {
335335
}
336336

337337
public static boolean forceSyncLevelRenderMarkDirty() {
338-
return SimplePropertiesConfig.forceSyncLevelRenderMarkDirty;
338+
// TODO: 详细看看 EBE Mod
339+
return ModListHelper.ENHANCEDBLOCKENTITIES_LOADED || SimplePropertiesConfig.forceSyncLevelRenderMarkDirty;
339340
}
340341

341342
public static void destroy() {

Diff for: common/src/main/java/fun/qu_an/minecraft/asyncparticles/client/AsyncTicker.java

+25-5
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import com.google.common.collect.EvictingQueue;
44
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
55
import fun.qu_an.minecraft.asyncparticles.client.config.SimplePropertiesConfig;
6-
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
76
import net.minecraft.Util;
87
import net.minecraft.client.Minecraft;
8+
import net.minecraft.client.multiplayer.ClientLevel;
99
import net.minecraft.client.particle.Particle;
1010
import net.minecraft.util.Mth;
1111
import net.minecraft.util.profiling.ProfilerFiller;
@@ -73,7 +73,7 @@ protected void onTermination(Throwable throwable) {
7373
}
7474

7575
public static void onRunAllTasks() {
76-
// Make sure not concurrently tick block entities
76+
// join before runAllTasks
7777
if (blockEntityTickFuture != null) {
7878
blockEntityTickFuture.join();
7979
blockEntityTickFuture = null;
@@ -107,6 +107,7 @@ public static void onTickBefore(int j) {
107107
futures[i++] = CompletableFuture.runAsync(() -> {
108108
Queue<Particle> particles = (Queue<Particle>) EvictingQueue$delegate.get(particles1);
109109
particles.removeIf(particle1 -> {
110+
// JDK 并没有定义这个判断会对每个对象执行多少次,但目前没遇到例外情况
110111
// use ArrayDeque's removeIf to improve performance
111112
boolean b = ((ParticleAddon) particle1).asyncParticles$shouldRemove();
112113
if (b) {
@@ -263,11 +264,20 @@ private static void tryReload() {
263264
}
264265
}
265266

266-
public static void registerEndTickEvent(ClientTickEvents.EndTick endTick) {
267-
AsyncTicker.END_TICK_EVENTS.add(() -> {
267+
public static void registerEndTickEvent(MinecraftConsumer consumer) {
268+
registerEndTickEvent(() -> {
268269
Minecraft mc = Minecraft.getInstance();
269270
if (mc.level != null && mc.player != null) {
270-
endTick.onEndTick(mc);
271+
consumer.accept(mc);
272+
}
273+
});
274+
}
275+
276+
public static void registerEndTickEvent(ClientLevelConsumer consumer) {
277+
registerEndTickEvent(() -> {
278+
Minecraft mc = Minecraft.getInstance();
279+
if (mc.level != null && mc.player != null) {
280+
consumer.accept(mc.level);
271281
}
272282
});
273283
}
@@ -295,4 +305,14 @@ public static void destroy() {
295305
END_TICK_OPERATIONS.clear();
296306
cancelled = false;
297307
}
308+
309+
@FunctionalInterface
310+
public interface MinecraftConsumer {
311+
void accept(Minecraft mc);
312+
}
313+
314+
@FunctionalInterface
315+
public interface ClientLevelConsumer {
316+
void accept(ClientLevel level);
317+
}
298318
}

Diff for: common/src/main/java/fun/qu_an/minecraft/asyncparticles/client/AsyncparticlesClient.java

-54
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,13 @@
11
package fun.qu_an.minecraft.asyncparticles.client;
22

3-
import com.mojang.brigadier.arguments.StringArgumentType;
43
import fun.qu_an.minecraft.asyncparticles.client.config.SimplePropertiesConfig;
5-
import net.fabricmc.api.ClientModInitializer;
6-
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
7-
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
8-
import net.fabricmc.loader.api.FabricLoader;
9-
import net.minecraft.commands.SharedSuggestionProvider;
10-
import net.minecraft.network.chat.Component;
114

125
import java.io.IOException;
136

14-
import static fun.qu_an.minecraft.asyncparticles.client.ModListHelper.*;
15-
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.*;
16-
177
public class AsyncparticlesClient {
188
public static final String MOD_ID = "asyncparticles";
199

2010
public static void init() {
21-
if (ModListHelper.FABRIC_API_LOADED) {
22-
ClientCommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> {
23-
dispatcher.register(literal(MOD_ID)
24-
.then(literal("isfabricmod")
25-
.then(argument("modid", StringArgumentType.word())
26-
.suggests((context, builder)
27-
-> SharedSuggestionProvider.suggest(FabricLoader.getInstance().getAllMods().stream().map(modContainer -> modContainer.getMetadata().getId()), builder))
28-
.executes(context -> {
29-
String modId = StringArgumentType.getString(context, "modid");
30-
context.getSource().sendFeedback(Component.literal(modId + " is " + (isFabricModLoaded(modId)? "fabric mod" : isModLoaded(modId) ? "not fabric mod": "not loaded")));
31-
return 1;
32-
})))
33-
.then(literal("isforgemod")
34-
.then(argument("modid", StringArgumentType.word())
35-
.suggests((context, builder)
36-
-> SharedSuggestionProvider.suggest(FabricLoader.getInstance().getAllMods().stream().map(modContainer -> modContainer.getMetadata().getId()), builder))
37-
.executes(context -> {
38-
String modId = StringArgumentType.getString(context, "modid");
39-
context.getSource().sendFeedback(Component.literal(modId + " is " + (isForgeModLoaded(modId)? "forge mod" : isModLoaded(modId) ? "not forge mod": "not loaded")));
40-
return 1;
41-
})))
42-
.then(literal("debug")
43-
.executes(context -> {
44-
FabricClientCommandSource source = context.getSource();
45-
AsyncTicker.debugLater(s -> source.sendFeedback(Component.literal(s)));
46-
AsyncRenderer.debugLater(s -> source.sendFeedback(Component.literal(s)));
47-
return 1;
48-
}))
49-
.then(literal("reload")
50-
.executes(context -> {
51-
FabricClientCommandSource source = context.getSource();
52-
try {
53-
SimplePropertiesConfig.load();
54-
} catch (IOException e) {
55-
source.sendFeedback(Component.literal("Failed to reload config"));
56-
return 1;
57-
}
58-
AsyncTicker.reloadLater();
59-
source.sendFeedback(Component.literal("AsyncParticles config reloaded"));
60-
return 1;
61-
})));
62-
});
63-
}
64-
6511
try {
6612
SimplePropertiesConfig.load();
6713
} catch (IOException e) {
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,56 @@
11
package fun.qu_an.minecraft.asyncparticles.client;
22

3+
import com.chailotl.particular.Main;
34
import dev.architectury.injectables.annotations.ExpectPlatform;
45
import net.fabricmc.loader.api.FabricLoader;
56
import org.sinytra.connector.loader.ConnectorEarlyLoader;
67

78
public class ModListHelper {
89
public static final boolean IS_FORGE = isForge();
9-
10-
@ExpectPlatform
11-
private static boolean isForge() {
12-
throw new AssertionError();
13-
}
14-
10+
public static final boolean FABRIC_API_LOADED = isModLoaded("fabric");
1511
public static final boolean CONNECTORMOD_LOADED = isModLoaded("connectormod");
16-
12+
/* Valkyrien Skies */
1713
public static final boolean VS_LOADED = isModLoaded("valkyrienskies");
14+
/* Sodium */
1815
public static final boolean SODIUM_LOADED = isModLoaded("sodium") || isModLoaded("embeddium");
19-
public static final boolean PARTICLERAIN_LOADED = isModLoaded("particlerain");
16+
/* IRIS */
2017
public static final boolean IRIS_LOADED = isModLoaded("iris");
18+
/* Dummmmmmy */
2119
public static final boolean DUMMMMMMY_LOADED = isModLoaded("dummmmmmy");
22-
public static final boolean EFFECTUAL_LOADED = isModLoaded("effectual");
23-
public static final boolean CREATE_LOADED = isModLoaded("create");
24-
public static final boolean FABRIC_API_LOADED = isModLoaded("fabric");
25-
public static final boolean FORGE_FLEROVIUM_LOADED = isModLoaded("flerovium");
26-
public static final boolean EFFECTIVE_LOADED = isModLoaded("effective");
20+
/* Effectual */
21+
public static final boolean FABRIC_EFFECTUAL_LOADED = isFabricModLoaded("effectual");
22+
/* Flerovium */
23+
public static final boolean FORGE_FLEROVIUM_LOADED = isForgeModLoaded("flerovium");
24+
/* Effective */
2725
public static final boolean FORGE_EFFECTIVE_LOADED = isForgeModLoaded("effective");
2826
public static final boolean FABRIC_EFFECTIVE_LOADED = isFabricModLoaded("effective");
27+
/* Lodestone */
2928
public static final boolean LODESTONE_LOADED = isModLoaded("lodestone");
30-
public static final boolean FORGE_LODESTONE_LOADED = isForgeModLoaded("lodestone");
31-
public static final boolean FABRIC_LODESTONE_LOADED = isFabricModLoaded("lodestone");
29+
/* Particle Rain */
3230
public static final boolean FABRIC_PARTICLERAIN_LOADED = isFabricModLoaded("particlerain");
3331
public static final boolean FORGE_PARTICLERAIN_LOADED = isForgeModLoaded("particlerain");
32+
/* Flywheel */
33+
public static final boolean FLYWHEEL_LOADED = isModLoaded("flywheel");
34+
/* Create */
3435
public static final boolean FABRIC_CREATE_LOADED = isFabricModLoaded("create");
3536
public static final boolean FORGE_CREATE_LOADED = isForgeModLoaded("create");
36-
public static final boolean FABRIC_EFFECTUAL_LOADED = isFabricModLoaded("effectual");
37+
/* Tombstone */
3738
public static final boolean TOMBSTONE_LOADED = isModLoaded("tombstone");
39+
/* Hexcasting */
3840
public static final boolean HEXCASTING_LOADED = isModLoaded("hexcasting");
39-
public static final boolean FLYWHEEL_LOADED = isModLoaded("flywheel");
41+
/* Enhanced Block Entities */
42+
public static final boolean ENHANCEDBLOCKENTITIES_LOADED = isModLoaded("enhancedblockentities");
43+
/* Particular */
44+
public static final boolean FABRIC_PARTICULAR_LOADED = isFabricModLoaded("particular");
45+
46+
@ExpectPlatform
47+
private static boolean isForge() {
48+
throw new AssertionError();
49+
}
4050

4151
@ExpectPlatform
4252
public static boolean isModLoaded(String modId) {
43-
throw new UnsupportedOperationException();
53+
throw new AssertionError();
4454
}
4555

4656
@SuppressWarnings("ConstantValue")
@@ -49,6 +59,6 @@ public static boolean isForgeModLoaded(String modId) {
4959
}
5060

5161
public static boolean isFabricModLoaded(String modId) {
52-
return IS_FORGE ? (CONNECTORMOD_LOADED && ConnectorEarlyLoader.isConnectorMod(modId)) : isModLoaded(modId);
62+
return IS_FORGE ? CONNECTORMOD_LOADED && ConnectorEarlyLoader.isConnectorMod(modId) : isModLoaded(modId);
5363
}
5464
}

0 commit comments

Comments
 (0)