use of com.ichorpowered.guardian.common.capture.player.InvalidControlCapture 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());
}
Aggregations