/*
* Copyright 2013 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.metadata;
import com.google.common.base.Predicates;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.reflection.metadata.ClassMetadata;
import org.terasology.reflection.copy.CopyStrategy;
import org.terasology.reflection.copy.CopyStrategyLibrary;
import org.terasology.reflection.reflect.InaccessibleFieldException;
import org.terasology.reflection.reflect.ReflectFactory;
import org.terasology.engine.SimpleUri;
import org.terasology.entitySystem.event.Event;
import org.terasology.network.BroadcastEvent;
import org.terasology.network.OwnerEvent;
import org.terasology.network.ServerEvent;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
/**
*/
public class EventMetadata<T extends Event> extends ClassMetadata<T, ReplicatedFieldMetadata<T, ?>> {
private static final Logger logger = LoggerFactory.getLogger(EventMetadata.class);
private NetworkEventType networkEventType = NetworkEventType.NONE;
private boolean lagCompensated;
private boolean skipInstigator;
public EventMetadata(Class<T> simpleClass, CopyStrategyLibrary copyStrategies, ReflectFactory factory, SimpleUri uri) throws NoSuchMethodException {
super(uri, simpleClass, factory, copyStrategies, Predicates.<Field>alwaysTrue());
if (simpleClass.getAnnotation(ServerEvent.class) != null) {
networkEventType = NetworkEventType.SERVER;
lagCompensated = simpleClass.getAnnotation(ServerEvent.class).lagCompensate();
} else if (simpleClass.getAnnotation(OwnerEvent.class) != null) {
networkEventType = NetworkEventType.OWNER;
} else if (simpleClass.getAnnotation(BroadcastEvent.class) != null) {
networkEventType = NetworkEventType.BROADCAST;
skipInstigator = simpleClass.getAnnotation(BroadcastEvent.class).skipInstigator();
}
if (networkEventType != NetworkEventType.NONE && !isConstructable() && !Modifier.isAbstract(simpleClass.getModifiers())) {
logger.error("Event '{}' is a network event but lacks a default constructor - will not be replicated", this);
}
}
/**
* @return Whether this event is a network event.
*/
public boolean isNetworkEvent() {
return networkEventType != NetworkEventType.NONE;
}
/**
* @return The type of network event this event is.
*/
public NetworkEventType getNetworkEventType() {
return networkEventType;
}
/**
* @return Whether this event is compensated for lag.
*/
public boolean isLagCompensated() {
return lagCompensated;
}
/**
* @return Whether this event should not be replicated to the instigator
*/
public boolean isSkipInstigator() {
return skipInstigator;
}
@Override
protected <V> ReplicatedFieldMetadata<T, ?> createField(Field field, CopyStrategy<V> copyStrategy, ReflectFactory factory) throws InaccessibleFieldException {
return new ReplicatedFieldMetadata<>(this, field, copyStrategy, factory, true);
}
}