Skip to content

Commit 147ed91

Browse files
committed
# 新增
- Barrier (攻击性弹幕)框架 (类比CooLib的Barrier) - ParticleControlerDataBuffers支持创建空类型 ParticleControlerDataBuffers.empty() 现在输入操作args时无需多余传入参数 更改了用于测试的ParticleGroup的位置 使用Barrier时 只需要创建类 继承AbstractBarrier 实现对应方法 然后生成Barrier只需要 使用BarrierManager.spawn()即可 Barrier需要绑定一个ServerParticleGroup 作为这个弹幕的显示层 这个ParticleGroup的位置由Barrier控制(teleport) 所以你无需在ControlableParticleGroup(Client)处对位置进行同步 Barrier是一个服务端模块 意味着 world entities 均代表服务端的 ServerWorld 重写tick方法时务必加上super.tick() 除非你想让大多数功能失效 新增一个物品 用于测试Barrier框架 # 修正 - 修复mod id的错误 (cooparticleapi -> cooparticlesapi)
1 parent 4701378 commit 147ed91

41 files changed

Lines changed: 644 additions & 72 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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.32
13+
mod_version=1.4
1414
maven_group=cn.coostack
1515
archives_base_name=coo-particles-api
1616

src/main/generated/.cache/355fe5f1ebe793470a797571741667bb65f029ed

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/main/generated/.cache/4322f7243df950a94e0ed1e02562c5a997f512ec

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/main/generated/assets/cooparticleapi/lang/zh_cn.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/main/generated/assets/cooparticleapi/models/item/test_particle.json

Lines changed: 0 additions & 6 deletions
This file was deleted.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.coostack
22

3+
import cn.coostack.barriers.BarrierManager
34
import cn.coostack.config.APIConfig
45
import cn.coostack.config.APIConfigManager
56
import cn.coostack.items.CooItems
@@ -21,7 +22,7 @@ import org.slf4j.LoggerFactory
2122
object CooParticleAPI : ModInitializer {
2223
val logger = LoggerFactory.getLogger("CooParticleAPI")!!
2324

24-
const val MOD_ID = "cooparticleapi"
25+
const val MOD_ID = "cooparticlesapi"
2526

2627

2728
lateinit var server: MinecraftServer
@@ -57,6 +58,7 @@ object CooParticleAPI : ModInitializer {
5758
APIConfigManager.loadConfig()
5859
ServerTickEvents.START_SERVER_TICK.register { _ ->
5960
ServerParticleGroupManager.upgrade()
61+
BarrierManager.doTick()
6062
}
6163
ServerLifecycleEvents.SERVER_STARTED.register { server ->
6264
this.server = server

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ import cn.coostack.network.packet.PacketParticleGroupS2C
44
import cn.coostack.network.packet.client.listener.ClientParticleGroupPacketHandler
55
import cn.coostack.particles.ModParticles
66
import cn.coostack.particles.control.group.ClientParticleGroupManager
7-
import cn.coostack.particles.control.group.impl.ScaleCircleGroupClient
8-
import cn.coostack.particles.control.group.impl.TestGroupClient
97
import cn.coostack.particles.impl.TestEndRodParticle
8+
import cn.coostack.test.particle.client.ScaleCircleGroupClient
9+
import cn.coostack.test.particle.client.TestGroupClient
10+
import cn.coostack.test.particle.client.BarrierSwordGroupClient
1011
import net.fabricmc.api.ClientModInitializer
1112
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
1213
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientWorldEvents
1314
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking
1415
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry
15-
import org.slf4j.LoggerFactory
1616

1717
object CooParticleAPIClient : ClientModInitializer {
1818

@@ -34,6 +34,9 @@ object CooParticleAPIClient : ClientModInitializer {
3434
ClientParticleGroupManager.register(
3535
ScaleCircleGroupClient::class.java, ScaleCircleGroupClient.Provider()
3636
)
37+
ClientParticleGroupManager.register(
38+
BarrierSwordGroupClient::class.java, BarrierSwordGroupClient.Provider()
39+
)
3740
ModParticles.reg()
3841
}
3942

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package cn.coostack.barriers
2+
3+
import cn.coostack.network.particle.ServerParticleGroup
4+
import com.google.common.base.Predicate
5+
import net.minecraft.block.BlockState
6+
import net.minecraft.entity.Entity
7+
import net.minecraft.entity.LivingEntity
8+
import net.minecraft.server.world.ServerWorld
9+
import net.minecraft.util.math.BlockPos
10+
import net.minecraft.util.math.Box
11+
import net.minecraft.util.math.Vec3d
12+
import kotlin.math.max
13+
14+
abstract class AbstractBarrier(
15+
override var loc: Vec3d,
16+
override val world: ServerWorld,
17+
override var hitBox: HitBox,
18+
override val bindControl: ServerParticleGroup,
19+
override val options: BarrierOption,
20+
) : Barrier {
21+
override var shooter: LivingEntity? = null
22+
override var direction: Vec3d = Vec3d.ZERO
23+
override var lunch: Boolean = false
24+
private var currentTick = 0
25+
private var spawnTick = 0
26+
internal var isValid = true
27+
override val valid: Boolean
28+
get() = isValid
29+
30+
/**
31+
* 当获取到hitBox有实体时,可以对实体进行过滤
32+
*/
33+
abstract fun filterHitEntity(livingEntity: LivingEntity): Boolean
34+
35+
override fun tick() {
36+
if (!lunch || !valid) {
37+
return
38+
}
39+
40+
// 判定速度
41+
if (options.enableSpeed) {
42+
loc = loc.add(direction.normalize().multiply(options.speed))
43+
options.speed += options.acceleration
44+
// 判定加速度最大值设定
45+
if (options.accelerationMaxSpeedEnabled) {
46+
options.speed = max(options.accelerationMaxSpeed, options.speed)
47+
}
48+
} else {
49+
loc = loc.add(direction)
50+
}
51+
52+
bindControl.teleportGroupTo(loc)
53+
// 判断击中
54+
if (options.maxLivingTick != -1) {
55+
if (currentTick++ > options.maxLivingTick) {
56+
hit(BarrierHitResult())
57+
return
58+
}
59+
}
60+
val blockPos = BlockPos.ofFloored(loc)
61+
val block = world.getBlockState(blockPos)
62+
val result = BarrierHitResult()
63+
if (!block.isAir) {
64+
if (block.isLiquid && !options.acrossLiquid) {
65+
result.hitBlockState = block
66+
hit(result)
67+
} else if (!options.acrossBlock) {
68+
result.hitBlockState = block
69+
hit(result)
70+
}
71+
}
72+
73+
if (spawnTick < options.noneHitBoxTick) {
74+
spawnTick++
75+
return
76+
}
77+
val collection = hitBoxEntities().filter {
78+
return@filter filterHitEntity(it)
79+
}
80+
if (collection.isNotEmpty()) {
81+
result.entities.addAll(collection)
82+
hit(result)
83+
}
84+
}
85+
86+
private fun hit(result: BarrierHitResult) {
87+
onHit(result)
88+
remove()
89+
}
90+
91+
fun remove() {
92+
bindControl.kill()
93+
isValid = false
94+
}
95+
96+
fun hitBoxEntities(): Set<LivingEntity> {
97+
val res = HashSet<LivingEntity>()
98+
res.addAll(world.getEntitiesByClass(LivingEntity::class.java, hitBox.ofBox(loc), { true }))
99+
return res
100+
}
101+
102+
fun hitBoxEntities(filter: Predicate<LivingEntity>): Set<LivingEntity> {
103+
val res = HashSet<LivingEntity>()
104+
res.addAll(world.getEntitiesByClass(LivingEntity::class.java, hitBox.ofBox(loc), filter))
105+
return res
106+
}
107+
108+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cn.coostack.barriers
2+
3+
import cn.coostack.network.particle.ServerParticleGroup
4+
import com.google.common.base.Predicate
5+
import net.minecraft.entity.LivingEntity
6+
import net.minecraft.server.world.ServerWorld
7+
import net.minecraft.util.math.Box
8+
import net.minecraft.util.math.Vec3d
9+
10+
interface Barrier {
11+
var loc: Vec3d
12+
val world: ServerWorld
13+
var hitBox: HitBox
14+
var shooter: LivingEntity?
15+
var direction: Vec3d
16+
var lunch: Boolean
17+
val valid: Boolean
18+
val options: BarrierOption
19+
20+
/**
21+
* 设置bindControl 会每tick都会设置 loc (teleport)
22+
*/
23+
val bindControl: ServerParticleGroup
24+
25+
/**
26+
* @param result 击中的目标
27+
*/
28+
fun onHit(result: BarrierHitResult)
29+
30+
31+
fun tick()
32+
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cn.coostack.barriers
2+
3+
import net.minecraft.block.Block
4+
import net.minecraft.block.BlockState
5+
import net.minecraft.entity.LivingEntity
6+
import net.minecraft.util.math.Vec3d
7+
8+
class BarrierHitResult {
9+
var hitBlockState: BlockState? = null
10+
11+
val entities = ArrayList<LivingEntity>()
12+
}

0 commit comments

Comments
 (0)