private void cleanUpTemporaryEntity(EntityRef entity) {
    Prefab prefab = entity.getParentPrefab();

    for (Component comp : entity.iterateComponents()) {
      if (!COMMON_BLOCK_COMPONENTS.contains(comp.getClass())
          && (prefab == null || !prefab.hasComponent(comp.getClass()))) {
        entity.removeComponent(comp.getClass());
      }
    }
    entity.removeComponent(NetworkComponent.class);

    if (prefab != null) {
      for (Component comp : prefab.iterateComponents()) {
        Component currentComp = entity.getComponent(comp.getClass());
        if (currentComp == null) {
          entity.addComponent(entityManager.getComponentLibrary().copy(comp));
        } else {
          ComponentMetadata<?> metadata =
              entityManager.getComponentLibrary().getMetadata(comp.getClass());
          boolean changed = false;
          for (FieldMetadata field : metadata.getFields()) {
            Object expected = field.getValue(comp);
            if (!Objects.equal(expected, field.getValue(currentComp))) {
              field.setValue(currentComp, expected);
              changed = true;
            }
          }
          if (changed) {
            entity.saveComponent(currentComp);
          }
        }
      }
    }
    entityManager.destroyEntityWithoutEvents(entity);
  }
 @Test
 public void testBlockEntityPrefabCorrectlyRemovedOnChangeToBlockWithNoPrefab() {
   worldProvider.setBlock(Vector3i.zero(), blockWithString);
   EntityRef entity = worldProvider.getBlockEntityAt(Vector3i.zero());
   worldProvider.setBlock(Vector3i.zero(), plainBlock);
   assertEquals(null, entity.getParentPrefab());
 }
 @Test
 public void testBlockEntityPrefabCorrectlyAddedOnChangeToBlockWithPrefab() {
   worldProvider.setBlock(Vector3i.zero(), plainBlock);
   EntityRef entity = worldProvider.getBlockEntityAt(Vector3i.zero());
   worldProvider.setBlock(Vector3i.zero(), blockWithString);
   assertEquals(blockWithString.getPrefab(), entity.getParentPrefab().getURI().toSimpleString());
 }
 public EntityData.PackedEntity.Builder serialize(
     EntityRef entity, boolean deltaAgainstPrefab, FieldSerializeCheck<Component> fieldCheck) {
   Prefab prefab = entity.getParentPrefab();
   if (prefab != null && deltaAgainstPrefab) {
     return serializeEntityDelta(entity, prefab, fieldCheck);
   } else {
     return serializeEntityFull(entity, fieldCheck);
   }
 }