Skip to content

Commit 36bf45a

Browse files
committed
写了一个自定义渲染工具
兼容IRIS 光影 (虽然IRIS光影无法作用到这个自定义渲染工具渲染的东西上, 但是也不会导致让这个面变成透明的)
1 parent 27a41b7 commit 36bf45a

40 files changed

+1524
-21
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ loom_version=1.10-SNAPSHOT
1111
fabric_kotlin_version=1.13.2+kotlin.2.1.20
1212

1313
# Mod Properties
14-
mod_version=1.11.1
14+
mod_version=1.12.0
1515
maven_group=cn.coostack
1616
archives_base_name=coo-particles-api
1717

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package cn.coostack.cooparticlesapi.mixin;
2+
3+
import cn.coostack.cooparticlesapi.renderer.client.ClientRenderEntityManager;
4+
import net.minecraft.client.render.*;
5+
import net.minecraft.client.world.ClientWorld;
6+
import org.jetbrains.annotations.Nullable;
7+
import org.joml.Matrix4f;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Shadow;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13+
14+
/**
15+
* 用于添加到渲染的最末尾 (避免光影影响)
16+
*/
17+
@Mixin(WorldRenderer.class)
18+
public class WorldRendererMixin {
19+
@Shadow
20+
private @Nullable ClientWorld world;
21+
22+
@Inject(method = "render", at = @At("TAIL"))
23+
public void render(RenderTickCounter tickCounter,
24+
boolean renderBlockOutline,
25+
Camera camera,
26+
GameRenderer gameRenderer,
27+
LightmapTextureManager lightmapTextureManager,
28+
Matrix4f matrix4f,
29+
Matrix4f matrix4f2,
30+
CallbackInfo ci
31+
) {
32+
if (world == null) {
33+
return;
34+
}
35+
boolean shouldTick = world.getTickManager().shouldTick();
36+
float tickDelta = tickCounter.getTickDelta(!shouldTick);
37+
ClientRenderEntityManager.INSTANCE.renderTick(tickDelta, matrix4f, matrix4f2);
38+
}
39+
}

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import cn.coostack.cooparticlesapi.network.packet.PacketParticleEmittersS2C
1111
import cn.coostack.cooparticlesapi.network.packet.PacketParticleGroupS2C
1212
import cn.coostack.cooparticlesapi.network.packet.PacketParticleS2C
1313
import cn.coostack.cooparticlesapi.network.packet.PacketParticleStyleS2C
14+
import cn.coostack.cooparticlesapi.network.packet.PacketRenderEntityS2C
1415
import cn.coostack.cooparticlesapi.network.particle.ServerParticleGroupManager
1516
import cn.coostack.cooparticlesapi.network.particle.ServerParticleGroup
1617
import cn.coostack.cooparticlesapi.network.particle.emitters.ParticleEmittersManager
@@ -30,12 +31,11 @@ import org.slf4j.LoggerFactory
3031
import cn.coostack.cooparticlesapi.particles.ControlableParticleEffect
3132
import cn.coostack.cooparticlesapi.particles.ControlableParticleEffectManager
3233
import cn.coostack.cooparticlesapi.particles.CooModParticles
34+
import cn.coostack.cooparticlesapi.renderer.server.ServerRenderEntityManager
3335
import cn.coostack.cooparticlesapi.test.entity.CooParticleEntities
3436
import cn.coostack.cooparticlesapi.test.entity.TestEntity
3537
import cn.coostack.cooparticlesapi.test.entity.TestPlayerEntity
3638
import com.ezylang.evalex.Expression
37-
import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents
38-
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents
3939
import net.fabricmc.fabric.api.`object`.builder.v1.entity.FabricDefaultAttributeRegistry
4040

4141
object CooParticleAPI : ModInitializer {
@@ -86,6 +86,12 @@ object CooParticleAPI : ModInitializer {
8686
EmittersShootTypes.init()
8787
APIConfigManager.loadConfig()
8888
ControlableParticleEffectManager.init()
89+
PacketParticleGroupS2C.init()
90+
PacketParticleS2C.init()
91+
PacketParticleStyleS2C.init()
92+
PacketParticleEmittersS2C.init()
93+
PacketCameraShakeS2C.init()
94+
PacketRenderEntityS2C.init()
8995
ServerTickEvents.START_SERVER_TICK.register { server ->
9096
val tickManager = server.tickManager
9197
if (!tickManager.shouldTick()) {
@@ -97,16 +103,12 @@ object CooParticleAPI : ModInitializer {
97103
BarrageManager.doTick()
98104
PathMotionManager.tick()
99105
AnimateManager.tickServer()
106+
ServerRenderEntityManager.tick()
100107
scheduler.doTick()
101108
}
102109
ServerLifecycleEvents.SERVER_STARTED.register { server ->
103110
this.server = server
104111
}
105-
PacketParticleGroupS2C.init()
106-
PacketParticleS2C.init()
107-
PacketParticleStyleS2C.init()
108-
PacketParticleEmittersS2C.init()
109-
PacketCameraShakeS2C.init()
110112
WindDirections.init()
111113
testEntity()
112114
}

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import cn.coostack.cooparticlesapi.network.packet.PacketParticleEmittersS2C
66
import cn.coostack.cooparticlesapi.network.packet.PacketParticleGroupS2C
77
import cn.coostack.cooparticlesapi.network.packet.PacketParticleS2C
88
import cn.coostack.cooparticlesapi.network.packet.PacketParticleStyleS2C
9+
import cn.coostack.cooparticlesapi.network.packet.PacketRenderEntityS2C
910
import cn.coostack.cooparticlesapi.network.packet.client.listener.ClientCameraShakeHandler
1011
import cn.coostack.cooparticlesapi.network.packet.client.listener.ClientParticleEmittersPacketHandler
1112
import cn.coostack.cooparticlesapi.network.packet.client.listener.ClientParticleGroupPacketHandler
1213
import cn.coostack.cooparticlesapi.network.packet.client.listener.ClientParticlePacketHandler
1314
import cn.coostack.cooparticlesapi.network.packet.client.listener.ClientParticleStylePacketHandler
15+
import cn.coostack.cooparticlesapi.network.packet.client.listener.ClientRenderEntityPacketHandler
1416
import cn.coostack.cooparticlesapi.network.particle.emitters.ParticleEmittersManager
1517
import cn.coostack.cooparticlesapi.network.particle.style.ParticleStyleManager
1618
import cn.coostack.cooparticlesapi.particles.CooModParticles
@@ -20,6 +22,7 @@ import cn.coostack.cooparticlesapi.particles.impl.ControlableEnchantmentParticle
2022
import cn.coostack.cooparticlesapi.particles.impl.ControlableFireworkParticle
2123
import cn.coostack.cooparticlesapi.particles.impl.ControlableFlashParticle
2224
import cn.coostack.cooparticlesapi.particles.impl.TestEndRodParticle
25+
import cn.coostack.cooparticlesapi.renderer.client.ClientRenderEntityManager
2326
import cn.coostack.cooparticlesapi.scheduler.CooScheduler
2427
import cn.coostack.cooparticlesapi.test.entity.CooParticleEntities
2528
import cn.coostack.cooparticlesapi.test.entity.CooParticlesEntityLayers
@@ -37,18 +40,15 @@ import cn.coostack.cooparticlesapi.test.particle.style.ExampleStyle
3740
import cn.coostack.cooparticlesapi.test.particle.style.RomaMagicTestStyle
3841
import cn.coostack.cooparticlesapi.test.particle.style.RotateTestStyle
3942
import cn.coostack.cooparticlesapi.test.particle.style.TestShapeUtilStyle
43+
import cn.coostack.cooparticlesapi.test.renderer.TestRendererEntity
4044
import net.fabricmc.api.ClientModInitializer
4145
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
4246
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientWorldEvents
4347
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents
4448
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking
4549
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry
46-
import net.fabricmc.fabric.api.client.rendering.v1.CoreShaderRegistrationCallback
4750
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry
4851
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry
49-
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents
50-
import net.minecraft.client.MinecraftClient
51-
import net.minecraft.client.gl.ShaderProgram
5252
import net.minecraft.client.world.ClientWorld
5353

5454
object CooParticleAPIClient : ClientModInitializer {
@@ -99,11 +99,18 @@ object CooParticleAPIClient : ClientModInitializer {
9999
ParticleStyleManager.register(TestShapeUtilStyle::class.java, TestShapeUtilStyle.Provider())
100100
CooModParticles.reg()
101101
ParticleEmittersManager.init()
102+
103+
ClientRenderEntityManager.register(TestRendererEntity.id, TestRendererEntity.codec)
104+
102105
testEntity()
103106
}
104107

105108

106109
private fun loadParticleGroupPacketListener() {
110+
ClientPlayNetworking.registerGlobalReceiver(
111+
PacketRenderEntityS2C.payloadID,
112+
ClientRenderEntityPacketHandler
113+
)
107114
ClientPlayNetworking.registerGlobalReceiver(
108115
PacketParticleGroupS2C.payloadID,
109116
ClientParticleGroupPacketHandler
@@ -124,13 +131,15 @@ object CooParticleAPIClient : ClientModInitializer {
124131
PacketCameraShakeS2C.payloadID,
125132
ClientCameraShakeHandler
126133
)
134+
127135
}
128136

129137

130138
private fun registerClientEvents() {
131139
ClientPlayConnectionEvents.DISCONNECT.register { _, event ->
132140
ParticleEmittersManager.clientEmitters.clear()
133141
ParticleStyleManager.clearAllVisible()
142+
ClientRenderEntityManager.clear()
134143
ClientParticleGroupManager.clearAllVisible()
135144
}
136145
ClientTickEvents.START_WORLD_TICK.register {
@@ -140,8 +149,8 @@ object CooParticleAPIClient : ClientModInitializer {
140149
ParticleEmittersManager.clientEmitters.clear()
141150
ParticleStyleManager.clearAllVisible()
142151
ClientParticleGroupManager.clearAllVisible()
152+
ClientRenderEntityManager.clear()
143153
}
144-
MinecraftClient.getInstance().player?.isDead
145154
}
146155

147156
var subTicks = 0.0
@@ -163,6 +172,7 @@ object CooParticleAPIClient : ClientModInitializer {
163172
ParticleStyleManager.doTickClient()
164173
ParticleEmittersManager.doTickClient()
165174
AnimateManager.tickClient()
175+
ClientRenderEntityManager.tick()
166176
}
167177
}
168178
}

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package cn.coostack.cooparticlesapi.items
22

3+
import cn.coostack.cooparticlesapi.renderer.server.ServerRenderEntityManager
4+
import cn.coostack.cooparticlesapi.test.renderer.TestRendererEntity
35
import net.minecraft.entity.player.PlayerEntity
46
import net.minecraft.item.Item
57
import net.minecraft.item.ItemStack
8+
import net.minecraft.server.network.ServerPlayerEntity
9+
import net.minecraft.server.world.ServerWorld
610
import net.minecraft.text.Text
711
import net.minecraft.util.Hand
812
import net.minecraft.util.TypedActionResult
@@ -12,6 +16,17 @@ class TestTickItem : Item(Settings().maxCount(1)) {
1216

1317
override fun use(world: World, user: PlayerEntity, hand: Hand): TypedActionResult<ItemStack> {
1418
if (world.isClient) return super.use(world, user, hand)
19+
testShader(world as ServerWorld, user as ServerPlayerEntity)
20+
return super.use(world, user, hand)
21+
}
22+
23+
fun testShader(world: ServerWorld, user: ServerPlayerEntity) {
24+
val shader = TestRendererEntity(world)
25+
shader.setPosition(user.pos)
26+
ServerRenderEntityManager.spawn(shader)
27+
}
28+
29+
fun tickFrozen(world: ServerWorld, user: ServerPlayerEntity) {
1530
val server = world.server!!
1631
val tickManager = server.tickManager
1732
val frozen = tickManager.isFrozen
@@ -30,7 +45,6 @@ class TestTickItem : Item(Settings().maxCount(1)) {
3045
"时停 ${!frozen}"
3146
)
3247
)
33-
return super.use(world, user, hand)
3448
}
3549

3650
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package cn.coostack.cooparticlesapi.network.packet
2+
3+
import cn.coostack.cooparticlesapi.CooParticleAPI
4+
import cn.coostack.cooparticlesapi.renderer.RenderEntity
5+
import cn.coostack.cooparticlesapi.renderer.client.ClientRenderEntityManager
6+
import io.netty.buffer.ByteBuf
7+
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry
8+
import net.minecraft.network.RegistryByteBuf
9+
import net.minecraft.network.codec.PacketCodec
10+
import net.minecraft.network.packet.CustomPayload
11+
import net.minecraft.util.Identifier
12+
import java.util.UUID
13+
14+
class PacketRenderEntityS2C(var uuid: UUID, var entityData: ByteBuf, var id: Identifier, var method: Method) :
15+
CustomPayload {
16+
enum class Method(val id: Int) {
17+
CREATE(0),
18+
TOGGLE(1),
19+
REMOVE(2);
20+
21+
companion object {
22+
fun idOf(id: Int): Method {
23+
return when (id) {
24+
CREATE.id -> CREATE
25+
TOGGLE.id -> TOGGLE
26+
REMOVE.id -> REMOVE
27+
else -> CREATE
28+
}
29+
}
30+
}
31+
}
32+
33+
companion object {
34+
private val identifierID = Identifier.of(CooParticleAPI.MOD_ID, "renderer_entity_packet")
35+
val payloadID = CustomPayload.Id<PacketRenderEntityS2C>(identifierID)
36+
private val CODEC: PacketCodec<RegistryByteBuf, PacketRenderEntityS2C> =
37+
CustomPayload.codecOf({ packet, buf ->
38+
val entity = packet.entityData
39+
buf.writeInt(packet.method.id)
40+
buf.writeUuid(packet.uuid)
41+
buf.writeIdentifier(packet.id)
42+
buf.writeBytes(entity)
43+
}, { buf ->
44+
val method = buf.readInt()
45+
val uuid = buf.readUuid()
46+
val id = buf.readIdentifier()
47+
val entity = buf.readBytes(buf.readableBytes())
48+
val packet = PacketRenderEntityS2C(uuid, entity, id, Method.idOf(method))
49+
return@codecOf packet
50+
})
51+
52+
fun init() {
53+
PayloadTypeRegistry.playS2C().register(payloadID, CODEC)
54+
}
55+
}
56+
57+
override fun getId(): CustomPayload.Id<out CustomPayload> {
58+
return payloadID
59+
}
60+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package cn.coostack.cooparticlesapi.network.packet.client.listener
2+
3+
import cn.coostack.cooparticlesapi.network.packet.PacketCameraShakeS2C
4+
import cn.coostack.cooparticlesapi.network.packet.PacketRenderEntityS2C
5+
import cn.coostack.cooparticlesapi.renderer.client.ClientRenderEntityManager
6+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking
7+
import net.minecraft.network.PacketByteBuf
8+
9+
object ClientRenderEntityPacketHandler : ClientPlayNetworking.PlayPayloadHandler<PacketRenderEntityS2C> {
10+
override fun receive(
11+
payload: PacketRenderEntityS2C,
12+
context: ClientPlayNetworking.Context
13+
) {
14+
val method = payload.method
15+
val data = payload.entityData
16+
val id = payload.id
17+
val buf = PacketByteBuf(data)
18+
val codec = ClientRenderEntityManager.getCodecFromID(id) ?: return
19+
val entity = codec.decode(buf)
20+
when (method) {
21+
PacketRenderEntityS2C.Method.CREATE -> {
22+
ClientRenderEntityManager.add(entity)
23+
}
24+
25+
PacketRenderEntityS2C.Method.TOGGLE -> {
26+
ClientRenderEntityManager.getFrom(payload.uuid)?.loadProfileFromEntity(entity)
27+
}
28+
29+
PacketRenderEntityS2C.Method.REMOVE -> {
30+
ClientRenderEntityManager.getFrom(payload.uuid)?.canceled = true
31+
}
32+
}
33+
}
34+
}

src/main/kotlin/cn/coostack/cooparticlesapi/network/particle/style/SequencedParticleStyle.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,6 @@ abstract class SequencedParticleStyle(visibleRange: Double = 32.0, uuid: UUID =
363363
return mapOf(
364364
"status" to ParticleControlerDataBuffers.longArray(displayedStatus),
365365
"displayed_particle_count" to ParticleControlerDataBuffers.int(displayedParticleCount),
366-
"particle_linkage_index" to ParticleControlerDataBuffers.int(particleLinkageDisplayCurrentIndex),
367366
*writePacketArgsSequenced().map { it.key to it.value }.toTypedArray()
368367
)
369368
}

0 commit comments

Comments
 (0)