private void updateBlockEntity(EntityRef blockEntity, Vector3i pos, Block oldType, Block type, boolean forceEntityUpdate, Set<Class<? extends Component>> retainComponents) { if (type.isKeepActive()) { temporaryBlockEntities.remove(blockEntity); } else if (oldType.isKeepActive() && isTemporaryBlock(blockEntity, type)) { temporaryBlockEntities.add(blockEntity); } if (forceEntityUpdate || !(Objects.equal(oldType.getBlockFamily(), type.getBlockFamily()) && Objects.equal(oldType.getPrefab(), type.getPrefab()))) { updateBlockEntityComponents(blockEntity, oldType, type, retainComponents); } EntityRef regionEntity = blockRegionLookup.get(pos); if (regionEntity != null) { regionEntity.send(new OnChangedBlock(pos, type, oldType)); } blockEntity.send(new OnChangedBlock(new Vector3i(pos), type, oldType)); }
private void updateBlock(Block block) { Optional<Prefab> prefab = block.getPrefab(); boolean keepActive = block.isKeepActive(); boolean requiresLifecycleEvents = false; if (prefab.isPresent()) { for (Component comp : prefab.get().iterateComponents()) { ComponentMetadata<?> metadata = entityManager.getComponentLibrary().getMetadata(comp.getClass()); if (metadata.isForceBlockActive()) { keepActive = true; break; } if (metadata.isBlockLifecycleEventsRequired()) { requiresLifecycleEvents = true; } } } block.setKeepActive(keepActive); block.setLifecycleEventsRequired(requiresLifecycleEvents && !keepActive); } }
private boolean isTemporaryBlock(ComponentContainer entity, Block block, Class<? extends Component> ignoreComponent) { if (block.isKeepActive()) { return false; } for (ComponentMetadata<?> metadata : entityManager.getComponentLibrary().iterateComponentMetadata()) { if (metadata.isForceBlockActive() && ignoreComponent != metadata.getType()) { if (entity.hasComponent(metadata.getType())) { return false; } } } return true; }