/*
* Copyright 2014 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.entitySystem.entity.internal;
import org.terasology.asset.AssetType;
import org.terasology.asset.AssetUri;
import org.terasology.entitySystem.Component;
import org.terasology.entitySystem.entity.EntityRef;
import org.terasology.entitySystem.entity.LowLevelEntityManager;
import org.terasology.entitySystem.event.Event;
import org.terasology.entitySystem.prefab.Prefab;
import org.terasology.network.NetworkComponent;
import java.util.Collections;
/**
* @author Immortius
*/
public abstract class BaseEntityRef extends EntityRef {
protected LowLevelEntityManager entityManager;
public BaseEntityRef(LowLevelEntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public boolean isPersistent() {
return exists() && (!isActive() || getEntityInfo().persisted);
}
@Override
public void setPersistent(boolean persistent) {
if (exists()) {
EntityInfoComponent info = getEntityInfo();
if (info.persisted != persistent) {
info.persisted = persistent;
saveComponent(info);
}
}
}
@Override
public boolean isAlwaysRelevant() {
return isActive() && getEntityInfo().alwaysRelevant;
}
@Override
public void setAlwaysRelevant(boolean alwaysRelevant) {
if (exists()) {
EntityInfoComponent info = getEntityInfo();
if (info.alwaysRelevant != alwaysRelevant) {
info.alwaysRelevant = alwaysRelevant;
saveComponent(info);
}
}
}
@Override
public EntityRef getOwner() {
if (exists()) {
return getEntityInfo().owner;
}
return EntityRef.NULL;
}
@Override
public void setOwner(EntityRef owner) {
if (exists()) {
EntityInfoComponent info = getEntityInfo();
if (!info.owner.equals(owner)) {
info.owner = owner;
saveComponent(info);
}
}
}
@Override
public Prefab getParentPrefab() {
if (exists()) {
EntityInfoComponent info = getComponent(EntityInfoComponent.class);
if (info != null) {
return entityManager.getPrefabManager().getPrefab(info.parentPrefab);
}
}
return null;
}
@Override
public AssetUri getPrefabURI() {
if (exists()) {
EntityInfoComponent info = getComponent(EntityInfoComponent.class);
if (info != null && !info.parentPrefab.isEmpty()) {
return new AssetUri(AssetType.PREFAB, info.parentPrefab);
}
}
return null;
}
@Override
public boolean isActive() {
return exists() && entityManager.isActiveEntity(getId());
}
@Override
public <T extends Component> T getComponent(Class<T> componentClass) {
if (exists()) {
return entityManager.getComponent(getId(), componentClass);
}
return null;
}
@Override
public <T extends Component> T addComponent(T component) {
if (isActive()) {
return entityManager.addComponent(getId(), component);
}
return component;
}
@Override
public void removeComponent(Class<? extends Component> componentClass) {
if (isActive()) {
entityManager.removeComponent(getId(), componentClass);
}
}
@Override
public void saveComponent(Component component) {
if (isActive()) {
entityManager.saveComponent(getId(), component);
}
}
@Override
public Iterable<Component> iterateComponents() {
if (exists()) {
return entityManager.iterateComponents(getId());
}
return Collections.emptyList();
}
@Override
public void destroy() {
if (isActive()) {
entityManager.destroy(getId());
}
}
@Override
public <T extends Event> T send(T event) {
if (exists()) {
entityManager.getEventSystem().send(this, event);
}
return event;
}
@Override
public boolean hasComponent(Class<? extends Component> component) {
return exists() && entityManager.hasComponent(getId(), component);
}
@Override
public String toString() {
AssetUri prefabUri = getPrefabURI();
StringBuilder builder = new StringBuilder();
builder.append("EntityRef{id = ");
builder.append(getId());
NetworkComponent networkComponent = getComponent(NetworkComponent.class);
if (networkComponent != null) {
builder.append(", netId = ");
builder.append(networkComponent.getNetworkId());
}
if (prefabUri != null) {
builder.append(", prefab = '");
builder.append(prefabUri.toSimpleString());
builder.append("'");
}
builder.append("}");
return builder.toString();
}
public void invalidate() {
entityManager = null;
}
private EntityInfoComponent getEntityInfo() {
EntityInfoComponent entityInfo = getComponent(EntityInfoComponent.class);
if (entityInfo == null) {
entityInfo = addComponent(new EntityInfoComponent());
}
return entityInfo;
}
}