892 words
4 minutes
26 方块放置添加附魔
26 方块放置添加附魔
这里用了一个例子说说一下方块放置时候将将位置和附魔放置到了对应的数据结构中的过程,不过这里只涉及到了一个方法,除了基础的这个方法外还有很多的内容会影响方块的位置,破坏方块,这写地方都需要你注入你的存取对应的数据结构的方法.
// 指定这个类作为 Block 类的混入类,允许我们修改 Block 类的行为。
@Mixin(Block.class)
public abstract class BlockMixin extends BlockBehaviour implements ItemLike, net.neoforged.neoforge.common.extensions.IBlockExtension {
// 构造函数,初始化 BlockMixin 类并调用父类 BlockBehaviour 的构造函数。
public BlockMixin(Properties properties) {
super(properties);
}
// 在 setPlacedBy 方法执行之前插入自定义逻辑
@Inject(at = @At("HEAD"), method = "setPlacedBy")
private void init1(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack, CallbackInfo ci) {
// 调用 InjectHelper 的 onPlacedInject 方法,处理方块放置时的逻辑。
InjectHelper.onPlacedInject(level, stack, pos);
}
// 在 destroy 方法执行之前插入自定义逻辑
@Inject(at = @At("HEAD"), method = "destroy")
private void init2(LevelAccessor level, BlockPos pos, BlockState state, CallbackInfo ci) {
// 确保逻辑只在服务器端执行
if (!level.isClientSide()) {
// 如果方块位置的附魔信息不为空
if (!Objects.equals(BlockEnchantmentStorage.getEnchantmentsAtPosition(pos), new ListTag())) {
// 从附魔存储中删除方块位置的附魔信息
BlockEnchantmentStorage.removeBlockEnchantment(pos.immutable());
// 取消掉落方块的附魔
// (这部分代码被注释掉了,可以根据需要恢复)
// BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null;
// Block.dropStacks(state, (World) world, pos, blockEntity, null, ItemStack.EMPTY);
}
}
}
// 在 wasExploded 方法执行之后插入自定义逻辑
@Inject(at = @At("TAIL"), method = "wasExploded")
private void init4(Level level, BlockPos pos, Explosion explosion, CallbackInfo ci) {
// 确保逻辑只在服务器端执行
if (!level.isClientSide) {
// 如果方块位置的附魔信息不为空
if (!Objects.equals(BlockEnchantmentStorage.getEnchantmentsAtPosition(pos), new ListTag())) {
// 从附魔存储中删除方块位置的附魔信息
BlockEnchantmentStorage.removeBlockEnchantment(pos.immutable());
}
}
}
// 在 dropResources 方法执行之后插入自定义逻辑
@Inject(at = @At("TAIL"), method = "dropResources(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V")
private static void init5(BlockState state, Level level, BlockPos pos, CallbackInfo ci) {
// 确保逻辑只在服务器端执行
if (!level.isClientSide()) {
// 如果方块位置的附魔信息不为空
if (!Objects.equals(BlockEnchantmentStorage.getEnchantmentsAtPosition(pos), new ListTag())) {
// 从附魔存储中删除方块位置的附魔信息
BlockEnchantmentStorage.removeBlockEnchantment(pos.immutable());
}
}
}
}
这里也看下当拿个刷子的时候在对应的具有附魔的方块附近生成粒子效果
package com.mafuyu33.neomafishmod.mixin.enchantmentblockmixin.main;
@Mixin(Player.class)
public abstract class PlayerEntityMixin extends LivingEntity {
protected PlayerEntityMixin(EntityType<? extends LivingEntity> entityType, Level level) {
super(entityType, level);
}
@Inject(at = @At("HEAD"), method = "tick")
private void init(CallbackInfo info) {
if(this.level().isClientSide && this.isHolding(Items.BRUSH)){
// 获取玩家所在位置
BlockPos playerPos = this.blockPosition();
// 遍历玩家周围 10 格范围内的方块
for (int x = -10; x <= 10; x++) {
for (int y = -10; y <= 10; y++) {
for (int z = -10; z <= 10; z++) {
BlockPos blockPos = playerPos.offset(x, y, z);
// 检查方块是否有附魔
if (!Objects.equals(BlockEnchantmentStorage.getEnchantmentsAtPosition(blockPos), new ListTag())) {
// 在方块上创建粒子效果
// 在方块顶部创建粒子效果
this.level().addParticle(ParticleTypes.COMPOSTER,
blockPos.getX() + 0.5,
blockPos.getY() + 1.1,
blockPos.getZ() + 0.5,
0.0, 0.0, 0.0);
// 在方块底部创建粒子效果
this.level().addParticle(ParticleTypes.COMPOSTER,
blockPos.getX() + 0.5,
blockPos.getY()-0.1,
blockPos.getZ() + 0.5,
0.0, 0.0, 0.0);
// 在方块北侧创建粒子效果
this.level().addParticle(ParticleTypes.COMPOSTER,
blockPos.getX() + 0.5,
blockPos.getY() + 0.5,
blockPos.getZ()-0.1, // 在北侧中心位置
0.0, 0.0, 0.0);
// 在方块南侧创建粒子效果
this.level().addParticle(ParticleTypes.COMPOSTER,
blockPos.getX() + 0.5,
blockPos.getY() + 0.5,
blockPos.getZ()+1.1, // 在南侧中心位置
0.0, 0.0, 0.0);
// 在方块西侧创建粒子效果
this.level().addParticle(ParticleTypes.COMPOSTER,
blockPos.getX()-0.1, // 在西侧中心位置
blockPos.getY() + 0.5,
blockPos.getZ() + 0.5,
0.0, 0.0, 0.0);
// 在方块东侧创建粒子效果
this.level().addParticle(ParticleTypes.COMPOSTER,
blockPos.getX() + 1.1, // 在东侧中心位置
blockPos.getY() + 0.5,
blockPos.getZ() + 0.5,
0.0, 0.0, 0.0);
}
}
}
}
}
}
}