Мой код здесь:
Код: Выделить всё
@Mod.EventBusSubscriber(modid = DoorLockPadMod.MODID)
public class EventHandlers {
@SubscribeEvent
public static void onBlockDestroyed(@NotNull BlockEvent.BreakEvent event) {
Player playerEntity = event.getPlayer();
Level level = playerEntity.getLevel();
BlockPos blockPos = event.getPos();
BlockState blockState = level.getBlockState(blockPos);
FunctionUtils.setLevel(level);
if (blockState.getBlock() instanceof DoorBlock) {
BlockPos padBlockPos = FunctionUtils.checkIfAssignedDoor(blockPos, null);
if (padBlockPos != null) {
PadBlockEntity padBlockEntity = (PadBlockEntity) level.getBlockEntity(padBlockPos);
BlockState padBlockState = level.getBlockState(padBlockPos);
if (padBlockEntity != null && (!padBlockEntity.isDoorLocked() || playerEntity.isCreative())) {
padBlockEntity.setRelatedDoor(null);
padBlockEntity.setPassword(null);
level.sendBlockUpdated(padBlockPos, padBlockState, padBlockState, 2);
FunctionUtils.removeDoorAssignedPadBlockByPadBlock(padBlockPos);
} else event.setCanceled(true);
}
} else if (blockState.getBlock() instanceof PadBlock) {
PadBlockEntity padBlockEntity = (PadBlockEntity) level.getBlockEntity(blockPos);
if (padBlockEntity != null && (!padBlockEntity.isDoorLocked() || playerEntity.isCreative())) {
FunctionUtils.removeDoorAssignedPadBlockByPadBlock(blockPos);
} else if (padBlockEntity != null) event.setCanceled(true);
}
}
}
Код класса PadBlockEntity:
Код: Выделить всё
public class PadBlockEntity extends BlockEntity {
private BlockPos pos;
private BlockPos supportBlockPos;
private String password;
private boolean isDoorLocked;
private String relatedDoor;
private int ticks;
public PadBlockEntity(BlockPos pos, BlockState state) {
super(DoorLockPadMod.PAD_BLOCK_ENTITY.get(), pos, state);
this.pos = pos;
this.isDoorLocked = true;
this.ticks = 0;
}
public BlockPos getPos() {
return pos;
}
public void setPos(BlockPos pos) {
this.pos = pos;
}
public BlockPos getSupportBlockPos() {
return supportBlockPos;
}
public void setSupportBlockPos(BlockPos supportBlockpos) {
this.supportBlockPos = supportBlockpos;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isDoorLocked() {
return isDoorLocked;
}
public void setDoorLocked(boolean doorLocked) {
isDoorLocked = doorLocked;
}
public String getRelatedDoor() {
return relatedDoor;
}
public void setRelatedDoor(String relatedDoor) {
this.relatedDoor = relatedDoor;
}
@Override
protected void saveAdditional(CompoundTag nbt) {
super.saveAdditional(nbt);
if (this.getPassword() != null)
nbt.putString("password", this.getPassword());
nbt.putLong("pos", this.getPos().asLong());
nbt.putLong("supportBlockPos", this.getSupportBlockPos().asLong());
if (this.getRelatedDoor() != null)
nbt.putString("relatedDoor", this.getRelatedDoor());
}
@Override
public void load(@NotNull CompoundTag nbt) {
super.load(nbt);
this.password = nbt.getString("password");
this.pos = BlockPos.of(nbt.getLong("pos"));
this.supportBlockPos = BlockPos.of(nbt.getLong("supportBlockPos"));
this.relatedDoor = nbt.getString("relatedDoor");
if (StringUtils.isEmpty(this.relatedDoor)) {
this.isDoorLocked = true;
this.ticks = 0;
}
}
@NotNull
@Override
public CompoundTag getUpdateTag() {
super.getUpdateTag();
return saveWithoutMetadata();
}
@Override
public void handleUpdateTag(CompoundTag nbt) {
super.handleUpdateTag(nbt);
this.load(nbt);
}
@Override
public Packet getUpdatePacket() {
return ClientboundBlockEntityDataPacket.create(this);
}
public static void tick(Level level, BlockPos blockPos, BlockState state,
T blockEntity) {
if (level.isClientSide && blockEntity instanceof PadBlockEntity padBlockEntity) {
if (!padBlockEntity.isDoorLocked()) {
padBlockEntity.ticks++;
}
if (padBlockEntity.ticks == 200) {
padBlockEntity.setDoorLocked(true);
FunctionUtils.sendToServer(padBlockEntity);
padBlockEntity.ticks = 0;
}
}
}
}
Я пробовал использовать sendBlockUpdate, но, по моему мнению, блок фактически не уничтожается до завершения события, поэтому это влияет на объект блока, который еще не был изменен. Я попытался создать пакет для синхронизации сервера и клиента, но по той же причине не думаю, что это сработает. На протяжении всего метода блок еще не уничтожается и не вставляется повторно, а сущность блока остается прежней.
Подробнее здесь: https://stackoverflow.com/questions/772 ... reak-event
Мобильная версия