private void serializeComponentFull( Component component, boolean ignoreIfNoFields, FieldSerializeCheck<Component> fieldCheck, EntityData.PackedEntity.Builder entityData, ByteString.Output entityFieldIds, ByteString.Output componentFieldCounts, boolean componentInitial) { ComponentMetadata<?> componentMetadata = componentLibrary.getMetadata(component.getClass()); if (componentMetadata == null) { logger.error("Unregistered component type: {}", component.getClass()); return; } Serializer serializer = typeSerializationLibrary.getSerializerFor(componentMetadata); byte fieldCount = 0; for (ReplicatedFieldMetadata field : componentMetadata.getFields()) { if (fieldCheck.shouldSerializeField(field, component, componentInitial)) { PersistedData fieldValue = serializer.serialize(field, component, serializationContext); if (!fieldValue.isNull()) { entityFieldIds.write(field.getId()); entityData.addFieldValue(((ProtobufPersistedData) fieldValue).getValue()); fieldCount++; } } } if (fieldCount != 0 || !ignoreIfNoFields) { entityData.addComponentId(idTable.get(component.getClass())); componentFieldCounts.write(fieldCount); } }
private void serializeComponentDelta( Component oldComponent, Component newComponent, FieldSerializeCheck<Component> fieldCheck, EntityData.PackedEntity.Builder entityData, ByteString.Output entityFieldIds, ByteString.Output componentFieldCounts, boolean componentInitial) { ComponentMetadata<?> componentMetadata = componentLibrary.getMetadata(oldComponent.getClass()); if (componentMetadata == null) { logger.error("Unregistered component type: {}", oldComponent.getClass()); return; } byte fieldCount = 0; Serializer serializer = typeSerializationLibrary.getSerializerFor(componentMetadata); for (ReplicatedFieldMetadata field : componentMetadata.getFields()) { if (fieldCheck.shouldSerializeField(field, newComponent, componentInitial)) { Object oldValue = field.getValue(oldComponent); Object newValue = field.getValue(newComponent); if (!Objects.equal(oldValue, newValue)) { PersistedData data = serializer.serializeValue(field, newValue, serializationContext); if (!data.isNull()) { entityFieldIds.write(field.getId()); entityData.addFieldValue(((ProtobufPersistedData) data).getValue()); fieldCount++; } else { logger.error( "Exception serializing component type: {}, field: {} - returned null", componentMetadata, field); } } } } if (fieldCount > 0) { entityData.addComponentId(idTable.get(newComponent.getClass())); componentFieldCounts.write(fieldCount); } }
public void deserializeOnto( MutableComponentContainer entity, EntityData.PackedEntity entityData, FieldSerializeCheck<Component> fieldCheck) { int fieldPos = 0; for (int componentIndex = 0; componentIndex < entityData.getComponentIdCount(); ++componentIndex) { Class<? extends Component> componentClass = idTable.inverse().get((Integer) entityData.getComponentId(componentIndex)); ComponentMetadata<?> metadata = componentLibrary.getMetadata(componentClass); if (metadata == null) { logger.warn("Skipping unknown component {}", entityData.getComponentId(componentIndex)); fieldPos += UnsignedBytes.toInt(entityData.getComponentFieldCounts().byteAt(componentIndex)); continue; } if (!componentSerializeCheck.serialize(metadata)) { fieldPos += UnsignedBytes.toInt(entityData.getComponentFieldCounts().byteAt(componentIndex)); continue; } Component component = entity.getComponent(metadata.getType()); boolean createdNewComponent = false; if (component == null) { createdNewComponent = true; component = metadata.newInstance(); } Serializer serializer = typeSerializationLibrary.getSerializerFor(metadata); for (int fieldIndex = 0; fieldIndex < UnsignedBytes.toInt(entityData.getComponentFieldCounts().byteAt(componentIndex)); ++fieldIndex) { byte fieldId = entityData.getFieldIds().byteAt(fieldPos); ReplicatedFieldMetadata fieldMetadata = metadata.getField(fieldId); if (fieldMetadata != null && fieldCheck.shouldDeserialize(metadata, fieldMetadata)) { logger.trace( "Deserializing field {} of component {} as value {}", fieldMetadata, metadata, entityData.getFieldValue(fieldPos)); serializer.deserializeOnto( component, fieldMetadata, new ProtobufPersistedData(entityData.getFieldValue(fieldPos)), deserializationContext); } fieldPos++; } if (createdNewComponent) { entity.addComponent(component); } else { entity.saveComponent(component); } } for (int componentId : entityData.getRemovedComponentList()) { Class<? extends Component> componentClass = idTable.inverse().get(componentId); ComponentMetadata<?> metadata = componentLibrary.getMetadata(componentClass); if (componentSerializeCheck.serialize(metadata)) { entity.removeComponent(metadata.getType()); } } }