Skip to content

Commit dda2cbc

Browse files
committed
现在ControlableParticleGroup支持在生成粒子时输入一个子ParticleGroup
子ParticleGroup无需注册Provider 优化了粒子传送时的移动, 现在进行复杂运动(例如旋转+位移) 更加流畅
1 parent a7d7d20 commit dda2cbc

File tree

11 files changed

+225
-61
lines changed

11 files changed

+225
-61
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ loader_version=0.16.10
1010
fabric_kotlin_version=1.13.1+kotlin.2.1.10
1111

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cn.coostack.particles
2+
3+
import cn.coostack.test.util.RelativeLocation
4+
import net.minecraft.util.math.Vec3d
5+
6+
/**
7+
* T 控制器对象
8+
*/
9+
interface Controlable<T> {
10+
fun rotateParticlesToPoint(to: RelativeLocation)
11+
fun rotateToWithAngle(to: RelativeLocation, angle: Double)
12+
fun rotateParticlesAsAxis(angle: Double)
13+
14+
fun teleportTo(pos: Vec3d)
15+
fun teleportTo(x: Double, y: Double, z: Double)
16+
17+
fun getControlObject(): T
18+
}

src/main/kotlin/cn/coostack/particles/ControlableParticle.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cn.coostack.particles
22

33
import cn.coostack.particles.control.ControlParticleManager
44
import cn.coostack.particles.control.ParticleControler
5+
import cn.coostack.test.util.RelativeLocation
56
import net.fabricmc.api.EnvType
67
import net.fabricmc.api.Environment
78
import net.minecraft.client.particle.Particle
@@ -25,12 +26,10 @@ abstract class ControlableParticle(
2526
) : SpriteBillboardParticle(world, pos.x, pos.y, pos.z, velocity.x, velocity.y, velocity.z) {
2627
val controler: ParticleControler = ControlParticleManager.getControl(controlUUID)!!
2728

28-
2929
/**
3030
* 是否调用 net.minecraft.client.particle.Particle中的tick方法
3131
*/
3232
var minecraftTick: Boolean = false
33-
3433
/**
3534
* @see x
3635
* @see y
@@ -202,14 +201,17 @@ abstract class ControlableParticle(
202201
ascending = value
203202
}
204203

204+
205+
private var lastPreview = cloneVec(pos)
206+
private var update = false
205207
fun teleportTo(pos: Vec3d) {
206-
prevPos = this.pos
207-
this.pos = pos
208+
lastPreview = cloneVec(pos)
209+
update = true
208210
}
209211

210212
fun teleportTo(x: Double, y: Double, z: Double) {
211-
prevPos = this.pos
212-
this.pos = Vec3d(x, y, z)
213+
lastPreview = Vec3d(x, y, z)
214+
update = true
213215
}
214216

215217
init {
@@ -225,8 +227,16 @@ abstract class ControlableParticle(
225227
if (minecraftTick) {
226228
super.tick()
227229
}
228-
229230
controler.doTick()
231+
if (update) {
232+
prevPos = this.pos
233+
this.pos = lastPreview
234+
update = false
235+
}
236+
}
237+
238+
private fun cloneVec(vec: Vec3d): Vec3d {
239+
return Vec3d(vec.x, vec.y, vec.z)
230240
}
231241

232242
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package cn.coostack.particles
2+
3+
import net.minecraft.particle.ParticleEffect
4+
import java.util.UUID
5+
6+
abstract class ControlableParticleEffect(val controlUUID: UUID) : ParticleEffect {
7+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cn.coostack.particles
2+
3+
import cn.coostack.particles.control.ControlParticleManager
4+
import cn.coostack.particles.control.group.ControlableParticleGroup
5+
import net.minecraft.client.world.ClientWorld
6+
import net.minecraft.particle.ParticleEffect
7+
import net.minecraft.util.math.Vec3d
8+
9+
/**
10+
* 为了更好的让ControlableParticleGroup 进行操作
11+
*/
12+
interface ParticleDisplayer {
13+
companion object {
14+
@JvmStatic
15+
fun withSingle(effect: ControlableParticleEffect): ParticleDisplayer {
16+
return SingleParticleDisplayer(effect)
17+
}
18+
19+
@JvmStatic
20+
fun withGroup(group: ControlableParticleGroup): ParticleDisplayer {
21+
return ParticleGroupDisplayer(group)
22+
}
23+
}
24+
25+
fun display(loc: Vec3d, world: ClientWorld): Controlable<*>?
26+
class SingleParticleDisplayer(val effect: ControlableParticleEffect) : ParticleDisplayer {
27+
/**
28+
* 始终返回null 因为此时粒子一定还未设置成功
29+
*/
30+
override fun display(loc: Vec3d, world: ClientWorld): Controlable<ControlableParticle>? {
31+
world.addParticle(effect, loc.x, loc.y, loc.z, 0.0, 0.0, 0.0)
32+
return ControlParticleManager.getControl(effect.controlUUID)
33+
}
34+
}
35+
36+
class ParticleGroupDisplayer(val group: ControlableParticleGroup) : ParticleDisplayer {
37+
override fun display(loc: Vec3d, world: ClientWorld): Controlable<ControlableParticleGroup> {
38+
group.display(loc, world)
39+
return group
40+
}
41+
}
42+
}

src/main/kotlin/cn/coostack/particles/control/ParticleControler.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package cn.coostack.particles.control
22

33
import cn.coostack.particles.ControlableParticle
44
import cn.coostack.network.buffer.ParticleControlerDataBuffer
5+
import cn.coostack.particles.Controlable
6+
import cn.coostack.test.util.RelativeLocation
57
import net.fabricmc.api.EnvType
68
import net.fabricmc.api.Environment
9+
import net.minecraft.util.math.Vec3d
710
import java.util.UUID
811
import java.util.concurrent.ConcurrentHashMap
912

@@ -12,7 +15,7 @@ import java.util.concurrent.ConcurrentHashMap
1215
* 此Controler 由 ControlerGroup代理创建 (Builder) 并使用
1316
*/
1417
@Environment(EnvType.CLIENT)
15-
class ParticleControler(private val uuid: UUID) {
18+
class ParticleControler(private val uuid: UUID) : Controlable<ControlableParticle> {
1619
lateinit var particle: ControlableParticle
1720
private set
1821

@@ -65,5 +68,26 @@ class ParticleControler(private val uuid: UUID) {
6568
}
6669
}
6770

71+
override fun rotateParticlesToPoint(to: RelativeLocation) {
72+
}
73+
74+
override fun rotateToWithAngle(to: RelativeLocation, angle: Double) {
75+
}
76+
77+
override fun rotateParticlesAsAxis(angle: Double) {
78+
}
79+
80+
override fun teleportTo(pos: Vec3d) {
81+
particle.teleportTo(pos)
82+
}
83+
84+
override fun teleportTo(x: Double, y: Double, z: Double) {
85+
particle.teleportTo(x, y, z)
86+
}
87+
88+
override fun getControlObject(): ControlableParticle {
89+
return particle
90+
}
91+
6892

6993
}

0 commit comments

Comments
 (0)