Skip to content

Commit 82d9752

Browse files
committed
修复 Emitter发包之前会执行tick方法 导致客户端刚刚开始收到的tick不为0 (看不见)的BUG
由于修复上述BUG 将Emitter相关的所有CODEC由RegistryByteBuf 改为 PacketByteBuf 修改ControlableParticle的getBrightness方法 现在可以自定义粒子亮度 (修改light属性) 设置为-1则为环境亮度 (自动获取)
1 parent c9876a5 commit 82d9752

34 files changed

Lines changed: 284 additions & 164 deletions

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,30 @@
1313

1414
@Mixin(Camera.class)
1515
public abstract class CooParticleCameraMixin {
16-
@Shadow private float yaw;
16+
@Shadow
17+
private float yaw;
1718

18-
@Shadow private float pitch;
19+
@Shadow
20+
private float pitch;
1921

2022

21-
@Shadow protected abstract void setRotation(float yaw, float pitch);
23+
@Shadow
24+
protected abstract void setRotation(float yaw, float pitch);
2225

23-
@Shadow protected abstract void setPos(double x, double y, double z);
26+
@Shadow
27+
protected abstract void setPos(double x, double y, double z);
2428

25-
@Shadow private Vec3d pos;
29+
@Shadow
30+
private Vec3d pos;
2631

27-
@Inject(method = "update", at=@At("TAIL"))
32+
@Inject(method = "update", at = @At("TAIL"))
2833
private void onUpdate(CallbackInfo ci) {
2934
// float newYaw = yaw + CameraUtil.INSTANCE.getCurrentYawOffset();
3035
// float newPitch = pitch + CameraUtil.INSTANCE.getCurrentPitchOffset();
3136
// setRotation(newYaw, newPitch);
3237
double x = pos.getX() + CameraUtil.INSTANCE.getCurrentXOffset();
3338
double y = pos.getY() + CameraUtil.INSTANCE.getCurrentYOffset();
3439
double z = pos.getZ() + CameraUtil.INSTANCE.getCurrentZOffset();
35-
setPos(x,y,z);
40+
setPos(x, y, z);
3641
}
37-
3842
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,8 @@
2121

2222
/**
2323
* TODO
24-
* 异步生成BuiltBuffer时
25-
* 在主线程draw会导致 buffer no longer valid的异常
26-
* 原理未知
24+
* 100%崩端 提示非法访问内存
25+
* 原因未知
2726
*/
2827
@Mixin(ParticleManager.class)
2928
public class ParticleManagerRenderMixin {

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,19 +115,16 @@ object CooParticleAPIClient : ClientModInitializer {
115115
ParticleEmittersManager.clientEmitters.clear()
116116
ParticleStyleManager.clearAllVisible()
117117
ClientParticleGroupManager.clearAllVisible()
118-
ParticleAsyncRenderHelper.close()
119118
}
120119
ClientTickEvents.START_WORLD_TICK.register {
121120
ClientParticleGroupManager.doClientTick()
122121
ParticleStyleManager.doTickClient()
123122
ParticleEmittersManager.doTickClient()
124-
ParticleAsyncRenderHelper.reloadIfClosed()
125123
}
126124
ClientWorldEvents.AFTER_CLIENT_WORLD_CHANGE.register { _, _ ->
127125
ParticleEmittersManager.clientEmitters.clear()
128126
ParticleStyleManager.clearAllVisible()
129127
ClientParticleGroupManager.clearAllVisible()
130-
ParticleAsyncRenderHelper.reloadIfClosed()
131128
}
132129
}
133130

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cn.coostack.cooparticlesapi.network.animation
2+
3+
/**
4+
* 粒子动画
5+
* 兼容 粒子发射器(ParticleEmitter) 粒子样式 (ParticleGroupStyle)
6+
* 在服务器端发包控制动画
7+
* TODO 没想好框架
8+
*/
9+
interface ParticleAnimation {
10+
11+
12+
}

src/main/kotlin/cn/coostack/cooparticlesapi/network/packet/PacketParticleEmittersS2C.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ import cn.coostack.cooparticlesapi.CooParticleAPI
44
import cn.coostack.cooparticlesapi.network.particle.emitters.ParticleEmitters
55
import cn.coostack.cooparticlesapi.network.particle.emitters.ParticleEmittersManager
66
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry
7+
import net.minecraft.network.PacketByteBuf
78
import net.minecraft.network.RegistryByteBuf
89
import net.minecraft.network.codec.PacketCodec
910
import net.minecraft.network.packet.CustomPayload
1011
import net.minecraft.util.Identifier
1112
import java.util.UUID
1213

1314
class PacketParticleEmittersS2C(
14-
val emitter: ParticleEmitters,
15+
val emitterBuf: PacketByteBuf,
1516
val emitterID: String,
1617
val type: PacketType
1718
) :
1819
CustomPayload {
19-
2020
enum class PacketType(val id: Int) {
2121
CHANGE_OR_CREATE(0),
2222
REMOVE(1);
@@ -36,17 +36,16 @@ class PacketParticleEmittersS2C(
3636
companion object {
3737
private val identifierID = Identifier.of(CooParticleAPI.MOD_ID, "particle_emitters")
3838
val payloadID = CustomPayload.Id<PacketParticleEmittersS2C>(identifierID)
39-
private val CODEC: PacketCodec<RegistryByteBuf, PacketParticleEmittersS2C> =
39+
private val CODEC: PacketCodec<PacketByteBuf, PacketParticleEmittersS2C> =
4040
CustomPayload.codecOf({ packet, buf ->
4141
buf.writeInt(packet.type.id)
4242
buf.writeString(packet.emitterID)
43-
packet.emitter.getCodec().encode(buf, packet.emitter)
43+
buf.writeBytes(packet.emitterBuf)
4444
}, { buf ->
4545
val packetTypeID = buf.readInt()
4646
val emitterID = buf.readString()
47-
val codec = ParticleEmittersManager.getCodecFromID(emitterID)!!
48-
val emitter = codec.decode(buf)
49-
PacketParticleEmittersS2C(emitter, emitterID, PacketType.fromID(packetTypeID))
47+
val emitterBuf = buf.readBytes(buf.readableBytes())
48+
PacketParticleEmittersS2C(PacketByteBuf(emitterBuf), emitterID, PacketType.fromID(packetTypeID))
5049
})
5150

5251
fun init() {

src/main/kotlin/cn/coostack/cooparticlesapi/network/packet/client/listener/ClientParticleEmittersPacketHandler.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import cn.coostack.cooparticlesapi.network.packet.PacketParticleEmittersS2C
44
import cn.coostack.cooparticlesapi.network.particle.emitters.ParticleEmitters
55
import cn.coostack.cooparticlesapi.network.particle.emitters.ParticleEmittersManager
66
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking
7+
import net.minecraft.network.PacketByteBuf
78

89
object ClientParticleEmittersPacketHandler : ClientPlayNetworking.PlayPayloadHandler<PacketParticleEmittersS2C> {
910
override fun receive(
@@ -12,16 +13,20 @@ object ClientParticleEmittersPacketHandler : ClientPlayNetworking.PlayPayloadHan
1213
) {
1314
when (payload.type) {
1415
PacketParticleEmittersS2C.PacketType.CHANGE_OR_CREATE -> handleChangeOrCreate(payload, context)
15-
PacketParticleEmittersS2C.PacketType.REMOVE -> handleRemove(payload.emitter)
16+
PacketParticleEmittersS2C.PacketType.REMOVE -> handleRemove(payload)
1617
}
1718

1819
}
1920

2021
fun handleChangeOrCreate(payload: PacketParticleEmittersS2C, context: ClientPlayNetworking.Context) {
21-
ParticleEmittersManager.createOrChangeClient(payload.emitter, context.player().world)
22+
val codec = ParticleEmittersManager.getCodecFromID(payload.emitterID) ?: return
23+
val emitter = codec.decode(payload.emitterBuf)
24+
ParticleEmittersManager.createOrChangeClient(emitter, context.player().world)
2225
}
2326

24-
fun handleRemove(emitter: ParticleEmitters) {
27+
fun handleRemove(payload: PacketParticleEmittersS2C) {
28+
val codec = ParticleEmittersManager.getCodecFromID(payload.emitterID) ?: return
29+
val emitter = codec.decode(payload.emitterBuf)
2530
ParticleEmittersManager.clientEmitters[emitter.uuid]?.cancelled = true
2631
}
2732
}

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import cn.coostack.cooparticlesapi.network.particle.emitters.environment.wind.Wi
55
import cn.coostack.cooparticlesapi.network.particle.emitters.environment.wind.WindDirections
66
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.PhysicsParticleEmitters.Companion.CROSS_SECTIONAL_AREA
77
import cn.coostack.cooparticlesapi.network.particle.emitters.impl.PhysicsParticleEmitters.Companion.DRAG_COEFFICIENT
8-
import cn.coostack.cooparticlesapi.particles.ControlableParticle
98
import cn.coostack.cooparticlesapi.particles.ParticleDisplayer
109
import cn.coostack.cooparticlesapi.particles.control.ControlParticleManager
1110
import cn.coostack.cooparticlesapi.particles.control.ParticleControler
1211
import cn.coostack.cooparticlesapi.utils.RelativeLocation
12+
import io.netty.buffer.Unpooled
1313
import net.minecraft.client.world.ClientWorld
14+
import net.minecraft.network.PacketByteBuf
1415
import net.minecraft.network.RegistryByteBuf
15-
import net.minecraft.network.codec.PacketCodec
1616
import net.minecraft.util.math.Vec3d
1717
import net.minecraft.world.World
1818
import java.util.UUID
@@ -37,7 +37,7 @@ abstract class ClassParticleEmitters(
3737
var gravity: Double = 0.0
3838

3939
companion object {
40-
fun encodeBase(data: ClassParticleEmitters, buf: RegistryByteBuf) {
40+
fun encodeBase(data: ClassParticleEmitters, buf: PacketByteBuf) {
4141
buf.writeVec3d(data.pos)
4242
buf.writeInt(data.tick)
4343
buf.writeInt(data.maxTick)
@@ -58,7 +58,7 @@ abstract class ClassParticleEmitters(
5858
* 然后将buf和container 传入此方法
5959
* 然后继续decode自己的参数
6060
*/
61-
fun decodeBase(container: ClassParticleEmitters, buf: RegistryByteBuf) {
61+
fun decodeBase(container: ClassParticleEmitters, buf: PacketByteBuf) {
6262
val pos = buf.readVec3d()
6363
val tick = buf.readInt()
6464
val maxTick = buf.readInt()
@@ -122,21 +122,25 @@ abstract class ClassParticleEmitters(
122122
if (cancelled || !playing) {
123123
return
124124
}
125-
if (tick++ >= maxTick && maxTick != -1) {
126-
stop()
127-
}
128125

129126
world ?: return
130127
doTick()
131128
if (!world!!.isClient) {
129+
increaseTick()
132130
return
133131
}
134-
135132
if (tick % max(1, delay) == 0) {
136133
// 执行粒子变更操作
137134
// 生成新粒子
138135
spawnParticle()
139136
}
137+
increaseTick()
138+
}
139+
140+
private fun increaseTick() {
141+
if (++tick >= maxTick && maxTick != -1) {
142+
stop()
143+
}
140144
}
141145

142146
override fun spawnParticle() {
@@ -213,6 +217,12 @@ abstract class ClassParticleEmitters(
213217
} else {
214218
Vec3d.ZERO
215219
}
220+
221+
if (!wind.hasLoadedEmitters()) {
222+
wind.loadEmitters(this)
223+
}
224+
225+
216226
val windForce = WindDirections.handleWindForce(
217227
wind, pos,
218228
airDensity, DRAG_COEFFICIENT, CROSS_SECTIONAL_AREA, v

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import cn.coostack.cooparticlesapi.particles.ControlableParticleEffect
44
import cn.coostack.cooparticlesapi.particles.ControlableParticleEffectManager
55
import cn.coostack.cooparticlesapi.particles.impl.TestEndRodEffect
66
import net.minecraft.client.particle.ParticleTextureSheet
7+
import net.minecraft.network.PacketByteBuf
78
import net.minecraft.network.RegistryByteBuf
89
import net.minecraft.network.codec.PacketCodec
910
import net.minecraft.util.math.Vec3d
@@ -13,11 +14,11 @@ import java.util.UUID
1314
open class ControlableParticleData {
1415
companion object {
1516
@JvmStatic
16-
val PACKET_CODEC = PacketCodec.ofStatic<RegistryByteBuf, ControlableParticleData>(
17+
val PACKET_CODEC = PacketCodec.ofStatic<PacketByteBuf, ControlableParticleData>(
1718
::encode, ::decode
1819
)
1920

20-
private fun encode(buf: RegistryByteBuf, data: ControlableParticleData) {
21+
private fun encode(buf: PacketByteBuf, data: ControlableParticleData) {
2122
buf.writeUuid(data.uuid)
2223
buf.writeVec3d(data.velocity)
2324
buf.writeFloat(data.size)
@@ -36,7 +37,7 @@ open class ControlableParticleData {
3637
}
3738

3839
private fun decode(
39-
buf: RegistryByteBuf,
40+
buf: PacketByteBuf,
4041
): ControlableParticleData {
4142
val uuid = buf.readUuid()
4243
val velocity = buf.readVec3d()
@@ -98,7 +99,7 @@ open class ControlableParticleData {
9899
}
99100
}
100101

101-
open fun getCodec(): PacketCodec<RegistryByteBuf, out ControlableParticleData> {
102+
open fun getCodec(): PacketCodec<PacketByteBuf, out ControlableParticleData> {
102103
return PACKET_CODEC
103104
}
104105

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.coostack.cooparticlesapi.network.particle.emitters
22

3+
import net.minecraft.network.PacketByteBuf
34
import net.minecraft.network.RegistryByteBuf
45
import net.minecraft.network.codec.PacketCodec
56
import net.minecraft.util.math.Vec3d
@@ -22,7 +23,6 @@ interface ParticleEmitters {
2223
var pos: Vec3d
2324
var world: World?
2425
var tick: Int
25-
2626
/**
2727
* 当maxTick == -1时
2828
* 代表此粒子不会由生命周期控制
@@ -57,5 +57,5 @@ interface ParticleEmitters {
5757
* 编解码器
5858
* 编码粒子信息, 当前位置
5959
*/
60-
fun getCodec(): PacketCodec<RegistryByteBuf, ParticleEmitters>
60+
fun getCodec(): PacketCodec<PacketByteBuf, ParticleEmitters>
6161
}

0 commit comments

Comments
 (0)