Search in sources :

Example 31 with Component

use of org.terasology.gestalt.entitysystem.component.Component in project Terasology by MovingBlocks.

the class PojoEntityManager method addComponent.

/**
 * Adds (or replaces) a component to an entity
 *
 * @param entityId
 * @param component
 * @param <T>
 * @return The added component
 */
@Override
public <T extends Component> T addComponent(long entityId, T component) {
    Preconditions.checkNotNull(component);
    Optional<Component> oldComponent = getPool(entityId).map(pool -> pool.getComponentStore().put(entityId, component));
    // notify internal users first to get the unobstructed views on the entity as it is at this moment.
    if (!oldComponent.isPresent()) {
        notifyComponentAdded(getEntity(entityId), component.getClass());
    } else {
        logger.error("Adding a component ({}) over an existing component for entity {}", component.getClass(), entityId);
        notifyComponentChanged(getEntity(entityId), component.getClass());
    }
    // Note: systems are free to remove the component that was just added, which might cause some trouble here...
    if (eventSystem != null) {
        EntityRef entityRef = getEntity(entityId);
        if (!oldComponent.isPresent()) {
            eventSystem.send(entityRef, OnAddedComponent.newInstance(), component);
            eventSystem.send(entityRef, OnActivatedComponent.newInstance(), component);
        } else {
            eventSystem.send(entityRef, OnChangedComponent.newInstance(), component);
        }
    }
    return component;
}
Also used : Component(org.terasology.gestalt.entitysystem.component.Component) BeforeDeactivateComponent(org.terasology.engine.entitySystem.entity.lifecycleEvents.BeforeDeactivateComponent) SectorSimulationComponent(org.terasology.engine.entitySystem.sectors.SectorSimulationComponent) BeforeRemoveComponent(org.terasology.engine.entitySystem.entity.lifecycleEvents.BeforeRemoveComponent) OnAddedComponent(org.terasology.engine.entitySystem.entity.lifecycleEvents.OnAddedComponent) OnActivatedComponent(org.terasology.engine.entitySystem.entity.lifecycleEvents.OnActivatedComponent) OnChangedComponent(org.terasology.engine.entitySystem.entity.lifecycleEvents.OnChangedComponent) EntityRef(org.terasology.engine.entitySystem.entity.EntityRef)

Example 32 with Component

use of org.terasology.gestalt.entitysystem.component.Component in project Terasology by MovingBlocks.

the class EventSystemImpl method send.

@Override
public void send(EntityRef entity, Event event, Component component) {
    if (Thread.currentThread() != mainThread) {
        pendingEvents.offer(new PendingEvent(entity, event, component));
    } else {
        SetMultimap<Class<? extends Component>, EventHandlerInfo> handlers = componentSpecificHandlers.get(event.getClass());
        if (handlers != null) {
            List<EventHandlerInfo> eventHandlers = Lists.newArrayList(handlers.get(component.getClass()));
            eventHandlers.sort(priorityComparator);
            for (EventHandlerInfo eventHandler : eventHandlers) {
                if (eventHandler.isValidFor(entity)) {
                    eventHandler.invoke(entity, event);
                }
            }
        }
    }
}
Also used : PendingEvent(org.terasology.engine.entitySystem.event.PendingEvent) Component(org.terasology.gestalt.entitysystem.component.Component)

Example 33 with Component

use of org.terasology.gestalt.entitysystem.component.Component in project Terasology by MovingBlocks.

the class Config method setModuleConfigs.

/**
 * @param generatorUri the generator Uri
 * @param configs      the new config params for the world generator
 */
public void setModuleConfigs(SimpleUri generatorUri, Map<String, Component> configs) {
    Gson gson = createGsonForModules();
    Map<String, JsonElement> map = Maps.newHashMap();
    for (Map.Entry<String, Component> entry : configs.entrySet()) {
        JsonElement json = gson.toJsonTree(entry.getValue());
        map.put(entry.getKey(), json);
    }
    config.getModuleConfigs().put(generatorUri, map);
}
Also used : JsonElement(com.google.gson.JsonElement) Gson(com.google.gson.Gson) Component(org.terasology.gestalt.entitysystem.component.Component) Map(java.util.Map)

Example 34 with Component

use of org.terasology.gestalt.entitysystem.component.Component in project Terasology by MovingBlocks.

the class CoreCommands method dumpEntities.

/**
 * Writes out information on entities having specific components to a text file for debugging
 * If no component names provided - writes out information on all entities
 *
 * @param componentNames string contains one or several component names, if more then one name
 *                       provided - they must be braced with double quotes and all names separated
 *                       by space
 * @return String containing information about number of entities saved
 * @throws IOException thrown when error with saving file occures
 */
@Command(shortDescription = "Writes out information on all entities to a JSON file for debugging", helpText = "Writes entity information out into a file named \"<timestamp>-entityDump.json\"." + " Supports list of component names, which will be used to only save entities that contains" + " one or more of those components. Names should be separated by spaces.")
public String dumpEntities(@CommandParam(value = "componentNames", required = false) String... componentNames) throws IOException {
    int savedEntityCount;
    EngineEntityManager engineEntityManager = (EngineEntityManager) entityManager;
    PrefabSerializer prefabSerializer = new PrefabSerializer(engineEntityManager.getComponentLibrary(), engineEntityManager.getTypeSerializerLibrary());
    WorldDumper worldDumper = new WorldDumper(engineEntityManager, prefabSerializer);
    Path outFile = PathManager.getInstance().getHomePath().resolve(Instant.now() + "-entityDump.json");
    if (componentNames.length == 0) {
        savedEntityCount = worldDumper.save(outFile);
    } else {
        List<Class<? extends Component>> filterComponents = Arrays.stream(componentNames).map(// Trim off whitespace
        String::trim).filter(// Remove empty strings
        o -> !o.isEmpty()).map(// All component class names end with "component"
        o -> o.toLowerCase().endsWith("component") ? o : o + "component").map(o -> Streams.stream(moduleManager.getEnvironment().getSubtypesOf(Component.class)).filter(e -> e.getSimpleName().equalsIgnoreCase(o)).findFirst()).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
        if (!filterComponents.isEmpty()) {
            savedEntityCount = worldDumper.save(outFile, filterComponents);
        } else {
            return "Could not find components matching given names";
        }
    }
    return "Number of entities saved: " + savedEntityCount;
}
Also used : EngineEntityManager(org.terasology.engine.entitySystem.entity.internal.EngineEntityManager) Path(java.nio.file.Path) DropItemEvent(org.terasology.engine.logic.inventory.events.DropItemEvent) Server(org.terasology.engine.network.Server) Arrays(java.util.Arrays) Component(org.terasology.gestalt.entitysystem.component.Component) In(org.terasology.engine.registry.In) SystemConfig(org.terasology.engine.config.SystemConfig) Sender(org.terasology.engine.logic.console.commandSystem.annotations.Sender) Console(org.terasology.engine.logic.console.Console) SkinSuggester(org.terasology.engine.logic.console.suggesters.SkinSuggester) DisplayDevice(org.terasology.engine.core.subsystem.DisplayDevice) NUIEditorScreen(org.terasology.engine.rendering.nui.editor.layers.NUIEditorScreen) Locale(java.util.Locale) BlockUri(org.terasology.engine.world.block.BlockUri) FontColor(org.terasology.nui.FontColor) Vector3f(org.joml.Vector3f) TranslationProject(org.terasology.engine.i18n.TranslationProject) Path(java.nio.file.Path) StateLoading(org.terasology.engine.core.modes.StateLoading) Command(org.terasology.engine.logic.console.commandSystem.annotations.Command) TranslationSystem(org.terasology.engine.i18n.TranslationSystem) ConsoleCommand(org.terasology.engine.logic.console.commandSystem.ConsoleCommand) CommandParam(org.terasology.engine.logic.console.commandSystem.annotations.CommandParam) ConsoleColors(org.terasology.engine.logic.console.ConsoleColors) GameEngine(org.terasology.engine.core.GameEngine) CommandNameSuggester(org.terasology.engine.logic.console.suggesters.CommandNameSuggester) WaitPopup(org.terasology.engine.rendering.nui.layers.mainMenu.WaitPopup) Set(java.util.Set) StateMainMenu(org.terasology.engine.core.modes.StateMainMenu) NUISkinEditorSystem(org.terasology.engine.rendering.nui.editor.systems.NUISkinEditorSystem) Streams(com.google.common.collect.Streams) BlockFamilyDefinition(org.terasology.engine.world.block.loader.BlockFamilyDefinition) Instant(java.time.Instant) UISkinAsset(org.terasology.nui.skin.UISkinAsset) Collectors(java.util.stream.Collectors) Direction(org.terasology.engine.math.Direction) NUIManager(org.terasology.engine.rendering.nui.NUIManager) List(java.util.List) EntityRef(org.terasology.engine.entitySystem.entity.EntityRef) RegisterSystem(org.terasology.engine.entitySystem.systems.RegisterSystem) NUISkinEditorScreen(org.terasology.engine.rendering.nui.editor.layers.NUISkinEditorScreen) ScreenSuggester(org.terasology.engine.logic.console.suggesters.ScreenSuggester) Optional(java.util.Optional) Name(org.terasology.gestalt.naming.Name) TerasologyConstants(org.terasology.engine.core.TerasologyConstants) UIElement(org.terasology.nui.asset.UIElement) ModuleManager(org.terasology.engine.core.module.ModuleManager) EngineEntityManager(org.terasology.engine.entitySystem.entity.internal.EngineEntityManager) NetworkMode(org.terasology.engine.network.NetworkMode) Callable(java.util.concurrent.Callable) BlockItemFactory(org.terasology.engine.world.block.items.BlockItemFactory) ArrayList(java.util.ArrayList) WorldDumper(org.terasology.engine.persistence.WorldDumper) ResourceUrn(org.terasology.gestalt.assets.ResourceUrn) Time(org.terasology.engine.core.Time) StreamSupport(java.util.stream.StreamSupport) AssetManager(org.terasology.gestalt.assets.management.AssetManager) PingService(org.terasology.engine.network.PingService) MessagePopup(org.terasology.engine.rendering.nui.layers.mainMenu.MessagePopup) Assets(org.terasology.engine.utilities.Assets) BlockFamily(org.terasology.engine.world.block.family.BlockFamily) PermissionManager(org.terasology.engine.logic.permission.PermissionManager) NUIEditorSystem(org.terasology.engine.rendering.nui.editor.systems.NUIEditorSystem) LocationComponent(org.terasology.engine.logic.location.LocationComponent) ClientComponent(org.terasology.engine.network.ClientComponent) EntityManager(org.terasology.engine.entitySystem.entity.EntityManager) PrefabManager(org.terasology.engine.entitySystem.prefab.PrefabManager) IOException(java.io.IOException) Prefab(org.terasology.engine.entitySystem.prefab.Prefab) UnknownHostException(java.net.UnknownHostException) BaseComponentSystem(org.terasology.engine.entitySystem.systems.BaseComponentSystem) Ordering(com.google.common.collect.Ordering) BlockManager(org.terasology.engine.world.block.BlockManager) PrefabSerializer(org.terasology.engine.persistence.serializers.PrefabSerializer) JoinStatus(org.terasology.engine.network.JoinStatus) NetworkSystem(org.terasology.engine.network.NetworkSystem) PathManager(org.terasology.engine.core.PathManager) Optional(java.util.Optional) WorldDumper(org.terasology.engine.persistence.WorldDumper) Component(org.terasology.gestalt.entitysystem.component.Component) LocationComponent(org.terasology.engine.logic.location.LocationComponent) ClientComponent(org.terasology.engine.network.ClientComponent) PrefabSerializer(org.terasology.engine.persistence.serializers.PrefabSerializer) Command(org.terasology.engine.logic.console.commandSystem.annotations.Command) ConsoleCommand(org.terasology.engine.logic.console.commandSystem.ConsoleCommand)

Example 35 with Component

use of org.terasology.gestalt.entitysystem.component.Component in project Terasology by MovingBlocks.

the class ThirdPersonRemoteClientSystem method linkHeldItemLocationForRemotePlayer.

/**
 * Changes held item entity.
 * <p>
 * Detaches old held item and removes its components. Adds components to new held item and attaches it to the mount
 * point entity.
 */
private void linkHeldItemLocationForRemotePlayer(EntityRef newItem, EntityRef player) {
    if (relatesToLocalPlayer(player)) {
        logger.debug("linkHeldItemLocationForRemotePlayer called with an entity that relates to the local player," + " ignoring{}", player);
        return;
    }
    // Find out if there is a current held item that maps to this player
    EntityRef currentHeldItem = EntityRef.NULL;
    for (EntityRef heldItemCandidate : entityManager.getEntitiesWith(ItemIsRemotelyHeldComponent.class)) {
        EntityRef remotePlayerCandidate = heldItemCandidate.getComponent(ItemIsRemotelyHeldComponent.class).remotePlayer;
        logger.debug("For held item candidate {} got its player candidate as {}", heldItemCandidate, remotePlayerCandidate);
        if (remotePlayerCandidate.equals(player)) {
            logger.debug("Thinking we found a match with player {} so counting this held item as relevant for " + "processing", player);
            currentHeldItem = heldItemCandidate;
            // need to remove the old item
            if (newItem.equals(EntityRef.NULL)) {
                logger.debug("Found an existing held item but the new request was to no longer hold anything so " + "destroying {}", currentHeldItem);
                currentHeldItem.destroy();
                return;
            }
            break;
        }
    }
    // In the case of an actual change of item other than an empty hand we need to hook up a new held item entity
    if (newItem != null && !newItem.equals(EntityRef.NULL) && !newItem.equals(currentHeldItem)) {
        RemotePersonHeldItemMountPointComponent mountPointComponent = player.getComponent(RemotePersonHeldItemMountPointComponent.class);
        if (mountPointComponent != null) {
            // currentHeldItem is at this point the old item
            if (currentHeldItem != EntityRef.NULL) {
                currentHeldItem.destroy();
            }
            currentHeldItem = entityManager.create();
            logger.debug("linkHeldItemLocationForRemotePlayer is now creating a new held item {}", currentHeldItem);
            // add the visually relevant components
            for (Component component : newItem.iterateComponents()) {
                if (component instanceof VisualComponent && !(component instanceof FirstPersonHeldItemTransformComponent)) {
                    currentHeldItem.addComponent(component);
                }
            }
            // ensure world location is set
            currentHeldItem.addComponent(new LocationComponent());
            // Map this held item to the player it is held by
            ItemIsRemotelyHeldComponent itemIsRemotelyHeldComponent = new ItemIsRemotelyHeldComponent();
            itemIsRemotelyHeldComponent.remotePlayer = player;
            currentHeldItem.addComponent(itemIsRemotelyHeldComponent);
            RemotePersonHeldItemTransformComponent heldItemTransformComponent = currentHeldItem.getComponent(RemotePersonHeldItemTransformComponent.class);
            if (heldItemTransformComponent == null) {
                heldItemTransformComponent = new RemotePersonHeldItemTransformComponent();
                currentHeldItem.addComponent(heldItemTransformComponent);
            }
            Location.attachChild(mountPointComponent.mountPointEntity, currentHeldItem, heldItemTransformComponent.translate, new Quaternionf().rotationYXZ(Math.toRadians(heldItemTransformComponent.rotateDegrees.y), Math.toRadians(heldItemTransformComponent.rotateDegrees.x), Math.toRadians(heldItemTransformComponent.rotateDegrees.z)), heldItemTransformComponent.scale);
        }
    } else {
        logger.info("Somehow ended up in the else during linkHeldItemLocationForRemotePlayer - current item was " + "{} and new item {}", currentHeldItem, newItem);
    }
}
Also used : VisualComponent(org.terasology.engine.rendering.logic.VisualComponent) Quaternionf(org.joml.Quaternionf) CharacterComponent(org.terasology.engine.logic.characters.CharacterComponent) CharacterHeldItemComponent(org.terasology.engine.logic.characters.CharacterHeldItemComponent) Component(org.terasology.gestalt.entitysystem.component.Component) VisualComponent(org.terasology.engine.rendering.logic.VisualComponent) LocationComponent(org.terasology.engine.logic.location.LocationComponent) ClientComponent(org.terasology.engine.network.ClientComponent) OnActivatedComponent(org.terasology.engine.entitySystem.entity.lifecycleEvents.OnActivatedComponent) OnChangedComponent(org.terasology.engine.entitySystem.entity.lifecycleEvents.OnChangedComponent) EntityRef(org.terasology.engine.entitySystem.entity.EntityRef) LocationComponent(org.terasology.engine.logic.location.LocationComponent)

Aggregations

Component (org.terasology.gestalt.entitysystem.component.Component)57 EntityRef (org.terasology.engine.entitySystem.entity.EntityRef)20 Prefab (org.terasology.engine.entitySystem.prefab.Prefab)12 LocationComponent (org.terasology.engine.logic.location.LocationComponent)12 OnActivatedComponent (org.terasology.engine.entitySystem.entity.lifecycleEvents.OnActivatedComponent)11 NetworkComponent (org.terasology.engine.network.NetworkComponent)10 OnChangedComponent (org.terasology.engine.entitySystem.entity.lifecycleEvents.OnChangedComponent)9 EntityData (org.terasology.protobuf.EntityData)8 BeforeDeactivateComponent (org.terasology.engine.entitySystem.entity.lifecycleEvents.BeforeDeactivateComponent)7 OnAddedComponent (org.terasology.engine.entitySystem.entity.lifecycleEvents.OnAddedComponent)7 BlockComponent (org.terasology.engine.world.block.BlockComponent)7 EntityInfoComponent (org.terasology.engine.entitySystem.entity.internal.EntityInfoComponent)6 ReceiveEvent (org.terasology.engine.entitySystem.event.ReceiveEvent)6 EntityManager (org.terasology.engine.entitySystem.entity.EntityManager)5 ClientComponent (org.terasology.engine.network.ClientComponent)5 List (java.util.List)4 Map (java.util.Map)4 Optional (java.util.Optional)4 FieldMetadata (org.terasology.reflection.metadata.FieldMetadata)4 ByteString (com.google.protobuf.ByteString)3