@Override public Prefab deserializePrefab(EntityData.Prefab prefabData, String packageContext) { String name = prefabData.getName(); if (!prefabData.getName().startsWith(packageContext + ":")) { int existingPackageName = name.lastIndexOf(':'); if (existingPackageName != -1) { name = name.substring(existingPackageName + 1); } name = packageContext + ":" + name; } Prefab prefab = prefabManager.createPrefab(name); for (String parentName : prefabData.getParentNameList()) { int packageSplit = parentName.indexOf(':'); if (packageSplit == -1) { parentName = packageContext + ":" + parentName; } Prefab parent = prefabManager.getPrefab(parentName); if (parent == null) { logger.log(Level.SEVERE, "Missing parent prefab (need to fix parent serialization)"); } else { prefab.addParent(parent); } } for (EntityData.Component componentData : prefabData.getComponentList()) { Component component = deserializeComponent(componentData); if (component != null) { prefab.setComponent(component); } } return prefab; }
@Override public EntityRef deserializeEntity(EntityData.Entity entityData) { EntityRef entity = entityManager.createEntityRefWithId(entityData.getId()); if (entityData.hasParentPrefab() && !entityData.getParentPrefab().isEmpty() && prefabManager.exists(entityData.getParentPrefab())) { Prefab prefab = prefabManager.getPrefab(entityData.getParentPrefab()); for (Component component : prefab.listComponents()) { String componentName = ComponentUtil.getComponentClassName(component.getClass()); if (!containsIgnoreCase(componentName, entityData.getRemovedComponentList())) { entity.addComponent(componentLibrary.copy(component)); } } entity.addComponent(new EntityInfoComponent(entityData.getParentPrefab())); } for (EntityData.Component componentData : entityData.getComponentList()) { Class<? extends Component> componentClass = getComponentClass(componentData); if (componentClass == null) continue; if (!entity.hasComponent(componentClass)) { entity.addComponent(deserializeComponent(componentData)); } else { deserializeComponentOnto(entity.getComponent(componentClass), componentData); } } return entity; }
/** * Ugly way to retrieve a name from a prefab * * @return a ":" seperated string, with name and flavor text. */ public static String getName() { PrefabManager prefMan = CoreRegistry.get(PrefabManager.class); Prefab prefab = prefMan.getPrefab("miniion:nameslist"); EntityRef namelist = CoreRegistry.get(EntityManager.class).create(prefab); namelist.hasComponent(namesComponent.class); namesComponent namecomp = namelist.getComponent(namesComponent.class); Random rand = new Random(); return namecomp.namelist.get(rand.nextInt(namecomp.namelist.size())); }
@Override public EntityData.Entity serializeEntity(EntityRef entityRef) { EntityInfoComponent entityInfo = entityRef.getComponent(EntityInfoComponent.class); if (entityInfo != null) { if (entityInfo.parentPrefab != null && prefabManager.exists(entityInfo.parentPrefab)) { return serializeEntityDelta(entityRef, prefabManager.getPrefab(entityInfo.parentPrefab)); } } return serializeEntityFull(entityRef); }
@Override public void deserializeWorld(EntityData.World world) { entityManager.setNextId(world.getNextEntityId()); for (Integer deadId : world.getFreedEntityIdList()) { entityManager.getFreedIds().add(deadId); } for (EntityData.Prefab prefabData : world.getPrefabList()) { if (!prefabManager.exists(prefabData.getName())) { deserializePrefab(prefabData); } } for (int index = 0; index < world.getComponentClassCount(); ++index) { ComponentMetadata componentMetadata = componentLibrary.getMetadata(world.getComponentClass(index)); if (componentMetadata != null) { componentIdTable.put(index, componentMetadata.getType()); } } for (EntityData.Entity entityData : world.getEntityList()) { deserializeEntity(entityData); } }
@Override public Prefab deserializePrefab(EntityData.Prefab prefabData) { Prefab prefab = prefabManager.createPrefab(prefabData.getName()); for (String parentName : prefabData.getParentNameList()) { Prefab parent = prefabManager.getPrefab(parentName); if (parent == null) { logger.log(Level.SEVERE, "Missing parent prefab (need to fix parent serialization)"); } else { prefab.addParent(parent); } } for (EntityData.Component componentData : prefabData.getComponentList()) { Component component = deserializeComponent(componentData); if (component != null) { prefab.setComponent(component); } } return prefab; }
@Override public EntityData.World serializeWorld() { final EntityData.World.Builder world = EntityData.World.newBuilder(); writeIdInfo(world); if (isUsingLookupTables()) { writeComponentTypeTable(world); } for (Prefab prefab : prefabManager.listPrefabs()) { world.addPrefab(serializePrefab(prefab)); } for (EntityRef entity : entityManager.iteratorEntities()) { world.addEntity(serializeEntity(entity)); } return world.build(); }