Compare commits

...
11 Commits
Author SHA1 Message Date
Jones d85f2bc2d5 Release 2.1.47 (#578) 2026-05-09 13:47:52 +02:00
Jones 877e3630b7 Warn if the default support URL is used 2026-05-08 21:50:21 +02:00
Jones 0c4495e502 Automatically replace legacy support URL 2026-05-08 21:46:05 +02:00
Jones 8cb92bb074 Make individual check timings configurable 2026-05-08 21:45:19 +02:00
dependabot[bot] 89a07cd06e Bump com.github.ben-manes.caffeine:caffeine from 3.2.3 to 3.2.4 (#577)
Bumps [com.github.ben-manes.caffeine:caffeine](https://github.com/ben-manes/caffeine) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/ben-manes/caffeine/releases)
- [Commits](https://github.com/ben-manes/caffeine/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: com.github.ben-manes.caffeine:caffeine
  dependency-version: 3.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 13:45:11 +02:00
dependabot[bot] 698a611511 Bump gradle-wrapper from 9.4.1 to 9.5.0 (#576)
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.4.1 to 9.5.0.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.4.1...v9.5.0)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 17:09:26 +02:00
Jones 0f598bb1da Implement option to place map in offhand (https://github.com/jonesdevelopment/sonar/issues/574) 2026-04-29 17:39:11 +02:00
dependabot[bot] 1a8c1caa39 Bump org.projectlombok:lombok from 1.18.44 to 1.18.46 (#573)
Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.44 to 1.18.46.
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.44...v1.18.46)

---
updated-dependencies:
- dependency-name: org.projectlombok:lombok
  dependency-version: 1.18.46
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 09:31:57 +02:00
Jones c24fe4a4d9 [ci skip] Update homepage and documentation links 2026-04-26 15:15:46 +02:00
Jones 2da0cc6761 Use JdbcConnectionSource for H2 2026-04-24 23:51:22 +02:00
Jones 80b7726f18 Update security contact email 2026-04-23 20:45:37 +02:00
25 changed files with 123 additions and 78 deletions

No files matched your search

+2 -3
View File
@@ -30,9 +30,8 @@
> ### Notice about Sonar 3.0
>
> We're excited to announce the public release of Sonar 3.0.
> If you are interested, please check out https://sonar.top/. You can read more about what sets Sonar 3.0 apart from Sonar 2.0 [here](<https://docs.sonar.top/faq>).
> If you want more robust protection, better performance, and awesome new features, check out Sonar 3.0!
> If you want more robust protection, better performance, and awesome new features, check out Sonar 3.0 at https://sonar.top/!
> You can read more about what sets Sonar 3.0 apart from Sonar 2.0 [here](<https://sonar.top/docs/features>).
## Design and Goal
* Effective, lightweight, and easy-to-use
+1 -1
View File
@@ -13,7 +13,7 @@ If you discover a security vulnerability within Sonar, please follow these steps
## Contact
If you have any questions or concerns regarding the security of this project, please open a ticket on Discord or contact me via email at contact@jonesdev.xyz.
If you have any questions or concerns regarding the security of this project, please open a ticket on Discord or contact me via email at support@sonar.top.
## Acknowledgments
@@ -56,7 +56,7 @@ public final class AntiBot {
return shouldPerform(Sonar.get0().getConfig().getVerification().getMap().getTiming());
}
private static boolean shouldPerform(final SonarConfiguration.Verification.Timing timing) {
public static boolean shouldPerform(final SonarConfiguration.Verification.Timing timing) {
return timing == SonarConfiguration.Verification.Timing.ALWAYS
|| (timing == SonarConfiguration.Verification.Timing.DURING_ATTACK
&& Sonar.get0().getAttackTracker().getCurrentAttack() != null);
@@ -167,12 +167,12 @@ public final class SonarConfiguration {
Sonar.get0().getLogger().warn(" ");
}
verification.gravity.enabled = generalConfig.getBoolean("verification.checks.gravity.enabled");
verification.gravity.checkCollisions = generalConfig.getBoolean("verification.checks.collision.enabled");
verification.gravity.timing = Verification.Timing.valueOf(generalConfig.getString("verification.checks.gravity.timing"));
verification.gravity.collisionTiming = Verification.Timing.valueOf(generalConfig.getString("verification.checks.collision.timing"));
verification.gravity.captchaOnFail = generalConfig.getBoolean("verification.checks.gravity.captcha-on-fail");
verification.gravity.maxMovementTicks = clamp(generalConfig.getInt("verification.checks.gravity.max-movement-ticks"), 2, 100);
verification.vehicle.enabled = generalConfig.getBoolean("verification.checks.vehicle.enabled");
verification.vehicle.timing = Verification.Timing.valueOf(generalConfig.getString("verification.checks.vehicle.timing"));
verification.vehicle.minimumPackets = clamp(generalConfig.getInt("verification.checks.vehicle.minimum-packets"), 0, 20);
verification.map.timing = Verification.Timing.valueOf(generalConfig.getString("verification.checks.map-captcha.timing"));
@@ -181,6 +181,7 @@ public final class SonarConfiguration {
verification.map.maxTries = clamp(generalConfig.getInt("verification.checks.map-captcha.max-tries"), 1, 100);
verification.map.alphabet = generalConfig.getString("verification.checks.map-captcha.alphabet");
verification.map.backgroundImage = null;
verification.map.placeInOffhand = generalConfig.getBoolean("verification.checks.map-captcha.place-in-offhand");
final String backgroundPath = generalConfig.getString("verification.checks.map-captcha.background");
if (!backgroundPath.isEmpty()) {
@@ -252,7 +253,12 @@ public final class SonarConfiguration {
SonarCommand.prepareCachedTabSuggestions();
supportUrl = messagesConfig.getString("support-url");
supportUrl = messagesConfig.getString("support-url")
.replace("jonesdev.xyz", "sonar.top") // Migration: Replace legacy URL
.trim();
if (supportUrl.contains("://sonar.top/")) {
Sonar.get0().getLogger().warn("Consider entering a custom support URL (if applicable).");
}
header = MiniMessage.miniMessage().deserialize(
String.join("<newline>", messagesConfig.getStringList("header")),
Placeholder.unparsed("support-url", supportUrl),
@@ -374,19 +380,20 @@ public final class SonarConfiguration {
private int maxTries;
private String alphabet;
private File backgroundImage;
private boolean placeInOffhand;
}
@Getter
public static final class Gravity {
private boolean enabled;
private boolean checkCollisions;
private Timing timing;
private Timing collisionTiming;
private boolean captchaOnFail;
private int maxMovementTicks;
}
@Getter
public static final class Vehicle {
private boolean enabled;
private Timing timing;
private int minimumPackets;
}
@@ -20,6 +20,7 @@ package xyz.jonesdev.sonar.api.database.controller;
import com.alessiodp.libby.LibraryManager;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.jdbc.JdbcConnectionSource;
import com.j256.ormlite.jdbc.JdbcPooledConnectionSource;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.support.ConnectionSource;
@@ -93,10 +94,11 @@ public final class VerifiedPlayerController {
"?autoReconnect=true");
}
connectionSource = new JdbcPooledConnectionSource(jdbcURL,
Sonar.get0().getConfig().getGeneralConfig().getString("database.username"),
Sonar.get0().getConfig().getGeneralConfig().getString("database.password"),
cachedDatabaseType.getDatabaseType());
final String user = Sonar.get0().getConfig().getGeneralConfig().getString("database.username");
final String pass = Sonar.get0().getConfig().getGeneralConfig().getString("database.password");
connectionSource = cachedDatabaseType == SonarConfiguration.Database.Type.H2
? new JdbcConnectionSource(jdbcURL, user, pass, cachedDatabaseType.getDatabaseType())
: new JdbcPooledConnectionSource(jdbcURL, user, pass, cachedDatabaseType.getDatabaseType());
try {
TableUtils.createTableIfNotExists(connectionSource, VerifiedPlayer.class);
@@ -73,6 +73,10 @@ public class SonarPacketPreparer {
0, 36 + MAP_SLOT, 1, ItemType.FILLED_MAP, CompoundBinaryTag.builder()
.put("map", IntBinaryTag.intBinaryTag(0)) // map id
.build());
public static final SonarPacket CAPTCHA_SET_CONTAINER_SLOT_OFFHAND = new SetContainerSlotPacket(
0, 45, 1, ItemType.FILLED_MAP, CompoundBinaryTag.builder()
.put("map", IntBinaryTag.intBinaryTag(0)) // map id
.build());
public final static SonarPacket CAPTCHA_HELD_ITEM_SLOT = new SetHeldItemPacket(MAP_SLOT);
public final SonarPacket DEFAULT_ABILITIES = new PlayerAbilitiesPacket(0x00, 0, 0);
public final SonarPacket NO_MOVE_ABILITIES = new PlayerAbilitiesPacket(0x02, 0, 0);
@@ -20,6 +20,7 @@ package xyz.jonesdev.sonar.common.verification;
import org.jetbrains.annotations.NotNull;
import xyz.jonesdev.sonar.api.Sonar;
import xyz.jonesdev.sonar.api.antibot.SonarUser;
import xyz.jonesdev.sonar.api.antibot.protocol.ProtocolVersion;
import xyz.jonesdev.sonar.common.protocol.CaptchaPreparer;
import xyz.jonesdev.sonar.common.protocol.SonarPacket;
import xyz.jonesdev.sonar.common.protocol.map.MapCaptchaInfo;
@@ -43,9 +44,15 @@ public final class CaptchaHandler extends VerificationHandler {
this.tries = Sonar.get0().getConfig().getVerification().getMap().getMaxTries();
// We may not be on slot 4, so we need to make sure to synchronize the current slot
user.delayedWrite(CAPTCHA_HELD_ITEM_SLOT);
user.delayedWrite(CAPTCHA_SET_CONTAINER_SLOT);
final boolean placeInOffhand = Sonar.get().getConfig().getVerification().getMap().isPlaceInOffhand()
&& user.getProtocolVersion().greaterThanOrEquals(ProtocolVersion.MINECRAFT_1_9);
if (placeInOffhand) {
user.delayedWrite(CAPTCHA_SET_CONTAINER_SLOT_OFFHAND);
} else {
// We may not be on slot 4, so we need to make sure to synchronize the current slot
user.delayedWrite(CAPTCHA_HELD_ITEM_SLOT);
user.delayedWrite(CAPTCHA_SET_CONTAINER_SLOT);
}
// Send random captcha to the player
final MapCaptchaInfo captcha = CaptchaPreparer.getRandomCaptcha();
this.answer = captcha.getAnswer().toLowerCase();
@@ -19,6 +19,7 @@ package xyz.jonesdev.sonar.common.verification;
import org.jetbrains.annotations.NotNull;
import xyz.jonesdev.sonar.api.Sonar;
import xyz.jonesdev.sonar.api.antibot.AntiBot;
import xyz.jonesdev.sonar.api.antibot.SonarUser;
import xyz.jonesdev.sonar.api.antibot.protocol.ProtocolVersion;
import xyz.jonesdev.sonar.common.protocol.SonarPacket;
@@ -38,8 +39,10 @@ public final class GravityHandler extends VerificationHandler {
// Bedrock users start falling immediately
this.canFall = user.isGeyser();
// We don't want to check Geyser players for valid gravity, as this might cause issues because of the protocol
this.enableGravityCheck = !user.isGeyser() && Sonar.get0().getConfig().getVerification().getGravity().isEnabled();
this.enableCollisionsCheck = !user.isGeyser() && Sonar.get0().getConfig().getVerification().getGravity().isCheckCollisions();
this.enableGravityCheck = !user.isGeyser() && AntiBot.shouldPerform(
Sonar.get0().getConfig().getVerification().getGravity().getTiming());
this.enableCollisionsCheck = !user.isGeyser() && AntiBot.shouldPerform(
Sonar.get0().getConfig().getVerification().getGravity().getCollisionTiming());
// First, write the JoinGame packet to the buffer
user.delayedWrite(joinGame);
@@ -19,6 +19,7 @@ package xyz.jonesdev.sonar.common.verification;
import org.jetbrains.annotations.NotNull;
import xyz.jonesdev.sonar.api.Sonar;
import xyz.jonesdev.sonar.api.antibot.AntiBot;
import xyz.jonesdev.sonar.api.antibot.SonarUser;
import xyz.jonesdev.sonar.api.antibot.protocol.ProtocolVersion;
import xyz.jonesdev.sonar.common.protocol.SonarPacket;
@@ -163,7 +164,8 @@ public final class ProtocolHandler extends VerificationHandler {
private void markSuccess() {
// Pass the player to the next best verification handler
if (!user.isGeyser() && Sonar.get0().getConfig().getVerification().getVehicle().isEnabled()) {
if (!user.isGeyser()
&& AntiBot.shouldPerform(Sonar.get0().getConfig().getVerification().getVehicle().getTiming())) {
user.channel().pipeline().get(SonarPacketDecoder.class).setListener(new VehicleHandler(user));
} else if (user.isForceCaptcha() || Sonar.get0().getAntiBot().shouldPerformCaptcha()) {
user.channel().pipeline().get(SonarPacketDecoder.class).setListener(new CaptchaHandler(user));
@@ -80,7 +80,7 @@ verification:
# Všechny předpokládané pohyby jsou předpočítány, kvůli ušetření výkonu
gravity:
# Měl by Sonar zkoušet pro gravitaci hráče (Doporučováno)
enabled: true
timing: ALWAYS
# Měl by Sonar přimět hráče, aby vyřešil CAPTCHA, pokud neuspějí při kontrole gravitace?
captcha-on-fail: false
# Maximální počet ticků, který má hráč padat aby byl puštěn na verifikační platformu
@@ -89,12 +89,12 @@ verification:
# Kontroluje, zda hráč naráží do bloků, které se vytvořily pod ním
collision:
# Měl by Sonar zkoušet jestli se hráč dotýka bloku? (Doporučováno)
enabled: true
timing: ALWAYS
# Kontroluje, zda klient odesílá správné pakety při montáži vozidla
vehicle:
# Měl by sonar kontrolovat, zda hráč správně vstoupil na loď?
enabled: true
timing: ALWAYS
# Minimální počet paketů odeslaných klientem
minimum-packets: 2
@@ -125,6 +125,9 @@ verification:
# Znaky (čísla a písmena), které jsou povoleny k zobrazování v CAPTCHE
# Nedoporučuje se přidávat čísla nebo písmena, která by se mohla navzájem podobat
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Zkouší pokuď hráč posílá správný "client brand packet" serveru
client-brand:
@@ -77,7 +77,7 @@ verification:
# Alle vorhergesagten Bewegungen werden vorausberechnet, um die Leistung zu sparen
gravity:
# Soll Sonar auf gültige Client-Gravitation prüfen? (Empfohlen)
enabled: true
timing: ALWAYS
# Soll Sonar den Spieler dazu bringen, ein CAPTCHA zu lösen, wenn er die Schwerkraftprüfung nicht besteht?
captcha-on-fail: false
# Maximale Anzahl an Ticks, die der Spieler fallen muss, um die Plattform erreichen zu dürfen
@@ -86,12 +86,12 @@ verification:
# Prüft, ob der Spieler mit Blöcken kollidiert, die unter ihm gespawnt sind
collision:
# Soll Sonar prüfen, ob der Spieler mit Blöcken kollidiert? (Empfohlen)
enabled: true
timing: ALWAYS
# Überprüft, ob der Spieler beim Einsteigen in ein Boot die richtigen Pakete sendet
vehicle:
# Sollte Sonar prüfen, ob der Spieler richtig in ein Fahrzeug einsteigt?
enabled: true
timing: ALWAYS
# Mindestanzahl der vom Client gesendeten Pakete
minimum-packets: 2
@@ -122,6 +122,9 @@ verification:
# Zeichen (Buchstaben und Zahlen), die im Antwort-CAPTCHA erscheinen dürfen
# Es wird nicht empfohlen, Zahlen oder Buchstaben hinzuzufügen, die einander ähneln könnten
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Überprüft, ob die Spieler eine gültige Client-Marke an den Server senden
client-brand:
@@ -79,7 +79,7 @@ verification:
# All predicted motions are precalculated to save performance
gravity:
# Should Sonar check for valid client gravity? (Recommended)
enabled: true
timing: ALWAYS
# Should Sonar make the player solve a CAPTCHA if they fail the gravity check?
captcha-on-fail: false
# The number of ticks the player has to fall to be allowed to hit the platform
@@ -88,12 +88,12 @@ verification:
# Checks if the player is colliding with blocks spawned below them
collision:
# Should Sonar check if the player collides with blocks? (Recommended)
enabled: true
timing: ALWAYS
# Checks if the client sends proper packets when entering a boat
vehicle:
# Should Sonar check if the player properly enters a boat?
enabled: true
timing: ALWAYS
# Minimum number of packets sent by the client
minimum-packets: 2
@@ -125,6 +125,9 @@ verification:
# It is not recommended to add numbers or letters that might look like one another.
# You should only edit this if you know what you're doing
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Checks if the players are sending a valid client brand to the server
client-brand:
@@ -79,7 +79,7 @@ verification:
# Tous les mouvements prévus sont précalculés afin d'économiser les performances
gravity:
# Sonar devrait-il vérifier la gravité du client ? (Recommandé)
enabled: true
timing: ALWAYS
# Sonar devrait-il faire résoudre un CAPTCHA au joueur s'il échoue à la vérification de la gravité ?
captcha-on-fail: false
# Nombre maximum de ticks que le joueur a pour tomber avant de pouvoir toucher la plateforme
@@ -88,12 +88,12 @@ verification:
# Vérifie si le joueur entre en collision avec les blocs apparus en dessous de lui
collision:
# Sonar devrait-il vérifier si le joueur entre en collision avec des blocs ? (Recommandé)
enabled: true
timing: ALWAYS
# Vérifie si le client envoie les paquets appropriés lorsqu'il monte dans un véhicule
vehicle:
# Sonar devrait-il vérifier si le joueur entre correctement dans un bateau ?
enabled: true
timing: ALWAYS
# Nombre minimum de paquets envoyés par le client
minimum-packets: 2
@@ -124,6 +124,9 @@ verification:
# Caractères (lettres et chiffres) autorisés à apparaître dans la réponse au CAPTCHA
# Il n'est pas recommandé d'ajouter des chiffres ou des lettres qui pourraient se ressembler
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Vérifie si le joueur envoie une marque client valide au serveur
client-brand:
@@ -79,7 +79,7 @@ verification:
# ყველა პროგნოზირებული მოძრაობა წინასწარ არის გათვლილი შესრულების სისწრაფის შესანარჩუნებლად
gravity:
# უნდა შეამოწმოს თუ არა Sonar-მა მოთამაშის (ან ბოტის) გრავიტაცია? (რეკომენდებულია)
enabled: true
timing: ALWAYS
# უნდა აიძულოს თუ არა Sonar-მა მოთამაშეს შეასრულოს CAPTCHA, თუ ისინი ვერ შეასრულებენ სიმძიმის შემოწმებას?
captcha-on-fail: false
# ტიკების მაქსიმალური რაოდენობა რომელითაც მოთამაშე უნდა დაეცეს, რათა პლატფორმაზე დაცემა შეეძლოს. (20 ტიკი = 1 წამი)
@@ -88,12 +88,12 @@ verification:
# ამოწმებს, ეჯახება თუ არა მოთამაშე მათ ქვემოთ წარმოქმნილ ბლოკებს
collision:
# უნდა შეამოწმოს თუ არა Sonar-მა, ეტაკება თუ არა მოთამაშე ბლოკებს? (რეკომენდებულია)
enabled: true
timing: ALWAYS
# ამოწმებს, აგზავნის თუ არა კლიენტი შესაბამის პაკეტებს სატრანსპორტო საშუალებაზე დაჯდომის დროს
vehicle:
# უნდა შეამოწმოს თუ არა სონარმა მოთამაშე სწორად შესული თუ არა ნავში?
enabled: true
timing: ALWAYS
# კლიენტის მიერ გაგზავნილი პაკეტების მინიმალური რაოდენობა
minimum-packets: 2
@@ -124,6 +124,9 @@ verification:
# სიმბოლოები (ასოები და რიცხვები), რომლებიც დაშვებულია გამოჩნდეს CAPTCHA-ს პასუხში
# არ არის რეკომენდებული რიცხვების ან ასოების დამატება, რომლებიც შეიძლება ერთმანეთს ჰგავდეს
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# ამოწმებს, აგზავნიან თუ არა მოთამაშეები სერვერზე რეალურ მოთამაშის მეტსახელს
client-brand:
@@ -79,7 +79,7 @@ verification:
# Alle voorspelde bewegingen worden vooraf berekend om prestaties te besparen
gravity:
# Moet Sonar controleren op geldige zwaartekracht van de cliënt? (Aanbevolen)
enabled: true
timing: ALWAYS
# Moet Sonar de speler een CAPTCHA laten oplossen als hij niet slaagt voor de zwaartekracht controle?
captcha-on-fail: false
# Maximaal aantal ticks dat de speler moet laten vallen om het platform te mogen raken
@@ -88,12 +88,12 @@ verification:
# Controleert of de speler botst met blokken die onder hem zijn gespawned
collision:
# Moet Sonar controleren of de speler tegen blokken botst? (Aanbevolen)
enabled: true
timing: ALWAYS
# Controleert of de klant de juiste pakketten verzendt bij het monteren van een voertuig
vehicle:
# Moet Sonar controleren of de speler goed in een boot stapt?
enabled: true
timing: ALWAYS
# Minimaal aantal pakketten verzonden door de cliënt
minimum-packets: 2
@@ -124,6 +124,9 @@ verification:
# Tekens (letters en cijfers) die mogen voorkomen in het antwoord op de CAPTCHA
# Het wordt niet aanbevolen om cijfers of letters toe te voegen die op elkaar lijken
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Controleert of de speler een geldig Minecraft-klantmerk naar de server verzendt
client-brand:
@@ -79,7 +79,7 @@ verification:
# Wszystkie przewidywane ruchy są wstępnie obliczane w celu zachowania wydajności
gravity:
# Czy Sonar powinien sprawdzać poprawność grawitacji gracza? (Zalecane)
enabled: true
timing: ALWAYS
# Czy Sonar powinien zmusić gracza do rozwiązania CAPTCHA, jeśli nie uda mu się przejść testu grawitacji?
captcha-on-fail: false
# Maksymalna liczba tików, po których gracz musi spaść, aby móc uderzyć w platformę.
@@ -88,12 +88,12 @@ verification:
# Sprawdza, czy gracz zderza się z blokami, które pojawiły się pod nim
collision:
# Czy Sonar powinien sprawdzać, czy gracz zderza się z blokami? (Zalecane)
enabled: true
timing: ALWAYS
# Sprawdza, czy gracz wysyła odpowiednie pakiety podczas umieszczania na pojeździe.
vehicle:
# Czy Sonar powinien sprawdzać, czy gracz prawidłowo wsiada do łodzi?
enabled: true
timing: ALWAYS
# Minimalna liczba pakietów wysłanych przez klienta
minimum-packets: 2
@@ -124,6 +124,9 @@ verification:
# Znaki (litery i cyfry), które mogą pojawić się w CAPTCHA
# Nie zaleca się dodawania cyfr lub liter, które mogą być do siebie podobne
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Sprawdza, czy gracz wysyła prawidłowy client brand do serwera.
client-brand:
@@ -78,7 +78,7 @@ verification:
# Todos os movimentos previstos são pré-calculados para economizar desempenho
gravity:
# O Sonar deve verificar a gravidade do cliente? (Recomendado)
enabled: true
timing: ALWAYS
# O Sonar deve fazer o jogador resolver um CAPTCHA se falhar na verificação de gravidade?
captcha-on-fail: false
# O número de ticks que o jogador deve cair para ser permitido atingir a plataforma
@@ -87,12 +87,12 @@ verification:
# Verifica se o jogador está colidindo com blocos gerados abaixo dele
collision:
# O Sonar deve verificar se o jogador colide com blocos? (Recomendado)
enabled: true
timing: ALWAYS
# Verifica se o cliente envia pacotes adequados ao entrar em um barco
vehicle:
# O Sonar deve verificar se o jogador entra corretamente em um barco?
enabled: true
timing: ALWAYS
# Número mínimo de pacotes enviados pelo cliente
minimum-packets: 2
@@ -124,6 +124,9 @@ verification:
# Não é recomendável adicionar números ou letras que possam parecer semelhantes.
# Você deve editar isso apenas se souber o que está fazendo
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Verifica se os jogadores estão enviando uma marca de cliente válida para o servidor
client-brand:
@@ -79,7 +79,7 @@ verification:
# Все предсказанные движения предварительно просчитываются для экономии производительности
gravity:
# Должен ли Sonar проверять наличие действительной гравитации клиента? (Рекомендуется)
enabled: true
timing: ALWAYS
# Должен ли Sonar заставлять игрока решать CAPTCHA, если он не проходит проверку на гравитацию?
captcha-on-fail: false
# Максимальное количество тиков, на которое должен упасть игрок, чтобы ему было разрешено упасть на платформу
@@ -88,12 +88,12 @@ verification:
# Проверяет, сталкивается ли игрок с блоками, порожденными под ним
collision:
# Должен ли Sonar проверять, сталкивается ли игрок с блоками? (Рекомендуется)
enabled: true
timing: ALWAYS
# Проверяет, отправляет ли клиент правильные пакеты при садке на транспортное средство
vehicle:
# Должен ли сонар проверять, правильно ли игрок входит в лодку?
enabled: true
timing: ALWAYS
# Минимальное количество пакетов, отправляемых клиентом
minimum-packets: 2
@@ -123,6 +123,9 @@ verification:
# Символы (буквы и цифры), которые разрешено использовать в ответе на капчу
# Не рекомендуется добавлять цифры или буквы, которые могут быть похожи друг на друга
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# Проверяет, отправляет ли игрок на сервер действительный клиентский бренд.
client-brand:
@@ -78,7 +78,7 @@ verification:
# 检查玩家的下落移动是否遵循原版客户端.
gravity:
# Sonar 是否应该检查玩家的下落移动? (推荐启用)
enabled: true
timing: ALWAYS
# 当玩家验证失败时 是否向他们发送地图验证码?
captcha-on-fail: false
# 玩家跌落在平台上多少tick后才能被算作站在平台上?
@@ -87,12 +87,12 @@ verification:
# 检查玩家是否可以正确地站在方块上
collision:
# Sonar 是否应该生成方块平台以检查玩家下落与方块之间的碰撞? (推荐启用)
enabled: true
timing: ALWAYS
# 检查客户端坐在实体上时是否发送了正确的数据包
vehicle:
# Sonar 是否应该让玩家坐在实体上, 以便检查他们的数据包是否合法?
enabled: true
timing: ALWAYS
# 客户端需要发送的所需的最小数据包数量
minimum-packets: 2
@@ -122,6 +122,9 @@ verification:
# 允许出现在验证码答案中的字符
# 不建议添加可能看起来彼此相似的数字或字母
alphabet: 'abcdefhjkmnoprstuxyz'
# Should Sonar place the map in the player's offhand?
# This only works on Minecraft 1.9 and above.
place-in-offhand: false
# 检查玩家是否正在向服务器发送有效的客户端标识符
client-brand:
+1 -1
View File
@@ -1,3 +1,3 @@
group=xyz.jonesdev
version=2.1.46
version=2.1.47
description=A lightweight, effective, and easy-to-use anti-bot plugin for Velocity, BungeeCord, and Bukkit.
+2 -2
View File
@@ -30,11 +30,11 @@ bstats-bungee = { module = "org.bstats:bstats-bungeecord", version.ref = "bstats
bstats-bukkit = { module = "org.bstats:bstats-bukkit", version.ref = "bstats" }
bstats-velocity = { module = "org.bstats:bstats-velocity", version.ref = "bstats" }
imagefilters = "com.jhlabs:filters:2.0.235-1"
caffeine = "com.github.ben-manes.caffeine:caffeine:3.2.3"
caffeine = "com.github.ben-manes.caffeine:caffeine:3.2.4"
annotations = "org.jetbrains:annotations:26.1.0"
simpleyaml = "com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4"
ormlite = "com.j256.ormlite:ormlite-jdbc:6.1"
lombok = "org.projectlombok:lombok:1.18.44"
lombok = "org.projectlombok:lombok:1.18.46"
bungeecord = "net.md-5:bungeecord-proxy:26.1-R0.1-SNAPSHOT"
velocity = "io.papermc.velocity:velocity-proxy:3.5.0-SNAPSHOT"
paper = "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT"
Binary file not shown.
+3 -1
View File
@@ -1,7 +1,9 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip
networkTimeout=10000
retries=0
retryBackOffMs=500
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+1 -1
View File
@@ -57,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
Vendored Executable → Regular
+10 -21
View File
@@ -23,8 +23,8 @@
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Set local scope for the variables, and ensure extensions are enabled
setlocal EnableExtensions
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@@ -51,7 +51,7 @@ echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
"%COMSPEC%" /c exit 1
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
@@ -65,7 +65,7 @@ echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
"%COMSPEC%" /c exit 1
:execute
@rem Setup the command line
@@ -73,21 +73,10 @@ goto fail
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
@rem which allows us to clear the local environment before executing the java command
endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
:exitWithErrorLevel
@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
"%COMSPEC%" /c exit %ERRORLEVEL%