Search in sources :

Example 1 with PlayerEntry

use of com.ichorpowered.guardianapi.entry.entity.PlayerEntry in project guardian by ichorpowered.

the class PotionEffectCapture method update.

@Override
public void update(@Nonnull PlayerEntry entry, @Nonnull CaptureContainer captureContainer) {
    if (!entry.getEntity(Player.class).isPresent() || !captureContainer.get(GuardianSequence.INITIAL_LOCATION).isPresent())
        return;
    final Player player = entry.getEntity(Player.class).get();
    captureContainer.offerIfEmpty(GuardianValue.builder(PotionEffectCapture.HORIZONTAL_SPEED_MODIFIER).defaultElement(1d).element(1d).create());
    captureContainer.offerIfEmpty(GuardianValue.builder(PotionEffectCapture.VERTICAL_SPEED_MODIFIER).defaultElement(1d).element(1d).create());
    final List<PotionEffect> potionEffects = player.get(Keys.POTION_EFFECTS).orElse(Lists.newArrayList());
    if (!potionEffects.isEmpty()) {
        for (PotionEffect potionEffect : potionEffects) {
            final String potionName = potionEffect.getType().getName().toLowerCase();
            if (this.effectSpeed.containsKey(potionName)) {
                final double effectValue = this.effectSpeed.get(potionName);
                captureContainer.getValue(PotionEffectCapture.HORIZONTAL_SPEED_MODIFIER).ifPresent(value -> value.transform(original -> original + ((potionEffect.getAmplifier() + 1) * effectValue)));
            }
            if (this.effectLift.containsKey(potionName)) {
                final double effectValue = this.effectLift.get(potionName);
                captureContainer.getValue(PotionEffectCapture.VERTICAL_SPEED_MODIFIER).ifPresent(value -> value.transform(original -> original + ((potionEffect.getAmplifier() + 1) * effectValue)));
            }
        }
    }
}
Also used : GuardianSequence(com.ichorpowered.guardian.sequence.GuardianSequence) ContentKeys(com.ichorpowered.guardianapi.content.ContentKeys) Keys(org.spongepowered.api.data.key.Keys) CaptureKey(com.ichorpowered.guardianapi.detection.capture.CaptureKey) GuardianCaptureKey(com.ichorpowered.guardian.sequence.capture.GuardianCaptureKey) TypeToken(com.google.common.reflect.TypeToken) Maps(com.google.common.collect.Maps) GuardianValue(com.ichorpowered.guardian.util.item.mutable.GuardianValue) GuardianMapValue(com.ichorpowered.guardian.util.item.mutable.GuardianMapValue) Detection(com.ichorpowered.guardianapi.detection.Detection) List(java.util.List) Lists(com.google.common.collect.Lists) AbstractCapture(com.ichorpowered.guardian.sequence.capture.AbstractCapture) Value(com.ichorpowered.guardianapi.util.item.value.mutable.Value) CaptureContainer(com.ichorpowered.guardianapi.detection.capture.CaptureContainer) Map(java.util.Map) PlayerEntry(com.ichorpowered.guardianapi.entry.entity.PlayerEntry) PotionEffect(org.spongepowered.api.effect.potion.PotionEffect) Player(org.spongepowered.api.entity.living.player.Player) Nonnull(javax.annotation.Nonnull) Player(org.spongepowered.api.entity.living.player.Player) PotionEffect(org.spongepowered.api.effect.potion.PotionEffect)

Example 2 with PlayerEntry

use of com.ichorpowered.guardianapi.entry.entity.PlayerEntry in project guardian by ichorpowered.

the class MaterialCapture method update.

@Override
public void update(@Nonnull PlayerEntry entry, @Nonnull CaptureContainer captureContainer) {
    if (!entry.getEntity(Player.class).isPresent() || !captureContainer.get(GuardianSequence.INITIAL_LOCATION).isPresent())
        return;
    final Player player = entry.getEntity(Player.class).get();
    final Location<World> location = player.getLocation();
    final MapValue<String, Integer> activeMaterials = GuardianMapValue.builder(MaterialCapture.ACTIVE_MATERIAL_TICKS).defaultElement(Maps.newHashMap()).element(Maps.newHashMap()).create();
    activeMaterials.put(GAS, 0);
    activeMaterials.put(LIQUID, 0);
    activeMaterials.put(SOLID, 0);
    captureContainer.offerIfEmpty(activeMaterials);
    captureContainer.offerIfEmpty(GuardianValue.builder(MaterialCapture.SPEED_MODIFIER).defaultElement(1d).element(1d).create());
    final Value<Double> playerBoxWidth = ContentUtil.getFirst(ContentKeys.BOX_PLAYER_WIDTH, entry, this.getDetection().getContentContainer()).orElse(GuardianValue.empty());
    final Value<Double> playerBoxHeight = ContentUtil.getFirst(ContentKeys.BOX_PLAYER_HEIGHT, entry, this.getDetection().getContentContainer()).orElse(GuardianValue.empty());
    final Value<Double> playerBoxSafety = ContentUtil.getFirst(ContentKeys.BOX_PLAYER_SAFETY, entry, this.getDetection().getContentContainer()).orElse(GuardianValue.empty());
    final double playerWidth = playerBoxWidth.getDirect().orElse(1.2) + playerBoxSafety.getDirect().orElse(0.05);
    final double playerHeight = playerBoxHeight.getDirect().orElse(1.8) + playerBoxSafety.getDirect().orElse(0.05);
    final boolean isSneaking = player.get(Keys.IS_SNEAKING).isPresent() && player.get(Keys.IS_SNEAKING).get();
    final BoundingBox playerBox = WorldUtil.getBoundingBox(playerWidth, isSneaking ? (playerHeight - 0.15) : playerHeight);
    if (!WorldUtil.containsBlocksUnder(location, playerBox, 1.25)) {
        final double gasSpeed = this.matterSpeed.get(GAS);
        captureContainer.getValue(MaterialCapture.SPEED_MODIFIER).ifPresent(value -> value.transform(original -> original * gasSpeed));
        captureContainer.getValue(MaterialCapture.ACTIVE_MATERIAL_TICKS).ifPresent(value -> value.put(GAS, value.get().get(GAS) + 1));
    } else if (WorldUtil.anyLiquidAtDepth(location, playerBox, 1d) || WorldUtil.anyLiquidAtDepth(location, playerBox, 0) || WorldUtil.anyLiquidAtDepth(location, playerBox, isSneaking ? -(playerHeight - 0.25) : -playerHeight)) {
        final double liquidSpeed = this.matterSpeed.get(LIQUID);
        captureContainer.getValue(MaterialCapture.SPEED_MODIFIER).ifPresent(value -> value.transform(original -> original * liquidSpeed));
        captureContainer.getValue(MaterialCapture.ACTIVE_MATERIAL_TICKS).ifPresent(value -> value.put(LIQUID, value.get().get(LIQUID) + 1));
    } else {
        final List<BlockType> surroundingBlockTypes = WorldUtil.getBlocksUnder(location, playerBox, 1.25);
        for (final BlockType blockType : surroundingBlockTypes) {
            final double speedModifier = this.materialSpeed.getOrDefault(blockType.getName().toLowerCase(), this.matterSpeed.get(SOLID));
            captureContainer.getValue(MaterialCapture.SPEED_MODIFIER).ifPresent(value -> value.transform(original -> original * speedModifier));
        }
        captureContainer.getValue(MaterialCapture.ACTIVE_MATERIAL_TICKS).ifPresent(value -> value.put(SOLID, value.get().get(SOLID) + 1));
    }
}
Also used : ContentKeys(com.ichorpowered.guardianapi.content.ContentKeys) Keys(org.spongepowered.api.data.key.Keys) GuardianCaptureKey(com.ichorpowered.guardian.sequence.capture.GuardianCaptureKey) TypeToken(com.google.common.reflect.TypeToken) GuardianValue(com.ichorpowered.guardian.util.item.mutable.GuardianValue) GuardianMapValue(com.ichorpowered.guardian.util.item.mutable.GuardianMapValue) Value(com.ichorpowered.guardianapi.util.item.value.mutable.Value) Map(java.util.Map) Nonnull(javax.annotation.Nonnull) Location(org.spongepowered.api.world.Location) GuardianSequence(com.ichorpowered.guardian.sequence.GuardianSequence) ContentUtil(com.ichorpowered.guardian.util.ContentUtil) CaptureKey(com.ichorpowered.guardianapi.detection.capture.CaptureKey) Maps(com.google.common.collect.Maps) BoundingBox(com.ichorpowered.guardian.util.entity.BoundingBox) Detection(com.ichorpowered.guardianapi.detection.Detection) List(java.util.List) AbstractCapture(com.ichorpowered.guardian.sequence.capture.AbstractCapture) CaptureContainer(com.ichorpowered.guardianapi.detection.capture.CaptureContainer) MapValue(com.ichorpowered.guardianapi.util.item.value.mutable.MapValue) World(org.spongepowered.api.world.World) BlockType(org.spongepowered.api.block.BlockType) PlayerEntry(com.ichorpowered.guardianapi.entry.entity.PlayerEntry) WorldUtil(com.ichorpowered.guardian.util.WorldUtil) Player(org.spongepowered.api.entity.living.player.Player) Player(org.spongepowered.api.entity.living.player.Player) World(org.spongepowered.api.world.World) BlockType(org.spongepowered.api.block.BlockType) BoundingBox(com.ichorpowered.guardian.util.entity.BoundingBox) List(java.util.List)

Example 3 with PlayerEntry

use of com.ichorpowered.guardianapi.entry.entity.PlayerEntry in project guardian by ichorpowered.

the class GuardianSequence method applyObserve.

@Override
public boolean applyObserve(final Event event, final SequenceContext sequenceContext) {
    final PlayerEntry entityEntry = sequenceContext.get(CommonContextKeys.ENTITY_ENTRY);
    final Player player = entityEntry.getEntity(Player.class).orElse(Sponge.getServer().getPlayer(entityEntry.getUniqueId()).orElse(null));
    if (player == null)
        return false;
    final SequenceContext mergedContext = SequenceContext.from(sequenceContext).custom(CommonContextKeys.LAST_ACTION_TIME, super.getLastActionTime()).custom(CommonContextKeys.CAPTURE_REGISTRY, this.captureRegistry).custom(CommonContextKeys.SUMMARY, this.summary).build();
    if (this.getState().equals(State.INACTIVE)) {
        this.captureRegistry.getContainer().offerIfEmpty(GuardianValue.builder(GuardianSequence.INITIAL_LOCATION).defaultElement(player.getLocation()).element(player.getLocation()).create());
    }
    return super.applyObserve(event, mergedContext);
}
Also used : Player(org.spongepowered.api.entity.living.player.Player) PlayerEntry(com.ichorpowered.guardianapi.entry.entity.PlayerEntry) SequenceContext(com.abilityapi.sequenceapi.SequenceContext)

Example 4 with PlayerEntry

use of com.ichorpowered.guardianapi.entry.entity.PlayerEntry in project guardian by ichorpowered.

the class GuardianSequence method applyAfter.

@Override
public final Tristate applyAfter(SequenceContext sequenceContext) {
    final PlayerEntry entityEntry = sequenceContext.get(CommonContextKeys.ENTITY_ENTRY);
    final Player player = entityEntry.getEntity(Player.class).orElse(Sponge.getServer().getPlayer(entityEntry.getUniqueId()).orElse(null));
    if (player == null)
        return Tristate.FALSE;
    final SequenceContext mergedContext = SequenceContext.from(sequenceContext).custom(CommonContextKeys.LAST_ACTION_TIME, super.getLastActionTime()).custom(CommonContextKeys.CAPTURE_REGISTRY, this.captureRegistry).custom(CommonContextKeys.SUMMARY, this.summary).build();
    if (this.getState().equals(State.INACTIVE)) {
        this.captureRegistry.getContainer().offerIfEmpty(GuardianValue.builder(GuardianSequence.INITIAL_LOCATION).defaultElement(player.getLocation()).element(player.getLocation()).create());
    }
    return super.applyAfter(mergedContext);
}
Also used : Player(org.spongepowered.api.entity.living.player.Player) PlayerEntry(com.ichorpowered.guardianapi.entry.entity.PlayerEntry) SequenceContext(com.abilityapi.sequenceapi.SequenceContext)

Example 5 with PlayerEntry

use of com.ichorpowered.guardianapi.entry.entity.PlayerEntry in project guardian by ichorpowered.

the class AltitudeCapture method update.

@Override
public void update(PlayerEntry entry, CaptureContainer captureContainer) {
    if (!entry.getEntity(Player.class).isPresent() || !captureContainer.get(GuardianSequence.INITIAL_LOCATION).isPresent())
        return;
    final Player player = entry.getEntity(Player.class).get();
    final Value<Double> playerBoxWidth = ContentUtil.getFirst(ContentKeys.BOX_PLAYER_WIDTH, entry, this.getDetection().getContentContainer()).orElse(GuardianValue.empty());
    final Value<Double> playerBoxHeight = ContentUtil.getFirst(ContentKeys.BOX_PLAYER_HEIGHT, entry, this.getDetection().getContentContainer()).orElse(GuardianValue.empty());
    final Value<Double> playerBoxSafety = ContentUtil.getFirst(ContentKeys.BOX_PLAYER_SAFETY, entry, this.getDetection().getContentContainer()).orElse(GuardianValue.empty());
    final double playerWidth = playerBoxWidth.getDirect().orElse(1.2) + playerBoxSafety.getDirect().orElse(0.05);
    final double playerHeight = playerBoxHeight.getDirect().orElse(1.8) + playerBoxSafety.getDirect().orElse(0.05);
    final boolean isSneaking = player.get(Keys.IS_SNEAKING).isPresent() && player.get(Keys.IS_SNEAKING).get();
    final BoundingBox playerBox = WorldUtil.getBoundingBox(playerWidth, isSneaking ? (playerHeight - 0.15) : playerHeight);
    final Location location = player.getLocation();
    Location relativeAltitude = null;
    double blockDepthOffset = 0;
    captureContainer.offerIfEmpty(GuardianValue.builder(AltitudeCapture.RELATIVE_ALTITUDE).defaultElement(1d).element(1d).create());
    for (int n = 0; n < Math.abs(location.getY()); n++) {
        double i = this.amount * n;
        Optional<Location> maximumDepth = captureContainer.get(AltitudeCapture.INITIAL_DEPTH);
        Location currentDepth = location.sub(0, i, 0);
        if (!WorldUtil.isEmptyAtDepth(location, playerBox, i)) {
            if (maximumDepth.isPresent() && maximumDepth.get().getY() == currentDepth.getY()) {
                relativeAltitude = currentDepth.add(0, this.amount, 0);
                blockDepthOffset = 1;
                break;
            } else if (maximumDepth.isPresent() && maximumDepth.get().getY() < currentDepth.getY()) {
                relativeAltitude = currentDepth.add(0, this.amount, 0);
                blockDepthOffset = (currentDepth.getY() - maximumDepth.get().getY()) > -1 ? -1 : currentDepth.getY() - maximumDepth.get().getY();
                break;
            } else if (maximumDepth.isPresent() && maximumDepth.get().getY() > currentDepth.getY()) {
                relativeAltitude = currentDepth.add(0, this.amount, 0);
                blockDepthOffset = (maximumDepth.get().getY() - currentDepth.getY()) < 1 ? 1 : maximumDepth.get().getY() - currentDepth.getY();
                break;
            } else if (!maximumDepth.isPresent()) {
                captureContainer.offer(GuardianValue.builder(AltitudeCapture.INITIAL_DEPTH).defaultElement(currentDepth).element(currentDepth).create());
                relativeAltitude = currentDepth.add(0, this.amount, 0);
                break;
            }
        } else if ((currentDepth.getY() - 1) < 0) {
            if (!maximumDepth.isPresent()) {
                captureContainer.offer(GuardianValue.builder(AltitudeCapture.INITIAL_DEPTH).defaultElement(location.getExtent().getLocation(currentDepth.getX(), -256, currentDepth.getZ())).element(location.getExtent().getLocation(currentDepth.getX(), -256, currentDepth.getZ())).create());
            }
            if (maximumDepth.isPresent() && maximumDepth.get().getY() == currentDepth.getY()) {
                relativeAltitude = currentDepth.add(0, this.amount, 0);
                blockDepthOffset = -1;
                break;
            }
        }
    }
    if (!captureContainer.get(AltitudeCapture.INITIAL_DEPTH).isPresent() || relativeAltitude == null) {
        relativeAltitude = player.getLocation().setPosition(new Vector3d(player.getLocation().getX(), 0, player.getLocation().getZ()));
    }
    double relativeAltitudeOffset = (player.getLocation().getY() - relativeAltitude.getY()) - Math.abs(blockDepthOffset);
    if (this.liftOnly && relativeAltitudeOffset < 0)
        return;
    final double offset = relativeAltitudeOffset;
    captureContainer.getValue(AltitudeCapture.RELATIVE_ALTITUDE).ifPresent(value -> value.transform(original -> original + offset));
    captureContainer.getValue(AltitudeCapture.LAST_ALTITUDE).ifPresent(value -> value.set(offset));
}
Also used : Location(org.spongepowered.api.world.Location) GuardianSequence(com.ichorpowered.guardian.sequence.GuardianSequence) ContentKeys(com.ichorpowered.guardianapi.content.ContentKeys) Keys(org.spongepowered.api.data.key.Keys) ContentUtil(com.ichorpowered.guardian.util.ContentUtil) CaptureKey(com.ichorpowered.guardianapi.detection.capture.CaptureKey) GuardianCaptureKey(com.ichorpowered.guardian.sequence.capture.GuardianCaptureKey) Vector3d(com.flowpowered.math.vector.Vector3d) TypeToken(com.google.common.reflect.TypeToken) BoundingBox(com.ichorpowered.guardian.util.entity.BoundingBox) GuardianValue(com.ichorpowered.guardian.util.item.mutable.GuardianValue) Detection(com.ichorpowered.guardianapi.detection.Detection) AbstractCapture(com.ichorpowered.guardian.sequence.capture.AbstractCapture) Value(com.ichorpowered.guardianapi.util.item.value.mutable.Value) CaptureContainer(com.ichorpowered.guardianapi.detection.capture.CaptureContainer) Optional(java.util.Optional) PlayerEntry(com.ichorpowered.guardianapi.entry.entity.PlayerEntry) WorldUtil(com.ichorpowered.guardian.util.WorldUtil) Player(org.spongepowered.api.entity.living.player.Player) Nonnull(javax.annotation.Nonnull) Player(org.spongepowered.api.entity.living.player.Player) Vector3d(com.flowpowered.math.vector.Vector3d) BoundingBox(com.ichorpowered.guardian.util.entity.BoundingBox) Location(org.spongepowered.api.world.Location)

Aggregations

PlayerEntry (com.ichorpowered.guardianapi.entry.entity.PlayerEntry)7 Player (org.spongepowered.api.entity.living.player.Player)7 TypeToken (com.google.common.reflect.TypeToken)4 GuardianSequence (com.ichorpowered.guardian.sequence.GuardianSequence)4 AbstractCapture (com.ichorpowered.guardian.sequence.capture.AbstractCapture)4 GuardianCaptureKey (com.ichorpowered.guardian.sequence.capture.GuardianCaptureKey)4 GuardianValue (com.ichorpowered.guardian.util.item.mutable.GuardianValue)4 ContentKeys (com.ichorpowered.guardianapi.content.ContentKeys)4 Detection (com.ichorpowered.guardianapi.detection.Detection)4 CaptureContainer (com.ichorpowered.guardianapi.detection.capture.CaptureContainer)4 CaptureKey (com.ichorpowered.guardianapi.detection.capture.CaptureKey)4 Value (com.ichorpowered.guardianapi.util.item.value.mutable.Value)4 Nonnull (javax.annotation.Nonnull)4 Keys (org.spongepowered.api.data.key.Keys)4 SequenceContext (com.abilityapi.sequenceapi.SequenceContext)3 Maps (com.google.common.collect.Maps)3 GuardianMapValue (com.ichorpowered.guardian.util.item.mutable.GuardianMapValue)3 Map (java.util.Map)3 ContentUtil (com.ichorpowered.guardian.util.ContentUtil)2 WorldUtil (com.ichorpowered.guardian.util.WorldUtil)2