Skip to content

Commit 85a125d

Browse files
committed
#新增
数学图案预设(罗马字符) #修复 现在生成粒子发射器会立刻同步给客户端(防止maxTick = 1时客户端有概率不显示) 修复了DefendClassParticleEmitter示例序列化的错误 (id忘记改了) 补充了一些注释 Barrage新增了一个新的必须实现的方法 (hit方法) 用于强制设置击中状态
1 parent 8c9857d commit 85a125d

23 files changed

Lines changed: 752 additions & 61 deletions

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.minecraft.client.particle.Particle;
77
import net.minecraft.client.particle.ParticleManager;
88
import net.minecraft.client.particle.ParticleTextureSheet;
9+
import org.spongepowered.asm.mixin.Final;
910
import org.spongepowered.asm.mixin.Mixin;
1011
import org.spongepowered.asm.mixin.Shadow;
1112
import org.spongepowered.asm.mixin.injection.At;
@@ -16,9 +17,11 @@
1617

1718
@Mixin(ParticleManager.class)
1819
public abstract class ParticleManagerMixin {
20+
@Final
1921
@Shadow
2022
private Map<ParticleTextureSheet, Queue<Particle>> particles;
2123

24+
@Final
2225
@Shadow
2326
private Queue<Particle> newParticles;
2427

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,14 @@ object CooParticleAPI : ModInitializer {
101101
private fun testEntity() {
102102
CooParticleEntities.init()
103103

104-
FabricDefaultAttributeRegistry.register(CooParticleEntities.TEST_ENTITY, TestEntity.createDefaultMobAttributes())
105-
FabricDefaultAttributeRegistry.register(CooParticleEntities.TEST_PLAYER_ENTITY, TestPlayerEntity.createDefaultMobAttributes())
104+
FabricDefaultAttributeRegistry.register(
105+
CooParticleEntities.TEST_ENTITY,
106+
TestEntity.createDefaultMobAttributes()
107+
)
108+
FabricDefaultAttributeRegistry.register(
109+
CooParticleEntities.TEST_PLAYER_ENTITY,
110+
TestPlayerEntity.createDefaultMobAttributes()
111+
)
106112

107113
}
108114
}

src/main/kotlin/cn/coostack/cooparticlesapi/CooParticleAPIClient.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,8 @@ import cn.coostack.cooparticlesapi.network.particle.emitters.ParticleEmittersMan
1212
import cn.coostack.cooparticlesapi.network.particle.style.ParticleStyleManager
1313
import cn.coostack.cooparticlesapi.particles.CooModParticles
1414
import cn.coostack.cooparticlesapi.particles.control.group.ClientParticleGroupManager
15-
import cn.coostack.cooparticlesapi.particles.impl.ControlableCloudEffect
1615
import cn.coostack.cooparticlesapi.particles.impl.ControlableCloudParticle
17-
import cn.coostack.cooparticlesapi.particles.impl.ControlableEnchantmentEffect
1816
import cn.coostack.cooparticlesapi.particles.impl.ControlableEnchantmentParticle
19-
import cn.coostack.cooparticlesapi.particles.impl.ControlableFireworkEffect
2017
import cn.coostack.cooparticlesapi.particles.impl.ControlableFireworkParticle
2118
import cn.coostack.cooparticlesapi.particles.impl.ControlableFlashParticle
2219
import cn.coostack.cooparticlesapi.particles.impl.TestEndRodParticle
@@ -33,6 +30,8 @@ import cn.coostack.cooparticlesapi.test.particle.client.SequencedMagicCircleClie
3330
import cn.coostack.cooparticlesapi.test.particle.client.TestGroupClient
3431
import cn.coostack.cooparticlesapi.test.particle.style.ExampleSequencedStyle
3532
import cn.coostack.cooparticlesapi.test.particle.style.ExampleStyle
33+
import cn.coostack.cooparticlesapi.test.particle.style.RomaMagicTestStyle
34+
import cn.coostack.cooparticlesapi.test.particle.style.RotateTestStyle
3635
import net.fabricmc.api.ClientModInitializer
3736
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
3837
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientWorldEvents
@@ -44,7 +43,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry
4443
object CooParticleAPIClient : ClientModInitializer {
4544

4645
override fun onInitializeClient() {
47-
particleGroupPacketListener()
46+
loadParticleGroupPacketListener()
4847
ClientTickEvents.START_WORLD_TICK.register {
4948
ClientParticleGroupManager.doClientTick()
5049
ParticleStyleManager.doTickClient()
@@ -88,12 +87,15 @@ object CooParticleAPIClient : ClientModInitializer {
8887

8988
ParticleStyleManager.register(ExampleStyle::class.java, ExampleStyle.Provider())
9089
ParticleStyleManager.register(ExampleSequencedStyle::class.java, ExampleSequencedStyle.Provider())
90+
ParticleStyleManager.register(RomaMagicTestStyle::class.java, RomaMagicTestStyle.Provider())
91+
ParticleStyleManager.register(RotateTestStyle::class.java, RotateTestStyle.Provider())
9192
CooModParticles.reg()
93+
ParticleEmittersManager.init()
9294
testEntity()
9395
}
9496

9597

96-
private fun particleGroupPacketListener() {
98+
private fun loadParticleGroupPacketListener() {
9799
ClientPlayNetworking.registerGlobalReceiver(
98100
PacketParticleGroupS2C.payloadID,
99101
ClientParticleGroupPacketHandler

src/main/kotlin/cn/coostack/cooparticlesapi/barrages/AbstractBarrage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ abstract class AbstractBarrage(
108108
/**
109109
* 判定barrage已经攻击到实体或者触发方块/液体时执行
110110
*/
111-
fun hit(result: BarrageHitResult) {
111+
override fun hit(result: BarrageHitResult) {
112112
onHit(result)
113113
val timeoutHit = options.maxLivingTick <= currentTick && options.maxLivingTick != -1
114114
if (options.acrossable && !timeoutHit) {

src/main/kotlin/cn/coostack/cooparticlesapi/barrages/Barrage.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ interface Barrage {
2323
*/
2424
val bindControl: ServerControler<*>
2525

26+
fun hit(result: BarrageHitResult)
27+
2628
/**
2729
* @param result 击中的目标
2830
*/

src/main/kotlin/cn/coostack/cooparticlesapi/barrages/BarrageManager.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import net.minecraft.util.math.Box
1111
object BarrageManager {
1212
private val barrages = ConcurrentHashMultiset.create<Barrage>()
1313

14-
1514
fun collectClipBarrages(world: ServerWorld, box: Box): List<Barrage> {
1615
return barrages.filter {
1716
it.valid && world == it.world && !it.noclip() && (box.contains(it.loc) || box.intersects(it.hitBox.ofBox(it.loc)))

src/main/kotlin/cn/coostack/cooparticlesapi/items/TestParticleItem.kt

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,20 @@ import cn.coostack.cooparticlesapi.network.particle.emitters.impl.ExplodeClassPa
99
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.FireClassParticleEmitters
1010
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.LightningClassParticleEmitters
1111
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.PhysicsParticleEmitters
12+
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.PresetTestEmitters
1213
import cn.coostack.cooparticlesapi.network.particle.emitters.type.EmittersShootTypes
14+
import cn.coostack.cooparticlesapi.network.particle.style.ParticleStyleManager
1315
import cn.coostack.cooparticlesapi.particles.impl.ControlableCloudEffect
1416
import cn.coostack.cooparticlesapi.particles.impl.TestEndRodEffect
17+
import cn.coostack.cooparticlesapi.test.particle.style.RomaMagicTestStyle
18+
import cn.coostack.cooparticlesapi.test.particle.style.RotateTestStyle
1519
import cn.coostack.cooparticlesapi.utils.CameraUtil
1620
import cn.coostack.cooparticlesapi.utils.Math3DUtil
1721
import net.minecraft.client.particle.ParticleTextureSheet
1822
import net.minecraft.entity.player.PlayerEntity
1923
import net.minecraft.item.Item
2024
import net.minecraft.item.ItemStack
25+
import net.minecraft.server.world.ServerWorld
2126
import net.minecraft.util.Hand
2227
import net.minecraft.util.TypedActionResult
2328
import net.minecraft.world.World
@@ -29,13 +34,37 @@ class TestParticleItem(settings: Settings) : Item(settings) {
2934
if (world.isClient) {
3035
return TypedActionResult.success(user.getStackInHand(hand))
3136
}
32-
testLightning(world, user)
37+
testRotate(world, user)
3338
// CameraUtil.startShakeCamera(240, 0.25)
3439
// testFire(world, user)
3540
// 线性阻力
3641
return super.use(world, user, hand)
3742
}
3843

44+
private fun testRotate(world: World, user: PlayerEntity) {
45+
val style = RotateTestStyle(user.uuid)
46+
ParticleStyleManager.spawnStyle(world as ServerWorld, user.pos, style)
47+
}
48+
49+
private fun testRomaCircle(world: World, user: PlayerEntity) {
50+
val style = RomaMagicTestStyle()
51+
ParticleStyleManager.spawnStyle(world as ServerWorld, user.pos, style)
52+
}
53+
54+
private fun testPresets(world: World, user: PlayerEntity) {
55+
val example = PresetTestEmitters(user.eyePos, world)
56+
.also {
57+
it.maxTick = 240
58+
it.templateData.apply {
59+
textureSheet = ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT
60+
color = Math3DUtil.colorOf(100, 100, 210)
61+
effect = TestEndRodEffect(uuid)
62+
size = 0.1f
63+
}
64+
}
65+
66+
ParticleEmittersManager.spawnEmitters(example)
67+
}
3968

4069
private fun testDefend(world: World, user: PlayerEntity) {
4170
val example = DefendClassParticleEmitters(user.uuid, user.eyePos, world)
@@ -87,17 +116,16 @@ class TestParticleItem(settings: Settings) : Item(settings) {
87116
user.uuid, user.eyePos, world
88117
).also {
89118
it.maxTick = 120
90-
it.fireSize = 1.0
91-
it.fireForce = 0.5
119+
it.fireSize = 0.4
120+
it.fireForce = 0.01
92121
it.templateData.apply {
93-
maxAge = 60
122+
maxAge = 20
94123
textureSheet = ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT
95124
color = Math3DUtil.colorOf(255, 255, 255)
96-
effect = ControlableCloudEffect(uuid)
125+
effect = TestEndRodEffect(uuid)
97126
}
98127
}
99128
ParticleEmittersManager.spawnEmitters(example)
100-
101129
}
102130

103131

src/main/kotlin/cn/coostack/cooparticlesapi/network/particle/emitters/ClassParticleEmitters.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ abstract class ClassParticleEmitters(
3737
var gravity: Double = 0.0
3838

3939
companion object {
40-
4140
fun encodeBase(data: ClassParticleEmitters, buf: RegistryByteBuf) {
4241
buf.writeVec3d(data.pos)
4342
buf.writeInt(data.tick)
@@ -123,7 +122,7 @@ abstract class ClassParticleEmitters(
123122
if (cancelled || !playing) {
124123
return
125124
}
126-
if (tick++ > maxTick) {
125+
if (tick++ >= maxTick && maxTick != -1) {
127126
stop()
128127
}
129128

src/main/kotlin/cn/coostack/cooparticlesapi/network/particle/emitters/ParticleEmitters.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,19 @@ import java.util.UUID
1414
*
1515
* -> 不固定数量的ParticleStyleData
1616
* -> 方便输入的
17+
*
18+
*
19+
* TODO BUGS 当maxTick = 1时 会有概率不显示 (应该是tick == maxTick的状态优先被同步过去了)
1720
*/
1821
interface ParticleEmitters {
1922
var pos: Vec3d
2023
var world: World?
2124
var tick: Int
25+
26+
/**
27+
* 当maxTick == -1时
28+
* 代表此粒子不会由生命周期控制
29+
*/
2230
var maxTick: Int
2331
var delay: Int
2432
var uuid: UUID

src/main/kotlin/cn/coostack/cooparticlesapi/network/particle/emitters/ParticleEmittersManager.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import cn.coostack.cooparticlesapi.network.particle.emitters.impl.ExplodeClassPa
88
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.FireClassParticleEmitters
99
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.LightningClassParticleEmitters
1010
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.PhysicsParticleEmitters
11+
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.PresetTestEmitters
1112
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.SimpleParticleEmitters
1213
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking
1314
import net.minecraft.network.RegistryByteBuf
@@ -38,16 +39,9 @@ object ParticleEmittersManager {
3839
}
3940

4041

41-
init {
42-
register(PhysicsParticleEmitters.ID, PhysicsParticleEmitters.CODEC)
43-
register(SimpleParticleEmitters.ID, SimpleParticleEmitters.CODEC)
44-
register(ExampleClassParticleEmitters.ID, ExampleClassParticleEmitters.CODEC)
45-
register(FireClassParticleEmitters.ID, FireClassParticleEmitters.CODEC)
46-
register(ExplodeClassParticleEmitters.ID, ExplodeClassParticleEmitters.CODEC)
47-
register(LightningClassParticleEmitters.ID, LightningClassParticleEmitters.CODEC)
48-
register(DefendClassParticleEmitters.ID, DefendClassParticleEmitters.CODEC)
49-
}
50-
42+
/**
43+
* 在客户端执行
44+
*/
5145
fun register(
5246
id: String,
5347
codec: PacketCodec<RegistryByteBuf, ParticleEmitters>
@@ -62,6 +56,7 @@ object ParticleEmittersManager {
6256
if (emitters.world!!.isClient) return
6357
serverEmitters[emitters.uuid] = emitters
6458
emitters.start()
59+
updateClientVisible(emitters)
6560
}
6661

6762
fun createOrChangeClient(emitters: ParticleEmitters, viewWorld: World) {
@@ -177,4 +172,15 @@ object ParticleEmittersManager {
177172
}
178173

179174

175+
internal fun init() {
176+
register(PhysicsParticleEmitters.ID, PhysicsParticleEmitters.CODEC)
177+
register(SimpleParticleEmitters.ID, SimpleParticleEmitters.CODEC)
178+
register(ExampleClassParticleEmitters.ID, ExampleClassParticleEmitters.CODEC)
179+
register(FireClassParticleEmitters.ID, FireClassParticleEmitters.CODEC)
180+
register(ExplodeClassParticleEmitters.ID, ExplodeClassParticleEmitters.CODEC)
181+
register(LightningClassParticleEmitters.ID, LightningClassParticleEmitters.CODEC)
182+
register(DefendClassParticleEmitters.ID, DefendClassParticleEmitters.CODEC)
183+
register(PresetTestEmitters.ID, PresetTestEmitters.CODEC)
184+
}
185+
180186
}

0 commit comments

Comments
 (0)