Search in sources :

Example 1 with ActivationPredicted

use of org.terasology.engine.logic.characters.events.ActivationPredicted in project Terasology by MovingBlocks.

the class LocalPlayer method activateTargetOrOwnedEntity.

/**
 * @param usedOwnedEntity if it does not exist it is not an item usage.
 * @return true if an activation request got sent. Returns always true if usedItem exists.
 */
private boolean activateTargetOrOwnedEntity(EntityRef usedOwnedEntity) {
    EntityRef character = getCharacterEntity();
    CharacterComponent characterComponent = character.getComponent(CharacterComponent.class);
    Vector3f direction = getViewDirection(new Vector3f());
    Vector3f originPos = getViewPosition(new Vector3f());
    if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.RECORDING) {
        this.directionAndOriginPosRecorderList.getTargetOrOwnedEntityDirectionAndOriginPosRecorder().add(direction, originPos);
    } else if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.REPLAYING) {
        Vector3f[] data = this.directionAndOriginPosRecorderList.getTargetOrOwnedEntityDirectionAndOriginPosRecorder().poll();
        direction = data[0];
        originPos = data[1];
    }
    boolean ownedEntityUsage = usedOwnedEntity.exists();
    int activationId = nextActivationId++;
    Physics physics = CoreRegistry.get(Physics.class);
    // FIXME This is the same code as in CharacterSystem#isPredictionOfEventCorrect to derive the actual interaction range from the
    // player's character component and the used item's range component...
    float interactionRange;
    if (ownedEntityUsage && usedOwnedEntity.hasComponent(RangeComponent.class)) {
        interactionRange = Math.max(usedOwnedEntity.getComponent(RangeComponent.class).range, characterComponent.interactionRange);
    } else {
        interactionRange = characterComponent.interactionRange;
    }
    HitResult result = physics.rayTrace(originPos, direction, interactionRange, Sets.newHashSet(character), CharacterSystem.DEFAULTPHYSICSFILTER);
    boolean eventWithTarget = result.isHit();
    if (ownedEntityUsage || eventWithTarget) {
        EntityRef activatedObject = usedOwnedEntity.exists() ? usedOwnedEntity : result.getEntity();
        activatedObject.send(new ActivationPredicted(character, result.getEntity(), originPos, direction, result.getHitPoint(), result.getHitNormal(), activationId));
        character.send(new ActivationRequest(character, ownedEntityUsage, usedOwnedEntity, eventWithTarget, result.getEntity(), originPos, direction, result.getHitPoint(), result.getHitNormal(), activationId));
        return true;
    }
    return false;
}
Also used : HitResult(org.terasology.engine.physics.HitResult) ActivationPredicted(org.terasology.engine.logic.characters.events.ActivationPredicted) ActivationRequest(org.terasology.engine.logic.characters.events.ActivationRequest) RangeComponent(org.terasology.engine.logic.common.RangeComponent) Vector3f(org.joml.Vector3f) CharacterComponent(org.terasology.engine.logic.characters.CharacterComponent) EntityRef(org.terasology.engine.entitySystem.entity.EntityRef) Physics(org.terasology.engine.physics.Physics)

Aggregations

Vector3f (org.joml.Vector3f)1 EntityRef (org.terasology.engine.entitySystem.entity.EntityRef)1 CharacterComponent (org.terasology.engine.logic.characters.CharacterComponent)1 ActivationPredicted (org.terasology.engine.logic.characters.events.ActivationPredicted)1 ActivationRequest (org.terasology.engine.logic.characters.events.ActivationRequest)1 RangeComponent (org.terasology.engine.logic.common.RangeComponent)1 HitResult (org.terasology.engine.physics.HitResult)1 Physics (org.terasology.engine.physics.Physics)1