Skip to content

Commit f44d004

Browse files
committed
Math3DUtil支持计算获取由 getCycloidGraphic方法生成的图像的顶点(点速度最小时)坐标集合
Math3DUtil.computeCycloidVertices() 重命名方法参数名字radiusPrecision 为 scale 由于考虑到多个不同的粒子可能会出现在同一个位置上,为了适配这个,故将 ControlableParticleGroup.loadParticleLocations() 方法的返回值 由 Map<RelativeLocation, ParticleRelativeData> 更改为 Map<ParticleRelativeData, RelativeLocation>
1 parent 25eb2cc commit f44d004

8 files changed

Lines changed: 84 additions & 20 deletions

File tree

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,14 @@ class TestGroupClient(uuid: UUID, val bindPlayer: UUID) : ControlableParticleGro
124124
}
125125

126126
// 魔法阵粒子组合
127-
override fun loadParticleLocations(): Map<RelativeLocation, ParticleRelativeData> {
127+
override fun loadParticleLocations(): Map<ParticleRelativeData, RelativeLocation> {
128128
// 在XZ平面的魔法阵
129129
val list = Math3DUtil.getCycloidGraphic(3.0, 5.0, 2, -3, 360, 0.2).onEach { it.y += 6 }
130-
//
131-
return list.associateWith {
130+
return list.associateBy {
132131
withEffect({
133132
// 提供ParticleEffect (在display方法中 world.addParticle)使用
134133
// it类型为UUID
135-
TestEndRodEffect(it)
134+
TestEndRodEffect(it)
136135
}) {
137136
// this is ControlableParticle
138137
// 用于初始化粒子信息

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ loader_version=0.16.10
1010
fabric_kotlin_version=1.13.1+kotlin.2.1.10
1111

1212
# Mod Properties
13-
mod_version=1.0.0
13+
mod_version=1.1
1414
maven_group=cn.coostack
15-
archives_base_name=cooparticlesapi
15+
archives_base_name=coo-particles-api
1616

1717
# Dependencies
1818
fabric_version=0.115.1+1.21.1

src/main/java/cn/coostack/mixin/ParticleManagerMixin.java

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

33

44
import cn.coostack.CooParticleAPI;
5+
import cn.coostack.config.APIConfigManager;
56
import com.google.common.collect.EvictingQueue;
67
import net.minecraft.client.particle.Particle;
78
import net.minecraft.client.particle.ParticleManager;
@@ -24,13 +25,18 @@ public abstract class ParticleManagerMixin {
2425

2526
@Redirect(method = "tick", at = @At(value = "INVOKE", target = "Ljava/util/Queue;poll()Ljava/lang/Object;"))
2627
public Object changeMaxParticles(Queue<Object> queue) {
27-
Particle particle;
28-
while ((particle = this.getNewParticles().poll()) != null) {
29-
Map<ParticleTextureSheet, Queue<Particle>> particles = this.getParticles();
30-
particles.computeIfAbsent(particle.getType(),
31-
sheet -> EvictingQueue.create(CooParticleAPI.MAX_PARTICLE_COUNT))
32-
.add(particle);
28+
if (APIConfigManager.getConfig().getEnabledParticleCountInject()) {
29+
Particle particle;
30+
while ((particle = this.getNewParticles().poll()) != null) {
31+
Map<ParticleTextureSheet, Queue<Particle>> particles = this.getParticles();
32+
particles.computeIfAbsent(particle.getType(),
33+
sheet -> EvictingQueue.create(APIConfigManager.getConfig().getParticleCountLimit()))
34+
.add(particle);
35+
}
36+
return null;
37+
} else {
38+
// 恢复原来的功能
39+
return this.getNewParticles().poll();
3340
}
34-
return null;
3541
}
3642
}

src/main/kotlin/cn/coostack/CooParticleAPI.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package cn.coostack
22

3+
import cn.coostack.config.APIConfig
4+
import cn.coostack.config.APIConfigManager
35
import cn.coostack.items.CooItems
46
import cn.coostack.items.group.CooItemGroup
57
import cn.coostack.network.packet.PacketParticleGroupS2C
@@ -21,7 +23,6 @@ object CooParticleAPI : ModInitializer {
2123

2224
const val MOD_ID = "cooparticleapi"
2325

24-
const val MAX_PARTICLE_COUNT = 65536
2526

2627
lateinit var server: MinecraftServer
2728

@@ -53,6 +54,7 @@ object CooParticleAPI : ModInitializer {
5354
override fun onInitialize() {
5455
CooItemGroup.reg()
5556
CooItems.reg()
57+
APIConfigManager.loadConfig()
5658
ServerTickEvents.START_SERVER_TICK.register { _ ->
5759
ServerParticleGroupManager.upgrade()
5860
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cn.coostack.config
2+
3+
class APIConfig {
4+
/**
5+
* 是否启用ParticleManagerMixin 对粒子数量上限进行修改
6+
* (对其他插件进行兼容)
7+
*/
8+
var enabledParticleCountInject = true
9+
10+
/**
11+
* 粒子数量上限
12+
* 原版上限为65536
13+
*/
14+
var particleCountLimit = 65536
15+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cn.coostack.config
2+
3+
import cn.coostack.CooParticleAPI
4+
import com.google.gson.GsonBuilder
5+
import net.fabricmc.fabric.impl.resource.loader.ModResourcePackUtil.GSON
6+
import net.fabricmc.loader.api.FabricLoader
7+
import org.apache.commons.compress.harmony.pack200.PackingUtils.config
8+
import java.nio.file.Files
9+
10+
11+
object APIConfigManager {
12+
private val gson = GsonBuilder().setPrettyPrinting().create()
13+
private val path = FabricLoader.getInstance().configDir.resolve("${CooParticleAPI.MOD_ID}.json")
14+
@JvmStatic
15+
private var withConfig: APIConfig? = null
16+
@JvmStatic
17+
fun getConfig(): APIConfig {
18+
return withConfig ?: let {
19+
loadConfig()
20+
withConfig!!
21+
}
22+
}
23+
@JvmStatic
24+
fun loadConfig() {
25+
if (!Files.exists(path)) {
26+
withConfig = APIConfig()
27+
saveConfig()
28+
return
29+
}
30+
withConfig = gson.fromJson(Files.readString(path), APIConfig::class.java)
31+
}
32+
33+
@JvmStatic
34+
fun saveConfig() {
35+
withConfig ?: return
36+
val json = gson.toJson(withConfig)
37+
Files.writeString(path, json)
38+
}
39+
40+
}

src/main/kotlin/cn/coostack/particles/control/group/ControlableParticleGroup.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,11 @@ abstract class ControlableParticleGroup(val uuid: UUID) {
5555
var displayed = false
5656

5757
/**
58-
* value代表的是 ParticleControler的初始化函数
59-
* @see ParticleControler.initInvoker value最终赋值到这里
58+
* key代表的是 ParticleControler的初始化函数
59+
* @see ParticleControler.initInvoker key最终赋值到这里
60+
* 考虑到不同的粒子可能会存在于相同的位置,因此做此修改
6061
*/
61-
abstract fun loadParticleLocations(): Map<RelativeLocation, ParticleRelativeData>
62+
abstract fun loadParticleLocations(): Map<ParticleRelativeData, RelativeLocation>
6263

6364
/**
6465
* 每次客户端更新可见时都会执行一次这个方法
@@ -97,7 +98,7 @@ abstract class ControlableParticleGroup(val uuid: UUID) {
9798
this.origin = pos
9899
this.world = world
99100
displayed = true
100-
for ((rl, v) in particleRelativeLocations) {
101+
for ((v, rl) in particleRelativeLocations) {
101102
val uuid = UUID.randomUUID()
102103
val controler = ControlParticleManager.createControl(uuid)
103104
controler.initInvoker = v.invoker

src/main/kotlin/cn/coostack/particles/control/group/impl/TestGroupClient.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ class TestGroupClient(uuid: UUID, val bindPlayer: UUID) : ControlableParticleGro
2323
}
2424
}
2525

26-
override fun loadParticleLocations(): Map<RelativeLocation, ParticleRelativeData> {
26+
override fun loadParticleLocations(): Map<ParticleRelativeData, RelativeLocation> {
2727
val list = Math3DUtil.getCycloidGraphic(3.0, 5.0, 2, -3, 360, 0.2).onEach { it.y += 6 }
28-
return list.associateWith {
28+
return list.associateBy {
2929
withEffect({ TestEndRodEffect(it) }) {
3030
color = Vector3f(230 / 255f, 130 / 255f, 60 / 255f)
3131
this.maxAliveTick = this.maxAliveTick
3232
}
3333
}
34+
3435
}
3536

3637

0 commit comments

Comments
 (0)