Search in sources :

Example 6 with Event

use of org.spongepowered.api.event.Event in project SpongeCommon by SpongePowered.

the class SpongeEventManager method registerListener.

@SuppressWarnings("unchecked")
public void registerListener(PluginContainer plugin, Object listenerObject) {
    checkNotNull(plugin, "plugin");
    checkNotNull(listenerObject, "listener");
    if (this.registeredListeners.contains(listenerObject)) {
        this.logger.warn("Plugin {} attempted to register an already registered listener ({})", plugin.getId(), listenerObject.getClass().getName());
        Thread.dumpStack();
        return;
    }
    List<RegisteredListener<? extends Event>> handlers = Lists.newArrayList();
    Map<Method, String> methodErrors = new HashMap<>();
    Class<?> handle = listenerObject.getClass();
    for (Method method : handle.getMethods()) {
        Listener listener = method.getAnnotation(Listener.class);
        if (listener != null) {
            String error = getHandlerErrorOrNull(method);
            if (error == null) {
                @SuppressWarnings("unchecked") final TypeToken eventType = TypeToken.of(method.getGenericParameterTypes()[0]);
                AnnotatedEventListener handler;
                try {
                    handler = this.handlerFactory.create(listenerObject, method);
                } catch (Exception e) {
                    this.logger.error("Failed to create handler for {} on {}", method, handle, e);
                    continue;
                }
                handlers.add(createRegistration(plugin, eventType, listener, handler));
            } else {
                methodErrors.put(method, error);
            }
        }
    }
    // about those.
    for (Class<?> handleParent = handle; handleParent != Object.class; handleParent = handleParent.getSuperclass()) {
        for (Method method : handleParent.getDeclaredMethods()) {
            if (method.getAnnotation(Listener.class) != null && !methodErrors.containsKey(method)) {
                String error = getHandlerErrorOrNull(method);
                if (error != null) {
                    methodErrors.put(method, error);
                }
            }
        }
    }
    for (Map.Entry<Method, String> method : methodErrors.entrySet()) {
        this.logger.warn("Invalid listener method {} in {}: {}", method.getKey(), method.getKey().getDeclaringClass().getName(), method.getValue());
    }
    this.registeredListeners.add(listenerObject);
    register(handlers);
}
Also used : EventListener(org.spongepowered.api.event.EventListener) Listener(org.spongepowered.api.event.Listener) HashMap(java.util.HashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Method(java.lang.reflect.Method) TypeToken(com.google.common.reflect.TypeToken) GenericEvent(org.spongepowered.api.event.GenericEvent) Event(org.spongepowered.api.event.Event) AbstractEvent(org.spongepowered.api.event.impl.AbstractEvent) HashMap(java.util.HashMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Example 7 with Event

use of org.spongepowered.api.event.Event in project SpongeCommon by SpongePowered.

the class FilterGenerator method generateClass.

public byte[] generateClass(String name, Method method) {
    name = name.replace('.', '/');
    Parameter[] params = method.getParameters();
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;
    cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, name, null, "java/lang/Object", new String[] { Type.getInternalName(EventFilter.class) });
    SubtypeFilterDelegate sfilter = null;
    List<FilterDelegate> additional = Lists.newArrayList();
    boolean cancellation = false;
    for (Annotation anno : method.getAnnotations()) {
        Object obj = filterFromAnnotation(anno.annotationType());
        if (obj == null) {
            continue;
        }
        if (obj instanceof SubtypeFilter) {
            if (sfilter != null) {
                throw new IllegalStateException("Cannot have both @Include and @Exclude annotations present at once");
            }
            sfilter = ((SubtypeFilter) obj).getDelegate(anno);
        } else if (obj instanceof EventTypeFilter) {
            EventTypeFilter etf = (EventTypeFilter) obj;
            additional.add(etf.getDelegate(anno));
            if (etf == EventTypeFilter.CANCELLATION) {
                cancellation = true;
            }
        }
    }
    if (!cancellation && Cancellable.class.isAssignableFrom(method.getParameterTypes()[0])) {
        additional.add(new CancellationEventFilterDelegate(Tristate.FALSE));
    }
    if (sfilter != null) {
        sfilter.createFields(cw);
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        if (sfilter != null) {
            sfilter.writeCtor(name, cw, mv);
        }
        mv.visitInsn(RETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "filter", "(" + Type.getDescriptor(Event.class) + ")[Ljava/lang/Object;", null, null);
        mv.visitCode();
        // index of the next available local variable
        int local = 2;
        if (sfilter != null) {
            local = sfilter.write(name, cw, mv, method, local);
        }
        for (FilterDelegate eventFilter : additional) {
            local = eventFilter.write(name, cw, mv, method, local);
        }
        // local var indices of the parameters values
        int[] plocals = new int[params.length - 1];
        for (int i = 1; i < params.length; i++) {
            Parameter param = params[i];
            ParameterFilterSourceDelegate source = null;
            List<ParameterFilterDelegate> paramFilters = Lists.newArrayList();
            for (Annotation anno : param.getAnnotations()) {
                Object obj = filterFromAnnotation(anno.annotationType());
                if (obj == null) {
                    continue;
                }
                if (obj instanceof ParameterSource) {
                    if (source != null) {
                        throw new IllegalStateException("Cannot have multiple parameter filter source annotations (for " + param.getName() + ")");
                    }
                    source = ((ParameterSource) obj).getDelegate(anno);
                } else if (obj instanceof ParameterFilter) {
                    paramFilters.add(((ParameterFilter) obj).getDelegate(anno));
                }
            }
            if (source == null) {
                throw new IllegalStateException("Cannot have additional parameters filters without a source (for " + param.getName() + ")");
            }
            if (source instanceof AllCauseFilterSourceDelegate && !paramFilters.isEmpty()) {
                // TODO until better handling for filtering arrays is added
                throw new IllegalStateException("Cannot have additional parameters filters without an array source (for " + param.getName() + ")");
            }
            Tuple<Integer, Integer> localState = source.write(cw, mv, method, param, local);
            local = localState.getFirst();
            plocals[i - 1] = localState.getSecond();
            for (ParameterFilterDelegate paramFilter : paramFilters) {
                paramFilter.write(cw, mv, method, param, plocals[i - 1]);
            }
        }
        // create the return array
        if (params.length == 1) {
            mv.visitInsn(ICONST_1);
        } else {
            mv.visitIntInsn(BIPUSH, params.length);
        }
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        // load the event into the array
        mv.visitInsn(DUP);
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(AASTORE);
        // load all the params into the array
        for (int i = 1; i < params.length; i++) {
            mv.visitInsn(DUP);
            mv.visitIntInsn(BIPUSH, i);
            Type paramType = Type.getType(params[i].getType());
            mv.visitVarInsn(paramType.getOpcode(ILOAD), plocals[i - 1]);
            GeneratorUtils.visitBoxingMethod(mv, paramType);
            mv.visitInsn(AASTORE);
        }
        mv.visitInsn(ARETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
    cw.visitEnd();
    byte[] data = cw.toByteArray();
    if (FILTER_DEBUG) {
        File outDir = new File(".sponge.debug.out");
        File outFile = new File(outDir, name + ".class");
        if (!outFile.getParentFile().exists()) {
            outFile.getParentFile().mkdirs();
        }
        try (FileOutputStream out = new FileOutputStream(outFile)) {
            out.write(data);
        } catch (IOException ignored) {
            ignored.printStackTrace();
        }
    }
    return data;
}
Also used : CancellationEventFilterDelegate(org.spongepowered.common.event.filter.delegate.CancellationEventFilterDelegate) Cancellable(org.spongepowered.api.event.Cancellable) ParameterFilterDelegate(org.spongepowered.common.event.filter.delegate.ParameterFilterDelegate) MethodVisitor(org.objectweb.asm.MethodVisitor) List(java.util.List) SubtypeFilterDelegate(org.spongepowered.common.event.filter.delegate.SubtypeFilterDelegate) SupportsDataFilterDelegate(org.spongepowered.common.event.filter.delegate.SupportsDataFilterDelegate) IncludeSubtypeFilterDelegate(org.spongepowered.common.event.filter.delegate.IncludeSubtypeFilterDelegate) FilterDelegate(org.spongepowered.common.event.filter.delegate.FilterDelegate) ParameterFilterDelegate(org.spongepowered.common.event.filter.delegate.ParameterFilterDelegate) HasDataFilterDelegate(org.spongepowered.common.event.filter.delegate.HasDataFilterDelegate) ExcludeSubtypeFilterDelegate(org.spongepowered.common.event.filter.delegate.ExcludeSubtypeFilterDelegate) CancellationEventFilterDelegate(org.spongepowered.common.event.filter.delegate.CancellationEventFilterDelegate) ParameterFilterSourceDelegate(org.spongepowered.common.event.filter.delegate.ParameterFilterSourceDelegate) AllCauseFilterSourceDelegate(org.spongepowered.common.event.filter.delegate.AllCauseFilterSourceDelegate) IOException(java.io.IOException) ClassWriter(org.objectweb.asm.ClassWriter) Annotation(java.lang.annotation.Annotation) SubtypeFilterDelegate(org.spongepowered.common.event.filter.delegate.SubtypeFilterDelegate) IncludeSubtypeFilterDelegate(org.spongepowered.common.event.filter.delegate.IncludeSubtypeFilterDelegate) ExcludeSubtypeFilterDelegate(org.spongepowered.common.event.filter.delegate.ExcludeSubtypeFilterDelegate) Type(org.objectweb.asm.Type) FileOutputStream(java.io.FileOutputStream) Parameter(java.lang.reflect.Parameter) Event(org.spongepowered.api.event.Event) File(java.io.File) Tuple(org.spongepowered.api.util.Tuple)

Example 8 with Event

use of org.spongepowered.api.event.Event in project SpongeForge by SpongePowered.

the class SpongeMod method onServerStopped.

@Subscribe
public void onServerStopped(FMLServerStoppedEvent event) throws IOException {
    try {
        CommandManager service = this.game.getCommandManager();
        service.getCommands().stream().filter(mapping -> mapping.getCallable() instanceof MinecraftCommandWrapper).forEach(service::removeMapping);
        ((SqlServiceImpl) this.game.getServiceManager().provideUnchecked(SqlService.class)).close();
    } catch (Throwable t) {
        this.controller.errorOccurred(this, t);
    }
    // used by client
    WorldManager.unregisterAllWorldSettings();
}
Also used : SpongeProfession(org.spongepowered.common.entity.SpongeProfession) IMixinVillagerProfession(org.spongepowered.mod.interfaces.IMixinVillagerProfession) EntityEntry(net.minecraftforge.fml.common.registry.EntityEntry) SpongeModPluginContainer(org.spongepowered.mod.plugin.SpongeModPluginContainer) Inject(com.google.inject.Inject) ChunkTicketManager(org.spongepowered.api.world.ChunkTicketManager) SpongeModule(org.spongepowered.common.inject.SpongeModule) SpongePermissionService(org.spongepowered.common.service.permission.SpongePermissionService) Type(org.objectweb.asm.Type) PermissionService(org.spongepowered.api.service.permission.PermissionService) SpongePlayerDataHandler(org.spongepowered.common.world.storage.SpongePlayerDataHandler) MinecraftServer(net.minecraft.server.MinecraftServer) Side(net.minecraftforge.fml.relauncher.Side) RegistryEvent(net.minecraftforge.event.RegistryEvent) DedicatedServer(net.minecraft.server.dedicated.DedicatedServer) StaticMixinForgeHelper(org.spongepowered.mod.util.StaticMixinForgeHelper) FMLConstructionEvent(net.minecraftforge.fml.common.event.FMLConstructionEvent) NbtDataUtil(org.spongepowered.common.data.util.NbtDataUtil) SpongeEventHooks(org.spongepowered.mod.event.SpongeEventHooks) IMixinServerCommandManager(org.spongepowered.common.interfaces.IMixinServerCommandManager) SpongeChunkTicketManager(org.spongepowered.mod.service.world.SpongeChunkTicketManager) SoundType(org.spongepowered.api.effect.sound.SoundType) SpongeGameData(org.spongepowered.mod.registry.SpongeGameData) ModContainerFactory(net.minecraftforge.fml.common.ModContainerFactory) Sponge(org.spongepowered.api.Sponge) MinecraftCommandWrapper(org.spongepowered.common.command.MinecraftCommandWrapper) SqlService(org.spongepowered.api.service.sql.SqlService) SpongeGuice(org.spongepowered.common.inject.SpongeGuice) ForgeModContainer(net.minecraftforge.common.ForgeModContainer) FMLLoadCompleteEvent(net.minecraftforge.fml.common.event.FMLLoadCompleteEvent) Stage(com.google.inject.Stage) SpongeModMessageHandler(org.spongepowered.mod.network.SpongeModMessageHandler) SpongeBootstrap(org.spongepowered.common.SpongeBootstrap) SpongeForgeModuleRegistry(org.spongepowered.mod.registry.SpongeForgeModuleRegistry) FMLFileResourcePack(net.minecraftforge.fml.client.FMLFileResourcePack) CraftingRecipe(org.spongepowered.api.item.recipe.crafting.CraftingRecipe) BlockType(org.spongepowered.api.block.BlockType) CommandManager(org.spongepowered.api.command.CommandManager) SpongeScheduler(org.spongepowered.common.scheduler.SpongeScheduler) TickEvent(net.minecraftforge.fml.common.gameevent.TickEvent) SpongeImpl(org.spongepowered.common.SpongeImpl) SpongeForgeModule(org.spongepowered.mod.inject.SpongeForgeModule) SqlServiceImpl(org.spongepowered.common.service.sql.SqlServiceImpl) Min(com.flowpowered.noise.module.combiner.Min) PotionEffectType(org.spongepowered.api.effect.potion.PotionEffectType) ProfessionRegistryModule(org.spongepowered.common.registry.type.entity.ProfessionRegistryModule) SpongeContextCalculator(org.spongepowered.common.service.permission.SpongeContextCalculator) EnchantmentType(org.spongepowered.api.item.enchantment.EnchantmentType) SpongeCraftingRecipeRegistry(org.spongepowered.common.item.recipe.crafting.SpongeCraftingRecipeRegistry) FMLPostInitializationEvent(net.minecraftforge.fml.common.event.FMLPostInitializationEvent) SpongeInternalListeners(org.spongepowered.common.SpongeInternalListeners) EventBus(com.google.common.eventbus.EventBus) FMLServerStoppedEvent(net.minecraftforge.fml.common.event.FMLServerStoppedEvent) Minecraft(net.minecraft.client.Minecraft) BlockTypeRegistryModule(org.spongepowered.common.registry.type.BlockTypeRegistryModule) FMLPreInitializationEvent(net.minecraftforge.fml.common.event.FMLPreInitializationEvent) Subscribe(com.google.common.eventbus.Subscribe) LoadController(net.minecraftforge.fml.common.LoadController) FMLInitializationEvent(net.minecraftforge.fml.common.event.FMLInitializationEvent) SoundRegistryModule(org.spongepowered.common.registry.type.effect.SoundRegistryModule) SideOnly(net.minecraftforge.fml.relauncher.SideOnly) PluginContainer(org.spongepowered.api.plugin.PluginContainer) PotionEffectTypeRegistryModule(org.spongepowered.common.registry.type.effect.PotionEffectTypeRegistryModule) IMixinBlock(org.spongepowered.common.interfaces.block.IMixinBlock) IRecipe(net.minecraft.item.crafting.IRecipe) Logger(org.slf4j.Logger) Event(org.spongepowered.api.event.Event) SpongeHooks(org.spongepowered.common.util.SpongeHooks) WorldManager(org.spongepowered.common.world.WorldManager) IOException(java.io.IOException) SpongeEntityAICommonSuperclass(org.spongepowered.common.entity.ai.SpongeEntityAICommonSuperclass) EntityTypeRegistryModule(org.spongepowered.common.registry.type.entity.EntityTypeRegistryModule) File(java.io.File) FMLFolderResourcePack(net.minecraftforge.fml.client.FMLFolderResourcePack) SpongeGame(org.spongepowered.common.SpongeGame) ItemTypeRegistryModule(org.spongepowered.common.registry.type.ItemTypeRegistryModule) Plugin(org.spongepowered.api.plugin.Plugin) MinecraftForge(net.minecraftforge.common.MinecraftForge) FMLServerStartedEvent(net.minecraftforge.fml.common.event.FMLServerStartedEvent) MetaModContainer(org.spongepowered.mod.plugin.MetaModContainer) Launch(net.minecraft.launchwrapper.Launch) ForgeRegistries(net.minecraftforge.fml.common.registry.ForgeRegistries) EnchantmentRegistryModule(org.spongepowered.common.registry.type.item.EnchantmentRegistryModule) IntegratedServer(net.minecraft.server.integrated.IntegratedServer) ResourceLocation(net.minecraft.util.ResourceLocation) SubscribeEvent(net.minecraftforge.fml.common.eventhandler.SubscribeEvent) Guice(com.google.inject.Guice) FMLStateEvent(net.minecraftforge.fml.common.event.FMLStateEvent) Preconditions(com.google.common.base.Preconditions) FMLServerAboutToStartEvent(net.minecraftforge.fml.common.event.FMLServerAboutToStartEvent) VillagerRegistry(net.minecraftforge.fml.common.registry.VillagerRegistry) ItemType(org.spongepowered.api.item.ItemType) SpongeForgeVillagerRegistry(org.spongepowered.mod.registry.SpongeForgeVillagerRegistry) EntityRegistry(net.minecraftforge.fml.common.registry.EntityRegistry) IMixinServerCommandManager(org.spongepowered.common.interfaces.IMixinServerCommandManager) CommandManager(org.spongepowered.api.command.CommandManager) SqlServiceImpl(org.spongepowered.common.service.sql.SqlServiceImpl) SqlService(org.spongepowered.api.service.sql.SqlService) MinecraftCommandWrapper(org.spongepowered.common.command.MinecraftCommandWrapper) Subscribe(com.google.common.eventbus.Subscribe)

Example 9 with Event

use of org.spongepowered.api.event.Event in project guardian by ichorpowered.

the class HorizontalSpeedCheck method getSequence.

@Override
public SequenceBlueprint<Event> getSequence(final Detection detection) {
    final Double analysisTime = detection.getContentContainer().get(ContentKeys.ANALYSIS_TIME).orElse(GuardianValue.empty()).getDirect().orElse(0d) / 0.05;
    final Double analysisIntercept = detection.getContentContainer().get(ContentKeys.ANALYSIS_INTERCEPT).orElse(GuardianValue.empty()).getDirect().orElse(0d);
    final Double minimumTickRate = detection.getContentContainer().get(ContentKeys.ANALYSIS_MINIMUM_TICK).orElse(GuardianValue.empty()).getDirect().orElse(0d) / 0.05;
    final Double maximumTickRate = detection.getContentContainer().get(ContentKeys.ANALYSIS_MAXIMUM_TICK).orElse(GuardianValue.empty()).getDirect().orElse(0d) / 0.05;
    return new GuardianSequenceBuilder().capture(new ControlCapture(detection.getPlugin(), detection)).capture(new MaterialCapture(detection.getPlugin(), detection)).capture(new PotionEffectCapture(detection.getPlugin(), detection)).observe(MoveEntityEvent.class).after().delay(analysisTime.intValue()).condition(sequenceContext -> {
        final GuardianPlayerEntry<Player> entityEntry = sequenceContext.get(CommonContextKeys.ENTITY_ENTRY);
        final Summary summary = sequenceContext.get(CommonContextKeys.SUMMARY);
        final GuardianCaptureRegistry captureRegistry = sequenceContext.get(CommonContextKeys.CAPTURE_REGISTRY);
        final long lastActionTime = sequenceContext.get(CommonContextKeys.LAST_ACTION_TIME);
        summary.set(SequenceReport.class, new SequenceReport(false, Origin.source(sequenceContext.getRoot()).owner(entityEntry).build()));
        if (!entityEntry.getEntity(Player.class).isPresent())
            return false;
        final Player player = entityEntry.getEntity(Player.class).get();
        /*
                         * Capture Collection
                         */
        final CaptureContainer captureContainer = captureRegistry.getContainer();
        final Optional<Location> initial = captureContainer.get(GuardianSequence.INITIAL_LOCATION);
        final Optional<Double> effectSpeedAmplifier = captureContainer.get(PotionEffectCapture.HORIZONTAL_SPEED_MODIFIER);
        final Optional<Double> materialSpeedAmplifier = captureContainer.get(MaterialCapture.SPEED_MODIFIER);
        final Optional<Double> horizontalOffset = captureContainer.get(ControlCapture.HORIZONTAL_DISTANCE);
        final Optional<Map<String, Integer>> activeControls = captureContainer.get(ControlCapture.ACTIVE_CONTROL_TICKS);
        if (!initial.isPresent() || !materialSpeedAmplifier.isPresent() || !horizontalOffset.isPresent())
            return false;
        long current = System.currentTimeMillis();
        // Gets the average between now and the last action.
        final double averageActionTime = ((current - lastActionTime) / 1000) / 0.05;
        if (averageActionTime < minimumTickRate) {
            detection.getLogger().warn("The server may be overloaded. A check could not be completed.");
            return false;
        } else if (averageActionTime > maximumTickRate) {
            return false;
        }
        if (player.get(Keys.VEHICLE).isPresent())
            return false;
        double intercept = analysisIntercept + (effectSpeedAmplifier.orElse(0d) / analysisTime);
        final Optional<Map.Entry<String, Integer>> validControlTicks = activeControls.get().entrySet().stream().max(Comparator.comparingInt(Map.Entry::getValue));
        // Gets the players horizontal displacement in the world.
        final double horizontalDisplacement = Math.abs((player.getLocation().getX() - initial.get().getX()) + (player.getLocation().getZ() - initial.get().getZ()));
        // Gets the percentage of the displacement that is the most important.
        final double maximumHorizontalDisplacement = validControlTicks.map(entry -> horizontalDisplacement * (entry.getValue() / averageActionTime)).orElse(horizontalDisplacement);
        // Gets the players maximum horizontal speed in the world, for this analysis.
        final double maximumHorizontalSpeed = (((horizontalOffset.get() * materialSpeedAmplifier.get()) / 2) / averageActionTime) + intercept;
        if (horizontalDisplacement <= 1 || maximumHorizontalDisplacement < 1 || maximumHorizontalSpeed < 1)
            return false;
        if (maximumHorizontalDisplacement > maximumHorizontalSpeed) {
            // ------------------------- DEBUG -----------------------------
            System.out.println(player.getName() + " has been caught using horizontal speed hacks. (" + (maximumHorizontalDisplacement - maximumHorizontalSpeed) + ")");
            // -------------------------------------------------------------
            SequenceReport report = new SequenceReport(true, Origin.source(sequenceContext.getRoot()).owner(entityEntry).build());
            report.put("type", "Horizontal Speed");
            report.put("information", Collections.singletonList("Overshot maximum movement by " + (maximumHorizontalDisplacement - maximumHorizontalSpeed) + "."));
            report.put("initial_location", initial.get());
            report.put("final_location", player.getLocation());
            report.put("severity", (maximumHorizontalDisplacement - maximumHorizontalSpeed) / maximumHorizontalDisplacement);
            summary.set(SequenceReport.class, report);
            return true;
        }
        return false;
    }, ConditionType.NORMAL).build(SequenceContext.builder().owner(detection).root(this).build());
}
Also used : GuardianSequenceBuilder(com.ichorpowered.guardian.sequence.GuardianSequenceBuilder) Summary(com.ichorpowered.guardianapi.detection.report.Summary) ContentKeys(com.ichorpowered.guardianapi.content.ContentKeys) Keys(org.spongepowered.api.data.key.Keys) GuardianValue(com.ichorpowered.guardian.util.item.mutable.GuardianValue) Origin(com.ichorpowered.guardianapi.event.origin.Origin) PotionEffectCapture(com.ichorpowered.guardian.common.capture.player.PotionEffectCapture) GuardianCaptureRegistry(com.ichorpowered.guardian.sequence.capture.GuardianCaptureRegistry) SequenceReport(com.ichorpowered.guardian.sequence.SequenceReport) Map(java.util.Map) ConditionType(com.abilityapi.sequenceapi.action.condition.ConditionType) Location(org.spongepowered.api.world.Location) GuardianSequence(com.ichorpowered.guardian.sequence.GuardianSequence) Event(org.spongepowered.api.event.Event) Set(java.util.Set) SequenceContext(com.abilityapi.sequenceapi.SequenceContext) Sets(com.google.common.collect.Sets) Check(com.ichorpowered.guardianapi.detection.check.Check) GuardianPlayerEntry(com.ichorpowered.guardian.entry.GuardianPlayerEntry) Detection(com.ichorpowered.guardianapi.detection.Detection) CommonContextKeys(com.ichorpowered.guardian.sequence.context.CommonContextKeys) CaptureContainer(com.ichorpowered.guardianapi.detection.capture.CaptureContainer) ControlCapture(com.ichorpowered.guardian.common.capture.player.ControlCapture) Optional(java.util.Optional) Player(org.spongepowered.api.entity.living.player.Player) SequenceBlueprint(com.abilityapi.sequenceapi.SequenceBlueprint) Comparator(java.util.Comparator) MaterialCapture(com.ichorpowered.guardian.common.capture.world.MaterialCapture) Collections(java.util.Collections) MoveEntityEvent(org.spongepowered.api.event.entity.MoveEntityEvent) Player(org.spongepowered.api.entity.living.player.Player) Optional(java.util.Optional) ControlCapture(com.ichorpowered.guardian.common.capture.player.ControlCapture) SequenceReport(com.ichorpowered.guardian.sequence.SequenceReport) GuardianPlayerEntry(com.ichorpowered.guardian.entry.GuardianPlayerEntry) GuardianPlayerEntry(com.ichorpowered.guardian.entry.GuardianPlayerEntry) MaterialCapture(com.ichorpowered.guardian.common.capture.world.MaterialCapture) PotionEffectCapture(com.ichorpowered.guardian.common.capture.player.PotionEffectCapture) CaptureContainer(com.ichorpowered.guardianapi.detection.capture.CaptureContainer) Summary(com.ichorpowered.guardianapi.detection.report.Summary) GuardianSequenceBuilder(com.ichorpowered.guardian.sequence.GuardianSequenceBuilder) Map(java.util.Map) GuardianCaptureRegistry(com.ichorpowered.guardian.sequence.capture.GuardianCaptureRegistry)

Example 10 with Event

use of org.spongepowered.api.event.Event in project guardian by ichorpowered.

the class InvalidCheck method getSequence.

@Nonnull
@Override
public SequenceBlueprint<Event> getSequence(final Detection detection) {
    final Double analysisTime = detection.getContentContainer().get(ContentKeys.ANALYSIS_TIME).orElse(GuardianValue.empty()).getDirect().orElse(0d) / 0.05;
    final Double minimumTickRate = detection.getContentContainer().get(ContentKeys.ANALYSIS_MINIMUM_TICK).orElse(GuardianValue.empty()).getDirect().orElse(0d) / 0.05;
    final Double maximumTickRate = detection.getContentContainer().get(ContentKeys.ANALYSIS_MAXIMUM_TICK).orElse(GuardianValue.empty()).getDirect().orElse(0d) / 0.05;
    return new GuardianSequenceBuilder().capture(new InvalidControlCapture(detection.getPlugin(), detection)).observe(MoveEntityEvent.class).observe(MoveEntityEvent.class).delay(analysisTime.intValue()).expire(maximumTickRate.intValue()).condition(sequenceContext -> {
        final GuardianPlayerEntry<Player> entityEntry = sequenceContext.get(CommonContextKeys.ENTITY_ENTRY);
        final Summary summary = sequenceContext.get(CommonContextKeys.SUMMARY);
        final GuardianCaptureRegistry captureRegistry = sequenceContext.get(CommonContextKeys.CAPTURE_REGISTRY);
        final long lastActionTime = sequenceContext.get(CommonContextKeys.LAST_ACTION_TIME);
        summary.set(SequenceReport.class, new SequenceReport(false, Origin.source(sequenceContext.getRoot()).owner(entityEntry).build()));
        if (!entityEntry.getEntity(Player.class).isPresent())
            return false;
        final Player player = entityEntry.getEntity(Player.class).get();
        /*
                         * Capture Collection
                         */
        final CaptureContainer captureContainer = captureRegistry.getContainer();
        Optional<Location> initial = captureContainer.get(GuardianSequence.INITIAL_LOCATION);
        Optional<Set<String>> invalidControls = captureContainer.get(InvalidControlCapture.INVALID_CONTROLS);
        if (!initial.isPresent() || !invalidControls.isPresent())
            return false;
        long current = System.currentTimeMillis();
        // Finds the average between now and the last action.
        double averageClockRate = ((current - lastActionTime) / 1000) / 0.05;
        if (averageClockRate < minimumTickRate) {
            detection.getLogger().warn("The server may be overloaded. A check could not be completed.");
            return false;
        } else if (averageClockRate > maximumTickRate) {
            return false;
        }
        if (invalidControls.get().isEmpty() || player.get(Keys.VEHICLE).isPresent())
            return false;
        // ------------------------- DEBUG -----------------------------
        System.out.println(player.getName() + " has been caught using invalid movement hacks.");
        // -------------------------------------------------------------
        SequenceReport report = new SequenceReport(true, Origin.source(sequenceContext.getRoot()).owner(entityEntry).build());
        report.put("type", "InvalidControlCapture Movement");
        report.put("information", Collections.singletonList("Received invalid controls of " + StringUtils.join((Set<String>) invalidControls.get(), ", ") + "."));
        report.put("initial_location", initial.get());
        report.put("final_location", player.getLocation());
        report.put("severity", 1d);
        summary.set(SequenceReport.class, report);
        return true;
    }, ConditionType.NORMAL).build(SequenceContext.builder().owner(detection).root(this).build());
}
Also used : GuardianSequenceBuilder(com.ichorpowered.guardian.sequence.GuardianSequenceBuilder) Summary(com.ichorpowered.guardianapi.detection.report.Summary) ContentKeys(com.ichorpowered.guardianapi.content.ContentKeys) Keys(org.spongepowered.api.data.key.Keys) StringUtils(org.apache.commons.lang3.StringUtils) GuardianValue(com.ichorpowered.guardian.util.item.mutable.GuardianValue) Origin(com.ichorpowered.guardianapi.event.origin.Origin) GuardianCaptureRegistry(com.ichorpowered.guardian.sequence.capture.GuardianCaptureRegistry) SequenceReport(com.ichorpowered.guardian.sequence.SequenceReport) Nonnull(javax.annotation.Nonnull) ConditionType(com.abilityapi.sequenceapi.action.condition.ConditionType) Location(org.spongepowered.api.world.Location) GuardianSequence(com.ichorpowered.guardian.sequence.GuardianSequence) Event(org.spongepowered.api.event.Event) InvalidControlCapture(com.ichorpowered.guardian.common.capture.player.InvalidControlCapture) Set(java.util.Set) SequenceContext(com.abilityapi.sequenceapi.SequenceContext) Sets(com.google.common.collect.Sets) Check(com.ichorpowered.guardianapi.detection.check.Check) GuardianPlayerEntry(com.ichorpowered.guardian.entry.GuardianPlayerEntry) Detection(com.ichorpowered.guardianapi.detection.Detection) CommonContextKeys(com.ichorpowered.guardian.sequence.context.CommonContextKeys) CaptureContainer(com.ichorpowered.guardianapi.detection.capture.CaptureContainer) Optional(java.util.Optional) Player(org.spongepowered.api.entity.living.player.Player) SequenceBlueprint(com.abilityapi.sequenceapi.SequenceBlueprint) Collections(java.util.Collections) MoveEntityEvent(org.spongepowered.api.event.entity.MoveEntityEvent) Player(org.spongepowered.api.entity.living.player.Player) MoveEntityEvent(org.spongepowered.api.event.entity.MoveEntityEvent) Set(java.util.Set) InvalidControlCapture(com.ichorpowered.guardian.common.capture.player.InvalidControlCapture) Optional(java.util.Optional) SequenceReport(com.ichorpowered.guardian.sequence.SequenceReport) GuardianPlayerEntry(com.ichorpowered.guardian.entry.GuardianPlayerEntry) CaptureContainer(com.ichorpowered.guardianapi.detection.capture.CaptureContainer) Summary(com.ichorpowered.guardianapi.detection.report.Summary) GuardianSequenceBuilder(com.ichorpowered.guardian.sequence.GuardianSequenceBuilder) GuardianCaptureRegistry(com.ichorpowered.guardian.sequence.capture.GuardianCaptureRegistry) Nonnull(javax.annotation.Nonnull)

Aggregations

Event (org.spongepowered.api.event.Event)13 Player (org.spongepowered.api.entity.living.player.Player)7 SequenceBlueprint (com.abilityapi.sequenceapi.SequenceBlueprint)5 SequenceContext (com.abilityapi.sequenceapi.SequenceContext)5 GuardianCaptureRegistry (com.ichorpowered.guardian.sequence.capture.GuardianCaptureRegistry)5 Origin (com.ichorpowered.guardianapi.event.origin.Origin)5 ConditionType (com.abilityapi.sequenceapi.action.condition.ConditionType)4 Sets (com.google.common.collect.Sets)4 GuardianPlayerEntry (com.ichorpowered.guardian.entry.GuardianPlayerEntry)4 GuardianSequence (com.ichorpowered.guardian.sequence.GuardianSequence)4 GuardianSequenceBuilder (com.ichorpowered.guardian.sequence.GuardianSequenceBuilder)4 SequenceReport (com.ichorpowered.guardian.sequence.SequenceReport)4 CommonContextKeys (com.ichorpowered.guardian.sequence.context.CommonContextKeys)4 Check (com.ichorpowered.guardianapi.detection.check.Check)4 ControlCapture (com.ichorpowered.guardian.common.capture.player.ControlCapture)3 PotionEffectCapture (com.ichorpowered.guardian.common.capture.player.PotionEffectCapture)3 GuardianValue (com.ichorpowered.guardian.util.item.mutable.GuardianValue)3 ContentKeys (com.ichorpowered.guardianapi.content.ContentKeys)3 Detection (com.ichorpowered.guardianapi.detection.Detection)3 CaptureContainer (com.ichorpowered.guardianapi.detection.capture.CaptureContainer)3