1+ package cn.coostack.particles.control.group.impl
2+
3+ import cn.coostack.network.buffer.ParticleControlerDataBuffer
4+ import cn.coostack.particles.ParticleDisplayer
5+ import cn.coostack.particles.control.group.ControlableParticleGroup
6+ import cn.coostack.particles.control.group.ControlableParticleGroupProvider
7+ import cn.coostack.particles.impl.TestEndRodEffect
8+ import cn.coostack.test.util.Math3DUtil
9+ import cn.coostack.test.util.RelativeLocation
10+ import org.joml.Vector3f
11+ import java.util.*
12+
13+ class ScaleCircleGroupClient (uuid : UUID , val bindPlayer : UUID ) : ControlableParticleGroup(uuid) {
14+ internal var anTick = 0
15+ internal var anMaxTick = 30
16+
17+ class Provider : ControlableParticleGroupProvider {
18+ override fun createGroup (
19+ uuid : UUID ,
20+ args : Map <String , ParticleControlerDataBuffer <* >>
21+ ): ControlableParticleGroup {
22+ val bindPlayer = args[" bind_player" ]!! .loadedValue as UUID
23+ val group = ScaleCircleGroupClient (uuid, bindPlayer)
24+ group.anTick = args[" an_tick" ]!! .loadedValue as Int
25+ return group
26+ }
27+ }
28+
29+ override fun loadParticleLocations (): Map <ParticleRelativeData , RelativeLocation > {
30+ val res = mutableMapOf<ParticleRelativeData , RelativeLocation >()
31+ val points = Math3DUtil .getCycloidGraphic(3.0 , 5.0 , - 2 , 3 , 360 , .5 )
32+ points.forEach {
33+ val withData = withEffect({ ParticleDisplayer .withSingle(TestEndRodEffect (it)) }) {
34+ color = Vector3f (100 / 255f , 100 / 255f , 255 / 255f )
35+ maxAge = 120
36+ }.withControler { c ->
37+ c.addPreTickAction {
38+ currentAge++
39+ if (currentAge >= maxAge) {
40+ this @ScaleCircleGroupClient.canceled = true
41+ }
42+ }
43+ }
44+ res[withData] = it.multiply(1.0 / anMaxTick)
45+ }
46+ return res
47+ }
48+
49+
50+ override fun onGroupDisplay () {
51+ // 保存最初始的长度
52+ // 用于做稳定的长度添加
53+ val firstClone = particlesLocations.map {
54+ it.key to it.value.length()
55+ }.toMap()
56+ addPreTickAction {
57+ val player = world!! .getPlayerByUuid(bindPlayer) ? : return @addPreTickAction
58+ // 同步位置
59+ teleportTo(player.pos)
60+ // 在变大的过程中也能旋转
61+ rotateParticlesAsAxis(Math .toRadians(10.0 ))
62+ // 旋转时间设定
63+ if (anTick++ >= anMaxTick) {
64+ anTick = anMaxTick
65+ return @addPreTickAction
66+ }
67+ particlesLocations.forEach {
68+ val cloneLength = firstClone[it.key]!!
69+ // 确保添加的方向和长度正确
70+ it.value.add(it.value.normalize().multiply(cloneLength))
71+ }
72+ }
73+ }
74+ }
0 commit comments