Optimize placement for acceleration and deflection rings 优化加速环与偏转环的放置方式#3756
Optimize placement for acceleration and deflection rings 优化加速环与偏转环的放置方式#3756YocyCraft wants to merge 4 commits into
Conversation
There was a problem hiding this comment.
代码审查结果
1. 重复代码问题
文件: AccelerationRingBlock.java 和 DeflectionRingBlock.java
问题: 两个类中 getShape 方法添加了完全相同的逻辑:
if (context.isHoldingItem(state.getBlock().asItem())) {
return Shapes.block();
}这违反了 DRY(Don't Repeat Yourself)原则。
建议: 考虑创建一个抽象基类或工具方法,将这段逻辑提取出来复用。
2. 性能考量
文件: ParticleEngineMixin.java
问题: addBlockHitEffects 方法在每次粒子效果触发时都会调用 getShape(),这可能会影响性能,特别是在大量粒子效果同时触发的情况下。
建议:
- 考虑缓存形状结果
- 或者使用更轻量级的检查方式,如
state.isAir()或检查方块材质
3. 逻辑完整性
文件: ParticleEngineMixin.java
问题: 当前逻辑只检查形状是否为空,但可能存在形状不为空但实际不可见的情况(如透明方块)。
建议: 考虑是否需要添加额外的可见性检查,例如:
if (this.level.getBlockState(pos).getShape(this.level, pos).isEmpty()
|| !this.level.getBlockState(pos).canOcclude()) {
ci.cancel();
}4. 配置文件变更
文件: anvilcraft.mixins.json
问题:
accessor.EntityAccessor的顺序被移动了(从第65行移到第63行)- 新增了
ParticleEngineMixin条目
建议:
- 确认
EntityAccessor的顺序移动是否是必要的,如果不是,建议保持原有顺序以减少不必要的变更 - 确保
ParticleEngineMixin的添加不会与其他 Mixin 产生冲突
5. 代码风格
文件: ParticleEngineMixin.java
问题: 方法名 damage 与 addBlockHitEffects 的语义不匹配,容易引起混淆。
建议: 将方法名改为更具描述性的名称,如 cancelBlockHitEffectsOnEmptyShape 或 onAddBlockHitEffects。
There was a problem hiding this comment.
代码审查结果
1. 逻辑问题:getShape 方法中的条件判断
文件: AccelerationRingBlock.java 和 DeflectionRingBlock.java
问题:
- 使用
context.isHoldingItem(state.getBlock().asItem())来判断玩家是否持有该方块物品,但CollisionContext可能为EntityCollisionContext或EmptyCollisionContext,其中isHoldingItem方法可能返回false或抛出异常。 - 当玩家手持其他物品时,形状仍为原始形状(可能为空),导致无法交互。
建议:
// 更安全的做法:检查 context 是否为 EntityCollisionContext
if (context instanceof EntityCollisionContext entityContext) {
Player player = entityContext.getPlayer();
if (player != null && player.getMainHandItem().is(state.getBlock().asItem())) {
return Shapes.block();
}
}2. 性能问题:重复调用 getShape
文件: ParticleEngineMixin.java
问题:
- 在
cancelHitEffectForEmptyBlock方法中,getShape会被调用两次(一次在 mixin 中,一次在原始方法中),造成不必要的性能开销。
建议:
- 考虑缓存形状结果或使用更轻量级的检查方式。
3. 代码风格:Mixin 注释格式
文件: ParticleEngineMixin.java
问题:
- Javadoc 注释使用了
/**但缺少@param和@return标签,且注释内容过于冗长。
建议:
/**
* 取消对空碰撞箱方块的特效渲染,避免 VoxelShape.bounds() 抛出异常。
*/
@Inject(method = "addBlockHitEffects", at = @At("HEAD"), cancellable = true)
private void cancelHitEffectForEmptyBlock(BlockPos pos, BlockHitResult target, CallbackInfo ci) {
// ...
}4. 潜在问题:mixins.json 中的顺序变更
文件: anvilcraft.mixins.json
问题:
- 移动了
accessor.EntityAccessor的位置,但没有明显理由。这可能导致与其他 mixin 的加载顺序依赖问题。
建议:
- 除非有特定原因,否则保持原有顺序。如果必须移动,请在提交信息中说明原因。
5. 安全考虑:空形状检查
文件: ParticleEngineMixin.java
问题:
- 使用
isEmpty()检查形状,但某些方块可能返回非空但无碰撞的形状(如Shapes.empty()的变体),导致仍会触发异常。
建议:
// 更安全的检查方式
VoxelShape shape = this.level.getBlockState(pos).getShape(this.level, pos);
if (shape.isEmpty() || shape.bounds().isEmpty()) {
ci.cancel();
}总结
主要问题集中在 getShape 方法的条件判断逻辑和性能优化上。建议优先修复 AccelerationRingBlock 和 DeflectionRingBlock 中的 context 类型检查,以确保在不同上下文中都能正常工作。
|
建议两个方块对对方的放置也加一下 |
Uh oh!
There was an error while loading. Please reload this page.