Compare commits

...
Author SHA1 Message Date
Axionize 17f01fb067 Fix builds erroring from being unable to fetch GrimAPI 2025-04-22 21:16:09 -04:00
52f3c6a998 [Upstream] Merged Upstream && Fixed Merge Conflicts (#81)
Last commit before rewrite

* Fix teleports on 1.21.4, fixes #1923

* flag invalid click types

* remove temp fix for trial spawners

* Merge pull request #2058 from Cyramek/consumable

handle consumable component [1.21.2+]

* bump minimessage

* fix legacy color codes not resetting formatting

* fix reset-item-usage-on-item-update breaking vanilla behavior

* forgot reset would reset non-decorations

* fix brand detection with legacy servers and modern clients

* fix &0

* Fix vehicle desync when demounting too fast

* remove misleading comment

* bump packetevents

* Fix NullPointerException

* fix build

* fix 1.18+ world reader

* Update Gradle wrapper and add validation workflow step

* Bump version

* Bump setup-gradle to v4

* Fix deprecation...

* Workflows are fun!

* Fixed: Merge Mistake while fixing conflicts

* Fixed: Mapping issue when grabbing the paintingVariant from the paintingRegistryData

---------

Co-authored-by: SamB440 <sam@islandearth.net>
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
Co-authored-by: Cyramek <xcyramek@gmail.com>
Co-authored-by: Packsolite <packsolite@gmail.com>
2025-04-22 15:10:59 -04:00
Axionize 45766c5265 Flag unknown click types 2025-03-31 08:40:59 -04:00
Axionize 4d8f6b5f50 Make buildscript use custom PE fixing numerous existing errors; merge merge-dev 2025-03-30 17:31:59 -04:00
Axionize 8acf512c80 Merge remote-tracking branch 'fork/merge-dev' into merge
# Conflicts:
#	build.gradle.kts
#	src/main/java/ac/grim/grimac/commands/GrimSpectate.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BoundingBoxSize.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BukkitNMS.java
2025-03-30 13:11:13 -04:00
Axionize deff13deb6 Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	.github/workflows/gradle-publish.yml
#	build.gradle.kts
#	src/main/java/ac/grim/grimac/checks/impl/breaking/FastBreak.java
#	src/main/java/ac/grim/grimac/commands/GrimSpectate.java
#	src/main/java/ac/grim/grimac/events/packets/PacketEntityReplication.java
#	src/main/java/ac/grim/grimac/events/packets/PacketPlayerAttack.java
#	src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntity.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BukkitNMS.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/GetBoundingBox.java
#	src/main/java/ac/grim/grimac/utils/team/TeamHandler.java
#	src/main/resources/punishments/it.yml
#	src/main/resources/punishments/ja.yml
2025-03-29 06:42:13 -04:00
AoElite 32c75c78b0 Merge pull request #2038 from 483378/fix/copper-door-falses
Fix copper door falses
2025-03-23 08:35:18 -04:00
Axionize b71c11882a Fix rare AirLiquidBreak NPE 2025-03-23 00:52:38 -04:00
ManInMyVan 990efdd6d2 fix a noslow 2025-03-22 15:31:21 -06:00
ManInMyVan 3c89193fff rename mitigate-autoblock and mitigate-desync-noslow 2025-03-22 15:25:49 -06:00
SamB440 aff9dc3c25 Merge pull request #2030 from Dream23322/patch-1
Update README.md
2025-03-22 18:43:15 +00:00
ManInMyVan 6b17d5fd0e fix spectate command 2025-03-19 16:06:07 -06:00
SamB440 319dca27ae Use single runnable for multi block changes 2025-03-19 14:24:27 +00:00
SamB440 5d20372645 Fix 1.21.2+ item cooldown
How to make simple feature more complex?
2025-03-14 18:26:39 +00:00
ManInMyVan 74108a2088 fix #1962 2025-03-14 11:56:23 -06:00
Cyramek aab710dd8b Fix Block Collisions [1.21.2+] (#2015) 2025-03-11 08:51:52 -04:00
Axionize 39a034d92c Fix firework rocket hitbox modeling 2025-03-06 16:42:13 -05:00
483378 4a65251817 Fix copper door falses 2025-03-04 22:29:29 +01:00
Axionize 80b196cac0 Fix upstream sillyness 2025-03-02 15:49:40 -05:00
SamB440 1fb1a73060 Fix teleport check 2025-03-02 20:37:41 +00:00
ManInMyVan 6811bc71fc Merge pull request #2033 from 483378/2.0
AimModulo360: fix horse false flag <= 1.13
2025-03-02 11:18:14 -07:00
SamB440 6205a23edd Merge pull request #2034 from 483378/Add-Hitboxes-to-punishments-config
Add Hitboxes to punishments config
2025-03-02 13:33:44 +00:00
483378 2f844bc56e Add Hitboxes to punishments config 2025-03-02 11:59:17 +01:00
483378 5ca4082675 AimModulo360: fix horse false flag <= 1.13 2025-03-02 10:59:51 +01:00
ManInMyVan 078bc139f7 revert changes from 68a04d05 and 45da02e7
it could be bypassed
2025-03-01 12:49:11 -07:00
Me. 37d07d3b03 Update README.md 2025-03-01 11:01:31 +10:00
SamB440 5bccfe831d Fix not reencoding stupidity packet 2025-02-28 14:31:41 +00:00
Axionize 42576f10ce Update and Fix minor HitBox modeling issues
- Update upstream to 3fbaa0a0e6
- Fix Villager HitBox being incorrect for 1.8 clients and Slimes with {Size: 0} being modeled incorrectly in modern Minecraft
2025-02-26 18:49:36 -05:00
Axionize 328e031c1b Fix 1.8 Villager and Modern Slime {Size: 0} hitboxes 2025-02-26 18:39:43 -05:00
Axionize 0bc781f390 Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/commands/GrimSpectate.java
2025-02-26 14:46:57 -05:00
ManInMyVan 3fbaa0a0e6 why does OnlinePlayer exist 2025-02-23 10:42:20 -07:00
SamB440 931d26569c Don't need to throw 2025-02-23 12:42:05 +00:00
SamB440 b207fe233e Add option to debug packet cancelling 2025-02-22 20:40:23 +00:00
SamB440 0cc0910455 Merge pull request #2019 from Cyramek/water-push-fix
fix water flow push [1.21.4]
2025-02-22 19:25:09 +00:00
cyramek b5acee4911 fix water flow push 2025-02-22 20:04:57 +01:00
ManInMyVan ccada109b1 include "ms" in fastbreak verbose 2025-02-21 17:30:59 -07:00
ManInMyVan 16c0d37b54 include block type in fastbreak verbose 2025-02-21 17:30:16 -07:00
ManInMyVan f6c16ea567 make fastbreak verbose case consistent 2025-02-21 17:29:33 -07:00
ManInMyVan b9934f5130 same with tridents and debug sticks 2025-02-21 17:18:05 -07:00
ManInMyVan 3c48b6edab creative mode players cannot mine with a mace 2025-02-21 17:10:14 -07:00
ManInMyVan fdf8bc26a5 very minor changes 2025-02-21 16:07:00 -07:00
AoElite 900cbed5fa update api 2025-02-19 07:06:28 -05:00
Axionize ab6920c300 - Update upstream 233cd2a7d7
- Attempt to fix HitboxEntity/Block AssertionError & some more AirLiquidPlace falses
2025-02-19 04:54:34 -05:00
Axionize c7f4bd15d2 Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	.github/workflows/gradle-publish.yml
#	build.gradle.kts
2025-02-19 03:33:51 -05:00
SamB440 233cd2a7d7 Fix TAB server version check 2025-02-17 21:00:46 +00:00
AoElite 0c8b60018a build with Java 21 2025-02-14 03:14:54 -05:00
AoElite a54787152d bump deepsource runtime version to 17 2025-02-14 03:11:19 -05:00
AoElite 2932f0a40c handle end tick support for folia better & try to use paper's end tick event if reflection fails 2025-02-14 03:08:37 -05:00
AoElite 94d47391af correct wrong method name 2025-02-14 02:55:08 -05:00
AoElite 9964478ce1 added a better way to log exceptions 2025-02-14 02:33:38 -05:00
AoElite d3667e1add use teleportAsync when possible, this also should fix the spectating command not working on folia 2025-02-14 02:28:17 -05:00
Axionize 9af7a7267e Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/nmsutil/BukkitNMS.java
2025-02-13 23:45:31 -05:00
ManInMyVan 04e1459d9e Merge pull request #2006 from ManInMyVan/fix/item-reset-exceptions
fix exceptions caused by resetting item usage async
2025-02-13 12:09:15 -07:00
Axionize 3ff9e774cd Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntity.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/GetBoundingBox.java
2025-02-13 13:24:10 -05:00
Axionize 36e5eb9304 Attempt to fix HitboxEntity/Block AssertionError & some more AirLiquidPlace falses 2025-02-13 11:53:14 -05:00
ManInMyVan e99855bdc5 inline the class field 2025-02-12 15:54:59 -07:00
Axionize b7c9deef83 Fix painting hitboxes and lite version adventure/packetevent errors:
- Temporarily around errors with Painting Hitboxes on older (pre 1.19?) clients
- Fix adventure shading errors with lite version by excluding it from being relocated in the lite version
2025-02-12 15:05:33 -05:00
Axionize 0d2940c34a Make painting hitbox code 1.19+ 2025-02-12 15:01:05 -05:00
Axionize a793912337 Get rid of debugging prints 2025-02-12 14:17:31 -05:00
Axionize d1194223ab Temporary workaround to NPE if paintingVariant registry doesn't have paintings for client version 2025-02-12 14:16:30 -05:00
Axionize 0624b117b5 Attempt to fix adventure shading issue with PE in lite mode 2025-02-12 14:15:27 -05:00
ManInMyVan 028a526c51 fix exceptions caused by resetting item usage async 2025-02-12 12:10:22 -07:00
SamB440 9650cdb4f2 Entity pushing fixes and performance improvement 2025-02-12 16:03:24 +00:00
GigaZelensky 5326845c7a Add Custom Setback Violation Threshold (#2001)
* Add Custom Setback Violation Threshold

This change introduces a configurable threshold for setbacks, allowing more flexibility in how violations are handled. It can be useful in multiple scenarios, such as integrating Grim with other anti-cheat systems like Vulcan. By delaying setbacks, more obvious cheats (e.g., flying) can be detected and handled by other systems first, preventing unnecessary interference that might limit their effectiveness.

Additionally, this feature helps reduce the impact of small false positives or minor violations on legitimate players, ensuring that occasional detection inaccuracies don’t result in unnecessary movement corrections.

The option is set to 1 by default to maintain the existing behavior, but it can be adjusted in the config for more customized handling.

* Update en.yml

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold

* Update ja.yml

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold

* Update tr.yml

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold

* Update config to match custom Setback Violation Threshold
2025-02-12 15:09:01 +00:00
Axionize 7fed456871 - Fix HitboxEntity falses caused by wrong hitbox modeling for Falling Blocks and Paintings
- Painting hitboxes only tested on 1.21. Any issues with other versions should be reported and fixed in a subsequent release.
- Fix upstream thread exception when accessing bukkit methods from netty threads
- Fix PacketEvents version check error message

Note: **If you are using the lite version**, fully fixing the falses with paintings requires merging in PRs from PacketEvents that are not in upstream yet. You can use use PE built from this PR: https://github.com/retrooper/packetevents/pull/1134 in the meantime.
2025-02-11 07:52:52 -05:00
Axionize 5f4ec6a1a7 Fix modeling hitbox of Paintings in 1.21 2025-02-11 07:48:20 -05:00
Axionize 3c400f1eeb Dirty hack to fix calculating hitboxes for paintings 2025-02-10 15:04:38 -05:00
Axionize f6dba5ee8e Fix modeling hitbox of Falling Blocks 2025-02-10 12:58:41 -05:00
Axionize 8b3cbab3ad Fix thread exception when accessing bukkit methods from netty threads 2025-02-10 12:50:09 -05:00
Axionize c0e6ae7ec6 Make PacketEventsInit version check use NEWEST_UNSUPPORTED_PE_VERSION instead of hard coding it 2025-02-09 06:26:11 -05:00
Axionize 6a5772b26b HitboxBlock improvements, add build automation and more compile-time options
- Attempt to fix a rare HitboxBlocks false
- Automatically build new releases from commits made on `merge` branch with GitHub Actions
- Add new build option to build jar without shading PE and automatically push releases with non-shaded PE as alternate jar which can be downloaded on a releases's page on Modrinth
2025-02-09 06:14:20 -05:00
Axionize 71d6d9e33f Fix build script 2025-02-09 06:08:27 -05:00
Axionize 0508bd98ba Fix build script 2025-02-09 05:57:50 -05:00
Axionize 5b9efc0ea5 Fix build script 2025-02-09 05:53:11 -05:00
Axionize a3812b2546 Exempt recently changed blocks as a temporary hack for HitboxBlocks 2025-02-09 05:47:41 -05:00
Axionize 05fb233f0e Build two jars, one with PE one ewithout 2025-02-09 04:53:14 -05:00
Axionize e15277d58d Add support for building Grim without shading PE as a build option 2025-02-09 03:45:54 -05:00
Axionize 177ae4cbfa Fix Remy's build mistakes #1 2025-02-09 00:51:33 -05:00
Axionize c1db1479b6 Fix merge issues with updating SprintC 2025-02-08 13:18:12 -05:00
Axionize 7646df0563 Fix a rare CME in LatencyUtils (#1984) 2025-02-08 12:53:02 -05:00
Axionize 23369cf1d6 Fix modeling teleport packets for entities on clients < 1.16.2 (#1985)
* Fix modeling teleport packets for entities on clients < 1.16.2
* Fix new entity modeling to handle riding entities
* Fix merge issues from backporting
2025-02-08 12:52:24 -05:00
RejomyandRejomy 86f89c010d Fix github actions failing due to incorrect path to the jar. (#53)
Co-authored-by: Rejomy <gg@gg.gg>
2025-02-07 17:41:17 -05:00
Axionize 5de92f28de Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/sprint/SprintC.java
2025-02-07 17:38:10 -05:00
ManInMyVan 864e9de3e8 fix #1948 2025-02-05 16:57:46 -07:00
ManInMyVan 68b4fa7805 fix SprintE false 2025-02-05 16:43:38 -07:00
ManInMyVan c7e1fda7bb correct checking water for in sprint checks 2025-02-05 16:20:25 -07:00
ManInMyVan 6c42bdcd4e MC152728 was unfixed 2025-02-05 15:31:29 -07:00
Axionize 96ab0c3bdf Fix updating upstream 2025-02-05 14:30:17 -05:00
Axionize a4a1397b87 Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/manager/init/start/CommandRegister.java
#	src/main/java/ac/grim/grimac/player/GrimPlayer.java
#	src/main/resources/config/zh.yml
2025-02-05 13:01:59 -05:00
Axionize 4b5cf2a9a1 Reduce number of rays required to be traced with new getPossibleLookVectors() function 2025-02-05 12:15:48 -05:00
Axionize fa86c87693 Fix HitboxEntity and HitboxReach not working on large custom reach distances 2025-02-05 11:46:41 -05:00
Ty_Regotly 439cbc6db3 Correct some translation errors, and update the time (#1996)
* Update de.yml

* Update en.yml

* Update es.yml

* Update fr.yml

* Update it.yml

* Update ja.yml

* Update nl.yml

* Update pt.yml

* Update ru.yml

* Update tr.yml

* Update zh.yml
2025-02-05 11:35:21 +00:00
ManInMyVan 652b66202d Merge pull request #1997 from TrollsterCooleg/2.0
Make the placeholders persist
2025-02-04 21:03:11 -07:00
TrollsterCooleg 9f031e638a Make the placeholders persist 2025-02-04 21:54:30 -06:00
ManInMyVan 45da02e7c0 check slot 2025-02-04 20:21:12 -07:00
ManInMyVan 68a04d05f8 hopefuly fix errors with mitigate-desync-noslow 2025-02-04 17:29:08 -07:00
ManInMyVan e329171b11 add check-for-updates to all config files 2025-02-03 15:15:46 -07:00
SamB440 b8121543ee Add setting for checking for updates on startup (implements #1995) 2025-02-03 19:42:49 +00:00
SamB440 70cf56fad6 Stop paper taking 10 years to remap the plugin 2025-02-03 19:33:20 +00:00
You 6b639048b9 Fix historical reach teleport reach modeling 2025-02-03 11:16:51 -05:00
Axionize 5413484c2a Merge branch 'feat/fix-Folia-LatencyUtils-CME' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/latency/LatencyUtils.java
2025-02-03 10:18:26 -05:00
Axionize 6d6b27dfe2 Merge remote-tracking branch 'origin/2.0' into merge-dev 2025-02-03 02:17:48 -05:00
SamB440 f88a114e0e Bump version 2025-02-01 15:17:30 +00:00
Axionize fde5efa31f Fix new entity modeling to handle riding entities 2025-02-01 00:04:40 -05:00
Axionize cccc0194d6 Fix upstream Java 8 compatability issue 2025-01-31 22:06:17 -05:00
Axionize d8e7bc8f3e Fix Java 8 compatability break from upstream 2025-01-31 22:02:58 -05:00
Axionize dd37d3407b Enable HitboxEntities by default 2025-01-31 17:38:21 -05:00
Axionize c0c19d1a2d Merge remote-tracking branch 'origin/2.0' into merge-dev 2025-01-31 17:32:10 -05:00
SamB440 ff888f8c73 Kick players if a transaction error occurs 2025-01-31 20:28:14 +00:00
SamB440 66a250eb9e Maybe fix flint and steel prediction (fixes #1991) 2025-01-31 20:06:57 +00:00
SamB440 3c56ba9880 Support creaking hitbox (fixes #1986) 2025-01-31 19:08:43 +00:00
SamB440 514a48e508 Update Gradle wrapper 2025-01-31 19:05:53 +00:00
SamB440 32b66cb4ff Fix checking for elytra on servers older than 1.21.2 2025-01-31 19:01:59 +00:00
SamB440 057de4d4e2 Update shadow plugin 2025-01-31 18:48:31 +00:00
ManInMyVan 081e2d3b2b fix resin hitbox
closes #1982
2025-01-30 19:17:28 -07:00
SamB440 856a51e574 Bump version 2025-01-30 21:35:29 +00:00
SamB440 a4786a16c0 Exempt TRIAL_SPAWNER on fastbreak (#1962) as temp-fix 2025-01-30 21:22:43 +00:00
SamB440 c904f14c7b Use Component instead of String 2025-01-30 21:19:54 +00:00
Axionize 59eb669c17 Fix a rare CME in LatencyUtils 2025-01-30 12:46:26 -05:00
Axionize 86cb4af960 Refactor hitbox debugging code 2025-01-30 02:41:12 -05:00
Axionize 056b9f0486 Fix merge conflicts 2025-01-30 02:18:46 -05:00
Axionize afe483c0ad Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
2025-01-30 02:02:38 -05:00
Axionize 5d4c8f6f85 Fix HitboxEntities falses 2025-01-30 01:45:49 -05:00
ManInMyVan 896cf12b71 patch civ 2025-01-29 16:02:04 -07:00
ManInMyVan 1506c97ffc fix comment 2025-01-29 07:56:20 -07:00
Axionize a08963e1dc Patches to handling non-target minimum entitiy hitboxes 2025-01-29 08:10:21 -05:00
Axionize 50a2b3af95 Update README.md to note that Java 8 is supported 2025-01-28 23:14:00 -05:00
ManInMyVan 9107586fc1 assume cooldown is full on 1.8 servers 2025-01-28 19:44:24 -07:00
ManInMyVan bc96460eb3 RotationBreak
closes #1196
2025-01-28 17:12:53 -07:00
ManInMyVan 94705fcd09 why are we ticking velocity on duplicates? 2025-01-28 12:47:27 -07:00
Axionize 01cd47a6b6 Merge branch 'feat/debug-hitboxes' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java
#	src/main/java/ac/grim/grimac/checks/impl/prediction/DebugHandler.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BlockRayTrace.java
2025-01-28 06:00:06 -05:00
Axionize 7ae935f5e3 Revert "More Accurate Position Reach Modeling for MC clients < 1.16.2 (#1964)" (#1980)
This reverts commit 6d06b9b559.
2025-01-28 05:55:36 -05:00
Axionize 6d06b9b559 More Accurate Position Reach Modeling for MC clients < 1.16.2 (#1964)
* Stop using server-side tracked position when attempting to account for teleports not always moving entity client side; expand from client area instead

* Seperate getting possible locations and possible hitbox to reduce how often expandNonRelative() needs to be called

* Add documention explaining getPossibleLocationCombined() and getPossibleHitboxCombined()

* Update documentation formatting
2025-01-28 05:47:59 -05:00
Axionize 7494b995bc Fix checking permission for inventory setbacks 2025-01-28 05:03:22 -05:00
SamB440 bae421ff27 Merge pull request #1976 from Packsolite/project/add-editorconfig
Add .editorconfig
2025-01-27 18:38:46 +00:00
ManInMyVan f81743e07f Merge pull request #1975 from Packsolite/config/ignore-laby-mod-brand
Ignore labymod client brand by default
2025-01-27 09:17:54 -07:00
Packsolite b0e4693f2b Add .editorconfig 2025-01-27 16:55:54 +01:00
Packsolite e569483f63 Ignore labymod client brand 2025-01-27 16:18:18 +01:00
ManInMyVan 164d16dce9 fix warns from TrackerData 2025-01-26 15:50:56 -07:00
SamB440 a504b8f595 Fix viaversion respawn metadata handling (fixes #1965) 2025-01-26 19:45:22 +00:00
Axionize e4ef877188 Port new Reach modeling to handle generating smallest possible hitboxes 2025-01-25 22:02:24 -05:00
Axionize efa8b750e7 Merge branch 'feat/more-accurate-position-reach-modeling' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/data/ReachInterpolationData.java
2025-01-25 21:51:10 -05:00
Axionize 21d21d2509 Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/RotationPlace.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/predictionengine/PlayerBaseTick.java
#	src/main/java/ac/grim/grimac/predictionengine/UncertaintyHandler.java
#	src/main/java/ac/grim/grimac/predictionengine/predictions/PredictionEngine.java
#	src/main/java/ac/grim/grimac/predictionengine/predictions/rideable/PredictionEngineRideableUtils.java
#	src/main/java/ac/grim/grimac/utils/data/KnownInput.java
#	src/main/java/ac/grim/grimac/utils/data/VectorData.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BlockProperties.java
2025-01-25 21:34:12 -05:00
Axionize 44011acca2 Make Inventory checks support/respect nosetback permissions 2025-01-25 21:12:53 -05:00
ManInMyVan 0a9ea97aa6 cleanup 2025-01-25 14:34:54 -07:00
ManInMyVan 91e281514b remove random newline 2025-01-25 14:22:45 -07:00
ManInMyVan a03c8bbdbd support placeholderapi placeholders in custom kick messages 2025-01-25 14:21:23 -07:00
ManInMyVan 22074dc228 revert renaming compensatedWorld and compensatedEntities 2025-01-25 14:17:15 -07:00
ManInMyVan 3a40ba8b29 "small" refactor 2025-01-25 12:34:22 -07:00
Axionize 71791a1020 Update documentation formatting 2025-01-25 12:44:37 -05:00
Axionize 665a43bd4c Merge remote-tracking branch 'origin/2.0' into feat/more-accurate-position-reach-modeling
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/data/ReachInterpolationData.java
2025-01-25 12:34:44 -05:00
Axionize 5ce81e0fe4 Add documention explaining getPossibleLocationCombined() and getPossibleHitboxCombined() 2025-01-25 12:23:46 -05:00
Axionize 29b6e12cb8 Seperate getting possible locations and possible hitbox to reduce how often expandNonRelative() needs to be called 2025-01-25 12:10:08 -05:00
Axionize 014c5f7670 Mark LineOfSightPlace as experimental cehck 2025-01-25 10:26:32 -05:00
ManInMyVan 0d84b4e958 patch drop noslow 2025-01-24 19:16:06 -07:00
ManInMyVan 098399f754 don't allow negative kb on 1.9+ 2025-01-24 19:12:30 -07:00
ManInMyVan 334a356446 some keepsprint patch fixes 2025-01-24 17:59:05 -07:00
SamB440 acac69e750 Account for new 1.21.2 collision requirement 2025-01-24 19:53:13 +00:00
SamB440 f8aa54855d Update compatibility notice 2025-01-24 19:48:22 +00:00
ManInMyVan 7d928d581f patch keepsprint 2025-01-23 17:59:46 -07:00
Axionize 9c9316e224 Merge remote-tracking branch 'origin/2.0' into merge-dev 2025-01-23 18:32:51 -05:00
SamB440 31394f472f Fix listening to brands on modern clients 2025-01-23 16:07:24 +00:00
SamB440 f721b1850c Fix the plugin not loading lol 2025-01-23 16:02:56 +00:00
ManInMyVan 4419646f11 customizable disconnect messages 2025-01-22 19:50:40 -07:00
Axionize 9e296cbf5a Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsX.java
#	src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java
#	src/main/resources/config/en.yml
#	src/main/resources/config/es.yml
#	src/main/resources/config/fr.yml
#	src/main/resources/config/it.yml
#	src/main/resources/config/nl.yml
#	src/main/resources/config/pt.yml
#	src/main/resources/config/ru.yml
#	src/main/resources/config/tr.yml
#	src/main/resources/config/zh.yml
2025-01-22 03:20:55 -05:00
Axionize 40bbd2eb2e Stop using server-side tracked position when attempting to account for teleports not always moving entity client side; expand from client area instead (#1902) 2025-01-22 01:27:16 -05:00
Axionize 0af47a1266 Stop using server-side tracked position when attempting to account for teleports not always moving entity client side; expand from client area instead 2025-01-22 00:50:05 -05:00
Axionize 6cfe71da9b Refactor HitboxData.getBlockHitbox() to include isTargetBlock as parameter (#1957)
Also fixes a rare NPE in LOSP
2025-01-22 00:45:27 -05:00
ManInMyVan 393357d9f6 revert recent BadPacketsN changes 2025-01-20 17:26:20 -07:00
ManInMyVan dcf0c73005 refactoring 2025-01-20 15:57:23 -07:00
ManInMyVan 856ec6c655 remove DebugHandler check name
I don't this is used
2025-01-20 15:42:08 -07:00
ManInMyVan 54a10f77db remove (Prediction) from NoSlow 2025-01-20 15:41:28 -07:00
ManInMyVan 0f50bde4db Merge pull request #1959 from spring-dependency-management/explosion-fix
Fix explosion false when dead
2025-01-20 15:25:33 -07:00
spring-dependency-management d7368ceba6 Fix explosion false when dead 2025-01-20 22:24:02 +00:00
ManInMyVan 1e8fc587af always poll 2025-01-20 12:27:52 -07:00
Axionize 8e6219c597 Stop using server-side tracked position; expand from client area instead 2025-01-20 03:55:57 -05:00
Axionize 9aa555ff78 Fix logic error in new brewing stand hitbox code and optimize CCB size 2025-01-20 02:34:20 -05:00
Axionize 21c0833769 Adapt RaycastData and BlockRayTrace classes to accommodate new HitboxData.getBlockHitbox() parameters format. 2025-01-20 01:44:39 -05:00
Axionize 450642d888 Refactor HitboxData.getBlockHitbox() to include isTargetBlock as parameter
Also fixes a rare NPE
2025-01-20 01:40:38 -05:00
ManInMyVan 75bcac7a49 don't check item usage in MultiActionsC/D 2025-01-19 14:30:33 -07:00
ManInMyVan 111cc7aafd finally use that util I added a while ago 2025-01-19 12:45:11 -07:00
AoElite 924dcf9014 update elytra feature & use switches 2025-01-19 03:03:31 -05:00
AoElite 63aa1ed632 update feature manager 2025-01-19 03:00:35 -05:00
ManInMyVan eda4dc7236 actually fix it 2025-01-18 20:21:32 -07:00
ManInMyVan 85e1e20e41 fix BadPacketsX false 2025-01-18 19:12:28 -07:00
ManInMyVan b6a79b74b6 this also applies to horses 2025-01-18 18:45:39 -07:00
SamB440 783240c06f Merge pull request #1952 from Cyramek/fix-fastbreak
account for fastbreak flag cancellation
2025-01-18 17:36:49 +00:00
cyramek fbcad3e605 account for fastbreak flag cancellation 2025-01-18 18:35:52 +01:00
SamB440 10c1a1350c Warn about plugin incompatibility 2025-01-18 14:50:04 +00:00
ManInMyVan 69875008c3 exempt 1.8 players from elytra checks 2025-01-16 19:37:52 -07:00
ManInMyVan e39eb89f59 fix possible BadPacketsQ npe 2025-01-16 19:35:15 -07:00
ManInMyVan 71015ec3c7 Add VehicleD 2025-01-16 17:10:12 -07:00
ManInMyVan 09b8071f5b make VehicleC a PacketCheck 2025-01-16 16:49:45 -07:00
ManInMyVan e011b2dbbd Vehicle check catagory 2025-01-16 16:37:21 -07:00
ManInMyVan 7208842b0c perf 2025-01-16 16:24:50 -07:00
ManInMyVan 2830856812 per check nosetback and nomodifypacket permissions 2025-01-16 16:24:34 -07:00
ManInMyVan 50f9b6ecbd fix ElytraH name 2025-01-15 21:55:02 -07:00
Axionize 4fa3ef68e2 Java 8 compatability fixes 2025-01-15 22:38:17 -05:00
Axionize f477ba4c62 Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsP.java
#	src/main/java/ac/grim/grimac/checks/impl/sprint/SprintB.java
#	src/main/java/ac/grim/grimac/manager/init/start/CommandRegister.java
#	src/main/java/ac/grim/grimac/utils/latency/CompensatedEntities.java
#	src/main/resources/messages/de.yml
#	src/main/resources/punishments/de.yml
#	src/main/resources/punishments/en.yml
#	src/main/resources/punishments/es.yml
#	src/main/resources/punishments/fr.yml
#	src/main/resources/punishments/it.yml
#	src/main/resources/punishments/ja.yml
#	src/main/resources/punishments/nl.yml
#	src/main/resources/punishments/pt.yml
#	src/main/resources/punishments/ru.yml
#	src/main/resources/punishments/tr.yml
#	src/main/resources/punishments/zh.yml
2025-01-15 22:01:06 -05:00
ManInMyVan f31182419f fix pose desync 2025-01-15 18:58:31 -07:00
ManInMyVan 918dbf28ce ElytraF to I 2025-01-15 18:08:24 -07:00
ManInMyVan 5c73e7d0f1 BadPacketsD description 2025-01-15 17:05:34 -07:00
ManInMyVan 950d7a7a86 add ElytraE 2025-01-15 16:46:39 -07:00
ManInMyVan 0f068c763f add ElytraD 2025-01-15 16:46:25 -07:00
ManInMyVan 32b799735a add ElytraC 2025-01-15 16:36:54 -07:00
ManInMyVan fba015809f fix #1932 2025-01-13 19:39:43 -07:00
ManInMyVan 917d115a54 |= is a thing 2025-01-13 19:21:16 -07:00
ManInMyVan bf2de308ed fix #1949 2025-01-13 19:02:32 -07:00
ManInMyVan 0d278ed756 Merge pull request #1950 from twcult/patch-1
Update CrashH.java
2025-01-13 15:21:58 -07:00
twcult 99cab0a346 Update CrashH.java 2025-01-14 01:04:17 +03:00
SamB440 b83c04ddca Count invalid packets in TickTimer 2025-01-13 20:55:47 +00:00
SamB440 83fba052a5 Fix AimModulo360 falses when entering vehicle (fixes #1942) 2025-01-13 17:33:00 +00:00
SamB440 66438dd0c0 Fix 1.9+ server check for BadPacketsH, fixes #1946 2025-01-13 17:21:09 +00:00
SamB440 470776e49e Don't alert for BadPacketsR 2025-01-12 13:03:01 +00:00
ManInMyVan c1e02d5731 support glider component 2025-01-11 19:06:58 -07:00
ManInMyVan 9303ca77bb &= is a thing 2025-01-11 17:47:55 -07:00
ManInMyVan f2043ff12e check for releasing jump in ElytraB 2025-01-11 17:45:44 -07:00
ManInMyVan 9fc6e2f696 fix WrongBreak false 2025-01-10 20:39:14 -07:00
ManInMyVan 6fb84703d0 use flagAndAlert 2025-01-10 20:37:01 -07:00
ManInMyVan 35ca5dcfe9 SprintF 2025-01-10 20:34:56 -07:00
ManInMyVan 77d07fb444 patch sideways sprint 2025-01-10 19:57:42 -07:00
ManInMyVan dbce0b70e5 patch spigot antispam bypass 2025-01-10 19:35:33 -07:00
ManInMyVan 83bb7eaf64 Merge pull request #1938 from twcult/2.0
Remove method `canSkipTicks()` inlining
2025-01-10 18:59:31 -07:00
twcult ec0b723ae9 Update Reach.java 2025-01-11 04:52:42 +03:00
ManInMyVan e2049c7998 exempt redstone in PositionBreakA 2025-01-10 16:30:55 -07:00
ManInMyVan 8968acf214 pass verbose to flag() 2025-01-10 07:56:57 -07:00
ManInMyVan 405b679d68 Merge pull request #1937 from MatrixU5er/patch-1
Better Chinese translation
2025-01-09 19:34:01 -07:00
ManInMyVan dcc134ef37 add elytra to punishments config 2025-01-09 19:30:05 -07:00
MatrixU5er b356c1d162 Better Chinese translation
Added new Chinese translations and made some changes to make them easier to understand
2025-01-10 09:59:04 +08:00
ManInMyVan c4f224f406 add 2 elytra checks 2025-01-09 18:37:59 -07:00
SamB440 10ff3cefb5 Merge pull request #1936 from Penguin285/Penguin285-patch-1
Fixed Client Brands not sending properly
2025-01-09 16:30:42 +00:00
Penguin285 5c80e28c7d Fixed Client Brands not sending properly
The previous code was checking if the player had verbose enabled, instead of checking if they had brands enabled
2025-01-09 16:09:08 +00:00
AoElite bdb1330706 bump api 2025-01-08 00:37:44 -05:00
AoElite b30f4e18da Merge pull request #1930 from spring-dependency-management/badpacketsc-spectator-false
Fix badpacketsC false when in spectator
2025-01-07 22:45:41 -05:00
spring-dependency-management 7563b53fa1 Fix spectator false 2025-01-08 02:54:52 +00:00
AoElite f852f16c9c implement sendMessage 2025-01-07 11:54:34 -05:00
AoElite de730d73c0 implement more new API additions 2025-01-07 11:27:44 -05:00
AoElite dbe72a7fbf update API implementation 2025-01-07 06:21:56 -05:00
Axionize 4ac58782ac Fix legacy Elder Guardian hitbox 2025-01-05 08:17:53 -05:00
Axionize 2f6242027b Fix calling PacketGuardianEntity constructor and updating metadata; document wiki's errors 2025-01-05 08:17:27 -05:00
Axionize d8c0aef8cc add PacketEntityGuardian for hitbox modeling 2025-01-05 07:48:30 -05:00
SamB440 c1225cb920 Brand handling improvements 2025-01-04 17:19:09 +00:00
ManInMyVan 17927c11bf remove grim.brand.exempt because it causes npes 2025-01-04 10:13:41 -07:00
SamB440 66f6bd72d0 More Jabba 17 cleanup 2025-01-03 18:29:54 +00:00
ManInMyVan 6816df7a93 fix #1921 2025-01-03 10:53:17 -07:00
SamB440 7e0699d1bb Merge pull request #1903 from matsu1213/fix-bpn-setbacks
Fix BadPacketsN setbacks for relative teleports
2025-01-03 14:58:41 +00:00
Axionize 3f1b4d8472 Merge branch 'merge-dev' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/commands/GrimDump.java
#	src/main/java/ac/grim/grimac/commands/GrimLog.java
#	src/main/java/ac/grim/grimac/commands/GrimVersion.java
#	src/main/java/ac/grim/grimac/manager/init/start/PlaceholderAPIExpansion.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BlockRayTrace.java
2025-01-02 22:20:51 -05:00
ManInMyVan 1ce5a530ff small optimization for older servers 2025-01-02 12:53:21 -07:00
ManInMyVan 61e506437b add methods for nms item usage 2025-01-02 12:41:57 -07:00
ManInMyVan a23e1a10f4 add /grim brand and grim.brand.enable-on-join 2025-01-02 11:46:16 -07:00
ManInMyVan d1f6a47519 add verbose toggle messages to messages.yml 2025-01-02 11:46:04 -07:00
ManInMyVan 4cb6de2cb1 remove unused import 2025-01-02 11:44:52 -07:00
ManInMyVan 000758e7f1 include action in invalidbreak verbose 2025-01-02 11:12:34 -07:00
ManInMyVan 57157d068e add grim.brand.exempt 2025-01-02 11:04:22 -07:00
ManInMyVan 368db15026 make BadPacketsL stricter 2025-01-02 11:00:23 -07:00
ManInMyVan a0b1d290b5 Merge pull request #1919 from calcastor/invalidbreak-1.7
Exempt block face id 255 for 1.7.10- players in InvalidBreak
2025-01-02 10:56:53 -07:00
ManInMyVan e75b987a6e check action 2025-01-02 10:56:40 -07:00
ManInMyVan 7955563931 make PositionBreakB stricter for 1.7 2025-01-02 10:54:37 -07:00
matsu1213 cd9e22aad4 Use getMask 2025-01-02 23:17:24 +09:00
BT (calcastor/mame) cf66554afe Exempt block face id 255 for 1.7.10- players in InvalidBreak 2025-01-02 00:33:09 -08:00
Axionize 0adc332d14 Fix Java 8 Compatability issues 2025-01-01 23:52:56 -05:00
ManInMyVan a179f3e625 fix #1918 2025-01-01 19:15:36 -07:00
ManInMyVan fe96f848ad import DiggingAction 2025-01-01 13:36:28 -07:00
ManInMyVan 37b12ac56b fix PositionBreakA falses 2025-01-01 13:10:12 -07:00
ManInMyVan 6846e2d6a3 small refactor 2024-12-31 11:46:10 -07:00
ManInMyVan 5da77e2aa5 Merge pull request #1917 from 483378/2.0
BadPacketsV: fix >= 1.21.2 false flag
2024-12-31 11:01:02 -07:00
483378 7ac3d4104f BadPacketsV: make check stricter again for 1.8 players 2024-12-31 18:58:05 +01:00
SamB440 1c1f1d7031 Fix redstone wall torch powered state 2024-12-31 17:40:11 +00:00
SamB440 47a26f86dc Merge pull request #1909 from caneeeeee/adjust-german-translation
Adjust German translation
2024-12-31 17:02:30 +00:00
483378 9e054c2b6c BadPacketsV: fix >= 1.21.2 false flag 2024-12-31 17:34:40 +01:00
Axionize cda6af1f34 Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsX.java
#	src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java
#	src/main/java/ac/grim/grimac/checks/impl/misc/TransactionOrder.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderB.java
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/AirLiquidPlace.java
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/PositionPlace.java
#	src/main/java/ac/grim/grimac/checks/impl/sprint/SprintB.java
#	src/main/java/ac/grim/grimac/commands/GrimVersion.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/events/packets/PacketPlayerDigging.java
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
#	src/main/java/ac/grim/grimac/manager/SpectateManager.java
#	src/main/java/ac/grim/grimac/predictionengine/PlayerBaseTick.java
#	src/main/java/ac/grim/grimac/utils/change/PlayerBlockHistory.java
#	src/main/java/ac/grim/grimac/utils/latency/CompensatedInventory.java
#	src/main/java/ac/grim/grimac/utils/math/GrimMath.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BlockBreakSpeed.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BoundingBoxSize.java
#	src/main/resources/punishments/de.yml
#	src/main/resources/punishments/en.yml
#	src/main/resources/punishments/es.yml
#	src/main/resources/punishments/fr.yml
#	src/main/resources/punishments/it.yml
#	src/main/resources/punishments/ja.yml
#	src/main/resources/punishments/nl.yml
#	src/main/resources/punishments/pt.yml
#	src/main/resources/punishments/ru.yml
#	src/main/resources/punishments/tr.yml
#	src/main/resources/punishments/zh.yml
2024-12-31 01:16:58 -05:00
Axionize 237f3744d4 Stash debugging code and new hitbox calculation (still wrong?) 2024-12-31 00:26:35 -05:00
ManInMyVan c685c47d16 exempt spectators in FarPlace and FarBreak 2024-12-30 20:21:53 -07:00
ManInMyVan b968bd98f3 add PositionBreakB 2024-12-30 18:36:34 -07:00
ManInMyVan 5902fec4a8 add PositionBreak 2024-12-30 18:32:50 -07:00
ManInMyVan 2171a57757 Merge pull request #1916 from jonesdevelopment/feat/remove-log4j-checks
Remove ExploitA since it's useless and broken
2024-12-30 17:11:03 -07:00
Jones 882990fe84 Remove ExploitA since it's useless and broken 2024-12-31 00:54:22 +01:00
Axionize 99b309a0b3 Hitbox Debug Protocol Version Update #1 2024-12-30 18:34:42 -05:00
ManInMyVan c1e070e7ba decrease movement threshold leniency for 1.21.2+ 2024-12-30 16:09:20 -07:00
ManInMyVan 7e879aab9d add InvalidBreak 2024-12-30 15:59:43 -07:00
ManInMyVan 08a73ba2c6 add AirLiquidBreak description 2024-12-30 15:53:31 -07:00
ManInMyVan 411d3577e8 add description for NoSwingBreak 2024-12-30 15:51:44 -07:00
ManInMyVan a24f6ac26c add FarBreak 2024-12-30 15:51:12 -07:00
ManInMyVan 58e05442fe add NoSwingBreak 2024-12-30 15:41:07 -07:00
ManInMyVan c79928a8c8 Add MultiBreak 2024-12-30 15:30:32 -07:00
ManInMyVan 994990e4df Merge pull request #1530 from ManInMyVan/bp3
Add BadPacketsX
2024-12-30 14:39:38 -07:00
ManInMyVan f6b55d3ca5 Add BadPacketsX 2024-12-30 14:37:30 -07:00
ManInMyVan 649ffe0f71 add description for BadPacketsH 2024-12-30 14:07:27 -07:00
ManInMyVan f861181959 Merge pull request #1915 from AbdisKiosk/fix-nosuchmethoderror
Fix nosuchmethoderror in grimversion in old minecraft versions
2024-12-30 14:05:43 -07:00
ManInMyVan bc2ebf7222 rename BadPacketsX to AirLiquidBreak 2024-12-30 14:04:30 -07:00
ManInMyVan ac204c99b2 rename BadPacketsZ to WrongBreak 2024-12-30 14:02:55 -07:00
ManInMyVan 606a89ea61 make "FastBreak" "Break" in punishments.yml 2024-12-30 13:59:56 -07:00
ManInMyVan 4340962786 fix sprint check names 2024-12-30 13:27:08 -07:00
ManInMyVan e2f22682bd move sprint checks to their own package 2024-12-30 13:22:35 -07:00
ManInMyVan f4ab6de6af move timer checks to their own package 2024-12-30 13:22:01 -07:00
ManInMyVan 7bb1f01f28 cleanup 2024-12-30 13:17:21 -07:00
SamB440 8d7217439f Make PlayerBaseTick static to reduce allocations, make Column a record 2024-12-30 17:59:50 +00:00
SamB440 3308b4d7e3 Let TickTimer setback 2024-12-30 17:17:36 +00:00
SamB440 f6513b5537 Reduce reach uncertainty for 1.21.2+ end tick 2024-12-30 17:07:23 +00:00
SamB440 20217fd40b Avoid an allocation here 2024-12-30 17:05:40 +00:00
SamB440 6c5ff42045 Fix Reach verbose 2024-12-30 17:02:41 +00:00
SamB440 1e1a176b73 Split reach missed hitbox into hitboxes 2024-12-30 16:57:45 +00:00
SamB440 ba85055e5a Code cleanup 2024-12-30 16:00:57 +00:00
AbdisKiosk caed9e1850 Fix nosuchmethoderror in grimversion 2024-12-30 15:20:29 +01:00
SamB440 5acbb1d514 Fix inside block epsilon thing 2024-12-30 01:15:19 +00:00
ManInMyVan 5532ae0c34 fix falses 2024-12-29 15:59:53 -07:00
ManInMyVan bc276d0ca9 fix #1801 2024-12-29 14:39:53 -07:00
SamB440 251f1c13a9 revert this because im an idiot and didn't notice it's changing a different velocity 2024-12-29 21:27:09 +00:00
SamB440 9322d5d7b4 refactor and mention mojang broke movement here 2024-12-29 21:25:31 +00:00
ManInMyVan cf8f2d04f6 fix more falses on legacy versions 2024-12-29 14:08:45 -07:00
ManInMyVan dc8329e2cd fix clicking on trapdoors with blocks causing falses on legacy version 2024-12-29 13:34:16 -07:00
ManInMyVan 4351fb0531 fix falses in spectator mode 2024-12-29 12:57:07 -07:00
ManInMyVan 3b9fcefae0 tiny cleanup 2024-12-29 12:40:01 -07:00
ManInMyVan e90601f2b9 use canSkipTicks in BadPacketsV 2024-12-29 12:14:23 -07:00
ManInMyVan 5fbbabadf7 don't count stop sprinting as a start sprinting packet 2024-12-28 19:48:46 -07:00
ManInMyVan 105f0eceab small cleanup 2024-12-28 19:41:32 -07:00
ManInMyVan 8c15640a44 move FastBreak to breaking package 2024-12-28 19:39:42 -07:00
ManInMyVan 51b6141f91 Merge pull request #1485 from ManInMyVan/BadPackets1
Add BadPacketsV
2024-12-28 19:36:56 -07:00
ManInMyVan a4624f6907 add BadPacketsV description 2024-12-28 19:36:26 -07:00
ManInMyVan 3ac459d42c get offset after checking isChecked 2024-12-28 18:10:55 -07:00
ManInMyVan 726f6f84bf use flagAndAlert in ExplosionHandler 2024-12-28 18:02:43 -07:00
ManInMyVan c880dbb4ce use flagAndAlert a bit more 2024-12-28 17:58:39 -07:00
ManInMyVan 097b471aed add SprintE 2024-12-28 15:14:12 -07:00
Axionize ad68a43b83 Style fix 2024-12-28 16:21:06 -05:00
Axionize e7abaf8523 Update upstream more and add debug logging for null hitboxes and PacketOrder 2024-12-28 16:20:22 -05:00
Axionize a508002c48 Update upstream more and add debug logging for null hitboxes 2024-12-28 16:20:05 -05:00
Axionize 259696710f Merge remote-tracking branch 'maninmyvan/packetorder' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderA.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderE.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderF.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderG.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderH.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderI.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderJ.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderK.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderL.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderM.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderN.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderProcessor.java
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
#	src/main/java/ac/grim/grimac/manager/init/start/CommandRegister.java
#	src/main/java/ac/grim/grimac/player/GrimPlayer.java
#	src/main/resources/punishments/de.yml
#	src/main/resources/punishments/en.yml
#	src/main/resources/punishments/es.yml
#	src/main/resources/punishments/fr.yml
#	src/main/resources/punishments/it.yml
#	src/main/resources/punishments/nl.yml
#	src/main/resources/punishments/pt.yml
#	src/main/resources/punishments/ru.yml
#	src/main/resources/punishments/zh.yml
2024-12-28 15:44:17 -05:00
ManInMyVan 069c503bda rename NoSlowB-E to SprintA-D
they aren't really "NoSlow" cheats
2024-12-28 13:42:13 -07:00
ManInMyVan b7c8ca1683 add MultiActions to tr.yml and ja.yml 2024-12-28 13:40:20 -07:00
ManInMyVan a47a34e9f9 include more information in verbose 2024-12-28 13:29:53 -07:00
ManInMyVan 27f4f34b16 fix falses 2024-12-28 12:44:18 -07:00
Axionize 4eb5ad4e87 Temporary debugging change + limit used lookVecs 2024-12-28 13:51:24 -05:00
caneeeeee d388d3f5db Adjust German translation: preserve placeholders and improve contextual accuracy 2024-12-28 15:14:29 +01:00
Axionize 46e616107e Fix baby entity hitboxes with dirty hardcoded hack 2024-12-27 22:06:15 -05:00
ManInMyVan 744be32389 Merge pull request #1908 from GrimAnticheat/fix/sculk-vein-hitbox
Fix Sculk Vein hitbox
2024-12-27 19:53:27 -07:00
Axionize dcb72a9efd Complete initial server-side debugging implementation 2024-12-27 21:47:04 -05:00
You 8c97274929 Fix Sculk Vein hitbox 2024-12-27 21:40:42 -05:00
Axionize b939ba5921 Fix modeling sculk vein hitbox and make SyncedTags compile on Java 8 2024-12-27 18:45:51 -05:00
Axionize 786611aeec Fix modeling sculk vein hitbox 2024-12-27 18:40:56 -05:00
Axionize 44eba3b446 Stash Reach debugging checks 2024-12-27 18:40:32 -05:00
ManInMyVan 0f11cb74b8 don't check the same value twice 2024-12-27 16:24:47 -07:00
ManInMyVan 1cff3e526f fix 1.21.2+ PacketOrderH false 2024-12-26 15:34:32 -07:00
ManInMyVan a09093ee5b don't register PacketOrderProcessor twice 2024-12-26 15:34:32 -07:00
ManInMyVan c1db9edd7d 1.21.2 2024-12-26 15:34:32 -07:00
ManInMyVan 9ac2b4fbb6 fix wrongly resolved merge conflict 2024-12-26 15:32:37 -07:00
ManInMyVan 0b9ba69afc fix falses 2024-12-26 15:32:37 -07:00
ManInMyVan b326c7b961 remove PacketOrderO
depends on too many factors
2024-12-26 15:32:37 -07:00
ManInMyVan f1243073f2 fix more falses 2024-12-26 15:32:37 -07:00
ManInMyVan 4e4f23479a fix falses 2024-12-26 15:32:37 -07:00
ManInMyVan c7a4eeec94 fix false when swapping offhand items 2024-12-26 15:32:37 -07:00
ManInMyVan d1a2dbf6aa fix false when dropping items 2024-12-26 15:32:37 -07:00
ManInMyVan c67258ac13 only setback on item use 2024-12-26 15:32:37 -07:00
ManInMyVan ca7da355f7 remove invalid variable default 2024-12-26 15:32:37 -07:00
ManInMyVan 2a452c7d85 add remaining entity actions to PacketOrderProcessor 2024-12-26 15:32:37 -07:00
ManInMyVan 66776e8163 rename invalidSlots to invalid 2024-12-26 15:32:36 -07:00
ManInMyVan 3089036d43 add PacketOrderO and PacketOrderP 2024-12-26 15:32:36 -07:00
ManInMyVan 447ce3466d add PacketOrderN 2024-12-26 15:32:36 -07:00
ManInMyVan 244113714e Add PacketOrderM 2024-12-26 15:32:36 -07:00
ManInMyVan ae1c47d21f fix a noslow 2024-12-26 15:32:36 -07:00
ManInMyVan 241525c2c2 rename exempt-digging to exempt-placing-while-digging in PacketOrderI
and make it work
2024-12-26 15:32:36 -07:00
ManInMyVan d2b529aceb rename PacketOrderM to PacketOrderA 2024-12-26 15:32:36 -07:00
ManInMyVan 89f0aefe22 add PacketOrderM 2024-12-26 15:32:36 -07:00
ManInMyVan 8d8499d6fc use PacketOrderProcessor in PacketOrderK 2024-12-26 15:32:36 -07:00
ManInMyVan 3bd1673e67 rewrite 2024-12-26 15:32:36 -07:00
ManInMyVan 2ee47a23ea fix falses 2024-12-26 15:32:35 -07:00
ManInMyVan 734d227175 don't cancel the tick 2024-12-26 15:32:35 -07:00
ManInMyVan 1377747bec more PacketOrderC stuff 2024-12-26 15:32:35 -07:00
ManInMyVan 210a9266a4 fixes 2024-12-26 15:32:35 -07:00
ManInMyVan 616c46d97e oops 2024-12-26 15:32:35 -07:00
ManInMyVan aa69b6f69f fix falses 2024-12-26 15:32:35 -07:00
ManInMyVan fae66e9039 Add PacketOrderK 2024-12-26 15:32:35 -07:00
ManInMyVan fb05fcb1fa make PacketOrderE setback
https://github.com/CCBlueX/LiquidBounce/blob/nextgen/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/noslow/modes/blocking/NoSlowBlockingSwitch.kt
2024-12-26 15:32:35 -07:00
ManInMyVan acdcfe8f71 exemptBreaking option in PacketOrdlerL 2024-12-26 15:32:35 -07:00
ManInMyVan e3f5db6f19 fix some PacketOrderF falses 2024-12-26 15:32:34 -07:00
ManInMyVan be48c35eda Add PacketOrderL 2024-12-26 15:32:34 -07:00
ManInMyVan 2ea1d29da5 Check entity in PacketOrderC 2024-12-26 15:32:34 -07:00
ManInMyVan c49e531853 Add PacketOrderJ 2024-12-26 15:32:34 -07:00
ManInMyVan 2eebcfd056 Add PacketOrderI 2024-12-26 15:32:34 -07:00
ManInMyVan f1988e66be Add PacketOrderH 2024-12-26 15:32:34 -07:00
ManInMyVan d7474db60d these are already packet checks 2024-12-26 15:32:34 -07:00
ManInMyVan 97b3781f49 Add PacketOrderG 2024-12-26 15:32:34 -07:00
ManInMyVan a99e0e4947 add PacketOrderF 2024-12-26 15:32:34 -07:00
ManInMyVan ec88893d52 add PacketOrderE 2024-12-26 15:32:33 -07:00
ManInMyVan c1670a7f4e PacketOrder check catagory 2024-12-26 15:32:28 -07:00
AoElite a630dbe028 Added /grim dump. A command that dumps useful debugging information into a link. 2024-12-26 01:54:51 -05:00
ManInMyVan 3e42fe9d5e remove random comment 2024-12-25 22:42:12 -07:00
AoElite 06fad2ecaf Added /grim version command. Uses Modrinth API to check if Grim is up to date. 2024-12-26 00:36:31 -05:00
Axionize 3e185b6e1e Initial server-side impementation for debugging Hitboxes 2024-12-25 23:05:20 -05:00
ManInMyVan 3ddc1e846a allow usage of grim variables outside of grim (PAPI expansion)) 2024-12-25 20:08:25 -07:00
Axionize d714211fe6 Merge branch 'merge' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
2024-12-25 19:14:22 -05:00
Axionize 71d524aad0 Fix more Java 8 compatability issues introduced by upstream 2024-12-24 22:58:48 -05:00
Axionize 9bf8eed3d1 - Temporarily undo entity map and iteration order changes in attempt to fix HitboxMiss and HitboxBlock? falses
- Update upstream
- Make PacketOrderC (formerly BadPacketsM) no longer experimental
2024-12-24 22:48:17 -05:00
Axionize 74c8c5ff01 Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderC.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/utils/anticheat/MessageUtil.java
2024-12-24 22:38:12 -05:00
Axionize 935b26ca0c Fix Java 8 Compatability in miniMessage() 2024-12-24 22:19:05 -05:00
Axionize 5e2f889550 Revert entity iteration mapping changes (attempt to fix HitboxMiss and HitboxBlocK? falses) 2024-12-24 22:17:39 -05:00
ManInMyVan af6c859b16 support for &x&r&r&g&g&b&b hex codes 2024-12-24 19:30:42 -07:00
ManInMyVan d138d0d602 remove inaccurate messages.yml header 2024-12-24 19:23:44 -07:00
ManInMyVan 70d0fa96c2 fix hex codes 2024-12-24 19:11:09 -07:00
ManInMyVan 133e7dc490 this is also stable 2024-12-24 18:38:16 -07:00
ManInMyVan 4cb0a46797 this is stable 2024-12-24 18:37:10 -07:00
ManInMyVan 4298031d3f fix fluid hitbox for pre 1.13 players 2024-12-24 14:41:53 -07:00
ManInMyVan f4c43735f7 fix getEyeHeight() for 1.8 players 2024-12-24 14:39:33 -07:00
ManInMyVan 61f90fe721 fix reach for lily pads and buckets 2024-12-24 14:19:08 -07:00
ManInMyVan 431200c855 fix viaversion snow 2024-12-24 12:45:12 -07:00
ManInMyVan 481a115ba1 fix fluid placement distance 2024-12-24 11:39:32 -07:00
SamB440 b0f6e49109 Remove useless semicolon 2024-12-24 18:30:12 +00:00
SamB440 122ad4a93c Make hasSentPreWavePacket atomic 2024-12-24 18:29:19 +00:00
ManInMyVan 464e61b6b0 fix some issues with fluid placements on pre-1.13 2024-12-24 10:36:27 -07:00
matsu1213 1405faa391 Fix BadPacketsN setbacks for relative teleports 2024-12-24 12:46:37 +09:00
Axionize b003ec799b Fix Java 8 Compatability in miniMessage() 2024-12-23 22:44:19 -05:00
Axionize 11037cdc85 Fix 1.8 Hitbox modeling for close non-relative teleports 2024-12-23 22:41:16 -05:00
Axionize fffae61f8a Merge branch 'feat/1.8-missed-hitbox-fix' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/events/packets/PacketEntityReplication.java
2024-12-23 22:39:29 -05:00
Axionize 6a56b9bbf0 Merge branch 'merge' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/predictionengine/predictions/rideable/PredictionEngineRideableUtils.java
#	src/main/java/ac/grim/grimac/utils/anticheat/MessageUtil.java
2024-12-23 22:38:28 -05:00
Axionize 4c13a0adec Fix 1.8 Hitbox modeling for close non-relative teleports 2024-12-23 22:06:49 -05:00
Axionize 0932b7062d Merge upstream changes up to commit 1f93dff26c 2024-12-23 21:33:36 -05:00
Axionize 7f61d19f55 Merge remote-tracking branch 'origin/2.0' into merge-dev
# Conflicts:
#	build.gradle.kts
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/AirLiquidPlace.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
#	src/main/java/ac/grim/grimac/player/GrimPlayer.java
#	src/main/java/ac/grim/grimac/utils/change/BlockModification.java
#	src/main/java/ac/grim/grimac/utils/change/PlayerBlockHistory.java
2024-12-23 21:12:40 -05:00
SamB440 1f93dff26c Update Gradle wrapper 2024-12-23 17:22:42 +00:00
ManInMyVan 002b027e2b don't apply changes to tags that don't exist in the player's version 2024-12-22 20:25:01 -07:00
Axionize 31396cdd73 Fix NPE that can occur in HitboxEntities check 2024-12-22 21:34:33 -05:00
ManInMyVan 2a5b25e927 oops 2024-12-22 19:33:46 -07:00
Axionize ceb6e7932b Merge branch 'merge' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/change/PlayerBlockHistory.java
2024-12-22 21:33:35 -05:00
Axionize 82a755d739 Fix NPE that can occur if there is no hitbox overlap on entity move in reach-entities-check 2024-12-22 21:32:04 -05:00
ManInMyVan 597e3ba820 Check lastVehicleSwitch in isTickingReliablyFor (#1876) 2024-12-22 21:01:26 -05:00
SamB440 20234319e6 Update Gradle wrapper 2024-12-22 17:26:53 +00:00
Axionize 631217a7f4 Fix very rare CME; investigate cause later 2024-12-20 21:35:59 -05:00
ManInMyVan 8b76fd36d7 fix falses with custom mining tags 2024-12-20 17:10:04 -07:00
ManInMyVan 6ca375ff61 Merge pull request #1895 from jonesdevelopment/fix/variable-replacements
Fix variables never actually updating
2024-12-20 13:53:47 -07:00
Jones 1836b14d5d The Grim version is also static 2024-12-20 21:49:49 +01:00
Jones 618b6aca24 Only change static variables 2024-12-20 21:49:22 +01:00
ManInMyVan 4a45918971 fix pale moss carpets 2024-12-20 13:02:48 -07:00
ManInMyVan f8af107a1a Merge pull request #1896 from ManInMyVan/fix/snow
fix snow collisions
2024-12-20 12:19:24 -07:00
ManInMyVan 94491d293b fix snow collisions 2024-12-20 12:11:44 -07:00
Jones 49debf6cd0 Fix variables never actually updating 2024-12-20 18:21:37 +01:00
ManInMyVan c87ae3af8b rename NoFallA and NoFallB classes to match check name 2024-12-19 18:00:34 -07:00
ManInMyVan 423f2d0711 remove redundant configName declarations 2024-12-19 17:54:36 -07:00
AoElite 9a0ec5d010 update grim api 2024-12-19 04:46:36 -05:00
ManInMyVan 60ed674228 Merge pull request #1894 from ManInMyVan/bump-packetevents
bump packetevents
2024-12-18 23:19:45 -07:00
ManInMyVan 8bec79abc6 bump packetevents 2024-12-18 23:09:04 -07:00
ManInMyVan 0ee4b2551f Merge pull request #1893 from ManInMyVan/fix/autoblock
patch autoblock in 1.8
2024-12-18 20:43:13 -07:00
Axionize ad3cbd739a Fix AirLiquidPlace falses (and BadPacketsX false) (#1822)
* Add new Data classes to see recently modified blocks
* Fix AirLiquidPlace false
* Cleanup AirLiquidPlace
* Finish documenting all edge cases that can false AirLiquidPlace and fixing them
* Apply Style Changes From Code Review
2024-12-18 22:21:53 -05:00
ManInMyVan d9718b308f patch autoblock in 1.8 2024-12-18 17:48:01 -07:00
Axionize b880f51fbc BadPacketsX, PacketOrder, and LineOfSightPlace improvements
* Refactor and improve numerous PacketOrder checks
* Fix some BadPacketsX falses
* Fix some LineOfSightPlace falses
2024-12-18 16:17:23 -05:00
Axionize 2a86ff4e5f BadPacketsX, and LOSP false fixes 2024-12-18 16:09:59 -05:00
Axionize 3d3a17eea9 Merge remote-tracking branch 'maninmyvan/packetorder' into merge-dev
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderA.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderE.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderF.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderG.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderH.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderI.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderJ.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderK.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderL.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderM.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderN.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderO.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderProcessor.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/TransactionOrder.java
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
#	src/main/java/ac/grim/grimac/player/GrimPlayer.java
#	src/main/resources/punishments/de.yml
#	src/main/resources/punishments/en.yml
#	src/main/resources/punishments/es.yml
#	src/main/resources/punishments/fr.yml
#	src/main/resources/punishments/it.yml
#	src/main/resources/punishments/nl.yml
#	src/main/resources/punishments/pt.yml
#	src/main/resources/punishments/ru.yml
#	src/main/resources/punishments/zh.yml
2024-12-18 14:45:58 -05:00
Axionize ac2607d6cd Merge branch 'merge' into merge-dev 2024-12-18 14:21:57 -05:00
AoElite 4b03892c86 Update README.md
fix typo
2024-12-18 01:52:52 -05:00
Axionize b4820b5f19 Update punishment files for logging 2024-12-17 19:57:07 -05:00
Axionize 79c70572a8 Code cleanup; re-add grim.verbose.enable-on-join permission 2024-12-17 19:11:55 -05:00
Axionize ced56218d9 Update punishment files for non-en langauges for reach refactor 2024-12-17 19:02:31 -05:00
Axionize 6243fdf605 Refactor and split Reach into 4 checks. Fix some HitboxEntity falses. (#25)
* Temporary hack to fix rapidly changing blocks causing falses
* Refactor reach to flag seperate checks
* Fix verbose double toggling
* Fix check annotations
* Temporary fix
* Temporarily disable removing extra eyeHeight reach iterations; also fix Pink Petals Box
* Stash sectioned entity map
* Replicate vanilla iteration order, primarily for performing entity hitbox blocking checks
2024-12-17 18:53:35 -05:00
AoElite 7668ddb6d6 Update README.md
add Java 17 warning
2024-12-17 15:43:48 -05:00
AoElite 33582cd417 Update README.md
add installation notes
2024-12-17 14:59:47 -05:00
AoElite 2474c550cc Update README.md 2024-12-17 14:49:52 -05:00
SamB440 4f8357f5a1 Bump version (2.3.69) 2024-12-17 17:59:58 +00:00
AbdisKioskandManInMyVan b40deaa620 Add / grim history (#24)
* Add option to log violations

* Add /grim history command

* Follow coventions

Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>

* Remove unused getters

* Make messages configurable

* make entries per page configurable

* fix subcommand alias

* add command to messages

* synchronize writes to avoid sqlite_misuse error

* add history messages to all lang files

* add mysql compatability to violation database

* add mysql compatability to violation database

* add grim history in help command for all languages

* change colorcodes from § to & for grim history strings

* avoid sync usage of Bukkit.getOfflinePlayer(string)

* add tab completion for online players in grim history

* remove test

* Follow coventions

Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>

* revert file permission change in gradlew

* add 'server' field to grim history

---------

Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-12-17 11:41:19 -05:00
SamB440 b4ac002779 Warn about viabackwards and promote placement config warn to error 2024-12-17 16:01:46 +00:00
SamB440 f04cadb38d Fix BadPacketsE with viabackwards 2024-12-17 15:35:21 +00:00
ManInMyVan 79ec178845 Merge pull request #1887 from ManInMyVan/localized-desciptions
allow localizing check descriptions
2024-12-16 16:10:47 -07:00
ManInMyVan a8da7dde72 allow localizing check descriptions 2024-12-16 15:49:18 -07:00
ManInMyVan 576a67502b Merge pull request #1621 from ManInMyVan/minimessage
Add MiniMessage And PlaceHolderAPI Support
2024-12-16 15:35:01 -07:00
SamB440 eb72a7c86d Add Camel simulation support 2024-12-16 21:40:31 +00:00
Axionize 5d486a5707 Merge pull request #1824 from Axionize/fix-modern-client-legacy-server-walls
Fix Modern Client + Legacy Server Walls
2024-12-15 17:12:06 -05:00
Axionize 9975d1a6bf Merge pull request #1886 from Axionize/fix/pink-petals-ccb-size
Fix IndexOutofBoundsException when interacting with Pink Petals with 3 or more flowers
2024-12-15 17:02:35 -05:00
Axionize dd74dc9737 Fix IndexOutofBoundsException when interacting with Pink Petals with 3 or more flowers 2024-12-15 16:52:02 -05:00
ManInMyVan 571ae73fc5 fix PacketOrderI falses with tick skipping 2024-12-15 12:55:16 -07:00
Axionize 8d2d33f1ea Fixed InventoryD not working due to upstream changes to simulation engine movement data.
ver: 2.3.69-B37
2024-12-15 14:31:52 -05:00
Axionize 738cd44ab9 Fix inventoryD breaking due to new engine changes 2024-12-15 14:30:11 -05:00
ManInMyVan b800699cbf fix 1.21.2+ PacketOrderH false 2024-12-15 12:19:41 -07:00
SamB440 bf37add382 Merge pull request #1880 from Currypan1229/maint/yml-cu-853275982
Fix namespace of punishments.yml for japanese
2024-12-15 19:09:48 +00:00
Currypan1229 432a0aed02 Fix namespace of punishments.yml for japanese 2024-12-16 04:07:30 +09:00
Axionize d3c82a326a Fix automatically enabling verbose when joining 2024-12-14 20:36:02 -05:00
Axionize e40ba62e5a Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/movement/NoSlowC.java
#	src/main/java/ac/grim/grimac/checks/impl/movement/NoSlowD.java
#	src/main/java/ac/grim/grimac/checks/impl/movement/NoSlowE.java
#	src/main/java/ac/grim/grimac/checks/impl/post/Post.java
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/RotationPlace.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
2024-12-14 19:59:35 -05:00
ManInMyVan 6a1a5f81ed add UNKNOWN branch to BadPacketsP 2024-12-13 13:59:05 -07:00
ManInMyVan bcc9e9be13 don't register PacketOrderProcessor twice 2024-12-13 13:12:47 -07:00
ManInMyVan 40918c9988 remove unused imports 2024-12-13 13:11:58 -07:00
ManInMyVan a620149a93 Merge pull request #1860 from ManInMyVan/bpP
show click type name and use enhanced switch statements in BadPacketsP
2024-12-13 13:04:46 -07:00
ManInMyVan f493fe3005 1.21.2 2024-12-13 12:38:30 -07:00
ManInMyVan c5dc6d4050 fix wrongly resolved merge conflict 2024-12-12 22:39:31 -07:00
ManInMyVan db8aad3c00 fix falses 2024-12-12 19:52:28 -07:00
ManInMyVan 12cdd2f380 remove PacketOrderO
depends on too many factors
2024-12-12 19:51:17 -07:00
ManInMyVan 6c3657ae40 fix more falses 2024-12-12 19:49:59 -07:00
ManInMyVan ffa21f6f3e fix falses 2024-12-12 19:49:59 -07:00
ManInMyVan 7ce0e2f9ec fix false when swapping offhand items 2024-12-12 19:49:59 -07:00
ManInMyVan 1c3c6a8879 fix false when dropping items 2024-12-12 19:49:59 -07:00
ManInMyVan 75aa7d8f71 only setback on item use 2024-12-12 19:49:59 -07:00
ManInMyVan 33c96893d7 remove invalid variable default 2024-12-12 19:49:59 -07:00
ManInMyVan c3f6fd5c65 add remaining entity actions to PacketOrderProcessor 2024-12-12 19:49:59 -07:00
ManInMyVan 616f3076c9 rename invalidSlots to invalid 2024-12-12 19:49:59 -07:00
ManInMyVan 0898a94104 add PacketOrderO and PacketOrderP 2024-12-12 19:49:59 -07:00
ManInMyVan 48a371dc66 add PacketOrderN 2024-12-12 19:49:39 -07:00
ManInMyVan 5e7fef1572 Add PacketOrderM 2024-12-12 19:49:39 -07:00
ManInMyVan 8701f12f6a fix a noslow 2024-12-12 19:49:39 -07:00
ManInMyVan cbdd5a7a14 rename exempt-digging to exempt-placing-while-digging in PacketOrderI
and make it work
2024-12-12 19:49:39 -07:00
ManInMyVan 48ba546a40 rename PacketOrderM to PacketOrderA 2024-12-12 19:49:39 -07:00
ManInMyVan cdbe983d22 add PacketOrderM 2024-12-12 19:49:39 -07:00
ManInMyVan e2ad24e604 use PacketOrderProcessor in PacketOrderK 2024-12-12 19:49:39 -07:00
ManInMyVan d954784e74 rewrite 2024-12-12 19:49:39 -07:00
ManInMyVan dd0e338588 fix falses 2024-12-12 19:49:39 -07:00
ManInMyVan 73d591907d don't cancel the tick 2024-12-12 19:49:38 -07:00
ManInMyVan 806a13ea25 more PacketOrderC stuff 2024-12-12 19:49:38 -07:00
ManInMyVan 38d64e2cff fixes 2024-12-12 19:49:38 -07:00
ManInMyVan c666d98a9e oops 2024-12-12 19:49:38 -07:00
ManInMyVan c270105c09 fix falses 2024-12-12 19:49:38 -07:00
ManInMyVan 36776a488b Add PacketOrderK 2024-12-12 19:49:38 -07:00
ManInMyVan 5d6c77851a make PacketOrderE setback
https://github.com/CCBlueX/LiquidBounce/blob/nextgen/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/noslow/modes/blocking/NoSlowBlockingSwitch.kt
2024-12-12 19:49:38 -07:00
ManInMyVan 8bb5be493d exemptBreaking option in PacketOrdlerL 2024-12-12 19:49:38 -07:00
ManInMyVan c681a12176 fix some PacketOrderF falses 2024-12-12 19:39:58 -07:00
ManInMyVan ea614f7336 Add PacketOrderL 2024-12-12 19:39:58 -07:00
ManInMyVan fa985fe4fa Check entity in PacketOrderC 2024-12-12 19:39:58 -07:00
ManInMyVan f485b70cbf Add PacketOrderJ 2024-12-12 19:39:58 -07:00
ManInMyVan 36e0974fcf Add PacketOrderI 2024-12-12 19:39:58 -07:00
ManInMyVan a4ee272641 Add PacketOrderH 2024-12-12 19:39:58 -07:00
ManInMyVan fd8507610b these are already packet checks 2024-12-12 19:39:57 -07:00
ManInMyVan 4428af4acc Add PacketOrderG 2024-12-12 19:39:57 -07:00
ManInMyVan a4031c4862 add PacketOrderF 2024-12-12 19:39:57 -07:00
ManInMyVan 7abb8d61b0 add PacketOrderE 2024-12-12 19:39:57 -07:00
ManInMyVan 0b76452fbb PacketOrder check catagory 2024-12-12 19:34:23 -07:00
ManInMyVan 4c21c11484 Merge pull request #1842 from ManInMyVan/descriptions
Add descriptions to checks
2024-12-12 18:39:15 -07:00
ManInMyVan ca72cd5997 Add descriptions to some checks 2024-12-12 18:36:26 -07:00
ManInMyVan 3952600032 Merge pull request #1875 from ManInMyVan/don't-check-skippedTickInActualMovement
don't check skippedTickInActualMovement when handling slot changes
2024-12-11 22:11:41 -07:00
ManInMyVan d42bc4bec7 Merge pull request #1879 from ManInMyVan/deprecations
fix some deprecation warnings
2024-12-11 19:34:27 -07:00
ManInMyVan 30a6e7c336 Merge pull request #1878 from ManInMyVan/use-new-java-features
use new java features more
2024-12-11 15:25:13 -07:00
ManInMyVan d82b168cd6 use new java features more 2024-12-10 18:44:02 -07:00
ManInMyVan 284effc237 fix some deprecation warnings 2024-12-09 17:58:30 -07:00
ManInMyVan e97566cd5f and check client version 2024-12-09 16:36:07 -07:00
ManInMyVan 8c2b87f472 don't check skippedTickInActualMovement when handling slot changes 2024-12-09 16:14:33 -07:00
ManInMyVan f3433f3011 Merge pull request #1874 from ManInMyVan/postcheck-to-post
rename PostCheck to Post
2024-12-08 23:13:52 -07:00
ManInMyVan 587b317cb6 rename PostCheck to Post 2024-12-08 20:23:10 -07:00
ManInMyVan febe00e950 Add MiniMessage and PlaceHolderAPI Support 2024-12-08 20:09:59 -07:00
AoElite c7445019f9 Merge pull request #1847 from ManInMyVan/blockbreakcheck
BlockBreakCheck
2024-12-08 21:54:37 -05:00
SamB440 ff1c3043b3 Merge pull request #1871 from ManInMyVan/noslowc&d-1.21.4
check 1.21.4 players in NoSlowC and NoSlowD
2024-12-08 11:35:11 +00:00
ManInMyVan 0b038d38e9 check 1.21.4 players in NoSlowC and NoSlowD 2024-12-07 13:58:56 -07:00
SamB440 b0790af3e1 Update packetevents 2024-12-07 19:42:47 +00:00
SamB440 912939a5f4 Another 1.21.2 fix 2024-12-07 19:33:33 +00:00
Axionize 0c8b4c2f3a Update PacketEvents for 1.21.4 support and shadow colors 2024-12-07 03:42:06 -05:00
Axionize 42af76a9ea Merge remote-tracking branch 'origin/2.0' into merge 2024-12-07 02:45:54 -05:00
SamB440 7d30183af3 Use an identity hash set for synced tags 2024-12-06 20:00:33 +00:00
SamB440 2ac8a86d4f Update ExplosionHandler to account for 1.21.2 changes 2024-12-06 14:57:37 +00:00
AoElite d598ae0057 Merge pull request #1863 from ManInMyVan/fix/multiactionsc-false
fix MultiActionsC false with server opened inventories
2024-12-05 21:25:25 -05:00
ManInMyVan d3fde8025a fix MultiActionsC false with server opened inventories 2024-12-05 17:31:56 -07:00
Axionize 7a0f2b1227 Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/predictionengine/predictions/PredictionEngine.java
2024-12-05 12:36:31 -05:00
Axionize 1789912e14 Improve performance; replace concurrent with nonconcurrent queue 2024-12-05 00:23:56 -05:00
Axionize 6cbedf1f26 Fix Java 8 Compatability 2024-12-04 23:18:17 -05:00
ManInMyVan 7fe146db05 show click type name and use enhanced switch statements in BadPacketsP 2024-12-04 19:49:53 -07:00
ManInMyVan 227458a633 BlockBreakCheck 2024-12-04 17:30:05 -07:00
ManInMyVan e61fb9b3e4 Add BadPacketsV 2024-12-04 17:25:58 -07:00
AoElite 97abaaf8ad Merge pull request #1846 from Axionize/remove-use-of-var
Remove Usage of Var
2024-12-04 15:36:17 -05:00
SamB440 1f3ac2a174 Merge pull request #1831 from GrimAnticheat/update/1.21.3
1.21.3 update
2024-12-04 13:37:52 +00:00
SamB440 ff0629d0b7 Merging really sucks 2024-12-04 13:36:17 +00:00
SamB440 9936984534 Merge branch '2.0' into update/1.21.3 2024-12-04 13:34:06 +00:00
SamB440 ca56975136 Revert BadPacketsE changes 2024-12-04 13:31:49 +00:00
AoElite 348daf6a52 Merge pull request #1850 from SergioK29/fix-missing-should-cancel-packets
Fix missing shouldModifyPackets
2024-12-04 08:05:46 -05:00
AoElite d67b470ff6 better BadPackets E & R support for 1.21.2+ 2024-12-04 08:00:12 -05:00
Axionize 2c42a96c3c Merge branch '2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/utils/latency/CompensatedEntities.java
2024-12-03 20:12:24 -05:00
SamB440 130f9e1023 Merge pull request #1597 from ManInMyVan/multiactions
Add MultiActions Checks
2024-12-03 22:13:59 +00:00
SamB440 eaac8ad908 Merge pull request #1835 from Axionize/fix-riptide-teams-and-non-pushable
Fix riptide trident attacks on entities that are non-pushable or the same team as the attacker
2024-12-03 21:12:19 +00:00
SamB440 89f8696d88 Merge pull request #1715 from ManInMyVan/elytra-fly
Allow exempting elytras
2024-12-03 18:01:08 +00:00
AoElite 940a1f819f punishment manager performance improvements 2024-12-03 12:07:33 -05:00
AoElite 3f01edba9d fixed paintings not being registered 2024-12-03 11:37:58 -05:00
SergioK29 24409a5771 Fix missing shouldModifyPackets 2024-12-03 14:00:27 +00:00
ManInMyVan 88e0f98241 fix swimming false 2024-12-02 18:11:48 -07:00
SamB440 fde99a7cbf Remove fastutil usage from CorrectingPlayerInventoryStorage 2024-12-02 13:54:46 +00:00
Axionize 1c3929834a Remove usage of var 2024-12-01 17:08:01 -05:00
ManInMyVan 3a839d7240 add parenthesis 2024-12-01 12:51:19 -07:00
SamB440 7737337a86 Don't let setbacks bypass stuck speed 2024-12-01 18:34:52 +00:00
MachineBreaker 88dc6a42a9 Merge pull request #1832 from Axionize/replace-var-with-explicit-types
Make var type in ExploitC explicitly String
2024-12-01 14:34:09 -04:00
MachineBreaker bcc93aab4a Merge pull request #1804 from GrimAnticheat/2.0-optimise-menu-type
Optimise MenuType#getMenuType
2024-12-01 14:30:33 -04:00
SamB440 b88561284c Disable verbose enable-on-join by default even for OPs 2024-12-01 17:38:41 +00:00
SamB440 5fd8230884 Fix timer ping-abuse-limit-threshold 2024-12-01 17:37:19 +00:00
SamB440 ca0fa88a77 Merge pull request #932 from SamB440/fix/BadPacketsG
Reimplement BadPacketsG
2024-12-01 15:01:56 +00:00
SamB440 cbb3c1cc0f Fix BadPacketsG falses & a sneak desync 2024-12-01 14:59:02 +00:00
SamB440 519968b85a Fix BadPacketsG teleport status 2024-12-01 14:58:38 +00:00
SamB440 6314b78e47 Merge pull request #1837 from ManInMyVan/cleanup/packetcheck
remove unused method from PacketCheck
2024-12-01 14:49:25 +00:00
SamB440 b791897dbc Merge pull request #1833 from Axionize/verbose-on-join
Add permission to enable verbose on join
2024-12-01 14:46:53 +00:00
SamB440 61af1d1e72 Merge pull request #1830 from ManInMyVan/blockbreak-class
add BlockBreak class
2024-12-01 14:42:08 +00:00
SamB440 bf3fc94d92 More big changes 2024-12-01 14:14:07 +00:00
Axionize bc1ab00c3f Merge remote-tracking branch 'origin/2.0' into 2.3.69-b30
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/data/Pair.java
2024-11-30 02:23:24 -05:00
Axionize 34fde514fd Revert "exempt 1.14.2+ clients in NoSlowC and NoSlowD"
This reverts commit f6ef1df29d.
2024-11-30 02:22:24 -05:00
Axionize 26d5d9d9d2 Merge remote-tracking branch 'maninmyvan/multiactions' into 2.3.69-b30
# Conflicts:
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
2024-11-30 02:14:27 -05:00
Axionize 4887415912 Add verbose to appropiate places; makes sure player have alert for auto activation of verbose 2024-11-29 22:50:29 -05:00
Axionize f755f2d670 Fix config issue where skip-block-check: true and skip-entity-check: false would cause numerous block falses 2024-11-29 16:23:30 -05:00
SamB440 7f0838832d Merge pull request #1839 from Cyramek/limit-jump-possibilities
[1.21.3] Limit jump possibilities
2024-11-29 18:06:24 +00:00
cyramek 336efafbd3 limit jump possibilities 2024-11-29 18:46:47 +01:00
SamB440 782f8f8a09 Big changes 2024-11-29 17:15:37 +00:00
SamB440 c1858e49d8 Merge pull request #1815 from Axionize/explicit-flush-detection
Warn users who want extra reach accuracy that they need to add paper.explicit-flush=true
2024-11-29 12:24:00 +00:00
SamB440 7dce3a7a12 Merge pull request #1836 from ManInMyVan/cleanup/pair
cleanup Pair class
2024-11-29 12:22:22 +00:00
Axionize 3004390528 Make LOSP use same direction calculations as Reach check; could fix some falses 2024-11-29 02:01:50 -05:00
Axionize af141e35d3 Put -Dpaper.explicit-flush=true in quotes 2024-11-29 01:07:24 -05:00
Axionize 3a33be168f Warn players who want extra reach accuracy that they need to add paper.explicit-flush=true 2024-11-29 01:07:17 -05:00
Axionize 30994d1279 Shrink blocks for 0.03/0.002 2024-11-29 01:06:06 -05:00
Axionize 9b716b5c58 Add block and reach check skip options 2024-11-29 00:57:01 -05:00
Axionize 714549f79c Merge branch 'reach-check-entities' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/LineOfSightPlace.java
#	src/main/java/ac/grim/grimac/utils/anticheat/update/BlockPlace.java
#	src/main/java/ac/grim/grimac/utils/data/HitData.java
#	src/main/java/ac/grim/grimac/utils/latency/CompensatedEntities.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BlockRayTrace.java
2024-11-29 00:20:45 -05:00
Axionize d0fcf33255 Fix Armorstand index on 1.13.2 for PacketEntity 2024-11-29 00:09:17 -05:00
Axionize 02553f332f Fix Bow NoSlow 2024-11-28 23:29:24 -05:00
Axionize 7786da7296 Fix evicting queue for riptide entities 2024-11-28 21:46:43 -05:00
Axionize 1eb12bafd4 Fix evicting queue for riptide entities 2024-11-28 21:17:09 -05:00
ManInMyVan bc365176b1 remove unused method from PacketCheck 2024-11-28 17:29:45 -07:00
ManInMyVan 7fe224c206 cleanup Pair class 2024-11-28 17:27:32 -07:00
Axionize 48e5f54341 Fix riptide trident attacks on entities that are non-pushable or the same team as the attacker 2024-11-28 17:14:56 -05:00
Axionize 88883caca8 Fix riptide trident attacks on entiies that are non-pushable or the same team as the attacker 2024-11-28 17:10:32 -05:00
SamB440 5edf92f124 Merge pull request #1834 from Cyramek/fix-known-input
[1.21.3] fix looping through invalid values caused by known input
2024-11-28 14:33:13 +00:00
cyramek 1c3e938f0f fix looping through invalid values caused by known input 2024-11-28 15:09:54 +01:00
Axionize ec71581eae Add permission to enable verbose on join 2024-11-27 23:46:10 -05:00
Axionize 5a8e8b320a Add permission to enable verbose on join 2024-11-27 23:45:49 -05:00
Axionize 0904b61df0 Make var type in ExploitC explicitly String 2024-11-27 22:04:50 -05:00
Axionize c9e082257c Put -Dpaper.explicit-flush=true in quotes 2024-11-27 22:01:27 -05:00
Axionize 53dd27e95d split union() in SCB into union() and new encompass() method; fixes Simulation false on walls 2024-11-27 21:59:56 -05:00
Axionize 3723581dc2 split union() in SCB into union() and new encompass() method; fixes Simulation false on walls 2024-11-27 21:48:19 -05:00
Axionize 7ea0d4d24c Make var type in ExploitC explicitly String 2024-11-27 21:47:14 -05:00
SamB440 8875bbf991 Re-encode this 2024-11-27 17:53:49 +00:00
SamB440 e933186d2e determineCanSkipTick idle for 1.21.2+ 2024-11-27 16:53:50 +00:00
SamB440 89bec80b34 Fix 1.21.2+ jump false 2024-11-27 16:07:11 +00:00
SamB440 cc78eca02f Fix offground precision loss to make us consistent 1E-15 offset 2024-11-27 16:06:58 +00:00
SamB440 77a91ec627 1.21.3 update 2024-11-27 16:06:07 +00:00
Axionize dff5361934 Merge remote-tracking branch 'origin/2.0' into merge 2024-11-27 01:37:11 -05:00
ManInMyVan 1036563b24 add BlockBreak class 2024-11-26 17:48:45 -07:00
AoElite dd5ea74ae4 update fastutils 2024-11-26 12:43:55 -05:00
Axionize cd032a51ab Merge remote-tracking branch 'origin/2.0' into merge 2024-11-26 03:41:30 -05:00
AoElite aa7a4dc155 Merge pull request #1828 from ManInMyVan/paper-dupe-patch
patch paper dupe
2024-11-25 21:49:57 -05:00
ManInMyVan 3387365732 remove unused import 2024-11-25 17:55:25 -07:00
ManInMyVan 411aa4f2b2 patch paper dupe 2024-11-25 17:48:30 -07:00
SamB440 63a8e394a9 Merge pull request #1827 from ItsClairton/fix/cauldron
fix: Legacy cauldron collision box.
2024-11-26 00:02:59 +00:00
Clairton Santos 9804b8b62f fix: Legacy cauldron collision box. 2024-11-25 20:44:55 -03:00
Axionize f59279ad51 Comment cleanup 2024-11-25 16:20:32 -05:00
SamB440 f82cce32f6 Merge pull request #1724 from K-Lqrs/2.0
[Improved] Add full Japanese translations for all GrimAC configuration files
2024-11-25 15:29:13 +00:00
AoElite 474ae7dd27 small ResyncWorldUtil refactor 2024-11-25 07:16:47 -05:00
SamB440 d85c1d267b Merge pull request #1825 from Cyramek/fix-reach
fix wrongly ported reach changes from grim 3.0
2024-11-25 09:02:36 +00:00
cyramek 6ce2bcb9e9 fix wrongly ported changes from grim 3.0 2024-11-25 09:30:21 +01:00
Axionize 379fc6601d Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/manager/init/start/BStats.java
2024-11-25 00:28:02 -05:00
Axionize dd490aa8c2 Merge branch 'fix-modern-cient-legacy-server-walls' into merge 2024-11-25 00:08:31 -05:00
AoElite 48eff610c3 fixed BadPackets E & R falsing on 1.21.2+ players in vehicles 2024-11-25 00:04:00 -05:00
AoElite 677dd044ff refactor bstats for packetevents 2024-11-25 00:02:34 -05:00
AoElite 87f30eea37 added a todo 2024-11-25 00:02:02 -05:00
AoElite 370da407ce update packetevents 2024-11-25 00:01:54 -05:00
Axionize 43e4c29f2c Document current state 2024-11-24 23:54:39 -05:00
Axionize 7924107b00 Finish faster equivalent impl 2024-11-24 23:54:39 -05:00
Axionize 42094cbddc Merge branch 'fix-airliquidplace' into merge 2024-11-24 23:49:52 -05:00
Axionize d0562de1e1 Cleanup 2024-11-24 22:22:12 -05:00
Axionize d85979d3ab Merge branch 'fix-airliquidplace' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsX.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/manager/TickManager.java
#	src/main/java/ac/grim/grimac/utils/collisions/CollisionData.java
#	src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java
#	src/main/java/ac/grim/grimac/utils/collisions/blocks/PistonHeadCollision.java
2024-11-24 22:04:35 -05:00
Axionize 3809aed146 Finish documenting all edge cases that can false AirLiquidPlace and fixing them 2024-11-24 22:02:21 -05:00
Axionize 06210f03ba Remove debug messages 2024-11-24 21:02:05 -05:00
Axionize 97afbd8d77 Move clearing updated blocks logic into an async loop; new ClearRecentlyUpdatedBlocks() class 2024-11-24 20:29:48 -05:00
Axionize df89d15aa6 Cleanup AirLiquidPlace 2024-11-24 20:25:22 -05:00
Axionize 12864dccc5 Only check first value in iterator() in AirLiquidPlace() 2024-11-24 20:17:01 -05:00
Axionize 4c9b07612d Fix AirLiquidPlace false 2024-11-24 20:12:59 -05:00
Axionize 026c2417c9 Add new Data classes to see recently modified blocks 2024-11-24 20:12:34 -05:00
SamB440 1ef4b4eec9 Merge pull request #1821 from Axionize/fix-complex-fence-boxes
Fix CCB constructor for DynamicHitboxFence
2024-11-24 14:00:36 +00:00
AoElite 954eb8b51c Merge pull request #1783 from ManInMyVan/track-paintings
track paintings
2024-11-24 06:52:30 -05:00
AoElite 84ceaa29dc Merge pull request #1797 from ManInMyVan/stopspectating-here-permission
add permission for /grim stopspectating here
2024-11-24 06:49:33 -05:00
AoElite 6974d61b9d Merge pull request #1817 from Axionize/badpacketsx
Fix BadPacketsX false and mark it as no longer experimental
2024-11-24 06:46:58 -05:00
AoElite d9a3a890c8 Merge pull request #1818 from Axionize/badpacketsz
Mark BadPacketsZ as no longer experimental
2024-11-24 06:46:29 -05:00
AoElite c4495d995a Merge pull request #1820 from Axionize/use-movement-threshold
Use movementThreshold() instead of 0.03 where appropiate
2024-11-24 06:42:44 -05:00
Axionize 9621add16e Fix CCB constructor for DynamicHitboxFence 2024-11-24 02:41:12 -05:00
Axionize 9bd5c2db0b Fix CCB constructor for DynamicHitboxFence 2024-11-24 02:38:55 -05:00
Axionize 2518b23f8b Use movementThreshold() instead of 0.03 where appropiate 2024-11-24 01:37:53 -05:00
Axionize 7bd3af3eca Use movementThreshold() instead of 0.03 where appropiate 2024-11-24 01:34:05 -05:00
Axionize dd9d14e195 Style fix 2024-11-24 00:29:24 -05:00
Axionize bd2ceeeed4 Style fix 2024-11-24 00:28:46 -05:00
Axionize 8d01e90f11 Mark BadPacketsZ as no longer experimental 2024-11-24 00:03:02 -05:00
Axionize a6d082b355 Mark BadPacketsX as no longer experimental 2024-11-24 00:00:47 -05:00
Axionize 8af0dbc46d Mark BadPacketsZ as no longer experimental 2024-11-23 23:59:56 -05:00
Axionize 3fedd558d6 Fix BadPacketsX falses 2024-11-23 23:58:02 -05:00
Axionize 6ed64d3730 Mark BadPacketsX as no longer experimental 2024-11-23 23:56:22 -05:00
Axionize 8660ff0f60 Fix BadPacketsX falses 2024-11-23 23:56:02 -05:00
Axionize 547a2965dd Warn players who want extra reach accuracy that they need to add paper.explicit-flush=true 2024-11-23 22:31:31 -05:00
ManInMyVan c19914e83f fix MutliActionsF false 2024-11-23 16:37:45 -07:00
ManInMyVan 6c14faa51d fix MutliActionsF falses 2024-11-23 16:37:06 -07:00
ManInMyVan 6b4060e0c4 fix MultiActionsF false 2024-11-23 16:37:06 -07:00
ManInMyVan 483706151b check sprinting in MultiActionsC and MultiActionsD 2024-11-23 16:37:06 -07:00
ManInMyVan 9dc128cc1d add MultiActionsF 2024-11-23 16:37:06 -07:00
ManInMyVan 50b7e84f58 offhand 2024-11-23 16:37:06 -07:00
ManInMyVan a77067ffe5 Add MultiActionsE 2024-11-23 16:37:06 -07:00
ManInMyVan 2a49635497 Add MutliActionsD 2024-11-23 16:37:05 -07:00
ManInMyVan a158019d66 Add MultiActions Checks 2024-11-23 16:37:05 -07:00
SamB440 5f7d296b4d Merge pull request #1814 from Axionize/dynamically-configurable-relocate
Make relocate read from project properties --> environment variable --> default to true
2024-11-23 19:11:32 +00:00
Axionize fd889bd26a Merge remote-tracking branch 'maninmyvan/packetorder' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderA.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderE.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderF.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderG.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderH.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderI.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderJ.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderK.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderL.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderM.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderN.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderO.java
#	src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderProcessor.java
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
2024-11-23 11:34:23 -05:00
Axionize c4cd8136bf Ensure ComplexCollisionBoxes can only contain SimpleCollisionBoxes (#1805)
* Ensure ComplexCollisionBoxes can only contain SimpleCollisionBoxes

* Optimize ComplexCollisionBoxes by using primitives internally; Make new more efficient constructors available

* Port everything to new internal .downCast() API besides getCollisionBoxes

* implement new downCast() API for Dynamic, Simple, and No Collision Boxes

* Manually size ComplexCollisionBoxes Pt. 1

* Manually size ComplexCollisionBoxes Pt. 2

* Fix new downCast() for SimpleCollisionBox

* Fix logic error in CCB constructor

* Optimize DynamicHitboxFence

* Fix logic error again in CCB constructor

* Remove debug print statement

* Fix copying CCBs in edge case

* Rename variable for clarity

* Make CCD length private var

* Make makeShapes() CCD extra maxIndex explicit; Fix DynamicCollisionWall error

* Remove unused calls to makeShapes()
2024-11-23 10:57:15 +00:00
SamB440 dbc0c11795 Merge pull request #1813 from ManInMyVan/fix/falses
fix falses
2024-11-23 10:56:35 +00:00
Axionize 1a7949a477 Revert "Fix rapidly breaking/placing instabreak blocks and lighting tnt falses; currently LOSP no longer stops any illegal placements just flags. Will fix later"
This reverts commit 9f09fcd1
2024-11-22 22:23:10 -05:00
Axionize 0a26d37728 Revert "New buffer system"
This reverts commit ef45df9e
2024-11-22 22:21:37 -05:00
Axionize 73597d9524 Make whether or not to relocate deps read from project properties -> environment variable"
Prevents having to modify build.gradle.kts when disabling relocating.
2024-11-22 21:24:35 -05:00
Axionize d30b024bd3 Make whether or not to relocate deps read from project properties -> environment variable"
Prevents having to modify build.gradle.kts when disabling relocating.
2024-11-22 21:23:12 -05:00
ManInMyVan a3e979abc8 fix falses 2024-11-22 14:33:57 -07:00
ManInMyVan 1799a56072 fix falses 2024-11-22 14:28:02 -07:00
ManInMyVan 56e4fa75bf cleanup imports 2024-11-22 14:13:32 -07:00
ManInMyVan b535b28661 rename PacketOrderP to PacketOrderO 2024-11-22 13:46:43 -07:00
ManInMyVan 43634772c7 remove PacketOrderO
depends on too many factors
2024-11-22 13:46:43 -07:00
ManInMyVan aea66feb33 fix more falses 2024-11-22 13:46:43 -07:00
ManInMyVan 11d856ce08 fix falses 2024-11-22 13:46:43 -07:00
ManInMyVan 30a346bd3f fix a noslow 2024-11-22 13:46:43 -07:00
ManInMyVan 5254a376c4 fix false when swapping offhand items 2024-11-22 13:46:43 -07:00
ManInMyVan f79e8c12a5 fix false when dropping items 2024-11-22 13:46:42 -07:00
ManInMyVan af580c4d48 only setback on item use 2024-11-22 13:46:42 -07:00
ManInMyVan be65dc5e51 remove invalid variable default 2024-11-22 13:46:42 -07:00
ManInMyVan 93c1c7b480 remove sent variable 2024-11-22 13:46:42 -07:00
ManInMyVan b0a5dbd07f and use them 2024-11-22 13:46:42 -07:00
ManInMyVan 74cca86bb6 add remaining entity actions to PacketOrderProcessor 2024-11-22 13:46:42 -07:00
ManInMyVan fe4e60c80c rename invalidSlots to invalid 2024-11-22 13:46:42 -07:00
ManInMyVan 22dd134196 add PacketOrderO and PacketOrderP 2024-11-22 13:46:42 -07:00
ManInMyVan e971604565 add PacketOrderN 2024-11-22 13:46:42 -07:00
ManInMyVan 90c59ad4df Add PacketOrderM 2024-11-22 13:46:42 -07:00
ManInMyVan c888256b38 remove unused method 2024-11-22 13:46:41 -07:00
ManInMyVan 72a0ad53dd rename exempt-digging to exempt-placing-while-digging in PAcketOrderI
and make it work
2024-11-22 13:46:41 -07:00
ManInMyVan 2fc13af09d rename PacketOrderM to PacketOrderA 2024-11-22 13:46:41 -07:00
ManInMyVan 57ccbe753e revert renaming post 2024-11-22 13:46:41 -07:00
ManInMyVan d14916c590 add PacketOrderM 2024-11-22 13:46:41 -07:00
ManInMyVan 5b8741ca46 use PacketOrderProcessor in PacketOrderK 2024-11-22 13:46:41 -07:00
ManInMyVan cfcf52f337 rewrite 2024-11-22 13:46:41 -07:00
ManInMyVan ab32f24dc1 fix falses 2024-11-22 13:46:40 -07:00
ManInMyVan a653e17f3c don't cancel the tick 2024-11-22 13:46:40 -07:00
ManInMyVan 809d26307f more PacketOrderC stuff 2024-11-22 13:46:40 -07:00
ManInMyVan d35d326595 fixes 2024-11-22 13:46:40 -07:00
ManInMyVan 81c550e834 oops 2024-11-22 13:46:40 -07:00
ManInMyVan b27cea2385 register PacketOrderL 2024-11-22 13:46:40 -07:00
ManInMyVan 79f1d65713 fix falses 2024-11-22 13:46:40 -07:00
ManInMyVan 737e6c4cfb exemptBreaking -> exempt-breaking 2024-11-22 13:46:40 -07:00
ManInMyVan 44f68a3266 Add PacketOrderK 2024-11-22 13:46:40 -07:00
ManInMyVan 4e69adc548 exemptBreaking option in PacketOrdlerL 2024-11-22 13:46:39 -07:00
ManInMyVan 93d0c38393 make PacketOrderE setback
https://github.com/CCBlueX/LiquidBounce/blob/nextgen/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/noslow/modes/blocking/NoSlowBlockingSwitch.kt
2024-11-22 13:46:39 -07:00
ManInMyVan 81aa8b8d31 check ENTITY_ACTION packets in PacketOrderL 2024-11-22 13:46:39 -07:00
ManInMyVan ce28bb689a fix some PacketOrderF falses 2024-11-22 13:46:39 -07:00
ManInMyVan 487ce68ef6 Add PacketOrderL 2024-11-22 13:46:39 -07:00
ManInMyVan a29f7a2807 nvm it is valid on 1.8 2024-11-22 13:46:39 -07:00
ManInMyVan 80d33f0f11 this packet order is only valid in 1.7 client 2024-11-22 13:46:39 -07:00
ManInMyVan 0bd57102d5 Check entity in PacketOrderC 2024-11-22 13:46:39 -07:00
ManInMyVan c701b22098 these are already packet checks 2024-11-22 13:46:39 -07:00
ManInMyVan 0ad3c58496 Check digging packets in PacketOrderF 2024-11-22 13:46:39 -07:00
ManInMyVan 99e06d6b3b Update PacketOrderI.java 2024-11-22 13:46:39 -07:00
ManInMyVan 4785482543 Add PacketOrderJ 2024-11-22 13:46:38 -07:00
ManInMyVan c06beba53b Add PacketOrderI 2024-11-22 13:46:38 -07:00
ManInMyVan 4b989a15b6 Add PacketOrderH 2024-11-22 13:46:38 -07:00
ManInMyVan 0f10d48519 Add PacketOrderG 2024-11-22 13:46:38 -07:00
ManInMyVan 2e7454de84 add PacketOrderF 2024-11-22 13:46:38 -07:00
ManInMyVan 5faad6b3ba add PacketOrderE 2024-11-22 13:46:38 -07:00
ManInMyVan 75b0f5c344 PacketOrder check catagory 2024-11-22 13:46:38 -07:00
Axionize d0b94bbda5 Merge remote-tracking branch 'origin/update/1.21.3' into merge 2024-11-22 12:15:58 -05:00
Axionize 6f18622643 Merge branch 'flatten-complexcollisionboxes' into merge 2024-11-22 09:14:08 -05:00
Cristian Milani 2b5016442b Fix race condition and exception when registering check permissions during rapid consecutive player joins on server start 2024-11-21 20:21:59 -05:00
Axionize e389e4b5e1 Fix Pink Petals Hitbox (Coral Fan) for > 1.12.2 and =< 1.19.3 players 2024-11-21 19:21:28 -05:00
Axionize 7d9cdb91b0 Merge branch 'flatten-complexcollisionboxes' into merge 2024-11-21 18:43:20 -05:00
Axionize fad1eb5736 Merge branch 'flatten-complexcollisionboxes' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/collisions/CollisionData.java
#	src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java
#	src/main/java/ac/grim/grimac/utils/collisions/blocks/DynamicStair.java
#	src/main/java/ac/grim/grimac/utils/collisions/blocks/PistonHeadCollision.java
#	src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicConnecting.java
#	src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxFence.java
#	src/main/java/ac/grim/grimac/utils/collisions/datatypes/ComplexCollisionBox.java
2024-11-21 12:18:11 -05:00
Axionize d01805ad13 Merge remote-tracking branch 'machinebreaker/inventory-checks' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/inventory/InventoryD.java
#	src/main/java/ac/grim/grimac/checks/impl/inventory/InventoryG.java
2024-11-20 12:23:05 -05:00
Axionize f638772c5f Merge remote-tracking branch 'maninmyvan/packetorder' into merge 2024-11-20 12:21:54 -05:00
Axionize b84b21a68f Revert "Remove old .downCast() method for CollisionBoxes"
This reverts commit c91ef450
2024-11-20 12:14:16 -05:00
Axionize da230781e3 Port everything to new internal .downCast() API besides getCollisionBoxes 2024-11-20 12:01:02 -05:00
Axionize c91ef45062 Remove old .downCast() method for CollisionBoxes 2024-11-20 11:23:28 -05:00
Axionize 9a87329618 Optimize ComplexCollisionBoxes by using primitives internally; Make new more efficient constructors available 2024-11-20 11:15:53 -05:00
Axionize 24ee315c0b Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java
2024-11-19 20:15:21 -05:00
ManInMyVan a4decb57f8 fix more falses 2024-11-17 18:03:13 -07:00
ManInMyVan 81feb5be3f fix falses 2024-11-17 17:25:57 -07:00
MachineBreaker 2253fd0ec3 Use correct operator in InventoryF 2024-11-17 19:46:08 -04:00
MachineBreaker db4ad8e16d Remove InventoryG millis check 2024-11-17 19:41:53 -04:00
MachineBreaker 11571a2b8a Implement inventory desync status 2024-11-17 19:40:28 -04:00
MachineBreaker c615c98d09 Clean imports 2024-11-17 19:24:53 -04:00
MachineBreaker 922b134467 Fix more false positives 2024-11-17 19:20:56 -04:00
Axionize 6650e0cece Fix entity metadata parsing for armorstands on 1.14.4 2024-11-17 14:56:18 -05:00
MachineBreaker 8714e0e5a9 Merge remote-tracking branch 'origin/inventory-checks' into inventory-checks 2024-11-17 13:53:44 -04:00
MachineBreaker 24570aa658 Update config version 2024-11-17 13:53:35 -04:00
Axionize 4b28aa7604 Ensure ComplexCollisionBoxes can only contain SimpleCollisionBoxes 2024-11-17 11:36:10 -05:00
Axionize 50425ada16 Remove debug print statement 2024-11-17 10:34:45 -05:00
MachineBreaker 93f14a5b40 Optimise MenuType#getMenuType 2024-11-17 11:15:07 -04:00
MachineBreaker 6d4f3650cc Merge branch 'GrimAnticheat:2.0' into inventory-checks 2024-11-17 10:22:07 -04:00
Axionize de7a5358d2 Armorstand entity metadata in older versions 2024-11-17 08:02:01 -05:00
Axionize 9a0f3a4dd1 Fix hitboxes for armor stands (including small ones) 2024-11-17 07:46:48 -05:00
Axionize bfbde9d8fc Fix falses due to marker armor stands 2024-11-17 07:19:29 -05:00
MachineBreaker a5ced59a35 Clean imports 2024-11-17 08:13:07 -04:00
MachineBreaker e9c6fac17a Apply suggested changes 2024-11-17 08:11:54 -04:00
Axionize 2bc467ac82 Optimize if else in updateEntityMetaData() 2024-11-17 07:05:26 -05:00
Axionize c68f7bd5f8 Finish merging new inventory checks and packetorder checks; backport to Java 8 2024-11-17 05:36:08 -05:00
Axionize 7015a9efa2 Merge remote-tracking branch 'maninmyvan/packetorder' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
2024-11-17 05:19:11 -05:00
ManInMyVan 06bd96fcae fix a noslow 2024-11-16 18:29:05 -07:00
ManInMyVan db7bbef9b5 fix false when swapping offhand items 2024-11-16 18:14:50 -07:00
ManInMyVan fa0d147e04 fix false when dropping items 2024-11-16 18:14:31 -07:00
ManInMyVan 39e7cbe9ca only setback on item use 2024-11-16 18:14:04 -07:00
ManInMyVan 84a1641968 remove invalid variable default 2024-11-16 18:13:45 -07:00
ManInMyVan 26acd7b3a5 remove sent variable 2024-11-16 18:13:15 -07:00
ManInMyVan f51e5e4eae and use them 2024-11-16 18:12:40 -07:00
ManInMyVan 636eaf3d5d add remaining entity actions to PacketOrderProcessor 2024-11-16 18:10:13 -07:00
ManInMyVan 5b9fdd00c8 rename invalidSlots to invalid 2024-11-16 16:45:53 -07:00
MachineBreaker bc42035866 Fix some false positives 2024-11-16 19:32:50 -04:00
Axionize 917eb371c8 Merge remote-tracking branch 'machinebreaker/inventory-checks' into inventory-checks 2024-11-16 18:09:23 -05:00
Axionize ef45df9ea3 New buffer system 2024-11-16 16:44:39 -05:00
Axionize 24965108b2 Fix for entities that players can hit through blocking reach/attack ray trace 2024-11-16 16:00:27 -05:00
Axionize 9f09fcd103 Fix rapidly breaking/placing instabreak blocks and lighting tnt falses; currently LOSP no longer stops any illegal placements just flags. Will fix later 2024-11-16 14:41:03 -05:00
MachineBreaker e1baecd32e Resync InventoryE 2024-11-16 15:31:41 -04:00
MachineBreaker 44d66e0e5b Requested changes 2024-11-16 15:26:45 -04:00
MachineBreaker 0368f930b8 Woops change check name 2024-11-16 13:12:40 -04:00
MachineBreaker a83a0c8579 Implement experimental entity action while inventory is open check 2024-11-16 13:07:17 -04:00
MachineBreaker 92b1ad28c2 Fix 1.8 clients never letting 1.9+ server know about their inventory status
(Via hack)
2024-11-16 12:59:15 -04:00
MachineBreaker 5302f15b9d Implement experimental 1.8 click window while inventory not open check 2024-11-16 12:50:09 -04:00
Axionize 6a3eec1960 Add optional success field to HitData used to indicate if raytrace hit intended target 2024-11-16 11:44:38 -05:00
Axionize 11425840ad Add getBlockPlaceCheck() method 2024-11-16 11:21:39 -05:00
Axionize 8515df8224 Early exit optimiztion 2024-11-16 11:08:47 -05:00
Axionize fe5d6e34f2 Initial work to eliminate final LOSP falses by tracking recently changed blocks; improve performance by using primitive array for SimpleCollisionBox 2024-11-16 10:56:37 -05:00
MachineBreaker e3e797e19a Woops fix compilation 2024-11-16 11:55:32 -04:00
MachineBreaker 2293092048 Make an inventory check type 2024-11-16 11:54:58 -04:00
MachineBreaker 147081ccc5 Clean 2024-11-16 11:09:47 -04:00
MachineBreaker b924f65f91 Implement held item change while inventory is open check
Also add verbose for the other inventory checks
2024-11-16 11:01:02 -04:00
MachineBreaker 259dd72f87 Use packets to close player inventory 2024-11-16 10:53:40 -04:00
MachineBreaker ab726bda78 Fix conflicts 2024-11-16 10:47:34 -04:00
MachineBreaker 163bbd7b0e Merge remote-tracking branch 'origin/2.0' into inventory-checks
# Conflicts:
#	src/main/java/ac/grim/grimac/manager/CheckManager.java
#	src/main/resources/config/zh.yml
2024-11-16 10:40:51 -04:00
Axionize 205e169754 Initial work to make Reach raytrace check also check for entities 2024-11-16 08:03:49 -05:00
Axionize 35f7914249 More robust hitData handling of new EntityHitData type in CheckManagerListener 2024-11-16 08:02:10 -05:00
Axionize 31b7fd462f Initial Entity Blocking Hit Checks 2024-11-16 06:55:52 -05:00
Axionize b9812ba2b6 Add better temporary logging to see if new HitData types are used in CheckManagerListener 2024-11-16 05:08:52 -05:00
Axionize fc1d5ff3ae Add new EntityHitData constructors 2024-11-16 01:33:56 -05:00
ManInMyVan 2de0f49af9 add permission for /grim stopspectating here 2024-11-15 15:04:04 -07:00
Axionize 2f983ad316 Refactor HitData in preperation for supporting EntityHitResults 2024-11-15 07:32:20 -05:00
Axionize db23910195 Document why we trace longer than player hit distance on reach ray trace 2024-11-15 06:23:03 -05:00
Axionize 968e166bde Fix Button hitboxes for pre-1.13 players 2024-11-15 03:13:01 -05:00
Axionize efe729c4d1 Add new Reach config option to skip checks against non-player-entities 2024-11-15 01:43:47 -05:00
Axionize d40d19d6e3 Bump packetevents back to 2.6.1 (custom) to fix bugs 2024-11-15 01:06:48 -05:00
Axionize b476b143f4 Spotless changes 2024-11-15 01:06:35 -05:00
Axionize bb54697d9c Make switch cases Java 8 compatible 2024-11-15 01:05:39 -05:00
Axionize 24102c15e6 Bump version number back to 2.3.69 2024-11-15 00:46:20 -05:00
Axionize 5100ef06c8 Build with Java 8 compatibility instead of Java 17 2024-11-15 00:44:54 -05:00
Axionize 9b892eab85 Revert "Java 17 update"
This reverts commit 5a6f87fe
2024-11-15 00:43:05 -05:00
Axionize eab5ca7f6d Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	build.gradle.kts
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/RotationPlace.java
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java
#	src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxPane.java
#	src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxWall.java
2024-11-15 00:40:09 -05:00
Axionize fd055c163e Use new packetevents metrics class 2024-11-15 00:32:03 -05:00
Axionize ea78d2ff40 Update packetevents (built locally using custom changes) to fix #3 2024-11-15 00:22:52 -05:00
SamB440 6f074513f2 Merge pull request #1787 from Onako2/2.0
Update dependencies so it works on 1.21.3
2024-11-14 16:18:42 +00:00
ManInMyVan 0719c5bdc6 add PacketOrderO and PacketOrderP 2024-11-11 19:19:41 -07:00
ManInMyVan 36a394d142 add PacketOrderN 2024-11-11 19:19:41 -07:00
ManInMyVan 0e08dbc6f2 Add PacketOrderM 2024-11-11 19:19:41 -07:00
ManInMyVan 003aa67a41 remove unused method 2024-11-11 19:19:41 -07:00
ManInMyVan be45a43524 rename exempt-digging to exempt-placing-while-digging in PAcketOrderI
and make it work
2024-11-11 19:19:41 -07:00
ManInMyVan 0d700848f8 rename PacketOrderM to PacketOrderA 2024-11-11 19:19:41 -07:00
ManInMyVan 1ff402036d revert renaming post 2024-11-11 19:19:40 -07:00
ManInMyVan 9d36dbd2b8 add PacketOrderM 2024-11-11 19:19:40 -07:00
ManInMyVan c53c4378d8 use PacketOrderProcessor in PacketOrderK 2024-11-11 19:19:40 -07:00
ManInMyVan eacf176f88 rewrite 2024-11-11 19:19:40 -07:00
ManInMyVan 13afb067bb fix falses 2024-11-11 19:19:39 -07:00
ManInMyVan 7af2f4b2e2 don't cancel the tick 2024-11-11 19:19:39 -07:00
ManInMyVan a1d8bfa6a1 more PacketOrderC stuff 2024-11-11 19:19:39 -07:00
ManInMyVan 47b3fe9ca2 fixes 2024-11-11 19:19:39 -07:00
ManInMyVan 0ce52ea107 oops 2024-11-11 19:19:39 -07:00
ManInMyVan d98fe31412 register PacketOrderL 2024-11-11 19:19:39 -07:00
ManInMyVan d8f338aada fix falses 2024-11-11 19:19:39 -07:00
ManInMyVan f5965c48b3 exemptBreaking -> exempt-breaking 2024-11-11 19:19:39 -07:00
ManInMyVan 0df7077ddb Add PacketOrderK 2024-11-11 19:19:38 -07:00
ManInMyVan 222a9341bf exemptBreaking option in PacketOrdlerL 2024-11-11 19:19:38 -07:00
ManInMyVan 35f6f7870a make PacketOrderE setback
https://github.com/CCBlueX/LiquidBounce/blob/nextgen/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/noslow/modes/blocking/NoSlowBlockingSwitch.kt
2024-11-11 19:19:38 -07:00
ManInMyVan 15b6e0ba27 check ENTITY_ACTION packets in PacketOrderL 2024-11-11 19:19:38 -07:00
ManInMyVan 968754efe0 fix some PacketOrderF falses 2024-11-11 19:19:38 -07:00
ManInMyVan a03c9e0194 Add PacketOrderL 2024-11-11 19:19:38 -07:00
ManInMyVan 734e7cbae8 nvm it is valid on 1.8 2024-11-11 19:19:38 -07:00
ManInMyVan 52fe6691ac this packet order is only valid in 1.7 client 2024-11-11 19:19:38 -07:00
ManInMyVan acd8d1192c Check entity in PacketOrderC 2024-11-11 19:19:38 -07:00
ManInMyVan 8fc309cb76 these are already packet checks 2024-11-11 19:19:37 -07:00
ManInMyVan 45f16ec10f Check digging packets in PacketOrderF 2024-11-11 19:19:37 -07:00
ManInMyVan 5ff8cb21c8 Update PacketOrderI.java 2024-11-11 19:19:37 -07:00
ManInMyVan f8997b8739 Add PacketOrderJ 2024-11-11 19:19:37 -07:00
ManInMyVan ed21464c3a Add PacketOrderI 2024-11-11 19:19:37 -07:00
ManInMyVan 7954575216 Add PacketOrderH 2024-11-11 19:19:37 -07:00
ManInMyVan 1a11d3e733 Add PacketOrderG 2024-11-11 19:19:37 -07:00
ManInMyVan 487aa45a27 add PacketOrderF 2024-11-11 19:19:37 -07:00
ManInMyVan b7f9aeab06 add PacketOrderE 2024-11-11 19:19:36 -07:00
ManInMyVan 6aaee382a6 PacketOrder check catagory 2024-11-11 19:19:30 -07:00
Onako2 8c84c506bf Update dependencies for 1.21.3 support 2024-11-11 22:03:35 +01:00
ManInMyVan 39a53db067 track paintings 2024-11-09 17:08:10 -07:00
Axionize 0622f92cf1 Revert "Remove unncessary NO_COLLISION entry for torchcrop"
This reverts commit e149ca6be8.
2024-11-03 18:14:12 -05:00
Axionize a8f81c141a Revert "Remove unncessary NO_COLLISION entries"
This reverts commit 1761d853de.
2024-11-03 18:14:11 -05:00
Axionize efffceb9f2 Fix scaffolding hitbox for pre-1.14 clients 2024-11-03 07:05:40 -05:00
Axionize 75d1fc32c8 Enable checks against scaffolding 2024-11-03 06:58:37 -05:00
Axionize e087e93e2a Fix Weeping Vines and Vine Plant for all versions; Fix Weeping + Twisted for pre 1.16 players 2024-11-03 06:34:04 -05:00
Axionize e83c9967b4 Fix pitcher crop for pre-1.20 players 2024-11-03 05:51:34 -05:00
Axionize 2b1896020d Fix sniffer egg for pre 1.20 players 2024-11-03 05:46:06 -05:00
Axionize 61b17907ee Fix frogspawn for pre-1.19 players 2024-11-03 05:45:50 -05:00
Axionize 339fb42f37 Fix Sculk Shrieker hit box for all versions and collision box for pre 1.18.2 2024-11-03 05:33:50 -05:00
Axionize 7985275697 Fix Spore Blossom hitbox on < 1.17 2024-11-03 05:18:42 -05:00
Axionize 661b60d07c Fix glow lichen and sculk vein boxes 2024-11-03 05:15:31 -05:00
Axionize d4f647e18b Fix Cauldron Hit/Collision Box 2024-11-03 03:51:39 -05:00
Axionize 1761d853de Remove unncessary NO_COLLISION entries 2024-11-03 02:59:10 -05:00
Axionize 42a6543f9b Fix Pink Petals Boxes 2024-11-03 02:51:23 -05:00
Axionize 9356c6c323 Add new union() function to collision boxes 2024-11-03 02:41:27 -05:00
Axionize a7a92f7e10 Fix Coral Fan Collision box 2024-11-03 01:44:04 -04:00
Axionize e149ca6be8 Remove unncessary NO_COLLISION entry for torchcrop 2024-11-03 01:17:36 -04:00
Axionize d44493743d Cleanup and documnet why 2nd rayTrace in getNearestReachHitResult is intentionally non-optimal 2024-11-03 00:48:51 -04:00
Axionize 7eb030de7d Remove unsued getFacing() from vector code 2024-11-02 22:34:03 -04:00
Axionize 8fd4a4a87d Fix falses on blocks with 'insides/internal walls' (different Raycast block placement shape then HitBox shape) like Cauldrons, Hoppers, and Composters 2024-11-02 22:33:08 -04:00
Lars 9bfc7d7d9b わずかな間違いを修正・2 2024-11-02 23:41:34 +13:00
Axionize 8f71a427fd Annotate LOSP functions 2024-11-02 04:36:56 -04:00
Lars 7c93eda985 わずかな間違いを修正 2024-11-02 19:13:51 +13:00
Lars 1e7a858aa0 Japanese向けの翻訳を修正 2024-11-02 19:10:17 +13:00
Lars 11fba1b6bd configのja.ymlを修正済み 2024-11-02 19:06:11 +13:00
Axionize 8b9bc356f2 Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/RotationPlace.java
#	src/main/java/ac/grim/grimac/player/GrimPlayer.java
2024-11-01 21:31:23 -04:00
Axionize 89b6c8306e Fix falses on dead corals 2024-11-01 21:25:08 -04:00
ManInMyVan ce9d66c199 Allow exempting elytras 2024-10-27 12:51:33 -06:00
Axionize 32a09aa36b Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/player/GrimPlayer.java
2024-10-27 04:31:43 -04:00
Axionize 3ea716c580 Merge remote-tracking branch 'origin/2.0' into merge 2024-10-20 03:01:42 -04:00
Axionize 328d347845 Merge remote-tracking branch 'origin/2.0' into merge 2024-10-14 13:05:26 -04:00
Axionize d394c3d67c Revert Java 17 changes 2024-10-10 23:59:36 -04:00
Axionize 17b6b8a4e7 Merge branch 'los-containers' into merge 2024-10-10 23:54:56 -04:00
Axionize 980226fab9 Update LOSP to work with new grim config 2024-10-10 23:54:19 -04:00
Axionize 0f726a0f34 Merge remote-tracking branch 'origin/2.0' into los-containers 2024-10-10 23:53:39 -04:00
Axionize 91ee057f4a Merge remote-tracking branch 'origin/2.0' into merge
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java
2024-10-10 23:38:40 -04:00
Axionize c26afbc0af Merge branch 'GrimAnticheat:2.0' into merge 2024-10-08 00:08:05 -04:00
Axionize be56e28009 Merge branch 'fix-attribute-clamp' into merge 2024-10-05 17:35:57 -04:00
Axionize 0697c425ca Document SimpleCollisionBox and HexCollisionBox with Javadoc 2024-10-03 03:40:32 -04:00
Axionize ca0ca471fb Document SimpleCollisionBox and HexCollisionBox with Javadoc 2024-10-03 03:38:58 -04:00
Axionize 7b2aac3874 Version Bump 2024-10-03 02:25:59 -04:00
Axionize fbe8376ca0 Remove experimental check flag from Reach 2024-10-03 02:15:33 -04:00
Axionize 22bc18859b Modernize reach check 2024-10-03 01:29:18 -04:00
Axionize 25f9608d58 Merge branch 'reach-wall-hit' into LOSP-reach-wall-check
# Conflicts:
#	src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
#	src/main/java/ac/grim/grimac/utils/nmsutil/BlockRayTrace.java
2024-10-03 01:26:45 -04:00
Axionize 428f213e15 Migrate reach-related functions to new BlockRayTrace util class 2024-10-03 01:23:39 -04:00
AxionizeandManInMyVan 593d48a6e6 Button Styling Change
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:15 -04:00
AxionizeandManInMyVan 3dcf3c931a Sapling Styling Change
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:15 -04:00
AxionizeandManInMyVan 8cc45ddba3 TALL_FLOWER Styling Change
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:14 -04:00
AxionizeandManInMyVan 6f23122657 Redstone Wire Comment Styling
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:14 -04:00
AxionizeandManInMyVan c0b0759ed0 Inline Hitbox Calculation
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:14 -04:00
AxionizeandManInMyVan 00252f3b97 getPropaguleMinHeight Spacing
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:13 -04:00
AxionizeandManInMyVan 531c49011b Small Flower Line Spacing/Styling
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:13 -04:00
AxionizeandManInMyVan dea22454f7 Coral Fan Line Spacing/Styling
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:13 -04:00
AxionizeandManInMyVan 12bda63785 Banner Line Spacing/Styling
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:12 -04:00
AxionizeandManInMyVan c65e17cf0c Simplify TALL_FLOWERS handling
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:12 -04:00
AxionizeandManInMyVan 753ca0e6ad Rails Styling
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:12 -04:00
AxionizeandManInMyVan 8b85e1711d Mark function as Deprecated
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-10-03 00:10:12 -04:00
Axionize 12b0dfd19d Fix spelling mistake 2024-10-03 00:07:51 -04:00
Axionize 8c05d41423 Replace RuntimeException in HitBox.java with IllegalStateException 2024-10-03 00:07:26 -04:00
Axionize c5ab0f5440 Merge remote-tracking branch 'origin/2.0' into los-containers
# Conflicts:
#	src/main/java/ac/grim/grimac/utils/collisions/CollisionData.java
2024-10-02 21:01:12 -04:00
ManInMyVan d92f5ef375 fix chains for pre-1.16 players 2024-10-02 21:00:18 -04:00
Axionize c313d6203a Compact all NO_COLLISION states together 2024-10-02 20:51:10 -04:00
Axionize 070f92aea2 Fix 1.11 Ascending rails hitboxes 2024-09-28 01:53:38 -04:00
Axionize 4e3c5894b5 Fix HitBox of ascending powered rail on 1.9 2024-09-28 01:37:43 -04:00
Axionize 8cfb9f0f17 Fix HitBox of ascending powered rails on 1.7.10 2024-09-28 01:14:49 -04:00
Axionize 4e135e3f92 Make result player.getPossibleEyeHeights() of final in checks and remove unused imports 2024-09-28 00:21:33 -04:00
Axionize 938522974b Replace RotationPlace with LOSP in Turkish config 2024-09-26 21:23:08 -04:00
Axionize 6994975387 Merge remote-tracking branch 'origin/2.0' into los-containers
# Conflicts:
#	src/main/java/ac/grim/grimac/checks/impl/scaffolding/RotationPlace.java
2024-09-26 21:20:07 -04:00
Axionize 6d3a172466 Removing unneeded special case handling 2024-09-26 17:12:07 -04:00
Axionize 3aaa185617 Readability/documentation improvements 2024-09-25 00:51:50 -04:00
Axionize 980cd92333 1.8 Players 2024-09-25 00:28:59 -04:00
Axionize 89da2942c7 Handle player joining on new version -> scale changing -> old version 2024-09-25 00:01:52 -04:00
Axionize 8ea905e053 Optimize returned array for crawling 2024-09-25 00:01:09 -04:00
Axionize 885e959cdb fix conditionall check 2024-09-24 23:22:22 -04:00
Axionize 02904a3dce Only rewrite player possibleEyeHeights when player scale changes 2024-09-24 23:03:10 -04:00
Axionize e8d4bb2376 Don't bother updating scale attribute if no change is made 2024-09-23 21:16:24 -04:00
Axionize 7695167578 Fix intializing array 2024-09-23 20:34:50 -04:00
Axionize 94e5f63a65 Simplify logic and handle caching even when scale changes 2024-09-23 20:19:05 -04:00
Axionize 9fa0f773d5 Cache eyeHeights where possible 2024-09-22 17:41:54 -04:00
Axionize 88111e6f7e make getPossibleEyeHeights return most likely heights 2024-09-22 17:17:25 -04:00
Axionize 9a5c16fe6a Merge branch '2.0' into los-containers 2024-09-21 23:04:16 -04:00
Axionize 4efaf8d497 Fix Array matching error and block
The lower level ArraySupport.mismatch() function doesn't work on Java 8 and requires access modification in modern Java. Repalced with Arrays.equals()

The removal of checking if hitdata.getSecond() == expectedBlockFace during iteration (added in Fix 1.8 Brewing Stand bug - 4a9d8627d3) eliminates cases where a block inbetween the target block has a different blockface intercept.

Ideally we should only check the blockface once we've reached the target block as future optimization.
2024-09-21 22:46:48 -04:00
Axionize 07881da451 More minor optimizations 2024-09-21 21:40:40 -04:00
Axionize bd6c2524e7 Optimize iteration order 2024-09-21 20:19:19 -04:00
Axionize b096e02b9b Optimize getPossibleEyeHeights() 2024-09-21 20:18:55 -04:00
Axionize ad6b24345b Minor Dynamic Fence cleanup 2024-09-20 03:43:41 -04:00
Axionize 9694b756b5 Inline lever hitboxes 2024-09-20 03:35:47 -04:00
Axionize 6b5786be9d Fix legacy hitboxes for versions up to 1.12.2 and make fence hitbox generation static 2024-09-20 03:29:00 -04:00
AxionizeandCyramek 1f49ab2551 Update src/main/java/ac/grim/grimac/player/GrimPlayer.java
Co-authored-by: Cyramek <xcyramek@gmail.com>
2024-09-20 03:21:28 -04:00
Axionize b18a5bec8e Fix fences on legacy servers 2024-09-20 03:20:01 -04:00
Axionize d741459e2f Fix levers and buttons for < 1.13 2024-09-17 23:01:42 -04:00
Axionize 7007722aca Fix cactuses for pre-1.13 2024-09-17 22:48:53 -04:00
Axionize 05e7b3c1e5 Exit conditions early and remove unnccessary if statement 2024-09-17 22:27:43 -04:00
Axionize 13554546eb Deobfuscate and document purpose of misunderstood code in traverseBlocks() 2024-09-17 19:38:38 -04:00
Axionize e2f3722b52 Minor cleanup 2024-09-17 19:21:40 -04:00
AxionizeandManInMyVan 1b75734046 Update src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-09-16 21:55:53 -04:00
Ruxy 330a9782bc Add full Japanese translations for all GrimAC configuration files 2024-09-17 10:31:53 +12:00
Axionize 61d9609328 More minor optimizations 2024-09-16 01:55:13 -04:00
Axionize 4cff51c89f More minor optimizations 2024-09-16 01:32:27 -04:00
Axionize ace5178e99 Minor optimizations 2024-09-16 01:10:44 -04:00
Axionize 4a9d8627d3 Fix 1.8 Brewing Stand bug 2024-09-16 00:26:25 -04:00
Axionize fc89b932dd Cleanup exit conditions 2024-09-15 22:38:42 -04:00
Axionize 0852ac8326 Fix ascending rails on 1.8.9 2024-09-15 22:23:15 -04:00
Axionize 87194d7f1b Fix legacy walls 2024-09-15 22:19:07 -04:00
Axionize 31fa689a98 Fix modern walls 2024-09-15 22:12:40 -04:00
Axionize 5d366e742c Fix rails 2024-09-15 18:44:07 -04:00
Axionize 7cc3c8f5ef Fix blockface false flags 2024-09-15 17:58:14 -04:00
Axionize 7215dfcf60 Add scoring system for most likely blockface 2024-09-15 17:49:15 -04:00
Axionize 5c709c1c54 Check 0.03/0.002 and non-expanded hitbox (for blockfaces) 2024-09-15 17:20:55 -04:00
Axionize 1e5ad65c9f Fix null exception 2024-09-15 14:06:48 -04:00
Axionize f6aeffb264 Quick and dirty button patch 2024-09-15 04:33:14 -04:00
Axionize 4593f3077c Quick and dirty lever fix 2024-09-15 04:29:17 -04:00
Axionize b92c8726de End portals 2024-09-15 04:16:11 -04:00
Axionize c560539a16 Brewing stands (excluding 1.8-1.8.9) 2024-09-15 04:02:53 -04:00
Axionize 9cba7a95f7 Fix cactus 2024-09-15 03:54:00 -04:00
Axionize d6d86ef04d Fix rails 2024-09-15 03:38:03 -04:00
Axionize ed643f3481 legacy pane hitbox faces, still falses because different face? 2024-09-15 03:23:04 -04:00
Axionize d8c2f77a0b Pane fix outline 2024-09-15 02:23:41 -04:00
Axionize 6cfda647f7 Fix flower and short grass offsets for older versions 2024-09-15 01:43:07 -04:00
Axionize fc58fcc721 Fix Wall Banners and Banner Simulation falses 2024-09-15 00:31:30 -04:00
Axionize 5f0707956a Also check blockfaces 2024-09-14 21:37:21 -04:00
Axionize 528712e931 Fix Wall Banners and Banner Simulation falses 2024-09-14 21:13:03 -04:00
Axionize 8fe609452b Bypass check when player near moving shulkers, pistons 2024-09-14 18:52:20 -04:00
Axionize 3afd2c4ac9 Skip post on pre 2024-09-14 18:27:51 -04:00
Axionize 5793d7b678 Merge branch '2.0' into los-containers 2024-09-14 05:13:00 -04:00
Axionize 569a8b4c4d 'Fix' 0.03 for 1.8-1.18.1 2024-09-14 05:11:17 -04:00
Axionize 9cab8f7469 Fix flower offset being visual in 1.8 + bamboo sim 2024-09-09 01:42:07 -04:00
Axionize 1ac0b2efbe Fix Bamboo HitBox & Collision Box 2024-09-08 23:19:34 -04:00
Axionize b78a36f1c2 accidentally added bamboo to No Collision 2024-09-08 22:58:35 -04:00
Axionize e23d191cb8 Merge branch '2.0' into los-containers 2024-09-08 22:50:26 -04:00
Axionize 8854b00b46 Support for buttons in 1.7 2024-09-05 21:03:12 -04:00
Axionize 4be835de07 Skip redstone wires 2024-09-05 20:38:05 -04:00
Axionize b8f59fa99c Fix Pointed Dripstone 2024-09-02 14:40:28 -04:00
Axionize 2236efea4f Fix Small Dripleaf 2024-09-02 14:34:17 -04:00
Axionize 344ba4138d Fix Hanging Roots hit/collision box 2024-09-02 14:23:31 -04:00
Axionize ba0fa7a869 Refactor Bamboo to use OffsetCollisionBox; Fix Bamboo Sapling Hit & Collision Box 2024-09-02 14:16:47 -04:00
Axionize 21668a63fd Fix Tall Grass & Large Ferns 2024-09-02 14:10:45 -04:00
Axionize 2f6f9bcbc5 Fix Tall Seagrass hitbox 2024-09-02 03:25:02 -04:00
Axionize 86d19de452 Reorder HitboxData - Groups Before Individual StateTypes so individual statetypes can override group settings (mangrove and saplings) 2024-09-02 03:18:44 -04:00
Axionize d4986449f1 Fix Mangrove Propagule, add HexOffsetCollisionBox 2024-09-02 03:09:38 -04:00
Axionize 3fc366bf1a Fix Tall Flower Hit and Collision boxes 2024-09-02 02:00:32 -04:00
Axionize 9d192b215e Add OffsetCollisionBox; Document all OffSetBlocks and quirks 2024-09-02 01:54:03 -04:00
AxionizeandCyramek b4ea4517e9 Update src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java
Co-authored-by: Cyramek <xcyramek@gmail.com>
2024-09-01 23:25:07 -04:00
AxionizeandManInMyVan 07ad12a16f Update src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java
Whitespace

Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-09-01 22:46:16 -04:00
Axionize f7529a18df Remove Fence Hack; Fix Lever South Wall Hitbox; Initial Work for Flower Hitbox 2024-09-01 22:34:11 -04:00
Axionize c66522cb47 Move Blocks with NoCollision but a Outline/Hitbox into HitboxData 2024-09-01 21:36:34 -04:00
Axionize 94a31f77ff Fix Sweet Berry Collision + HitBox 2024-09-01 19:57:51 -04:00
Axionize c0630f9f6d Crop Collision Box Overhaul
Add Crop Hitboxes
- NetherWart
- Carrot
- Wheat
- Beetroot
- Potatoes
- COCOA

Replace CollisionBoxes with NoCollisionBox
- NetherWart
- Carrot
- Wheat
- Beatroot
- Pumpkin Stem
- Melon Stem

Added new CollisionBox and set to NoCollisionBox for
- Potatoes
2024-08-31 21:05:24 -04:00
Axionize 3a145cb615 Fix banners 2024-08-31 20:03:34 -04:00
Axionize 837516ea86 Fix syntax error 2024-08-31 14:57:07 -04:00
Axionize 66228f59be Add lever hitboxes and fix banner hitboxes 2024-08-31 14:55:33 -04:00
Axionize 800c79a898 Document Hex vs Simple CollisionBox purpose 2024-08-31 14:55:16 -04:00
Axionize 2177b12bcf Print out target block when flagged - help find falses from constant flagging on non-standard blocks 2024-08-30 14:44:22 -04:00
Axionize 050c22ce27 Clean up 2024-08-29 17:02:29 -04:00
Axionize ded614f30f MVP commit 2024-08-29 17:02:28 -04:00
Axionize 88e439ebfd Improve temporary fix - delete unncessary code 2024-08-29 02:55:40 -04:00
AxionizeandManInMyVan a027355c7d Update src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-08-29 02:53:48 -04:00
AxionizeandManInMyVan 8a351ec928 Update src/main/java/ac/grim/grimac/utils/collisions/datatypes/ComplexCollisionBox.java
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-08-29 02:52:53 -04:00
AxionizeandManInMyVan b2fa4974ef Update src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java
Co-authored-by: ManInMyVan <113963219+ManInMyVan@users.noreply.github.com>
2024-08-29 02:52:29 -04:00
Axionize 9c2a034b43 Temporary Hacky Fix to demonstrate cause of fence false flag 2024-08-29 02:35:29 -04:00
Axionize 45ba746300 Comment cleanup 2024-08-26 01:22:07 -04:00
Axionize 483f317f83 Remove unneeded entry in punishments.yml 2024-08-26 01:16:26 -04:00
Axionize dee3268bce Make variables private 2024-08-26 01:14:30 -04:00
Axionize 2a88d3eef4 Account for player being inside of target block 2024-08-26 00:39:00 -04:00
Axionize 2898fed15a 1.9+ tick behind and 1.7 ticking behaviour compensation 2024-08-26 00:20:40 -04:00
Axionize d2721077c9 Remove print statements and cleanup comments 2024-08-26 00:13:54 -04:00
Axionize dd7bb81b46 Rework whitelist to use HashSet 2024-08-26 00:13:04 -04:00
Axionize 4515d21023 Seperate LOS-block-place checks from Sam's LOS reach checks 2024-08-26 00:01:14 -04:00
Axionize 3315e3c148 Revert "Merge reach wall hit check"
This reverts commit b5990080
2024-08-25 23:58:36 -04:00
Axionize 2b552680a7 Fix styling 2024-08-25 13:44:26 -04:00
Axionize f78c80f04d Temporarily comment out system.out.println 2024-08-25 03:18:17 -04:00
Axionize bc239a7994 Fix block whitelist 2024-08-25 03:15:00 -04:00
Axionize a508ec2279 0.03/0.0002 changes, cleanup code, add comments 2024-08-24 23:15:46 -04:00
Axionize cccecbacbc Remove RotationPlace, replacec with LineOfSightPlace 2024-08-24 23:09:06 -04:00
Axionize 177a8b0527 Add config options for check and enable it by adding to punishments 2024-08-24 23:08:41 -04:00
Axionize d869ff959f Add config options for check and enable it by adding to punishments 2024-08-24 23:05:04 -04:00
Axionize 772ba562e6 Rename check 2024-08-24 23:04:50 -04:00
Axionize 1786360d7c Clean up Code and add code for blockTypeWhitelist to BlockLOS checks for performance. 2024-08-24 22:24:23 -04:00
Axionize 328596f01f Expand hitbox of target block by 0.03/0.0002 to account for known MC bug 2024-08-24 19:18:43 -04:00
Axionize 6a13c9f822 Expand hitbox of target block by 0.03/0.0002 to account for known MC bug 2024-08-24 19:18:41 -04:00
Axionize 3c78a63719 Workable check 2024-08-24 19:18:41 -04:00
Axionize 8b645b75df Stash commits - loop alternate possible scenarios 2024-08-24 19:18:41 -04:00
Axionize ae3ea30c92 Stash commits - compensated everything 2024-08-24 19:18:40 -04:00
Axionize 01bd2c0c11 Stash commits - compensated world 2024-08-24 19:18:40 -04:00
Axionize e91721299a Container LOS initial commit 2024-08-24 19:18:39 -04:00
Axionize 4e08ec9fca Deobfuscate and document purpose of misunderstood code in traverseBlocks() 2024-08-24 19:18:39 -04:00
Axionize b599008040 Merge reach wall hit check
(cherry picked from commit 335c33b109)
2024-08-24 19:18:39 -04:00
SamB440 831f68b00c Check for hitting through walls 2024-06-29 18:11:05 +01:00
MachineBreaker bccda6cb9e Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-11-04 00:17:56 -04:00
MachineBreaker d0e77d2959 InventoryD: Exempt last block place use item if < 50L 2023-11-03 09:06:48 -04:00
MachineBreaker 441ff72e1e Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-11-03 09:05:45 -04:00
MachineBreaker aff131394e Don't handle InventoryD predictions if slowed down by a item. 2023-10-17 04:25:06 -04:00
MachineBreaker 7a6f758853 Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-10-17 04:24:24 -04:00
MachineBreaker eef8f538bc Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-09-25 19:55:46 -04:00
MachineBreaker 42d79ea01f Exempt teleports for InventoryD
Fixes a false positive
2023-09-18 17:42:08 -04:00
MachineBreaker df2c92555f Update fr.yml 2023-09-18 17:40:42 -04:00
MachineBreaker 380f6b5581 Update fr.yml 2023-09-18 17:40:12 -04:00
MachineBreaker fb6450fb72 Merge branch '2.0' into inventory-checks 2023-09-18 17:38:59 -04:00
Alejandro Martinez bb01c25605 Close inventory synchronously 2023-05-25 19:32:55 -04:00
Alejandro Martinez d812e7dd8b Don't setback for inventory checks 2023-05-21 13:20:28 -04:00
Alejandro Martinez 60f3a765f3 Fix section typo 2023-05-21 11:26:10 -04:00
Alejandro Martinez 31d6bd3664 Bump config version & add missing config upgrade 2023-05-21 11:24:49 -04:00
MachineBreaker 4c0018b04c Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-05-21 10:49:06 -04:00
MachineBreaker 4b0b3df9d2 Merge pull request #2 from UserNugget/inventory-checks-hotfix
Make transaction id "NONE" really impossible
2023-04-05 06:05:47 -06:00
UserNugget f699be1a65 Make transaction id "NONE" really impossible 2023-04-05 14:39:43 +03:00
MachineBreaker b6496b31f0 Merge pull request #1 from UserNugget/inventory-checks
InventoryWalk check
2023-04-05 05:17:56 -06:00
UserNugget 1e601c3de9 Remove pointless optimization 2023-04-05 10:57:39 +03:00
MachineBreaker 00b39fec38 Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-04-04 20:50:49 -06:00
UserNugget 9224ab8a76 Correct some comments 2023-04-05 05:03:29 +03:00
UserNugget 5307aebbf5 Some small fixes 2023-04-04 23:00:34 +03:00
UserNugget e7d8d613aa Most likely fixed false flags 2023-04-04 22:56:22 +03:00
UserNugget f469b08505 Close inventory to prevent infinity setbacks 2023-04-04 22:34:48 +03:00
UserNugget 60b2a07659 Initial InventoryD rewrite 2023-04-04 15:28:46 +03:00
MachineBreaker 8d6d448073 Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-04-02 17:17:22 -06:00
Alejandro Martinez 798156fedc Merge branch 'inventory-checks' of https://github.com/MachineBreaker/Grim into inventory-checks
 Conflicts:
	src/main/java/ac/grim/grimac/utils/latency/CompensatedInventory.java
2023-03-19 08:23:30 -06:00
MachineBreaker e18510fc6b Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-03-19 08:23:09 -06:00
Alejandro Martinez 0fe96bf32d Implement InventoryD (Clicking inventory while moving) 2023-03-19 08:22:04 -06:00
noobi 6d1f491b80 Fix InventoryC missing setback vls 2023-03-19 00:27:49 +01:00
noobi 07ac8b99f0 Implement InventoryC (Placing while inventory is open) 2023-03-19 00:16:05 +01:00
Alejandro Martinez 622c35e935 Implement InventoryB (Digging while inventory is open) 2023-03-18 17:03:00 -06:00
Alejandro Martinez c6adad5992 Make code more readable 2023-03-18 16:24:23 -06:00
Alejandro Martinez 211722a8a7 Properly exempt beacon inventory 2023-03-18 16:22:51 -06:00
Alejandro Martinez a0082a4ce7 Merge remote-tracking branch 'origin/inventory-checks' into inventory-checks 2023-03-18 16:17:42 -06:00
Alejandro Martinez a4eb540d23 Implement InventoryA (Attack while inventory is open) 2023-03-18 16:16:51 -06:00
MachineBreaker 2d427d6c47 Merge branch 'GrimAnticheat:2.0' into inventory-checks 2023-03-18 14:19:25 -06:00
Alejandro Martinez 0d00168aaf Initial work of Inventory Checks 2023-03-17 04:25:35 -06:00
363 changed files with 14127 additions and 3203 deletions

No files matched your search

+1 -1
View File
@@ -5,4 +5,4 @@ name = "java"
enabled = true
[analyzers.meta]
runtime_version = "16"
runtime_version = "17"
+17
View File
@@ -0,0 +1,17 @@
root = true
[*]
charset = utf-8
indent_size = 4
indent_style = space
insert_final_newline = true
max_line_length = 100
tab_width = 4
# intellij specific configuration
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = false
ij_smart_tabs = false
ij_wrap_on_typing = false
+91 -17
View File
@@ -15,24 +15,98 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: read
contents: write # Allows the workflow to create or update references (tags)
packages: write
actions: write
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- name: Build with Gradle
uses: gradle/actions/setup-gradle@v3
with:
arguments: build
- name: Upload a Build Artifact
uses: actions/upload-artifact@v4
with:
path: /home/runner/work/Grim/Grim/build/libs/**.jar
# Temporary tasks so built jar works because PacketEvents won't merge my fixes for their bugs yet
- name: Clone Axionize's PacketEvents Repository
run: |
git clone -b fix/fabric-events https://github.com/Axionize/packetevents.git packetevents
cd packetevents
echo "Cloned PacketEvents repository"
- name: Build and Publish PacketEvents to Maven Local
uses: gradle/actions/setup-gradle@v3
with:
build-root-directory: packetevents
arguments: publishToMavenLocal
- name: Extract Version from build.gradle.kts
id: extract-version
run: |
# Extract the version from build.gradle.kts using grep and sed
VERSION=$(grep "^version\s*=" build.gradle.kts | sed 's/version\s*=\s*"\(.*\)"/\1/')
echo "VERSION: $VERSION"
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Build Lite Jar with Gradle
uses: gradle/actions/setup-gradle@v3
with:
arguments: build -PshadePE=false
- name: Upload Lite Artifact
uses: actions/upload-artifact@v4
with:
name: grimac-lite
path: ${{ github.workspace }}/build/libs/grimac-${{ env.VERSION }}-lite.jar
- name: Build Main Jar with Gradle
uses: gradle/actions/setup-gradle@v3
with:
arguments: build
- name: Upload Main Artifact
uses: actions/upload-artifact@v4
with:
name: grimac-main
path: ${{ github.workspace }}/build/libs/grimac-${{ env.VERSION }}.jar
- name: Generate build number
if: contains(fromJSON('["merge", "release", "main"]'), github.ref_name)
id: buildnumber
uses: onyxmueller/build-tag-number@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Publish to Modrinth
if: contains(fromJSON('["merge", "release", "main"]'), github.ref_name)
uses: Kir-Antipov/mc-publish@v3.3
with:
modrinth-id: ${{ vars.MODRINTH_ID }}
modrinth-featured: true
modrinth-unfeature-mode: subset
modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
files: |
${{ github.workspace }}/build/libs/grimac-${{ env.VERSION }}.jar
${{ github.workspace }}/build/libs/grimac-${{ env.VERSION }}-lite.jar
name: Lightning Grim Anticheat ${{ env.VERSION }}-b${{ steps.buildnumber.outputs.build_number }}
version: ${{ env.VERSION }}-b${{ steps.buildnumber.outputs.build_number }}
version-type: release
loaders: |
bukkit
spigot
paper
folia
purpur
game-versions: |
>=1.7
retry-attempts: 2
retry-delay: 10000
fail-mode: fail
+32 -12
View File
@@ -1,27 +1,47 @@
# GrimAC
This project is considered feature complete for the 2.0 (open-source) branch of this project. If you would like a bugfix or enhancement and cannot sponsor the work, pull requests are welcome. You can join the [discord](https://discord.com/invite/kqQAhTmkUF) for jar releases & changelogs.
GrimAC is an open source Minecraft anticheat designed for 1.21 and supports 1.8-1.21. It is free while in beta. It will eventually become paid and/or will include offering additional subscription based paid checks. Geyser players are fully exempt.
### Compiling through terminal/command prompt
1. git clone https://github.com/GrimAnticheat/Grim.git (or click the green code button, download ZIP, then unzip it.)
2. cd Grim
3. ./gradlew build
4. The final jar is located in build/libs
This project is considered feature complete for the 2.0 (open-source) branch of this project. If you would like a bugfix or enhancement and cannot sponsor the work, pull requests are welcome.
### API Information
Grim's API allows you to integrate Grim into your own plugins. For more information, check out the API's GitHub repository [here](https://github.com/GrimAnticheat/GrimAPI).
## Downloads
- [Modrinth](https://modrinth.com/plugin/grimac)
- [Hangar](https://hangar.papermc.io/GrimAnticheat/GrimAnticheat)
- [SpigotMC](https://www.spigotmc.org/resources/grim-anticheat.99923/)
- *For bleeding edge builds use* [Github artifacts](https://nightly.link/GrimAnticheat/Grim/workflows/gradle-publish/2.0/artifact.zip)
## Installation notes
- Java 8 is fully supported.
- Paper, Spigot, and Folia are currently supported.
- If you use Geyser, place Floodgate on the backend server so grim can exempt bedrock players. Grim cannot access the Floodgate API if it is on the proxy.
- If you use ViaVersion, it should be on the backend server as movement is highly dependent on client version.
## Support & wiki information
- Support & discussion: [Discord](https://discord.com/invite/kqQAhTmkUF)
- Report issues: [Issues](https://github.com/GrimAnticheat/Grim/issues/new/choose)
- Wiki & examples: [Wiki](https://github.com/GrimAnticheat/Grim/wiki)
## Developer API
Grim's API allows you to integrate Grim into your own plugins.
- API repository: [GrimAPI](https://github.com/GrimAnticheat/GrimAPI)
- Wiki info: [Wiki](https://github.com/GrimAnticheat/GrimAPI)
## How to compile
1. `git clone https://github.com/GrimAnticheat/Grim.git`
2. `cd Grim`
3. `./gradlew build`
4. The final jar will compile into the build/libs folder
## Grim supremacy
Here are the main cores that make Grim stand out against other anticheats
What makes Grim stand out against other anticheats?
### Movement Simulation Engine
* We have a 1:1 replication of the player's possible movements
* This covers everything from basic walking, swimming, knockback, cobwebs, to bubble columns
* It even covers riding entities from boats to pigs to striders
* This covers everything from basic walking, swimming, knockback, cobwebs, to bubble columns
* It even covers riding entities from boats to pigs to striders
* Built upon covering edge cases to confirm accuracy
* 1.13+ clients on 1.13+ servers, 1.12- clients on 1.13+ servers, 1.13+ clients on 1.12- servers, and 1.12- clients on 1.12- servers are all supported regardless of the large technical changes between these versions.
* The order of collisions depends on the client version and is correct
+81 -19
View File
@@ -3,7 +3,7 @@ import net.minecrell.pluginyml.bukkit.BukkitPluginDescription.Permission
plugins {
id("java")
id("maven-publish")
id("com.github.johnrengelman.shadow") version "8.1.1"
id("com.gradleup.shadow") version "9.0.0-beta6"
id("io.freefair.lombok") version "8.6"
id("net.minecrell.plugin-yml.bukkit") version "0.6.0"
id("com.diffplug.spotless") version "6.25.0"
@@ -26,25 +26,40 @@ spotless {
}
group = "ac.grim.grimac"
version = "2.3.68"
version = "2.3.72"
description = "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0."
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
java.sourceCompatibility = JavaVersion.VERSION_1_8
java.targetCompatibility = JavaVersion.VERSION_1_8
// Set to false for debug builds
// You cannot live reload classes if the jar relocates dependencies
var relocate = true;
// Checks Project properties -> environment variable -> defaults true
val relocate: Boolean = project.findProperty("relocate")?.toString()?.toBoolean()
?: System.getenv("RELOCATE_JAR")?.toBoolean()
?: true
// Whether or not to shade PE into the jar, some servers may not want this if they use other plugins
// With PE; this prevents duplicate listening and reduces RAM usage by ~80-100 MB
val shadePE: Boolean = project.findProperty("shadePE")?.toString()?.toBoolean()
?: System.getenv("SHADE_PE")?.toBoolean()
?: true
repositories {
mavenLocal()
maven {
name = "papermc"
url = uri("https://repo.papermc.io/repository/maven-public/")
}
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") // Spigot
maven("https://jitpack.io/") { // Grim API
content {
includeGroup("com.github.grimanticheat")
}
}
maven {
name = "grimacSnapshots"
url = uri("https://repo.grim.ac/snapshots")
}
maven("https://repo.viaversion.com") // ViaVersion
maven("https://repo.aikar.co/content/groups/aikar/") // ACF
maven("https://nexus.scarsz.me/content/repositories/releases") // Configuralize
@@ -52,26 +67,38 @@ repositories {
maven("https://repo.opencollab.dev/maven-releases/") // Cumulus (for Floodgate)
maven("https://repo.codemc.io/repository/maven-releases/") // PacketEvents
maven("https://repo.codemc.io/repository/maven-snapshots/")
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") // placeholderapi
mavenCentral()
// FastUtil, Discord-Webhooks
}
dependencies {
implementation("com.github.retrooper:packetevents-spigot:2.5.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT")
// PE dependency is now conditional
if (shadePE) {
implementation("com.github.retrooper:packetevents-spigot:2.8.0-SNAPSHOT")
} else {
compileOnly("com.github.retrooper:packetevents-spigot:2.8.0-SNAPSHOT")
}
implementation("co.aikar:acf-paper:0.5.1-SNAPSHOT")
implementation("club.minnced:discord-webhooks:0.8.0") // Newer versions include kotlin-stdlib, which leads to incompatibility with plugins that use Kotlin
implementation("it.unimi.dsi:fastutil:8.5.13")
implementation("it.unimi.dsi:fastutil:8.5.15")
implementation("github.scarsz:configuralize:1.4.0")
implementation("com.zaxxer:HikariCP:4.0.3")
//implementation("com.github.grimanticheat:grimapi:1193c4fa41")
// Used for local testing: implementation("ac.grim.grimac:GRIMAPI:1.0")
implementation("com.github.grimanticheat:grimapi:fc5634e444")
// Used for local testing:
//implementation("ac.grim.grimac:GrimAPI:1.0")
implementation("ac.grim.grimac:GrimAPI:05e31d62f2")
implementation("net.kyori:adventure-text-minimessage:4.20.0")
implementation("net.kyori:adventure-platform-bukkit:4.3.4")
implementation("org.jetbrains:annotations:24.1.0")
compileOnly("org.geysermc.floodgate:api:2.0-SNAPSHOT")
compileOnly("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT")
compileOnly("com.viaversion:viaversion-api:5.0.4-SNAPSHOT")
//
compileOnly("me.clip:placeholderapi:2.11.6")
compileOnly("io.netty:netty-all:4.1.85.Final")
}
@@ -83,6 +110,10 @@ bukkit {
apiVersion = "1.13"
foliaSupported = true
if (!shadePE) {
depend = listOf("packetevents") + (depend ?: emptyList())
}
softDepend = listOf(
"ProtocolLib",
"ProtocolSupport",
@@ -92,7 +123,8 @@ bukkit {
"ViaRewind",
"Geyser-Spigot",
"floodgate",
"FastLogin"
"FastLogin",
"PlaceholderAPI",
)
permissions {
@@ -121,6 +153,11 @@ bukkit {
default = Permission.Default.OP
}
register("grim.brand.enable-on-join") {
description = "Enable showing client brands on join"
default = Permission.Default.OP
}
register("grim.sendalert") {
description = "Send cheater alert"
default = Permission.Default.OP
@@ -140,6 +177,16 @@ bukkit {
description = "Exempt from all checks"
default = Permission.Default.FALSE
}
register("grim.verbose") {
description = "Receive verbose alerts for violations. Requires grim.alerts"
default = Permission.Default.OP
}
register("grim.verbose.enable-on-join") {
description = "Enable verbose alerts on join. Requires grim.alerts and grim.alerts.enable-on-join"
default = Permission.Default.FALSE
}
}
}
@@ -152,16 +199,30 @@ tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
disableAutoTargetJvm()
}
publishing.publications.create<MavenPublication>("maven") {
artifact(tasks["shadowJar"])
}
tasks.shadowJar {
manifest {
attributes["paperweight-mappings-namespace"] = "mojang"
}
minimize()
archiveFileName.set("${project.name}-${project.version}.jar")
archiveFileName.set("${project.name}-${project.version}${if (shadePE) "" else "-lite"}.jar")
if (relocate) {
relocate("io.github.retrooper.packetevents", "ac.grim.grimac.shaded.io.github.retrooper.packetevents")
relocate("com.github.retrooper.packetevents", "ac.grim.grimac.shaded.com.github.retrooper.packetevents")
// Only relocate PE if we're shading it
if (shadePE) {
relocate("io.github.retrooper.packetevents", "ac.grim.grimac.shaded.io.github.retrooper.packetevents")
relocate("com.github.retrooper.packetevents", "ac.grim.grimac.shaded.com.github.retrooper.packetevents")
exclude("assets/mappings") // Exclude new PE mappings folder
relocate("net.kyori", "ac.grim.grimac.shaded.kyori") // use PE's built-in adventure instead when not shading
}
relocate("co.aikar.commands", "ac.grim.grimac.shaded.acf")
relocate("co.aikar.locale", "ac.grim.grimac.shaded.locale")
relocate("club.minnced", "ac.grim.grimac.shaded.discord-webhooks")
@@ -170,12 +231,13 @@ tasks.shadowJar {
relocate("com.google.code.gson", "ac.grim.grimac.shaded.gson")
relocate("alexh", "ac.grim.grimac.shaded.maps")
relocate("it.unimi.dsi.fastutil", "ac.grim.grimac.shaded.fastutil")
relocate("net.kyori", "ac.grim.grimac.shaded.kyori")
relocate("okhttp3", "ac.grim.grimac.shaded.okhttp3")
relocate("okio", "ac.grim.grimac.shaded.okio")
relocate("org.yaml.snakeyaml", "ac.grim.grimac.shaded.snakeyaml")
relocate("org.json", "ac.grim.grimac.shaded.json")
relocate("org.intellij", "ac.grim.grimac.shaded.intellij")
relocate("org.jetbrains", "ac.grim.grimac.shaded.jetbrains")
relocate("com.zaxxer", "ac.grim.grimac.shaded.zaxxer")
relocate("org.slf4j", "ac.grim.grimac.shaded.slf4j")
}
}
Binary file not shown.
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Vendored
+2 -3
View File
@@ -86,8 +86,7 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -206,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
+23 -3
View File
@@ -2,8 +2,11 @@ package ac.grim.grimac;
import ac.grim.grimac.manager.*;
import ac.grim.grimac.manager.config.BaseConfigManager;
import ac.grim.grimac.manager.violationdatabase.ViolationDatabaseManager;
import ac.grim.grimac.utils.anticheat.LogUtil;
import ac.grim.grimac.utils.anticheat.PlayerDataManager;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
@Getter
@@ -17,22 +20,39 @@ public enum GrimAPI {
private final PlayerDataManager playerDataManager = new PlayerDataManager();
private final TickManager tickManager = new TickManager();
private final GrimExternalAPI externalAPI = new GrimExternalAPI(this);
private ViolationDatabaseManager violationDatabaseManager;
private InitManager initManager;
private JavaPlugin plugin;
private boolean criticalLoadFailure = false; // Track critical failures
public void load(final JavaPlugin plugin) {
this.plugin = plugin;
this.violationDatabaseManager = new ViolationDatabaseManager(plugin);
initManager = new InitManager();
initManager.load();
initManager.load(); // Load all initializers
}
public void start(final JavaPlugin plugin) {
this.plugin = plugin;
initManager.start();
if (initManager != null) {
initManager.start();
}
if (criticalLoadFailure) {
LogUtil.error("GrimAC encountered one or more critical error(s) during initialization.");
Bukkit.getPluginManager().disablePlugin(plugin);
}
}
public void stop(final JavaPlugin plugin) {
this.plugin = plugin;
initManager.stop();
if (initManager != null) {
initManager.stop();
}
}
// Method to signal a critical failure
public void signalCriticalFailure() {
criticalLoadFailure = true;
}
}
@@ -22,6 +22,7 @@ import org.bukkit.plugin.ServicePriority;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
@@ -43,8 +44,10 @@ public class GrimExternalAPI implements GrimAbstractAPI, ConfigReloadObserver, I
}
@Override
public void setServerName(String name) {
variableReplacements.put("%server%", user -> name);
public @Nullable GrimUser getGrimUser(UUID uuid) {
Player player = Bukkit.getPlayer(uuid);
if (player == null) return null;
return getGrimUser(player);
}
@Getter
@@ -53,8 +56,7 @@ public class GrimExternalAPI implements GrimAbstractAPI, ConfigReloadObserver, I
@Getter
private final Map<String, String> staticReplacements = new ConcurrentHashMap<>();
public String replaceVariables(GrimUser user, String content, boolean colors) {
if (colors) content = ChatColor.translateAlternateColorCodes('&', content);
public String replaceVariables(GrimUser user, String content) {
for (Map.Entry<String, String> entry : staticReplacements.entrySet()) {
content = content.replace(entry.getKey(), entry.getValue());
}
@@ -114,6 +116,16 @@ public class GrimExternalAPI implements GrimAbstractAPI, ConfigReloadObserver, I
return configManager;
}
@Override
public boolean hasStarted() {
return started;
}
@Override
public int getCurrentTick() {
return GrimAPI.INSTANCE.getTickManager().currentTick;
}
private ConfigManager configManager = null;
private final ConfigManagerFileImpl configManagerFile = new ConfigManagerFileImpl();
private boolean started = false;
@@ -208,7 +220,7 @@ public class GrimExternalAPI implements GrimAbstractAPI, ConfigReloadObserver, I
variableReplacements.putIfAbsent("%tps%", user -> String.format("%.2f", SpigotReflectionUtil.getTPS()));
variableReplacements.putIfAbsent("%version%", GrimUser::getVersionName);
// static variables
staticReplacements.putIfAbsent("%prefix%", ChatColor.translateAlternateColorCodes('&', GrimAPI.INSTANCE.getConfigManager().getPrefix()));
staticReplacements.put("%prefix%", ChatColor.translateAlternateColorCodes('&', GrimAPI.INSTANCE.getConfigManager().getPrefix()));
staticReplacements.putIfAbsent("%grim_version%", getGrimVersion());
}
+80 -29
View File
@@ -5,9 +5,10 @@ import ac.grim.grimac.api.AbstractCheck;
import ac.grim.grimac.api.config.ConfigManager;
import ac.grim.grimac.api.events.FlagEvent;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.common.ConfigReloadObserver;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import io.github.retrooper.packetevents.util.folia.FoliaScheduler;
import lombok.Getter;
import lombok.Setter;
@@ -15,7 +16,7 @@ import org.bukkit.Bukkit;
// Class from https://github.com/Tecnio/AntiCheatBase/blob/master/src/main/java/me/tecnio/anticheat/check/Check.java
@Getter
public class Check implements AbstractCheck, ConfigReloadObserver {
public class Check extends GrimProcessor implements AbstractCheck {
protected final GrimPlayer player;
public double violations;
@@ -31,20 +32,16 @@ public class Check implements AbstractCheck, ConfigReloadObserver {
private boolean experimental;
@Setter
private boolean isEnabled;
private boolean exempted;
@Override
public boolean isExperimental() {
return experimental;
}
private boolean exemptPermission;
private boolean noSetbackPermission;
private boolean noModifyPacketPermission;
public Check(final GrimPlayer player) {
this.player = player;
final Class<?> checkClass = this.getClass();
if (checkClass.isAnnotationPresent(CheckData.class)) {
final CheckData checkData = checkClass.getAnnotation(CheckData.class);
final CheckData checkData = this.getClass().getAnnotation(CheckData.class);
if (checkData != null) {
this.checkName = checkData.name();
this.configName = checkData.configName();
// Fall back to check name
@@ -56,23 +53,31 @@ public class Check implements AbstractCheck, ConfigReloadObserver {
this.description = checkData.description();
this.displayName = this.checkName;
}
//
reload();
}
public boolean shouldModifyPackets() {
return isEnabled && !player.disableGrim && !player.noModifyPacketPermission && !exempted;
return isEnabled && !player.disableGrim && !player.noModifyPacketPermission && !exemptPermission;
}
public void updateExempted() {
public void updatePermissions() {
if (player.bukkitPlayer == null || checkName == null) return;
FoliaScheduler.getEntityScheduler().run(player.bukkitPlayer, GrimAPI.INSTANCE.getPlugin(),
t -> exempted = player.bukkitPlayer.hasPermission("grim.exempt." + checkName.toLowerCase()),
() -> {});
FoliaScheduler.getEntityScheduler().run(
player.bukkitPlayer,
GrimAPI.INSTANCE.getPlugin(),
t -> {
final String id = checkName.toLowerCase();
exemptPermission = player.bukkitPlayer.hasPermission("grim.exempt." + id);
noSetbackPermission = player.bukkitPlayer.hasPermission("grim.nosetback." + id);
noModifyPacketPermission = player.bukkitPlayer.hasPermission("grim.nomodifypacket." + id);
},
() -> {}
);
}
public final boolean flagAndAlert(String verbose) {
if (flag()) {
if (flag(verbose)) {
alert(verbose);
return true;
}
@@ -84,16 +89,21 @@ public class Check implements AbstractCheck, ConfigReloadObserver {
}
public final boolean flag() {
if (player.disableGrim || (experimental && !player.isExperimentalChecks()) || exempted)
return flag("");
}
private long lastViolationTime;
public final boolean flag(String verbose) {
if (player.disableGrim || (experimental && !player.isExperimentalChecks()) || exemptPermission)
return false; // Avoid calling event if disabled
FlagEvent event = new FlagEvent(player, this);
FlagEvent event = new FlagEvent(player, this, verbose);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) return false;
player.punishmentManager.handleViolation(this);
lastViolationTime = System.currentTimeMillis();
violations++;
return true;
}
@@ -106,6 +116,18 @@ public class Check implements AbstractCheck, ConfigReloadObserver {
return false;
}
public final boolean flagAndAlertWithSetback() {
return flagAndAlertWithSetback("");
}
public final boolean flagAndAlertWithSetback(String verbose) {
if (flagAndAlert(verbose)) {
setbackIfAboveSetbackVL();
return true;
}
return false;
}
public final void reward() {
violations = Math.max(0, violations - decay);
}
@@ -115,9 +137,10 @@ public class Check implements AbstractCheck, ConfigReloadObserver {
decay = configuration.getDoubleElse(configName + ".decay", decay);
setbackVL = configuration.getDoubleElse(configName + ".setbackvl", setbackVL);
displayName = configuration.getStringElse(configName + ".displayname", checkName);
description = configuration.getStringElse(configName + ".description", description);
if (setbackVL == -1) setbackVL = Double.MAX_VALUE;
updateExempted();
updatePermissions();
onReload(configuration);
}
@@ -131,14 +154,14 @@ public class Check implements AbstractCheck, ConfigReloadObserver {
}
public boolean setbackIfAboveSetbackVL() {
if (getViolations() > setbackVL) {
if (shouldSetback()) {
return player.getSetbackTeleportUtil().executeViolationSetback();
}
return false;
}
public boolean isAboveSetbackVl() {
return getViolations() > setbackVL;
public boolean shouldSetback() {
return !noSetbackPermission && violations > setbackVL;
}
public String formatOffset(double offset) {
@@ -150,9 +173,37 @@ public class Check implements AbstractCheck, ConfigReloadObserver {
packetType == PacketType.Play.Client.WINDOW_CONFIRMATION;
}
@Override
public void reload() {
reload(GrimAPI.INSTANCE.getConfigManager().getConfig());
public boolean isFlying(PacketTypeCommon packetType) {
return WrapperPlayClientPlayerFlying.isFlying(packetType);
}
public boolean isUpdate(PacketTypeCommon packetType) {
return isFlying(packetType)
|| packetType == PacketType.Play.Client.CLIENT_TICK_END
|| isTransaction(packetType);
}
public boolean isTickPacket(PacketTypeCommon packetType) {
if (isTickPacketIncludingNonMovement(packetType)) {
if (isFlying(packetType)) {
return !player.packetStateData.lastPacketWasTeleport && !player.packetStateData.lastPacketWasOnePointSeventeenDuplicate;
}
return true;
}
return false;
}
public boolean isTickPacketIncludingNonMovement(PacketTypeCommon packetType) {
// On 1.21.2+ fall back to the TICK_END packet IF the player did not send a movement packet for their tick
// TickTimer checks to see if player did not send a tick end packet before new flying packet is sent
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_21_2)
&& !player.packetStateData.didSendMovementBeforeTickEnd) {
if (packetType == PacketType.Play.Client.CLIENT_TICK_END) {
return true;
}
}
return isFlying(packetType);
}
}
@@ -0,0 +1,17 @@
package ac.grim.grimac.checks;
import ac.grim.grimac.GrimAPI;
import ac.grim.grimac.api.AbstractProcessor;
import ac.grim.grimac.api.config.ConfigReloadable;
import ac.grim.grimac.utils.common.ConfigReloadObserver;
public abstract class GrimProcessor implements AbstractProcessor, ConfigReloadable, ConfigReloadObserver {
// Not everything has to be a check for it to process packets & be configurable
@Override
public void reload() {
reload(GrimAPI.INSTANCE.getConfigManager().getConfig());
}
}
@@ -0,0 +1,23 @@
package ac.grim.grimac.checks.debug;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.player.GrimPlayer;
import org.bukkit.entity.Player;
public abstract class AbstractDebugHandler extends Check {
protected final GrimPlayer grimPlayer;
public AbstractDebugHandler(GrimPlayer grimPlayer) {
super(grimPlayer);
this.grimPlayer = grimPlayer;
}
public GrimPlayer getPlayer() {
return grimPlayer;
}
public abstract void toggleListener(Player player);
public abstract boolean toggleConsoleOutput();
}
@@ -0,0 +1,198 @@
package ac.grim.grimac.checks.debug;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.collisions.datatypes.CollisionBox;
import ac.grim.grimac.utils.collisions.datatypes.NoCollisionBox;
import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox;
import ac.grim.grimac.utils.data.Pair;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPluginMessage;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* Handles debug visualization of hitboxes and reach calculations for GrimAC.
* Sends debug data to clients through plugin messages that can be visualized by compatible clients.
*/
public class HitboxDebugHandler extends AbstractDebugHandler {
/**
* Set of players currently listening to hitbox debug data
*/
private final Set<Player> listeners = new CopyOnWriteArraySet<>(new HashSet<>());
/**
* Creates a new HitboxDebugHandler for the specified player
*
* @param grimPlayer The GrimAC player instance to debug
*/
public HitboxDebugHandler(GrimPlayer grimPlayer) {
super(grimPlayer);
}
/**
* Toggles whether a player receives hitbox debug visualization data.
* If the player is already listening, they will be removed. If not, they will be added.
*
* @param player The player to toggle debug visualization for
*/
@Override
public void toggleListener(Player player) {
if (!listeners.remove(player)) listeners.add(player);
}
@Override
public boolean toggleConsoleOutput() {
throw new UnsupportedOperationException();
}
/**
* Sends debug visualization data for reach calculations to all listening players.
* The data includes hitboxes, target entities, look vectors, and eye heights used in reach calculations.
*
* @param hitboxes Map of entity IDs to their collision boxes
* @param targetEntities Set of entity IDs that are considered targets
* @param lookVecsAndEyeHeights List of pairs containing look vectors and their corresponding eye heights
* @param basePos Base position before eye height adjustments
* @param isPrediction Whether these hitboxes are from a prediction calculation
*
* Packet Format (Version 1):
* - Byte: Version (0)
* - Byte: Global flags
* - Bit 0: isPrediction
* - Bits 1-7: Reserved
* - Double: Player reach/interact distance
* - Vector3d: Base position (3 doubles)
* - VarInt: Number of ray traces
* - For each ray trace:
* - Double: Eye height delta
* - Vector3d: Look vector (3 doubles)
* - VarInt: Number of hitboxes
* - For each hitbox:
* - VarInt: Entity ID
* - Byte: Flags
* - Bit 0: Is target entity
* - Bit 1: Is no collision
* - Bits 2-7: Reserved
* - If not NoCollisionBox:
* - Double: minX
* - Double: minY
* - Double: minZ
* - Double: maxX
* - Double: maxY
* - Double: maxZ
*/
public void sendHitboxData(Map<Integer, CollisionBox> hitboxes, Set<Integer> targetEntities,
List<Pair<Vector, Double>> lookVecsAndEyeHeights, Vector basePos,
boolean isPrediction, double reachDistance) {
if (!isEnabled()) return;
ByteBuf buffer = Unpooled.buffer();
try {
// Version Header
buffer.writeByte(1);
// Global Flags Header
// Pack boolean flags into a single byte
byte global_flags = 0;
global_flags |= (isPrediction ? 1 : 0); // Bit 0: are the hitboxes from a prediction?
// Bits 2-7 reserved for future use
buffer.writeByte(global_flags);
// Write reach distance
buffer.writeDouble(reachDistance);
// Write base position
writeVector(buffer, basePos);
// Write number of ray traces
ByteBufHelper.writeVarInt(buffer, lookVecsAndEyeHeights.size());
// Write all possible ray traces
for (Pair<Vector, Double> pair : lookVecsAndEyeHeights) {
Vector lookVec = pair.first();
double eyeHeight = pair.second();
// Write eye height delta and look vector
// we make them 3 meters shorter because all of the vectors passed into here are made 3 meters longer
// then they need to be so grim can report correct reach distance for too far away hits
buffer.writeDouble(eyeHeight);
writeVector(buffer, lookVec);
}
// Write number of hitboxes
ByteBufHelper.writeVarInt(buffer, hitboxes.size());
// Write hitbox data
for (Map.Entry<Integer, CollisionBox> entry : hitboxes.entrySet()) {
int entityId = entry.getKey();
CollisionBox box = entry.getValue();
// Write entity ID
ByteBufHelper.writeVarInt(buffer, entityId);
// Pack boolean flags into a single byte
byte flags = 0;
flags |= (targetEntities.contains(entityId) ? 1 : 0); // Bit 0: Is target
flags |= (box == NoCollisionBox.INSTANCE ? 2 : 0); // Bit 1: Is no collision
// Bits 2-7 reserved for future use
buffer.writeByte(flags);
// Write box coordinates if it's not a NoCollisionBox
if ((flags & 2) == 0) {
SimpleCollisionBox simpleCollisionBox = (SimpleCollisionBox) box;
buffer.writeDouble(simpleCollisionBox.minX);
buffer.writeDouble(simpleCollisionBox.minY);
buffer.writeDouble(simpleCollisionBox.minZ);
buffer.writeDouble(simpleCollisionBox.maxX);
buffer.writeDouble(simpleCollisionBox.maxY);
buffer.writeDouble(simpleCollisionBox.maxZ);
}
}
// Convert buffer to byte array
byte[] data = new byte[buffer.readableBytes()];
buffer.readBytes(data);
// Create and send packet
WrapperPlayServerPluginMessage packet = new WrapperPlayServerPluginMessage(
"grim:debug_hitbox",
data
);
// Send to all listeners
for (Player listener : listeners) {
if (listener != null) {
PacketEvents.getAPI().getPlayerManager().sendPacket(listener, packet);
}
}
} finally {
// Release buffer to prevent memory leaks
buffer.release();
}
}
public boolean isEnabled() {
return !listeners.isEmpty();
}
/**
* Helper method to write a Vector to the ByteBuf
* @param buffer The buffer to write to
* @param vector The vector to write
*/
private void writeVector(ByteBuf buffer, Vector vector) {
buffer.writeDouble(vector.getX());
buffer.writeDouble(vector.getY());
buffer.writeDouble(vector.getZ());
}
}
@@ -16,7 +16,7 @@ public class AimDuplicateLook extends Check implements RotationCheck {
@Override
public void process(final RotationUpdate rotationUpdate) {
if (player.packetStateData.lastPacketWasTeleport || player.packetStateData.lastPacketWasOnePointSeventeenDuplicate || player.compensatedEntities.getSelf().getRiding() != null) {
if (player.packetStateData.lastPacketWasTeleport || player.packetStateData.lastPacketWasOnePointSeventeenDuplicate || player.compensatedEntities.self.getRiding() != null) {
exempt = true;
return;
}
@@ -20,7 +20,10 @@ public class AimModulo360 extends Check implements RotationCheck {
@Override
public void process(final RotationUpdate rotationUpdate) {
if (player.packetStateData.lastPacketWasTeleport) {
// Exempt for teleport, entering a vehicle due to rotation reset or
// after forced, client-sided rotation change after interacting with a horse (not necessarily mounting it)
if (player.packetStateData.lastPacketWasTeleport || player.vehicleData.wasVehicleSwitch
|| player.packetStateData.horseInteractCausedForcedRotation) {
lastDeltaYaw = rotationUpdate.getDeltaXRot();
return;
}
@@ -8,7 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientHeldItemChange;
@CheckData(name = "BadPacketsA")
@CheckData(name = "BadPacketsA", description = "Sent duplicate slot id")
public class BadPacketsA extends Check implements PacketCheck {
int lastSlot = -1;
@@ -5,10 +5,11 @@ import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
@CheckData(name = "BadPacketsC")
@CheckData(name = "BadPacketsC", description = "Interacted with self")
public class BadPacketsC extends Check implements PacketCheck {
public BadPacketsC(GrimPlayer player) {
super(player);
@@ -17,6 +18,7 @@ public class BadPacketsC extends Check implements PacketCheck {
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
if (player.gamemode == GameMode.SPECTATOR) return;
if (new WrapperPlayClientInteractEntity(event).getEntityId() == player.entityID) {
// Instant ban
if (flagAndAlert() && shouldModifyPackets()) {
@@ -8,7 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
@CheckData(name = "BadPacketsD")
@CheckData(name = "BadPacketsD", description = "Impossible pitch")
public class BadPacketsD extends Check implements PacketCheck {
public BadPacketsD(GrimPlayer player) {
super(player);
@@ -4,8 +4,11 @@ import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
@CheckData(name = "BadPacketsE")
@@ -18,12 +21,14 @@ public class BadPacketsE extends Check implements PacketCheck {
@Override
public void onPacketReceive(PacketReceiveEvent event) {
final boolean isViaPleaseStopUsingProtocolHacksOnYourServer = player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_21_2) || PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_21_2);
if (event.getPacketType() == PacketType.Play.Client.PLAYER_POSITION_AND_ROTATION ||
event.getPacketType() == PacketType.Play.Client.PLAYER_POSITION) {
noReminderTicks = 0;
} else if (WrapperPlayClientPlayerFlying.isFlying(event.getPacketType())) {
noReminderTicks++;
} else if (event.getPacketType() == PacketType.Play.Client.STEER_VEHICLE) {
} else if (event.getPacketType() == PacketType.Play.Client.STEER_VEHICLE
|| (isViaPleaseStopUsingProtocolHacksOnYourServer && player.inVehicle())) {
noReminderTicks = 0; // Exempt vehicles
}
@@ -8,7 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "BadPacketsF")
@CheckData(name = "BadPacketsF", description = "Sent duplicate sprinting status")
public class BadPacketsF extends Check implements PacketCheck {
public boolean lastSprinting;
public boolean exemptNext = true; // Support 1.14+ clients starting on either true or false sprinting, we don't know
@@ -8,10 +8,9 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "BadPacketsG")
@CheckData(name = "BadPacketsG", description = "Sent duplicate sneaking status")
public class BadPacketsG extends Check implements PacketCheck {
boolean wasTeleport;
boolean lastSneaking;
private boolean lastSneaking, respawn;
public BadPacketsG(GrimPlayer player) {
super(player);
@@ -19,13 +18,12 @@ public class BadPacketsG extends Check implements PacketCheck {
@Override
public void onPacketReceive(PacketReceiveEvent event) {
wasTeleport = player.packetStateData.lastPacketWasTeleport || wasTeleport;
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION) {
WrapperPlayClientEntityAction packet = new WrapperPlayClientEntityAction(event);
if (packet.getAction() == WrapperPlayClientEntityAction.Action.START_SNEAKING) {
if (lastSneaking && !wasTeleport) {
// The player may send two START_SNEAKING packets if they respawned
if (lastSneaking && !respawn) {
if (flagAndAlert("state=true") && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
@@ -33,8 +31,9 @@ public class BadPacketsG extends Check implements PacketCheck {
} else {
lastSneaking = true;
}
respawn = false;
} else if (packet.getAction() == WrapperPlayClientEntityAction.Action.STOP_SNEAKING) {
if (!lastSneaking && !wasTeleport) {
if (!lastSneaking && !respawn) {
if (flagAndAlert("state=false") && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
@@ -42,7 +41,13 @@ public class BadPacketsG extends Check implements PacketCheck {
} else {
lastSneaking = false;
}
respawn = false;
}
}
}
public void handleRespawn() {
// Clients could potentially not send a STOP_SNEAKING packet when they die, so we need to track it
respawn = true;
}
}
@@ -11,7 +11,7 @@ import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
@CheckData(name = "BadPacketsH")
@CheckData(name = "BadPacketsH", description = "Did not swing for attack")
public class BadPacketsH extends Check implements PacketCheck {
// 1.9 packet order: INTERACT -> ANIMATION
@@ -41,9 +41,9 @@ public class BadPacketsH extends Check implements PacketCheck {
// I will simply disable this check for 1.8- clients on 1.9+ servers as I can't be bothered to find a way around this.
// Stop supporting such old clients on modern servers!
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_9)
&& PacketEvents.getAPI().getServerManager().getVersion().isNewerThan(ServerVersion.V_1_8)) return;
&& PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9)) return;
if (!sentAnimation && flagAndAlert()) {
if (!sentAnimation && flagAndAlert() && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
@@ -8,7 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerAbilities;
@CheckData(name = "BadPacketsI")
@CheckData(name = "BadPacketsI", description = "Claimed to be flying while unable to fly")
public class BadPacketsI extends Check implements PacketCheck {
public BadPacketsI(GrimPlayer player) {
super(player);
@@ -8,7 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.GameMode;
@CheckData(name = "BadPacketsK")
@CheckData(name = "BadPacketsK", description = "Sent spectate packets while not in spectator mode")
public class BadPacketsK extends Check implements PacketCheck {
public BadPacketsK(GrimPlayer player) {
super(player);
@@ -8,13 +8,11 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.world.BlockFace;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import java.util.Locale;
// checks for impossible dig packets
@CheckData(name = "BadPacketsL")
@CheckData(name = "BadPacketsL", description = "Sent impossible dig packet")
public class BadPacketsL extends Check implements PacketCheck {
public BadPacketsL(GrimPlayer player) {
@@ -30,19 +28,20 @@ public class BadPacketsL extends Check implements PacketCheck {
// 1.8 and above clients always send digging packets that aren't used for digging at 0, 0, 0, facing DOWN
// 1.7 and below clients do the same, except use SOUTH for RELEASE_USE_ITEM
final BlockFace expectedFace = player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10) && packet.getAction() == DiggingAction.RELEASE_USE_ITEM
? BlockFace.SOUTH : BlockFace.DOWN;
final int expectedFace = player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10) && packet.getAction() == DiggingAction.RELEASE_USE_ITEM
? 255 : 0;
if (packet.getBlockFace() != expectedFace
if (packet.getBlockFaceId() != expectedFace
|| packet.getBlockPosition().getX() != 0
|| packet.getBlockPosition().getY() != 0
|| packet.getBlockPosition().getZ() != 0
|| packet.getSequence() != 0
) {
if (flagAndAlert("xyzF="
+ packet.getBlockPosition().getX() + ", " + packet.getBlockPosition().getY() + ", " + packet.getBlockPosition().getZ() + ", " + packet.getBlockFace()
if (flagAndAlert("pos="
+ packet.getBlockPosition().getX() + ", " + packet.getBlockPosition().getY() + ", " + packet.getBlockPosition().getZ()
+ ", face=" + packet.getBlockFace()
+ ", sequence=" + packet.getSequence()
+ ", action=" + packet.getAction().toString().toLowerCase(Locale.ROOT).replace("_", " ") + " v" + player.getVersionName()
+ ", action=" + packet.getAction().toString().toLowerCase(Locale.ROOT)
) && shouldModifyPackets() && packet.getAction() != DiggingAction.RELEASE_USE_ITEM) {
event.setCancelled(true);
player.onPacketCancel();
@@ -5,7 +5,7 @@ import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "BadPacketsN")
@CheckData(name = "BadPacketsN", setback = 0)
public class BadPacketsN extends Check implements PacketCheck {
public BadPacketsN(final GrimPlayer player) {
super(player);
@@ -8,6 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClickWindow;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClickWindow.WindowClickType;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerOpenWindow;
@CheckData(name = "BadPacketsP", experimental = true)
@@ -33,35 +34,39 @@ public class BadPacketsP extends Check implements PacketCheck {
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.CLICK_WINDOW) {
WrapperPlayClientClickWindow wrapper = new WrapperPlayClientClickWindow(event);
int clickType = wrapper.getWindowClickType().ordinal();
WindowClickType clickType = wrapper.getWindowClickType();
int button = wrapper.getButton();
boolean flag = false;
//TODO: Adjust for containers
// TODO: Adjust for containers
boolean flag;
switch (clickType) {
case 0:
case 1:
case 4:
if (button != 0 && button != 1) flag = true;
case PICKUP:
case QUICK_MOVE:
case CLONE:
flag = button > 2 || button < 0;
break;
case 2:
if ((button > 8 || button < 0) && button != 40) flag = true;
case SWAP:
flag = (button > 8 || button < 0) && button != 40;
break;
case 3:
if (button != 2) flag = true;
case THROW:
flag = button != 0 && button != 1;
break;
case 5:
if (button == 3 || button == 7 || button > 10 || button < 0) flag = true;
case QUICK_CRAFT:
flag = button == 3 || button == 7 || button > 10 || button < 0;
break;
case 6:
if (button != 0) flag = true;
case PICKUP_ALL:
flag = button != 0;
break;
case UNKNOWN:
flag = true;
break;
default:
throw new IllegalStateException("Impossible clickType; Compiler does not know this is unreachable!");
}
//Allowing this to false flag to debug and find issues faster
// Allowing this to false flag to debug and find issues faster
if (flag) {
if (flagAndAlert("clickType=" + clickType + " button=" + button + (wrapper.getWindowId() == containerId ? " container=" + containerType : "")) && shouldModifyPackets()) {
if (flagAndAlert("clickType=" + clickType.toString().toLowerCase() + ", button=" + button + (wrapper.getWindowId() == containerId ? ", container=" + containerType : "")) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
@@ -19,8 +19,10 @@ public class BadPacketsQ extends Check implements PacketCheck {
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == Client.ENTITY_ACTION) {
WrapperPlayClientEntityAction wrapper = new WrapperPlayClientEntityAction(event);
if (wrapper.getJumpBoost() < 0 || wrapper.getJumpBoost() > 100 || wrapper.getEntityId() != player.entityID || (wrapper.getAction() != Action.START_JUMPING_WITH_HORSE && wrapper.getJumpBoost() != 0)) {
// you are able to send negative jump boost, how and why!?
if (Math.abs(wrapper.getJumpBoost()) > 100
|| wrapper.getEntityId() != player.entityID
|| wrapper.getAction() != Action.START_JUMPING_WITH_HORSE && wrapper.getJumpBoost() != 0) {
if (flagAndAlert("boost=" + wrapper.getJumpBoost() + ", action=" + wrapper.getAction() + ", entity=" + wrapper.getEntityId()) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
@@ -25,8 +25,8 @@ public class BadPacketsR extends Check implements PacketCheck {
long ms = (player.getPlayerClockAtLeast() - clock) / 1000000L;
long diff = (System.currentTimeMillis() - lastTransTime);
if (diff > 2000 && ms > 2000) {
if (positions == 0 && clock != 0 && player.gamemode != GameMode.SPECTATOR && !player.compensatedEntities.getSelf().isDead) {
flagAndAlert("time=" + ms + "ms, " + "lst=" + diff + "ms, positions=" + positions);
if (positions == 0 && clock != 0 && player.gamemode != GameMode.SPECTATOR && !player.compensatedEntities.self.isDead) {
flag("time=" + ms + "ms, " + "lst=" + diff + "ms, positions=" + positions);
} else {
reward();
}
@@ -39,9 +39,10 @@ public class BadPacketsR extends Check implements PacketCheck {
}
//
if ((event.getPacketType() == PacketType.Play.Client.PLAYER_POSITION_AND_ROTATION ||
event.getPacketType() == PacketType.Play.Client.PLAYER_POSITION) && !player.compensatedEntities.getSelf().inVehicle()) {
event.getPacketType() == PacketType.Play.Client.PLAYER_POSITION) && !player.inVehicle()) {
positions++;
} else if (event.getPacketType() == PacketType.Play.Client.STEER_VEHICLE && player.compensatedEntities.getSelf().inVehicle()) {
} else if ((event.getPacketType() == PacketType.Play.Client.STEER_VEHICLE || event.getPacketType() == PacketType.Play.Client.VEHICLE_MOVE)
&& player.inVehicle()) {
positions++;
}
}
@@ -49,7 +49,7 @@ public class BadPacketsT extends Check implements PacketCheck {
// 27/12/2023 - Dynamic values for more than just one entity type?
// 28/12/2023 - Player-only is fine
// 30/12/2023 - Expansions differ in 1.9+
final float scale = (float) packetEntity.getAttributeValue(Attributes.GENERIC_SCALE);
final float scale = (float) packetEntity.getAttributeValue(Attributes.SCALE);
if (targetVector.y > (minVerticalDisplacement * scale) && targetVector.y < (maxVerticalDisplacement * scale)
&& Math.abs(targetVector.x) < (maxHorizontalDisplacement * scale)
&& Math.abs(targetVector.z) < (maxHorizontalDisplacement * scale)) {
@@ -14,7 +14,7 @@ import com.github.retrooper.packetevents.util.Vector3f;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerBlockPlacement;
@CheckData(name = "BadPacketsU", experimental = true)
@CheckData(name = "BadPacketsU", description = "Sent impossible use item packet")
public class BadPacketsU extends Check implements PacketCheck {
public BadPacketsU(GrimPlayer player) {
super(player);
@@ -5,26 +5,36 @@ import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.item.ItemStack;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
@CheckData(name = "BadPacketsV", experimental = true)
@CheckData(name = "BadPacketsV", description = "Did not move far enough", experimental = true)
public class BadPacketsV extends Check implements PacketCheck {
public BadPacketsV(GrimPlayer player) {
super(player);
}
private int noReminderTicks;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
WrapperPlayClientInteractEntity interactEntity = new WrapperPlayClientInteractEntity(event);
if (interactEntity.getAction() != WrapperPlayClientInteractEntity.InteractAction.ATTACK) return;
if (!player.packetStateData.isSlowedByUsingItem()) return;
ItemStack itemInUse = player.getInventory().getItemInHand(player.packetStateData.eatingHand);
if (flagAndAlert("UseItem=" + itemInUse.getType().getName().getKey()) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
if (!player.canSkipTicks() && isTickPacket(event.getPacketType())) {
if (event.getPacketType() == PacketType.Play.Client.PLAYER_POSITION || event.getPacketType() == PacketType.Play.Client.PLAYER_POSITION_AND_ROTATION) {
int positionAtLeastEveryNTicks = player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8) ? 20 : 19;
if (noReminderTicks < positionAtLeastEveryNTicks && !player.uncertaintyHandler.lastTeleportTicks.hasOccurredSince(1)) {
final double deltaSq = new WrapperPlayClientPlayerFlying(event).getLocation().getPosition()
.distanceSquared(new Vector3d(player.lastX, player.lastY, player.lastZ));
if (deltaSq <= player.getMovementThreshold() * player.getMovementThreshold()) {
flagAndAlert("delta=" + Math.sqrt(deltaSq));
}
}
noReminderTicks = 0;
} else {
noReminderTicks++;
}
}
}
@@ -5,7 +5,7 @@ import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "BadPacketsW", experimental = true)
@CheckData(name = "BadPacketsW", description = "Interacted with non-existent entity", experimental = true)
public class BadPacketsW extends Check implements PacketCheck {
public BadPacketsW(GrimPlayer player) {
super(player);
@@ -2,42 +2,82 @@ package ac.grim.grimac.checks.impl.badpackets;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.item.type.ItemTypes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "BadPacketsX", experimental = true)
public class BadPacketsX extends Check implements PacketCheck {
public class BadPacketsX extends Check implements PostPredictionCheck {
public BadPacketsX(GrimPlayer player) {
super(player);
}
public final boolean noFireHitbox = player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_15_2);
private boolean sprint;
private boolean sneak;
private int flags;
public final void handle(PacketReceiveEvent event, WrapperPlayClientPlayerDigging dig, StateType block) {
if (dig.getAction() != DiggingAction.START_DIGGING && dig.getAction() != DiggingAction.FINISHED_DIGGING)
@Override
public void onPredictionComplete(final PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) {
if (flags > 0) {
setbackIfAboveSetbackVL();
}
flags = 0;
return;
}
// the block does not have a hitbox
boolean invalid = (block == StateTypes.LIGHT && !(player.getInventory().getHeldItem().is(ItemTypes.LIGHT) || player.getInventory().getOffHand().is(ItemTypes.LIGHT)))
|| block.isAir()
|| block == StateTypes.WATER
|| block == StateTypes.LAVA
|| block == StateTypes.BUBBLE_COLUMN
|| block == StateTypes.MOVING_PISTON
|| (block == StateTypes.FIRE && noFireHitbox)
// or the client claims to have broken an unbreakable block
|| block.getHardness() == -1.0f && dig.getAction() == DiggingAction.FINISHED_DIGGING;
if (player.isTickingReliablyFor(3)) {
for (; flags > 0; flags--) {
flagAndAlertWithSetback();
}
}
if (invalid && flagAndAlert("block=" + block.getName() + ", type=" + dig.getAction()) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
flags = 0;
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.gamemode == GameMode.SPECTATOR || isTickPacket(event.getPacketType())) {
sprint = sneak = false;
return;
}
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION) {
WrapperPlayClientEntityAction wrapper = new WrapperPlayClientEntityAction(event);
switch (wrapper.getAction()) {
case START_SNEAKING:
case STOP_SNEAKING:
if (sneak) {
if (player.canSkipTicks() || flagAndAlert()) {
flags++;
}
}
sneak = true;
break;
case START_SPRINTING:
case STOP_SPRINTING:
if (player.inVehicle()) {
return;
}
if (sprint) {
if (player.canSkipTicks() || flagAndAlert()) {
flags++;
}
}
sprint = true;
break;
default:
// Handle other cases if necessary
break;
}
}
}
}
@@ -8,10 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientHeldItemChange;
/**
* Checks for out of bounds slot changes
*/
@CheckData(name = "BadPacketsY")
@CheckData(name = "BadPacketsY", description = "Sent out of bounds slot id")
public class BadPacketsY extends Check implements PacketCheck {
public BadPacketsY(GrimPlayer player) {
super(player);
@@ -0,0 +1,72 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.GrimAPI;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import com.github.retrooper.packetevents.protocol.item.type.ItemTypes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
import com.github.retrooper.packetevents.util.Vector3i;
import org.checkerframework.checker.nullness.qual.NonNull;
@CheckData(name = "AirLiquidBreak", description = "Breaking a block that cannot be broken")
public class AirLiquidBreak extends Check implements BlockBreakCheck {
public AirLiquidBreak(GrimPlayer player) {
super(player);
}
private int lastTick;
private boolean didLastFlag;
// Initialize to non-null values to prevent NPE when checking for blockType properties and if position equals old position
private @NonNull Vector3i lastBreakLoc = new Vector3i();
private @NonNull StateType lastBlockType = StateTypes.AIR;
public final boolean noFireHitbox = player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_15_2);
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (blockBreak.action != DiggingAction.START_DIGGING && blockBreak.action != DiggingAction.FINISHED_DIGGING)
return;
final StateType block = blockBreak.block.getType();
// Fixes false from breaking kelp underwater
// The client sends two start digging packets to the server both in the same tick. AirLiquidBreak gets called twice, doesn't false the first time, but falses the second
// One ends up breaking the kelp, the other ends up doing nothing besides falsing this check because we think they're trying to mine water
// I am explicitly making this patch as narrow and specific as possible to potentially discover other blocks that exhibit similar behaviour
int newTick = GrimAPI.INSTANCE.getTickManager().currentTick;
if (lastTick == newTick
&& lastBreakLoc.equals(blockBreak.position)
&& !didLastFlag
&& lastBlockType.getHardness() == 0.0F
&& lastBlockType.getBlastResistance() == 0.0F
&& block == StateTypes.WATER
) return;
lastTick = newTick;
lastBreakLoc = blockBreak.position;
lastBlockType = block;
// the block does not have a hitbox
boolean invalid = (block == StateTypes.LIGHT && !(player.getInventory().getHeldItem().is(ItemTypes.LIGHT) || player.getInventory().getOffHand().is(ItemTypes.LIGHT)))
|| block.isAir()
|| block == StateTypes.WATER
|| block == StateTypes.LAVA
|| block == StateTypes.BUBBLE_COLUMN
|| block == StateTypes.MOVING_PISTON
|| block == StateTypes.FIRE && noFireHitbox
// or the client claims to have broken an unbreakable block
|| block.getHardness() == -1.0f && blockBreak.action == DiggingAction.FINISHED_DIGGING;
if (invalid && flagAndAlert("block=" + block.getName() + ", type=" + blockBreak.action) && shouldModifyPackets()) {
didLastFlag = true;
blockBreak.cancel();
} else {
didLastFlag = false;
}
}
}
@@ -0,0 +1,45 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox;
import ac.grim.grimac.utils.math.VectorUtils;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import org.bukkit.util.Vector;
@CheckData(name = "FarBreak", description = "Breaking blocks too far away", experimental = true)
public class FarBreak extends Check implements BlockBreakCheck {
public FarBreak(GrimPlayer player) {
super(player);
}
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (player.gamemode == GameMode.SPECTATOR || player.inVehicle() || blockBreak.action == DiggingAction.CANCELLED_DIGGING) return; // falses
double min = Double.MAX_VALUE;
for (double d : player.getPossibleEyeHeights()) {
SimpleCollisionBox box = new SimpleCollisionBox(blockBreak.position);
Vector eyes = new Vector(player.x, player.y + d, player.z);
Vector best = VectorUtils.cutBoxToVector(eyes, box);
min = Math.min(min, eyes.distanceSquared(best));
}
// getPickRange() determines this?
// With 1.20.5+ the new attribute determines creative mode reach using a modifier
double maxReach = player.compensatedEntities.self.getAttributeValue(Attributes.BLOCK_INTERACTION_RANGE);
if (player.packetStateData.didLastMovementIncludePosition || player.canSkipTicks()) {
double threshold = player.getMovementThreshold();
maxReach += Math.hypot(threshold, threshold);
}
if (min > maxReach * maxReach && flagAndAlert(String.format("distance=%.2f", Math.sqrt(min))) && shouldModifyPackets()) {
blockBreak.cancel();
}
}
}
@@ -0,0 +1,122 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import ac.grim.grimac.utils.math.GrimMath;
import ac.grim.grimac.utils.nmsutil.BlockBreakSpeed;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState;
import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import java.util.Collections;
import java.util.Set;
// Based loosely off of Hawk BlockBreakSpeedSurvival
// Also based loosely off of NoCheatPlus FastBreak
// Also based off minecraft wiki: https://minecraft.wiki/w/Breaking#Instant_breaking
@CheckData(name = "FastBreak", description = "Breaking blocks too quickly")
public class FastBreak extends Check implements BlockBreakCheck {
// For some reason these states flag and I don't know why.
// Better to just exempt to not annoy legit players.
private static final Set<StateType> EXEMPT_STATES = Collections.emptySet();
public FastBreak(GrimPlayer playerData) {
super(playerData);
}
// The block the player is currently breaking
Vector3i targetBlock = null;
// The maximum amount of damage the player deals to the block
//
double maximumBlockDamage = 0;
// The last time a finish digging packet was sent, to enforce 0.3-second delay after non-instabreak
long lastFinishBreak = 0;
// The time the player started to break the block, to know how long the player waited until they finished breaking the block
long startBreak = 0;
// The buffer to this check
double blockBreakBalance = 0;
double blockDelayBalance = 0;
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (blockBreak.action == DiggingAction.START_DIGGING) {
WrappedBlockState block = blockBreak.block;
// Exempt all blocks that do not exist in the player version
final WrappedBlockState defaultState = WrappedBlockState.getDefaultState(player.getClientVersion(), block.getType());
if (defaultState.getType() == StateTypes.AIR || EXEMPT_STATES.contains(defaultState.getType())) {
return;
}
startBreak = System.currentTimeMillis() - (targetBlock == null ? 50 : 0); // ???
targetBlock = blockBreak.position;
maximumBlockDamage = BlockBreakSpeed.getBlockDamage(player, targetBlock);
double breakDelay = System.currentTimeMillis() - lastFinishBreak;
if (breakDelay >= 275) { // Reduce buffer if "close enough"
blockDelayBalance *= 0.9;
} else { // Otherwise, increase buffer
blockDelayBalance += 300 - breakDelay;
}
if (blockDelayBalance > 1000) { // If more than a second of advantage
if (flagAndAlert("delay=" + breakDelay + "ms, type=" + blockBreak.block.getType()) && shouldModifyPackets()) {
blockBreak.cancel();
}
}
clampBalance();
}
if (blockBreak.action == DiggingAction.FINISHED_DIGGING && targetBlock != null) {
double predictedTime = Math.ceil(1 / maximumBlockDamage) * 50;
double realTime = System.currentTimeMillis() - startBreak;
double diff = predictedTime - realTime;
clampBalance();
if (diff < 25) { // Reduce buffer if "close enough"
blockBreakBalance *= 0.9;
} else { // Otherwise, increase buffer
blockBreakBalance += diff;
}
if (blockBreakBalance > 1000) { // If more than a second of advantage
if (flagAndAlert("diff=" + diff + "ms, balance=" + blockBreakBalance + "ms, type=" + blockBreak.block.getType()) && shouldModifyPackets()) {
blockBreak.cancel();
}
}
// also set start time because the breaking netcode is fucked on 1.14.4+
lastFinishBreak = startBreak = System.currentTimeMillis();
}
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
// Find the most optimal block damage using the animation packet, which is sent at least once a tick when breaking blocks
// On 1.8 clients, via screws with this packet meaning we must fall back to the 1.8 idle flying packet
if ((player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9) ? event.getPacketType() == PacketType.Play.Client.ANIMATION : WrapperPlayClientPlayerFlying.isFlying(event.getPacketType())) && targetBlock != null) {
maximumBlockDamage = Math.max(maximumBlockDamage, BlockBreakSpeed.getBlockDamage(player, targetBlock));
}
}
private void clampBalance() {
double balance = Math.max(1000, (player.getTransactionPing()));
blockBreakBalance = GrimMath.clamp(blockBreakBalance, -balance, balance); // Clamp not Math.max in case other logic changes
blockDelayBalance = GrimMath.clamp(blockDelayBalance, -balance, balance);
}
}
@@ -0,0 +1,30 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
@CheckData(name = "InvalidBreak", description = "Sent impossible block face id")
public class InvalidBreak extends Check implements BlockBreakCheck {
public InvalidBreak(GrimPlayer player) {
super(player);
}
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (blockBreak.faceId == 255 && blockBreak.action == DiggingAction.CANCELLED_DIGGING && player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10)) {
return;
}
if (blockBreak.faceId < 0 || blockBreak.faceId > 5) {
// ban
if (flagAndAlert("face=" + blockBreak.faceId + ", action=" + blockBreak.action) && shouldModifyPackets()) {
blockBreak.cancel();
}
}
}
}
@@ -0,0 +1,74 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.MessageUtil;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.protocol.world.BlockFace;
import com.github.retrooper.packetevents.util.Vector3i;
import java.util.ArrayList;
import java.util.List;
@CheckData(name = "MultiBreak", experimental = true)
public class MultiBreak extends Check implements BlockBreakCheck {
public MultiBreak(GrimPlayer player) {
super(player);
}
private final List<String> flags = new ArrayList<>();
private boolean hasBroken;
private BlockFace lastFace;
private Vector3i lastPos;
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (blockBreak.action == DiggingAction.CANCELLED_DIGGING) {
return;
}
if (hasBroken && (blockBreak.face != lastFace || !blockBreak.position.equals(lastPos))) {
final String verbose = "face=" + blockBreak.face + ", lastFace=" + lastFace
+ ", pos=" + MessageUtil.toUnlabledString(blockBreak.position)
+ ", lastPos=" + MessageUtil.toUnlabledString(lastPos);
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
blockBreak.cancel();
}
} else {
flags.add(verbose);
}
}
lastFace = blockBreak.face;
lastPos = blockBreak.position;
hasBroken = true;
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.gamemode == GameMode.SPECTATOR || isTickPacket(event.getPacketType())) {
hasBroken = false;
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
flagAndAlert(verbose);
}
}
flags.clear();
}
}
@@ -0,0 +1,42 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
@CheckData(name = "NoSwingBreak", description = "Did not swing while breaking block", experimental = true)
public class NoSwingBreak extends Check implements BlockBreakCheck {
public NoSwingBreak(GrimPlayer playerData) {
super(playerData);
}
private boolean sentAnimation;
private boolean sentBreak;
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (blockBreak.action != DiggingAction.CANCELLED_DIGGING) {
sentBreak = true;
}
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.ANIMATION) {
sentAnimation = true;
}
if (isTickPacket(event.getPacketType())) {
if (sentBreak && !sentAnimation) {
flagAndAlert();
}
sentAnimation = sentBreak = false;
}
}
}
@@ -0,0 +1,76 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
@CheckData(name = "PositionBreakA")
public class PositionBreakA extends Check implements BlockBreakCheck {
public PositionBreakA(GrimPlayer player) {
super(player);
}
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (player.inVehicle()
|| blockBreak.action == DiggingAction.CANCELLED_DIGGING
|| blockBreak.block.getType() == StateTypes.REDSTONE_WIRE
) return;
SimpleCollisionBox combined = blockBreak.getCombinedBox();
final double[] possibleEyeHeights = player.getPossibleEyeHeights();
double minEyeHeight = Double.MAX_VALUE;
double maxEyeHeight = Double.MIN_VALUE;
for (double height : possibleEyeHeights) {
minEyeHeight = Math.min(minEyeHeight, height);
maxEyeHeight = Math.max(maxEyeHeight, height);
}
SimpleCollisionBox eyePositions = new SimpleCollisionBox(player.x, player.y + minEyeHeight, player.z, player.x, player.y + maxEyeHeight, player.z);
if (!player.packetStateData.didLastMovementIncludePosition || player.canSkipTicks()) {
eyePositions.expand(player.getMovementThreshold());
}
// If the player is inside a block, then they can ray trace through the block and hit the other side of the block
if (eyePositions.isIntersected(combined)) {
return;
}
// So now we have the player's possible eye positions
// So then look at the face that the player has clicked
boolean flag;
switch (blockBreak.face) {
case NORTH:
flag = eyePositions.minZ > combined.minZ; // Z- face
break;
case SOUTH:
flag = eyePositions.maxZ < combined.maxZ; // Z+ face
break;
case EAST:
flag = eyePositions.maxX < combined.maxX; // X+ face
break;
case WEST:
flag = eyePositions.minX > combined.minX; // X- face
break;
case UP:
flag = eyePositions.maxY < combined.maxY; // Y+ face
break;
case DOWN:
flag = eyePositions.minY > combined.minY; // Y- face
break;
default:
flag = false;
break;
}
if (flag && flagAndAlert("action=" + blockBreak.action + ", face=" + blockBreak.face) && shouldModifyPackets()) {
blockBreak.cancel();
}
}
}
@@ -0,0 +1,37 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.world.BlockFace;
@CheckData(name = "PositionBreakB", experimental = true)
public class PositionBreakB extends Check implements BlockBreakCheck {
public PositionBreakB(GrimPlayer player) {
super(player);
}
private BlockFace lastFace;
private final int releaseFace = player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_8) ? 0 : 255;
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (blockBreak.action == DiggingAction.START_DIGGING) {
if (blockBreak.face == lastFace) {
lastFace = null;
}
}
if (lastFace != null) {
flagAndAlert("lastFace=" + lastFace + ", action=" + blockBreak.action);
}
if (blockBreak.action == DiggingAction.CANCELLED_DIGGING) {
lastFace = blockBreak.faceId == releaseFace ? null : blockBreak.face;
}
}
}
@@ -0,0 +1,120 @@
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox;
import ac.grim.grimac.utils.data.Pair;
import ac.grim.grimac.utils.nmsutil.Ray;
import ac.grim.grimac.utils.nmsutil.ReachUtils;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.protocol.world.BlockFace;
import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.util.Vector3f;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@CheckData(name = "RotationBreak", experimental = true)
public class RotationBreak extends Check implements BlockBreakCheck {
public RotationBreak(GrimPlayer player) {
super(player);
}
private double flagBuffer = 0; // If the player flags once, force them to play legit, or we will cancel the tick before.
private boolean ignorePost = false;
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (player.gamemode == GameMode.SPECTATOR) return; // you don't send flying packets when spectating entities
if (player.inVehicle()) return; // falses
if (blockBreak.action == DiggingAction.CANCELLED_DIGGING) return; // falses
if (flagBuffer > 0 && !didRayTraceHit(blockBreak)) {
ignorePost = true;
// If the player hit and has flagged this check recently
if (flagAndAlert("pre-flying, action=" + blockBreak.action) && shouldModifyPackets()) {
blockBreak.cancel();
}
}
}
@Override
public void onPostFlyingBlockBreak(BlockBreak blockBreak) {
if (player.gamemode == GameMode.SPECTATOR) return; // you don't send flying packets when spectating entities
if (player.inVehicle()) return; // falses
if (blockBreak.action == DiggingAction.CANCELLED_DIGGING) return; // falses
// Don't flag twice
if (ignorePost) {
ignorePost = false;
return;
}
if (didRayTraceHit(blockBreak)) {
flagBuffer = Math.max(0, flagBuffer - 0.1);
} else {
flagBuffer = 1;
flagAndAlert("post-flying, action=" + blockBreak.action);
}
}
private boolean didRayTraceHit(BlockBreak blockBreak) {
SimpleCollisionBox box = new SimpleCollisionBox(blockBreak.position);
final double[] possibleEyeHeights = player.getPossibleEyeHeights();
// Start checking if player is in the block
double minEyeHeight = Double.MAX_VALUE;
double maxEyeHeight = Double.MIN_VALUE;
for (double height : possibleEyeHeights) {
minEyeHeight = Math.min(minEyeHeight, height);
maxEyeHeight = Math.max(maxEyeHeight, height);
}
SimpleCollisionBox eyePositions = new SimpleCollisionBox(player.x, player.y + minEyeHeight, player.z, player.x, player.y + maxEyeHeight, player.z);
eyePositions.expand(player.getMovementThreshold());
// If the player is inside a block, then they can ray trace through the block and hit the other side of the block
if (eyePositions.isIntersected(box)) {
return true;
}
// End checking if the player is in the block
List<Vector3f> possibleLookDirs = new ArrayList<>(Arrays.asList(
new Vector3f(player.lastXRot, player.yRot, 0),
new Vector3f(player.xRot, player.yRot, 0)
));
// 1.9+ players could be a tick behind because we don't get skipped ticks
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9)) {
possibleLookDirs.add(new Vector3f(player.lastXRot, player.lastYRot, 0));
}
// 1.7 players do not have any of these issues! They are always on the latest look vector
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_8)) {
possibleLookDirs = Collections.singletonList(new Vector3f(player.xRot, player.yRot, 0));
}
final double distance = player.compensatedEntities.self.getAttributeValue(Attributes.BLOCK_INTERACTION_RANGE);
for (double d : possibleEyeHeights) {
for (Vector3f lookDir : possibleLookDirs) {
Vector3d starting = new Vector3d(player.x, player.y + d, player.z);
Ray trace = new Ray(player, starting.getX(), starting.getY(), starting.getZ(), lookDir.getX(), lookDir.getY());
Pair<Vector, BlockFace> intercept = ReachUtils.calculateIntercept(box, trace.getOrigin(), trace.getPointAtDistance(distance));
if (intercept.first() != null) return true;
}
}
return false;
}
}
@@ -1,24 +1,22 @@
package ac.grim.grimac.checks.impl.badpackets;
package ac.grim.grimac.checks.impl.breaking;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.checks.type.BlockBreakCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.MessageUtil;
import ac.grim.grimac.utils.anticheat.update.BlockBreak;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import static ac.grim.grimac.events.packets.patch.ResyncWorldUtil.resyncPosition;
import static ac.grim.grimac.utils.nmsutil.BlockBreakSpeed.getBlockDamage;
@CheckData(name = "BadPacketsZ", experimental = true)
public class BadPacketsZ extends Check implements PacketCheck {
public BadPacketsZ(final GrimPlayer player) {
@CheckData(name = "WrongBreak")
public class WrongBreak extends Check implements BlockBreakCheck {
public WrongBreak(final GrimPlayer player) {
super(player);
}
@@ -40,9 +38,10 @@ public class BadPacketsZ extends Check implements PacketCheck {
return player.getClientVersion().isOlderThan(ClientVersion.V_1_14_4) || getBlockDamage(player, pos) < 1;
}
public void handle(PacketReceiveEvent event, WrapperPlayClientPlayerDigging dig) {
if (dig.getAction() == DiggingAction.START_DIGGING) {
final Vector3i pos = dig.getBlockPosition();
@Override
public void onBlockBreak(BlockBreak blockBreak) {
if (blockBreak.action == DiggingAction.START_DIGGING) {
final Vector3i pos = blockBreak.position;
lastBlockWasInstantBreak = getBlockDamage(player, pos) >= 1;
lastCancelledBlock = null;
@@ -50,24 +49,15 @@ public class BadPacketsZ extends Check implements PacketCheck {
lastBlock = pos;
}
if (dig.getAction() == DiggingAction.CANCELLED_DIGGING) {
final Vector3i pos = dig.getBlockPosition();
if (blockBreak.action == DiggingAction.CANCELLED_DIGGING) {
final Vector3i pos = blockBreak.position;
if (shouldExempt(pos)) {
lastCancelledBlock = pos;
lastLastBlock = null;
lastBlock = null;
return;
}
if (!pos.equals(lastBlock)) {
if (!shouldExempt(pos) && !pos.equals(lastBlock)) {
// https://github.com/GrimAnticheat/Grim/issues/1512
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_14_4) || (!lastBlockWasInstantBreak && pos.equals(lastCancelledBlock))) {
if (flagAndAlert("action=CANCELLED_DIGGING" + ", last=" + MessageUtil.toUnlabledString(lastBlock) + ", pos=" + MessageUtil.toUnlabledString(pos))) {
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
resyncPosition(player, pos);
blockBreak.cancel();
}
}
}
@@ -79,24 +69,21 @@ public class BadPacketsZ extends Check implements PacketCheck {
return;
}
if (dig.getAction() == DiggingAction.FINISHED_DIGGING) {
final Vector3i pos = dig.getBlockPosition();
if (blockBreak.action == DiggingAction.FINISHED_DIGGING) {
final Vector3i pos = blockBreak.position;
// when a player looks away from the mined block, they send a cancel, and if they look at it again, they don't send another start. (thanks mojang!)
if (!pos.equals(lastCancelledBlock) && (!lastBlockWasInstantBreak || player.getClientVersion().isOlderThan(ClientVersion.V_1_14_4)) && !pos.equals(lastBlock)) {
if (flagAndAlert("action=FINISHED_DIGGING" + ", last=" + MessageUtil.toUnlabledString(lastBlock) + ", pos=" + MessageUtil.toUnlabledString(pos))) {
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
resyncPosition(player, pos);
blockBreak.cancel();
}
}
}
lastCancelledBlock = null;
// 1.14.4+ clients don't send another start break in protected regions
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_14_4)) {
lastCancelledBlock = null;
lastLastBlock = null;
lastBlock = null;
}
@@ -0,0 +1,13 @@
package ac.grim.grimac.checks.impl.combat;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "HitboxBlock", configName = "HitboxBlock", setback = 20)
public class HitboxBlock extends Check implements PacketCheck {
public HitboxBlock(GrimPlayer player) {
super(player);
}
}
@@ -0,0 +1,13 @@
package ac.grim.grimac.checks.impl.combat;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "HitboxEntity", configName = "HitboxEntity", setback = 30)
public class HitboxEntity extends Check implements PacketCheck {
public HitboxEntity(GrimPlayer player) {
super(player);
}
}
@@ -0,0 +1,13 @@
package ac.grim.grimac.checks.impl.combat;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "HitboxMiss", configName = "HitboxMiss", setback = 10)
public class HitboxMiss extends Check implements PacketCheck {
public HitboxMiss(GrimPlayer player) {
super(player);
}
}
@@ -7,13 +7,12 @@ import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import java.util.ArrayList;
@CheckData(name = "MultiInteractA", experimental = true)
@CheckData(name = "MultiInteractA", description = "Interacted with multiple entities in the same tick", experimental = true)
public class MultiInteractA extends Check implements PostPredictionCheck {
public MultiInteractA(final GrimPlayer player) {
super(player);
@@ -34,7 +33,7 @@ public class MultiInteractA extends Check implements PostPredictionCheck {
if (hasInteracted && entity != lastEntity) {
String verbose = "lastEntity=" + lastEntity + ", entity=" + entity
+ ", lastSneaking=" + lastSneaking + ", sneaking=" + sneaking;
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
@@ -49,15 +48,14 @@ public class MultiInteractA extends Check implements PostPredictionCheck {
hasInteracted = true;
}
if (WrapperPlayClientPlayerFlying.isFlying(event.getPacketType()) && player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8) && !player.packetStateData.lastPacketWasTeleport) {
if (player.gamemode == GameMode.SPECTATOR || isTickPacket(event.getPacketType())) {
hasInteracted = false;
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
// we don't need to check pre-1.9 players here (no tick skipping)
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) return;
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
@@ -66,6 +64,5 @@ public class MultiInteractA extends Check implements PostPredictionCheck {
}
flags.clear();
hasInteracted = false;
}
}
@@ -8,10 +8,9 @@ import ac.grim.grimac.utils.anticheat.MessageUtil;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.util.Vector3f;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import java.util.ArrayList;
@@ -36,7 +35,7 @@ public class MultiInteractB extends Check implements PostPredictionCheck {
if (hasInteracted && !pos.equals(lastPos)) {
String verbose = "pos=" + MessageUtil.toUnlabledString(pos) + ", lastPos=" + MessageUtil.toUnlabledString(lastPos);
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
@@ -50,15 +49,14 @@ public class MultiInteractB extends Check implements PostPredictionCheck {
hasInteracted = true;
}
if (WrapperPlayClientPlayerFlying.isFlying(event.getPacketType()) && player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8) && !player.packetStateData.lastPacketWasTeleport) {
if (player.gamemode == GameMode.SPECTATOR || isTickPacket(event.getPacketType())) {
hasInteracted = false;
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
// we don't need to check pre-1.9 players here (no tick skipping)
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) return;
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
@@ -67,6 +65,5 @@ public class MultiInteractB extends Check implements PostPredictionCheck {
}
flags.clear();
hasInteracted = false;
}
}
@@ -18,10 +18,18 @@ package ac.grim.grimac.checks.impl.combat;
import ac.grim.grimac.api.config.ConfigManager;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.debug.HitboxDebugHandler;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.collisions.datatypes.CollisionBox;
import ac.grim.grimac.utils.collisions.datatypes.NoCollisionBox;
import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox;
import ac.grim.grimac.utils.data.BlockHitData;
import ac.grim.grimac.utils.data.EntityHitData;
import ac.grim.grimac.utils.data.HitData;
import ac.grim.grimac.utils.data.Pair;
import ac.grim.grimac.utils.data.packetentity.PacketEntity;
import ac.grim.grimac.utils.nmsutil.BlockRayTrace;
import ac.grim.grimac.utils.data.packetentity.dragon.PacketEntityEnderDragonPart;
import ac.grim.grimac.utils.nmsutil.ReachUtils;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
@@ -31,28 +39,39 @@ import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState;
import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import java.util.*;
// You may not copy the check unless you are licensed under GPL
@CheckData(name = "Reach", configName = "Reach", setback = 10)
@CheckData(name = "Reach", setback = 10)
public class Reach extends Check implements PacketCheck {
// Only one flag per reach attack, per entity, per tick.
// We store position because lastX isn't reliable on teleports.
private final Int2ObjectMap<Vector3d> playerAttackQueue = new Int2ObjectOpenHashMap<>();
// Used to prevent falses in the wall hit check
private final Set<Vector3i> blocksChangedThisTick = new HashSet<>();
public static final double extraSearchDistance = 3; // extra distance to raytrace beyond reach distance so we know far beyond the legit distance a cheater hit
private static final List<EntityType> blacklisted = Arrays.asList(
EntityTypes.BOAT,
EntityTypes.CHEST_BOAT,
EntityTypes.SHULKER);
private boolean ignoreNonPlayerTargets;
private boolean cancelImpossibleHits;
private double threshold;
public double reachThreshold;
private double cancelBuffer; // For the next 4 hits after using reach, we aggressively cancel reach
public Reach(GrimPlayer player) {
@@ -84,6 +103,10 @@ public class Reach extends Check implements PacketCheck {
return;
}
if (ignoreNonPlayerTargets && !entity.getType().equals(EntityTypes.PLAYER)) {
return;
}
// Dead entities cause false flags (https://github.com/GrimAnticheat/Grim/issues/546)
if (entity.isDead) return;
@@ -91,7 +114,7 @@ public class Reach extends Check implements PacketCheck {
if (entity.getType() == EntityTypes.ARMOR_STAND && player.getClientVersion().isOlderThan(ClientVersion.V_1_8)) return;
if (player.gamemode == GameMode.CREATIVE || player.gamemode == GameMode.SPECTATOR) return;
if (player.compensatedEntities.getSelf().inVehicle()) return;
if (player.inVehicle()) return;
if (entity.riding != null) return;
boolean tooManyAttacks = playerAttackQueue.size() > 10;
@@ -108,10 +131,9 @@ public class Reach extends Check implements PacketCheck {
}
// If the player set their look, or we know they have a new tick
if (WrapperPlayClientPlayerFlying.isFlying(event.getPacketType()) ||
event.getPacketType() == PacketType.Play.Client.PONG ||
event.getPacketType() == PacketType.Play.Client.WINDOW_CONFIRMATION) {
tickBetterReachCheckWithAngle();
final boolean isFlying = WrapperPlayClientPlayerFlying.isFlying(event.getPacketType());
if (isUpdate(event.getPacketType())) {
tickBetterReachCheckWithAngle(isFlying);
}
}
@@ -129,38 +151,55 @@ public class Reach extends Check implements PacketCheck {
return false; // exempt
if (player.gamemode == GameMode.CREATIVE || player.gamemode == GameMode.SPECTATOR) return false;
if (player.compensatedEntities.getSelf().inVehicle()) return false;
if (player.inVehicle()) return false;
// Filter out what we assume to be cheats
if (cancelBuffer != 0) {
return checkReach(reachEntity, new Vector3d(player.x, player.y, player.z), true) != null; // If they flagged
return checkReach(reachEntity, new Vector3d(player.x, player.y, player.z), true) != NONE; // If they flagged
} else {
SimpleCollisionBox targetBox = reachEntity.getPossibleCollisionBoxes();
if (reachEntity.getType() == EntityTypes.END_CRYSTAL) {
targetBox = new SimpleCollisionBox(reachEntity.trackedServerPosition.getPos().subtract(1, 0, 1), reachEntity.trackedServerPosition.getPos().add(1, 2, 1));
}
return ReachUtils.getMinReachToBox(player, targetBox) > player.compensatedEntities.getSelf().getAttributeValue(Attributes.PLAYER_ENTITY_INTERACTION_RANGE);
return ReachUtils.getMinReachToBox(player, targetBox) > player.compensatedEntities.self.getAttributeValue(Attributes.ENTITY_INTERACTION_RANGE);
}
}
private void tickBetterReachCheckWithAngle() {
private void tickBetterReachCheckWithAngle(boolean isFlying) {
for (Int2ObjectMap.Entry<Vector3d> attack : playerAttackQueue.int2ObjectEntrySet()) {
PacketEntity reachEntity = player.compensatedEntities.entityMap.get(attack.getIntKey());
if (reachEntity != null) {
String result = checkReach(reachEntity, attack.getValue(), false);
if (result != null) {
if (reachEntity.getType() == EntityTypes.PLAYER) {
flagAndAlert(result);
} else {
flagAndAlert(result + " type=" + reachEntity.getType().getName().getKey());
}
}
if (reachEntity == null) continue;
CheckResult result = checkReach(reachEntity, attack.getValue(), false);
String added;
switch (result.type()) {
case REACH:
added = reachEntity.getType() == EntityTypes.PLAYER ? "" : ", type=" + reachEntity.getType().getName().getKey();
flagAndAlert(result.verbose() + added);
break;
case HITBOX:
added = reachEntity.getType() == EntityTypes.PLAYER ? "" : "type=" + reachEntity.getType().getName().getKey();
player.checkManager.getPacketCheck(HitboxMiss.class).flagAndAlert(result.verbose() + added);
break;
case BLOCK:
added = reachEntity.getType() == EntityTypes.PLAYER ? "" : "type=" + reachEntity.getType().getName().getKey();
player.checkManager.getPacketCheck(HitboxBlock.class).flagAndAlert(result.verbose() + added);
break;
case ENTITY:
added = reachEntity.getType() == EntityTypes.PLAYER ? "" : "type=" + reachEntity.getType().getName().getKey();
player.checkManager.getPacketCheck(HitboxEntity.class).flagAndAlert(result.verbose() + added);
break;
}
}
playerAttackQueue.clear();
// We can't use transactions for this because of this problem:
// transaction -> block changed applied -> 2nd transaction -> list cleared -> attack packet -> flying -> reach block hit checked, falses
if (isFlying) blocksChangedThisTick.clear();
}
private String checkReach(PacketEntity reachEntity, Vector3d from, boolean isPrediction) {
@NotNull
private CheckResult checkReach(PacketEntity reachEntity, Vector3d from, boolean isPrediction) {
SimpleCollisionBox targetBox = reachEntity.getPossibleCollisionBoxes();
if (reachEntity.getType() == EntityTypes.END_CRYSTAL) { // Hardcode end crystal box
@@ -173,41 +212,33 @@ public class Reach extends Check implements PacketCheck {
targetBox.expand(0.1f);
}
targetBox.expand(threshold);
targetBox.expand(reachThreshold);
// This is better than adding to the reach, as 0.03 can cause a player to miss their target
// Adds some more than 0.03 uncertainty in some cases, but a good trade off for simplicity
//
// Just give the uncertainty on 1.9+ clients as we have no way of knowing whether they had 0.03 movement
if (!player.packetStateData.didLastLastMovementIncludePosition || player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9))
// However, on 1.21.2+ we do know if they had 0.03 movement
if (!player.packetStateData.didLastLastMovementIncludePosition || player.canSkipTicks())
targetBox.expand(player.getMovementThreshold());
double minDistance = Double.MAX_VALUE;
// https://bugs.mojang.com/browse/MC-67665
List<Vector> possibleLookDirs = new ArrayList<>(Collections.singletonList(ReachUtils.getLook(player, player.xRot, player.yRot)));
// will store all lookVecsAndEyeHeight pairs that landed a hit on the target entity
// We only need to check for blocking intersections for these
List<Pair<Vector, Double>> lookVecsAndEyeHeights = new ArrayList<>();
// If we are a tick behind, we don't know their next look so don't bother doing this
if (!isPrediction) {
possibleLookDirs.add(ReachUtils.getLook(player, player.lastXRot, player.yRot));
// 1.9+ players could be a tick behind because we don't get skipped ticks
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9)) {
possibleLookDirs.add(ReachUtils.getLook(player, player.lastXRot, player.lastYRot));
}
// 1.7 players do not have any of these issues! They are always on the latest look vector
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_8)) {
possibleLookDirs = Collections.singletonList(ReachUtils.getLook(player, player.xRot, player.yRot));
}
}
// +3 would be 3 + 3 = 6, which is the pre-1.20.5 behaviour, preventing "Missed Hitbox"
final double distance = player.compensatedEntities.getSelf().getAttributeValue(Attributes.PLAYER_ENTITY_INTERACTION_RANGE) + 3;
final double maxReach = player.compensatedEntities.self.getAttributeValue(Attributes.ENTITY_INTERACTION_RANGE);
// We raytrace for > the player's reach distance so in the case a player is hacking
// We can return in the flag the distance of the reach hit instead of a generic "player failed reach check"
// +3 would be 3 + extraSearchDistance = 6, which is the pre-1.20.5 behaviour, preventing "Missed Hitbox"
final double distance = maxReach + extraSearchDistance;
final double[] possibleEyeHeights = player.getPossibleEyeHeights();
final Vector[] possibleLookDirs = player.getPossibleLookVectors(isPrediction);
final Vector eyePos = new Vector(from.getX(), 0, from.getZ());
for (Vector lookVec : possibleLookDirs) {
for (double eye : possibleEyeHeights) {
Vector eyePos = new Vector(from.getX(), from.getY() + eye, from.getZ());
eyePos.setY(from.getY() + eye);
Vector endReachPos = eyePos.clone().add(new Vector(lookVec.getX() * distance, lookVec.getY() * distance, lookVec.getZ() * distance));
Vector intercept = ReachUtils.calculateIntercept(targetBox, eyePos, endReachPos).first();
@@ -219,29 +250,191 @@ public class Reach extends Check implements PacketCheck {
if (intercept != null) {
minDistance = Math.min(eyePos.distance(intercept), minDistance);
lookVecsAndEyeHeights.add(new Pair<>(lookVec, eye));
}
}
}
if (hitboxDebuggingEnabled())
sendHitboxDebugData(reachEntity, from, lookVecsAndEyeHeights, isPrediction);
HitData foundHitData = null;
// If the entity is within range of the player (we'll flag anyway if not, so no point checking blocks in this case)
// Ignore when could be hitting through a moving shulker, piston blocks. They are just too glitchy/uncertain to check.
if (minDistance <= distance - extraSearchDistance && !player.compensatedWorld.isNearHardEntity(player.boundingBox.copy().expand(4))) {
// we can optimize didRayTraceHit more to only rayTrace up to the maximize distance of all rays that hit to the target...
// I'm too lazy to do that and we don't need to optimize that much yet so...
final @Nullable Pair<Double, HitData> hitResult = didRayTraceHit(reachEntity, lookVecsAndEyeHeights, from);
HitData hitData = hitResult.second();
// If the returned hit result was NOT the target entity we flag the check
if (hitData instanceof EntityHitData &&
player.compensatedEntities.getPacketEntityID(((EntityHitData) hitData).getEntity()) != player.compensatedEntities.getPacketEntityID(reachEntity)) {
minDistance = Double.MIN_VALUE;
foundHitData = hitData;
// until I fix block modeling exempt any blocks changed this tick
} else if (hitData instanceof BlockHitData && !blocksChangedThisTick.contains(((BlockHitData) hitData).getPosition())) {
minDistance = Double.MIN_VALUE;
foundHitData = hitData;
}
}
// if the entity is not exempt and the entity is alive
if ((!blacklisted.contains(reachEntity.getType()) && reachEntity.isLivingEntity()) || reachEntity.getType() == EntityTypes.END_CRYSTAL) {
if (minDistance == Double.MAX_VALUE) {
if (minDistance == Double.MIN_VALUE && foundHitData != null) {
cancelBuffer = 1;
return "Missed hitbox";
} else if (minDistance > player.compensatedEntities.getSelf().getAttributeValue(Attributes.PLAYER_ENTITY_INTERACTION_RANGE)) {
if (foundHitData instanceof BlockHitData) {
return new CheckResult(ResultType.BLOCK, "Hit block=" + ((BlockHitData) foundHitData).getState().getType().getName() + " ");
} else { // entity hit data
return new CheckResult(ResultType.ENTITY, "Hit entity=" + ((EntityHitData) foundHitData).getEntity().getType().getName() + " ");
}
} else if (minDistance == Double.MAX_VALUE) {
cancelBuffer = 1;
return String.format("%.5f", minDistance) + " blocks";
return new CheckResult(ResultType.HITBOX, "");
} else if (minDistance > player.compensatedEntities.self.getAttributeValue(Attributes.ENTITY_INTERACTION_RANGE)) {
cancelBuffer = 1;
return new CheckResult(ResultType.REACH, String.format("%.5f", minDistance) + " blocks");
} else {
cancelBuffer = Math.max(0, cancelBuffer - 0.25);
}
}
return null;
return NONE;
}
private static final CheckResult NONE = new CheckResult(ResultType.NONE, "");
private static class CheckResult {
private final ResultType type;
private final String verbose;
public CheckResult(ResultType type, String verbose) {
this.type = type;
this.verbose = verbose;
}
public ResultType type() {
return type;
}
public String verbose() {
return verbose;
}
public boolean isFlag() {
return type != ResultType.NONE;
}
}
private enum ResultType {
REACH, HITBOX, BLOCK, ENTITY, NONE
}
public void handleBlockChange(Vector3i vector3i, WrappedBlockState state) {
if (blocksChangedThisTick.size() >= 40) return; // Don't let players freeze movement packets to grow this
// Only do this for nearby blocks
if (new Vector(vector3i.x, vector3i.y, vector3i.z).distanceSquared(new Vector(player.x, player.y, player.z)) > 6) return;
// Only do this if the state really had any world impact
if (state.equals(player.compensatedWorld.getBlock(vector3i))) return;
blocksChangedThisTick.add(vector3i);
}
// Checks if it was possible to hit a target entity
// TODO refactor to return list of rays and why each of them didn't hit instead of closest obstruction
// NOTE: It should be impossible for the returned Pair to be null
// because all of the possibleLookVecsAndEyeHeights passed in should be ones that hit the target entity
// in previous parts of this check when we didn't check for any obstructions like blocks/entities
private @NotNull Pair<@NotNull Double, @NotNull HitData> didRayTraceHit(PacketEntity targetEntity,
List<Pair<Vector, Double>> possibleLookVecsAndEyeHeights,
Vector3d from) {
HitData firstObstruction = null;
double firstObstructionDistanceSq = 0;
// Check every possible look direction and every possible eye height
for (Pair<Vector, Double> vectorDoublePair : possibleLookVecsAndEyeHeights) {
Vector lookVec = vectorDoublePair.first();
double eye = vectorDoublePair.second();
Vector eyes = new Vector(from.getX(), from.getY() + eye, from.getZ());
// this function is completely 0.03 aware
final HitData hitResult = BlockRayTrace.getNearestHitResult(player, targetEntity, eyes, lookVec);
// If we hit the target entity, it's a valid hit
if (hitResult instanceof EntityHitData && ((EntityHitData) hitResult).getEntity().equals(targetEntity)) {
double distanceSquared = eyes.distanceSquared(hitResult.getBlockHitLocation());
return new Pair<>(distanceSquared, hitResult); // Legitimate hit
} else if (hitResult != null && firstObstruction == null) {
// Store the first obstruction only
firstObstruction = hitResult;
firstObstructionDistanceSq = eyes.distanceSquared(hitResult.getBlockHitLocation());
}
}
// Return the first obstruction if no valid hit found
// Since we sort eye heights by likeniness, we should in effect return the most likely (first) obstruction
assert firstObstruction != null;
return new Pair<>(firstObstructionDistanceSq, firstObstruction);
}
private boolean hitboxDebuggingEnabled() {
return player.checkManager.getCheck(HitboxDebugHandler.class).isEnabled();
}
private void sendHitboxDebugData(PacketEntity reachEntity, Vector3d from, List<Pair<Vector, Double>> lookVecsAndEyeHeights, boolean isPrediction) {
Map<Integer, CollisionBox> hitboxes = new HashMap<>();
for (Int2ObjectMap.Entry<PacketEntity> entry : player.compensatedEntities.entityMap.int2ObjectEntrySet()) {
PacketEntity entity = entry.getValue();
if (!entity.canHit()) continue;
CollisionBox box;
if (entity.equals(reachEntity)) {
// Target entity gets expanded hitbox
box = entity.getPossibleCollisionBoxes();
SimpleCollisionBox sBox = (SimpleCollisionBox) box;
sBox.expand(player.checkManager.getPacketCheck(Reach.class).reachThreshold);
// Add movement threshold uncertainty for 1.9+ or non-position updates
if (!player.packetStateData.didLastLastMovementIncludePosition
|| player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9)) {
sBox.expand(player.getMovementThreshold());
}
} else {
// Non-target entities
box = entity.getMinimumPossibleCollisionBoxes();
if (box instanceof NoCollisionBox) {
hitboxes.put(entry.getIntKey(), NoCollisionBox.INSTANCE);
continue;
} else if (box instanceof SimpleCollisionBox) {
SimpleCollisionBox sBox = (SimpleCollisionBox) box;
sBox.expand(-player.checkManager.getPacketCheck(Reach.class).reachThreshold);
// Shrink non-target entities by movement threshold when applicable
if (!player.packetStateData.didLastLastMovementIncludePosition
|| player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9)) {
sBox.expand(-player.getMovementThreshold());
}
}
}
// Add 1.8 and below extra hitbox size
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_9)
&& box instanceof SimpleCollisionBox) {
((SimpleCollisionBox) box).expand(0.1f);
}
hitboxes.put(entry.getIntKey(), box);
}
player.checkManager.getCheck(HitboxDebugHandler.class).sendHitboxData(hitboxes,
Collections.singleton(player.compensatedEntities.getPacketEntityID(reachEntity)),
lookVecsAndEyeHeights,
new Vector(from.getX(), from.getY(), from.getZ()),
isPrediction, player.compensatedEntities.self.getAttributeValue(Attributes.ENTITY_INTERACTION_RANGE));
}
@Override
public void onReload(ConfigManager config) {
this.ignoreNonPlayerTargets = config.getBooleanElse("Reach.ignore-non-player-targets", false);
this.cancelImpossibleHits = config.getBooleanElse("Reach.block-impossible-hits", true);
this.threshold = config.getDoubleElse("Reach.threshold", 0.0005);
this.reachThreshold = config.getDoubleElse("Reach.threshold", 0.0005);
}
}
@@ -8,7 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.GameMode;
@CheckData(name = "CrashB")
@CheckData(name = "CrashB", description = "Sent creative mode inventory click packets while not in creative mode")
public class CrashB extends Check implements PacketCheck {
public CrashB(GrimPlayer player) {
super(player);
@@ -8,7 +8,7 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.world.Location;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
@CheckData(name = "CrashC")
@CheckData(name = "CrashC", description = "Sent non-finite position or rotation")
public class CrashC extends Check implements PacketCheck {
public CrashC(GrimPlayer playerData) {
super(playerData);
@@ -13,7 +13,7 @@ import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClickWindow;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerOpenWindow;
@CheckData(name = "CrashD", experimental = false)
@CheckData(name = "CrashD", description = "Clicking slots in lectern window")
public class CrashD extends Check implements PacketCheck {
public CrashD(GrimPlayer playerData) {
@@ -2,14 +2,13 @@ package ac.grim.grimac.checks.impl.crash;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.impl.exploit.ExploitA;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientSettings;
@CheckData(name = "CrashE", experimental = false)
@CheckData(name = "CrashE")
public class CrashE extends Check implements PacketCheck {
public CrashE(GrimPlayer playerData) {
@@ -21,12 +20,10 @@ public class CrashE extends Check implements PacketCheck {
if (event.getPacketType() == PacketType.Play.Client.CLIENT_SETTINGS) {
WrapperPlayClientSettings wrapper = new WrapperPlayClientSettings(event);
int viewDistance = wrapper.getViewDistance();
boolean invalidLocale = player.checkManager.getPrePredictionCheck(ExploitA.class).checkString(wrapper.getLocale());
if (viewDistance < 2) {
flagAndAlert("distance=" + viewDistance);
wrapper.setViewDistance(2);
}
if (invalidLocale) wrapper.setLocale("en_us");
}
}
@@ -13,7 +13,7 @@ import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPl
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientUseItem;
@CheckData(name = "CrashG")
@CheckData(name = "CrashG", description = "Sent negative sequence id")
public class CrashG extends Check implements PacketCheck {
public CrashG(GrimPlayer player) {
@@ -32,13 +32,12 @@ public class CrashH extends Check implements PacketCheck {
}
// paper's patch
final int index;
if (text.length() > 64 && ((index = text.indexOf(' ')) == -1 || index >= 64)) {
if (length > 64 && ((index = text.indexOf(' ')) == -1 || index >= 64)) {
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
flagAndAlert("(invalid) length=" + length);
return;
}
}
}
@@ -0,0 +1,50 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraA", description = "Started gliding while already gliding", experimental = true)
public class ElytraA extends Check implements PostPredictionCheck {
private boolean setback;
public ElytraA(GrimPlayer player) {
super(player);
}
public void onStartGliding(PacketReceiveEvent event) {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
return;
}
if (player.isGliding && flagAndAlert()) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_15) && event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
) onStartGliding(event);
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
@@ -0,0 +1,57 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraB", description = "Started gliding without jumping", experimental = true)
public class ElytraB extends Check implements PostPredictionCheck {
private boolean glide;
private boolean setback;
public ElytraB(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
&& player.supportsEndTick()
) {
if (player.packetStateData.knownInput.jump()) {
if (flagAndAlert("no release")) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
} else {
glide = true;
}
}
if (isUpdate(event.getPacketType())) {
if (glide && !player.packetStateData.knownInput.jump() && flagAndAlert("no jump")) {
setback = true;
}
glide = false;
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setback = false;
setbackIfAboveSetbackVL();
}
}
}
@@ -0,0 +1,76 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraC", description = "Started gliding too frequently", experimental = true)
public class ElytraC extends Check implements PostPredictionCheck {
private boolean glideThisTick, glideLastTick, setback;
private int flags;
public ElytraC(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
return;
}
if (player.gamemode == GameMode.SPECTATOR) {
glideThisTick = glideLastTick = false;
}
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION && new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA) {
if (glideThisTick || glideLastTick) {
if (player.canSkipTicks()) {
flags++;
} else {
if (flagAndAlert()) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
}
glideThisTick = true;
}
if (isTickPacket(event.getPacketType())) {
glideLastTick = glideThisTick;
glideThisTick = false;
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (player.canSkipTicks()) {
if (player.isTickingReliablyFor(3)) {
for (; flags > 0; flags--) {
flagAndAlert();
}
}
flags = 0;
setback = false;
}
if (setback) {
setback = false;
setbackIfAboveSetbackVL();
}
}
}
@@ -0,0 +1,48 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraD", description = "Started gliding without an elytra", experimental = true)
public class ElytraD extends Check implements PostPredictionCheck {
private boolean setback;
public ElytraD(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
return;
}
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
&& !player.canGlide()
&& flagAndAlert()
) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
@@ -0,0 +1,48 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraE", description = "Started gliding while flying", experimental = true)
public class ElytraE extends Check implements PostPredictionCheck {
private boolean setback;
public ElytraE(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
return;
}
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
&& player.isFlying
&& flagAndAlert()
) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
@@ -0,0 +1,48 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraF", description = "Started gliding while on ground", experimental = true)
public class ElytraF extends Check implements PostPredictionCheck {
private boolean setback;
public ElytraF(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
return;
}
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
&& player.clientClaimsLastOnGround
&& flagAndAlert()
) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
@@ -0,0 +1,46 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.potion.PotionTypes;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraG", description = "Started gliding with levitation", experimental = true)
public class ElytraG extends Check implements PostPredictionCheck {
private boolean setback;
public ElytraG(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
&& player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_16)
&& player.compensatedEntities.self.hasPotionEffect(PotionTypes.LEVITATION)
&& flagAndAlert()
) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
@@ -0,0 +1,48 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraH", description = "Started gliding in vehicle", experimental = true)
public class ElytraH extends Check implements PostPredictionCheck {
private boolean setback;
public ElytraH(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8)) {
return;
}
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
&& player.inVehicle()
&& flagAndAlert()
) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
@@ -0,0 +1,45 @@
package ac.grim.grimac.checks.impl.elytra;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "ElytraI", description = "Started gliding in water", experimental = true)
public class ElytraI extends Check implements PostPredictionCheck {
private boolean setback;
public ElytraI(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION
&& new WrapperPlayClientEntityAction(event).getAction() == WrapperPlayClientEntityAction.Action.START_FLYING_WITH_ELYTRA
&& player.wasTouchingWater
&& player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_15)
&& flagAndAlert()
) {
setback = true;
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.resyncPose();
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
@@ -4,12 +4,11 @@ import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientChatMessage;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientNameItem;
import java.util.regex.Pattern;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientTabComplete;
@CheckData(name = "ExploitA", experimental = true)
public class ExploitA extends Check implements PacketCheck {
@@ -18,35 +17,18 @@ public class ExploitA extends Check implements PacketCheck {
super(playerData);
}
private static final Pattern EXPLOIT_PATTERN = Pattern.compile("\\$\\{.+}");
/*
WARNING: This doesn't fully patch Log4J! It is highly recommended you update your server
jar to a version that has true Log4J migrations instead of using a plugin. However, this
patch is better than nothing and will still be useful for punishing players who attempt
to abuse this exploit.
*/
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.CHAT_MESSAGE) {
if (true) return; // TODO: Fix PacketEvents pls retrooper
WrapperPlayClientChatMessage wrapper = new WrapperPlayClientChatMessage(event);
String message = wrapper.getMessage();
if (checkString(message)) {
event.setCancelled(true);
player.onPacketCancel();
}
} else if (event.getPacketType() == PacketType.Play.Client.NAME_ITEM) {
WrapperPlayClientNameItem wrapper = new WrapperPlayClientNameItem(event);
String name = wrapper.getItemName();
if (checkString(name)) {
event.setCancelled(true);
player.onPacketCancel();
if (event.getPacketType() == PacketType.Play.Client.TAB_COMPLETE && PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_13)) {
WrapperPlayClientTabComplete wrapper = new WrapperPlayClientTabComplete(event);
String text = wrapper.getText();
if (text.equals("/") || text.trim().isEmpty()) {
if (flagAndAlert("")) {
event.setCancelled(true);
player.onPacketCancel();
}
}
}
}
public boolean checkString(String message) {
return EXPLOIT_PATTERN.matcher(message).matches() && flagAndAlert();
}
}
@@ -4,31 +4,29 @@ import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientTabComplete;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEditBook;
@CheckData(name = "ExploitB", experimental = true)
@CheckData(name = "ExploitB", description = "Too long book title")
public class ExploitB extends Check implements PacketCheck {
public ExploitB(GrimPlayer playerData) {
super(playerData);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.TAB_COMPLETE && PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_13)) {
WrapperPlayClientTabComplete wrapper = new WrapperPlayClientTabComplete(event);
String text = wrapper.getText();
if (text.equals("/") || text.trim().length() == 0) {
if (flagAndAlert("")) {
if (event.getPacketType() == PacketType.Play.Client.EDIT_BOOK) {
final String title = new WrapperPlayClientEditBook(event).getTitle();
if (title == null) return; // book was not signed
if (title.length() > 15) {
if (flagAndAlert("title=" + title) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
}
}
}
@@ -0,0 +1,56 @@
package ac.grim.grimac.checks.impl.exploit;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientChatCommand;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientChatCommandUnsigned;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientChatMessage;
// this can false from click events, but I doubt this would actually
// happen unless they're trying to flag, or if the server is set up badly
@CheckData(name = "ExploitC", description = "Invalid chat message")
public class ExploitC extends Check implements PacketCheck {
public ExploitC(GrimPlayer playerData) {
super(playerData);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.CHAT_MESSAGE) {
String message = new WrapperPlayClientChatMessage(event).getMessage();
if (message.isEmpty() || !message.trim().equals(message) || message.startsWith("/") && PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_19)) {
if (flagAndAlert("message=" + message)) {
event.setCancelled(true);
player.onPacketCancel();
}
}
}
if (event.getPacketType() == PacketType.Play.Client.CHAT_COMMAND_UNSIGNED) {
String command = "/" + new WrapperPlayClientChatCommandUnsigned(event).getCommand();
String strippedCommand = command.replaceAll("\\s+$", ""); // Remove trailing whitespace
if (!strippedCommand.equals(command)) {
if (flagAndAlert("command=" + command)) {
event.setCancelled(true);
player.onPacketCancel();
}
}
}
if (event.getPacketType() == PacketType.Play.Client.CHAT_COMMAND) {
String command = "/" + new WrapperPlayClientChatCommand(event).getCommand();
if (!command.trim().equals(command)) {
if (flagAndAlert("command=" + command)) {
event.setCancelled(true);
player.onPacketCancel();
}
}
}
}
}
@@ -17,12 +17,12 @@ import java.util.List;
// Catches NoFalls for LOOK and GROUND packets
// This check runs AFTER the predictions
@CheckData(name = "NoFall", configName = "nofall", setback = 10)
public class NoFallA extends Check implements PacketCheck {
@CheckData(name = "NoFall", setback = 10)
public class NoFall extends Check implements PacketCheck {
public boolean flipPlayerGroundStatus = false;
public NoFallA(GrimPlayer player) {
public NoFall(GrimPlayer player) {
super(player);
}
@@ -42,7 +42,7 @@ public class NoFallA extends Check implements PacketCheck {
if (wrapper.isOnGround() && !hasPosition) {
if (!isNearGround(wrapper.isOnGround())) { // If player isn't near ground
// 1.8 boats have a mind on their own... only flag if they're not near a boat or are on 1.9+
if (!GhostBlockDetector.isGhostBlock(player) && flagWithSetback()) alert("");
if (!GhostBlockDetector.isGhostBlock(player)) flagAndAlertWithSetback();
if (shouldModifyPackets()) {
wrapper.setOnGround(false);
event.markForReEncode(true);
@@ -0,0 +1,42 @@
package ac.grim.grimac.checks.impl.inventory;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.InventoryCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity.InteractAction;
@CheckData(name = "InventoryA", setback = 3, description = "Attacked an entity while inventory is open")
public class InventoryA extends InventoryCheck {
public InventoryA(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
super.onPacketReceive(event);
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
WrapperPlayClientInteractEntity wrapper = new WrapperPlayClientInteractEntity(event);
if (wrapper.getAction() != InteractAction.ATTACK) return;
// Is not possible to attack while the inventory is open.
if (player.hasInventoryOpen) {
if (flagAndAlert()) {
// Cancel the packet
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
if (!isNoSetbackPermission())
closeInventory();
}
} else {
reward();
}
}
}
}
@@ -0,0 +1,35 @@
package ac.grim.grimac.checks.impl.inventory;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.InventoryCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
@CheckData(name = "InventoryB", setback = 3, description = "Started digging blocks while inventory is open")
public class InventoryB extends InventoryCheck {
public InventoryB(GrimPlayer player) {
super(player);
}
public void handle(PacketReceiveEvent event, WrapperPlayClientPlayerDigging wrapper) {
if (wrapper.getAction() != DiggingAction.START_DIGGING) return;
// Is not possible to start digging a block while the inventory is open.
if (player.hasInventoryOpen) {
if (flagAndAlert()) {
// Cancel the packet
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
if (!isNoSetbackPermission()) {
closeInventory();
}
}
} else {
reward();
}
}
}
@@ -0,0 +1,30 @@
package ac.grim.grimac.checks.impl.inventory;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.InventoryCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockPlace;
@CheckData(name = "InventoryC", setback = 3, description = "Placed a block while inventory is open")
public class InventoryC extends InventoryCheck {
public InventoryC(GrimPlayer player) {
super(player);
}
public void onBlockPlace(final BlockPlace place) {
// It is not possible to place a block while the inventory is open
if (player.hasInventoryOpen) {
if (flagAndAlert()) {
if (shouldModifyPackets()) {
place.resync();
}
if (!isNoSetbackPermission()) {
closeInventory();
}
}
} else {
reward();
}
}
}
@@ -0,0 +1,85 @@
package ac.grim.grimac.checks.impl.inventory;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.InventoryCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import ac.grim.grimac.utils.data.VectorData;
import ac.grim.grimac.utils.data.VectorData.MoveVectorData;
import ac.grim.grimac.utils.data.VehicleData;
import java.util.StringJoiner;
@CheckData(name = "InventoryD", setback = 1, decay = 0.25)
public class InventoryD extends InventoryCheck {
private int horseJumpVerbose;
public InventoryD(GrimPlayer player) {
super(player);
}
@Override
public void onPredictionComplete(final PredictionComplete predictionComplete) {
if (!predictionComplete.isChecked() ||
predictionComplete.getData().isTeleport() ||
player.getSetbackTeleportUtil().blockOffsets ||
player.packetStateData.lastPacketWasTeleport ||
player.packetStateData.isSlowedByUsingItem() ||
System.currentTimeMillis() - player.lastBlockPlaceUseItem < 50L) {
return;
}
if (player.hasInventoryOpen) {
boolean inVehicle = player.inVehicle();
boolean isJumping, isMoving;
if (inVehicle) {
VehicleData vehicle = player.vehicleData;
// Will flag once if player open anything with pressed space bar
isJumping = vehicle.nextHorseJump > 0 && horseJumpVerbose++ >= 1;
isMoving = vehicle.nextVehicleForward != 0 || vehicle.nextVehicleHorizontal != 0;
} else {
MoveVectorData move = findMovement(player.predictedVelocity);
isJumping = player.predictedVelocity.isJump();
isMoving = move != null && (move.x != 0 || move.z != 0);
}
if (!isMoving && !isJumping) {
reward();
return;
}
if (flag()) {
if (!isNoSetbackPermission())
closeInventory();
StringJoiner joiner = new StringJoiner(" ");
if (isMoving) joiner.add("moving");
if (isJumping) joiner.add("jumping");
if (inVehicle) joiner.add("inVehicle");
alert(joiner.toString());
}
} else {
horseJumpVerbose = 0;
}
}
private MoveVectorData findMovement(VectorData vectorData) {
if (vectorData instanceof MoveVectorData) {
return (MoveVectorData) vectorData;
}
while (vectorData != null) {
vectorData = vectorData.lastVector;
if (vectorData instanceof MoveVectorData) {
return (MoveVectorData) vectorData;
}
}
return null;
}
}
@@ -0,0 +1,50 @@
package ac.grim.grimac.checks.impl.inventory;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.InventoryCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
@CheckData(name = "InventoryE", setback = 3, description = "Sent a held item change packet while inventory is open")
public class InventoryE extends InventoryCheck {
private long lastTransaction = Long.MAX_VALUE; // Impossible transaction ID
public InventoryE(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
super.onPacketReceive(event);
if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_CHANGE) {
// It is not possible to change hotbar slots with held item change while the inventory is open
// A container click packet would be sent instead
if (player.hasInventoryOpen) {
if (this.lastTransaction < player.lastTransactionReceived.get()
&& flagAndAlert()) {
// Cancel the packet
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
player.getInventory().needResend = true;
}
if (!isNoSetbackPermission()) {
closeInventory();
}
}
} else {
reward();
}
}
}
@Override
public void onPacketSend(PacketSendEvent event) {
if (event.getPacketType() == PacketType.Play.Server.HELD_ITEM_CHANGE) {
this.lastTransaction = player.lastTransactionSent.get();
}
}
}
@@ -0,0 +1,46 @@
package ac.grim.grimac.checks.impl.inventory;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.InventoryCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.inventory.InventoryDesyncStatus;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
@CheckData(name = "InventoryF", setback = 3, description = "Sent a click window packet without a open inventory", experimental = true)
public class InventoryF extends InventoryCheck {
public InventoryF(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
// Exempt on 1.9+ server version due to the Via hack done in PacketPlayerWindow, the exemption can be deleted
// once we are ahead of ViaVersion
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9)
|| player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9)) return;
super.onPacketReceive(event);
if (event.getPacketType() == PacketType.Play.Client.CLICK_WINDOW) {
if (!player.hasInventoryOpen && player.inventoryDesyncStatus == InventoryDesyncStatus.NOT_DESYNCED) {
if (flagAndAlert()) {
// Cancel the packet
if (shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
if (!isNoSetbackPermission()) {
closeInventory();
}
}
} else {
reward();
}
}
}
}
@@ -0,0 +1,40 @@
package ac.grim.grimac.checks.impl.inventory;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.InventoryCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "InventoryG", setback = 3, description = "Sent a entity action packet while inventory is open", experimental = true)
public class InventoryG extends InventoryCheck {
public InventoryG(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.packetStateData.lastPacketWasTeleport) return;
super.onPacketReceive(event);
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION) {
WrapperPlayClientEntityAction wrapper = new WrapperPlayClientEntityAction(event);
WrapperPlayClientEntityAction.Action action = wrapper.getAction();
if (action == WrapperPlayClientEntityAction.Action.STOP_SNEAKING
|| action == WrapperPlayClientEntityAction.Action.STOP_SPRINTING) {
return;
}
if (player.hasInventoryOpen) {
if (flagAndAlert() && !isNoSetbackPermission()) {
closeInventory();
}
} else {
reward();
}
}
}
}
@@ -2,19 +2,27 @@ package ac.grim.grimac.checks.impl.misc;
import ac.grim.grimac.GrimAPI;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.impl.exploit.ExploitA;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.MessageUtil;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.configuration.client.WrapperConfigClientPluginMessage;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPluginMessage;
import lombok.Getter;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
public class ClientBrand extends Check implements PacketCheck {
String brand = "vanilla";
boolean hasBrand = false;
public static final String channel = PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_13) ? "minecraft:brand" : "MC|Brand";
@Getter
private String brand = "vanilla";
private boolean hasBrand = false;
public ClientBrand(GrimPlayer player) {
super(player);
@@ -24,40 +32,37 @@ public class ClientBrand extends Check implements PacketCheck {
public void onPacketReceive(final PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.PLUGIN_MESSAGE) {
WrapperPlayClientPluginMessage packet = new WrapperPlayClientPluginMessage(event);
String channelName = packet.getChannelName();
handle(channelName, packet.getData());
handle(packet.getChannelName(), packet.getData());
} else if (event.getPacketType() == PacketType.Configuration.Client.PLUGIN_MESSAGE) {
WrapperConfigClientPluginMessage packet = new WrapperConfigClientPluginMessage(event);
handle(packet.getChannelName(), packet.getData());
}
}
public void handle(String channel, byte[] data) {
if (channel.equalsIgnoreCase("minecraft:brand") || // 1.13+
channel.equals("MC|Brand")) { // 1.12
if (data.length > 64 || data.length == 0) {
brand = "sent " + data.length + " bytes as brand";
} else if (!hasBrand) {
byte[] minusLength = new byte[data.length - 1];
System.arraycopy(data, 1, minusLength, 0, minusLength.length);
brand = new String(minusLength).replace(" (Velocity)", ""); //removes velocity's brand suffix
brand = ChatColor.stripColor(brand); //strip color codes from client brand
if (player.checkManager.getPrePredictionCheck(ExploitA.class).checkString(brand)) brand = "sent log4j";
if (!GrimAPI.INSTANCE.getConfigManager().isIgnoredClient(brand)) {
String message = GrimAPI.INSTANCE.getConfigManager().getConfig().getStringElse("client-brand-format", "%prefix% &f%player% joined using %brand%");
message = GrimAPI.INSTANCE.getExternalAPI().replaceVariables(getPlayer(), message, true);
// sendMessage is async safe while broadcast isn't due to adventure
for (Player player : Bukkit.getOnlinePlayers()) {
if (player.hasPermission("grim.brand")) {
player.sendMessage(message);
}
private void handle(String channel, byte[] data) {
if (!channel.equals(ClientBrand.channel)) return;
if (data.length > 64 || data.length == 0) {
brand = "sent " + data.length + " bytes as brand";
} else if (!hasBrand) {
byte[] minusLength = new byte[data.length - 1];
System.arraycopy(data, 1, minusLength, 0, minusLength.length);
brand = new String(minusLength).replace(" (Velocity)", ""); //removes velocity's brand suffix
brand = ChatColor.stripColor(brand); //strip color codes from client brand
if (!GrimAPI.INSTANCE.getConfigManager().isIgnoredClient(brand)) {
String message = GrimAPI.INSTANCE.getConfigManager().getConfig().getStringElse("client-brand-format", "%prefix% &f%player% joined using %brand%");
Component component = MessageUtil.replacePlaceholders(player, MessageUtil.miniMessage(message));
for (Player player : Bukkit.getOnlinePlayers()) {
if (GrimAPI.INSTANCE.getAlertManager().hasBrandsEnabled(player)) {
MessageUtil.sendMessage(player, component);
}
}
}
hasBrand = true;
}
}
public String getBrand() {
return brand;
hasBrand = true;
}
}
@@ -1,155 +0,0 @@
package ac.grim.grimac.checks.impl.misc;
import ac.grim.grimac.GrimAPI;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.math.GrimMath;
import ac.grim.grimac.utils.nmsutil.BlockBreakSpeed;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState;
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerAcknowledgeBlockChanges;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerBlockChange;
import io.github.retrooper.packetevents.util.folia.FoliaScheduler;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
// Based loosely off of Hawk BlockBreakSpeedSurvival
// Also based loosely off of NoCheatPlus FastBreak
// Also based off minecraft wiki: https://minecraft.wiki/w/Breaking#Instant_breaking
@CheckData(name = "FastBreak", experimental = false)
public class FastBreak extends Check implements PacketCheck {
public FastBreak(GrimPlayer playerData) {
super(playerData);
}
// The block the player is currently breaking
Vector3i targetBlock = null;
// The maximum amount of damage the player deals to the block
//
double maximumBlockDamage = 0;
// The last time a finish digging packet was sent, to enforce 0.3-second delay after non-instabreak
long lastFinishBreak = 0;
// The time the player started to break the block, to know how long the player waited until they finished breaking the block
long startBreak = 0;
// The buffer to this check
double blockBreakBalance = 0;
double blockDelayBalance = 0;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
// Find the most optimal block damage using the animation packet, which is sent at least once a tick when breaking blocks
// On 1.8 clients, via screws with this packet meaning we must fall back to the 1.8 idle flying packet
if ((player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9) ? event.getPacketType() == PacketType.Play.Client.ANIMATION : WrapperPlayClientPlayerFlying.isFlying(event.getPacketType())) && targetBlock != null) {
maximumBlockDamage = Math.max(maximumBlockDamage, BlockBreakSpeed.getBlockDamage(player, targetBlock));
}
if (event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING) {
WrapperPlayClientPlayerDigging digging = new WrapperPlayClientPlayerDigging(event);
final Vector3i blockPosition = digging.getBlockPosition();
if (digging.getAction() == DiggingAction.START_DIGGING) {
WrappedBlockState block = player.compensatedWorld.getWrappedBlockStateAt(blockPosition);
// Exempt all blocks that do not exist in the player version
if (WrappedBlockState.getDefaultState(player.getClientVersion(), block.getType()).getType() == StateTypes.AIR) {
return;
}
startBreak = System.currentTimeMillis() - (targetBlock == null ? 50 : 0); // ???
targetBlock = blockPosition;
maximumBlockDamage = BlockBreakSpeed.getBlockDamage(player, targetBlock);
double breakDelay = System.currentTimeMillis() - lastFinishBreak;
if (breakDelay >= 275) { // Reduce buffer if "close enough"
blockDelayBalance *= 0.9;
} else { // Otherwise, increase buffer
blockDelayBalance += 300 - breakDelay;
}
if (blockDelayBalance > 1000) { // If more than a second of advantage
flagAndAlert("Delay=" + breakDelay);
if (shouldModifyPackets()) {
event.setCancelled(true); // Cancelling start digging will cause server to reject block break
player.onPacketCancel();
}
}
clampBalance();
}
if (digging.getAction() == DiggingAction.FINISHED_DIGGING && targetBlock != null) {
double predictedTime = Math.ceil(1 / maximumBlockDamage) * 50;
double realTime = System.currentTimeMillis() - startBreak;
double diff = predictedTime - realTime;
clampBalance();
if (diff < 25) { // Reduce buffer if "close enough"
blockBreakBalance *= 0.9;
} else { // Otherwise, increase buffer
blockBreakBalance += diff;
}
if (blockBreakBalance > 1000) { // If more than a second of advantage
FoliaScheduler.getEntityScheduler().execute(player.bukkitPlayer, GrimAPI.INSTANCE.getPlugin(), () -> {
Player bukkitPlayer = player.bukkitPlayer;
if (bukkitPlayer == null || !bukkitPlayer.isOnline()) return;
if (bukkitPlayer.getLocation().distance(new Location(bukkitPlayer.getWorld(), blockPosition.getX(), blockPosition.getY(), blockPosition.getZ())) < 64) {
final int chunkX = blockPosition.getX() >> 4;
final int chunkZ = blockPosition.getZ() >> 4;
if (!bukkitPlayer.getWorld().isChunkLoaded(chunkX, chunkZ)) return; // Don't load chunks sync
Chunk chunk = bukkitPlayer.getWorld().getChunkAt(chunkX, chunkZ);
Block block = chunk.getBlock(blockPosition.getX() & 15, blockPosition.getY(), blockPosition.getZ() & 15);
int blockId;
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_13)) {
// Cache this because strings are expensive
blockId = WrappedBlockState.getByString(PacketEvents.getAPI().getServerManager().getVersion().toClientVersion(), block.getBlockData().getAsString(false)).getGlobalId();
} else {
blockId = (block.getType().getId() << 4) | block.getData();
}
player.user.sendPacket(new WrapperPlayServerBlockChange(blockPosition, blockId));
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_19)) { // Via will handle this for us pre-1.19
player.user.sendPacket(new WrapperPlayServerAcknowledgeBlockChanges(digging.getSequence())); // Make 1.19 clients apply the changes
}
}
}, null, 0);
if (flagAndAlert("Diff=" + diff + ",Balance=" + blockBreakBalance) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
lastFinishBreak = System.currentTimeMillis();
}
}
}
private void clampBalance() {
double balance = Math.max(1000, (player.getTransactionPing()));
blockBreakBalance = GrimMath.clamp(blockBreakBalance, -balance, balance); // Clamp not Math.max in case other logic changes
blockDelayBalance = GrimMath.clamp(blockDelayBalance, -balance, balance);
}
}
@@ -5,12 +5,9 @@ import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "TransactionOrder", experimental = false)
@CheckData(name = "TransactionOrder")
public class TransactionOrder extends Check implements PacketCheck {
public TransactionOrder(GrimPlayer player) {
super(player);
}
}
@@ -1,17 +0,0 @@
package ac.grim.grimac.checks.impl.movement;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "Entity control", configName = "EntityControl")
public class EntityControl extends Check implements PostPredictionCheck {
public EntityControl(GrimPlayer player) {
super(player);
}
public void rewardPlayer() {
reward();
}
}
@@ -8,8 +8,8 @@ import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
@CheckData(name = "NoSlowA (Prediction)", configName = "NoSlowA", setback = 5)
public class NoSlowA extends Check implements PostPredictionCheck {
@CheckData(name = "NoSlow", description = "Was not slowed while using an item", setback = 5)
public class NoSlow extends Check implements PostPredictionCheck {
double offsetToFlag;
double bestOffset = 1;
// The player sends that they switched items the next tick if they switch from an item that can be used
@@ -17,7 +17,7 @@ public class NoSlowA extends Check implements PostPredictionCheck {
public boolean didSlotChangeLastTick = false;
public boolean flaggedLastTick = false;
public NoSlowA(GrimPlayer player) {
public NoSlow(GrimPlayer player) {
super(player);
}
@@ -34,8 +34,8 @@ public class NoSlowA extends Check implements PostPredictionCheck {
}
if (bestOffset > offsetToFlag) {
if (flaggedLastTick && flagWithSetback()) {
alert("");
if (flaggedLastTick) {
flagAndAlertWithSetback();
}
flaggedLastTick = true;
} else {
@@ -52,6 +52,6 @@ public class NoSlowA extends Check implements PostPredictionCheck {
@Override
public void onReload(ConfigManager config) {
offsetToFlag = config.getDoubleElse("NoSlowA.threshold", 0.001);
offsetToFlag = config.getDoubleElse(getConfigName() + ".threshold", 0.001);
}
}
@@ -1,37 +0,0 @@
package ac.grim.grimac.checks.impl.movement;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
@CheckData(name = "NoSlowC", setback = 5, experimental = true)
public class NoSlowC extends Check implements PostPredictionCheck {
public NoSlowC(GrimPlayer player) {
super(player);
}
@Override
public void onPredictionComplete(final PredictionComplete predictionComplete) {
if (!predictionComplete.isChecked()) return;
if (player.isSlowMovement) {
ClientVersion client = player.getClientVersion();
// https://bugs.mojang.com/browse/MC-152728
if (client.isNewerThanOrEquals(ClientVersion.V_1_14_2)) {
return;
}
if (player.isSprinting
// you can sneak and swim in 1.13 - 1.14.1
&& (!player.isSwimming || client.isNewerThan(ClientVersion.V_1_14_1) || client.isOlderThan(ClientVersion.V_1_13))
&& player.sneakingSpeedMultiplier < 0.8f
) {
if (flagWithSetback()) alert("");
} else reward();
}
}
}
@@ -12,7 +12,7 @@ public class PredictionRunner extends Check implements PositionCheck {
@Override
public void onPositionUpdate(final PositionUpdate positionUpdate) {
if (!player.compensatedEntities.getSelf().inVehicle()) {
if (!player.inVehicle()) {
player.movementCheckRunner.processAndCheckMovementPacket(positionUpdate);
}
}
@@ -32,7 +32,7 @@ public class SetbackBlocker extends Check implements PacketCheck {
}
// Look is the only valid packet to send while in a vehicle
if (player.compensatedEntities.getSelf().inVehicle() && event.getPacketType() != PacketType.Play.Client.PLAYER_ROTATION && !player.packetStateData.lastPacketWasTeleport) {
if (player.inVehicle() && event.getPacketType() != PacketType.Play.Client.PLAYER_ROTATION && !player.packetStateData.lastPacketWasTeleport) {
event.setCancelled(true);
}
@@ -42,7 +42,7 @@ public class SetbackBlocker extends Check implements PacketCheck {
}
// Player is dead
if (player.compensatedEntities.getSelf().isDead) {
if (player.compensatedEntities.self.isDead) {
event.setCancelled(true);
}
}
@@ -53,7 +53,7 @@ public class SetbackBlocker extends Check implements PacketCheck {
}
// Don't let a player move a vehicle when not in a vehicle
if (!player.compensatedEntities.getSelf().inVehicle()) {
if (!player.inVehicle()) {
event.setCancelled(true);
}
@@ -63,7 +63,7 @@ public class SetbackBlocker extends Check implements PacketCheck {
}
// Player is dead
if (player.compensatedEntities.getSelf().isDead) {
if (player.compensatedEntities.self.isDead) {
event.setCancelled(true);
}
}
@@ -0,0 +1,29 @@
package ac.grim.grimac.checks.impl.multiactions;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.InteractionHand;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
@CheckData(name = "MultiActionsA", description = "Attacked while using an item", experimental = true)
public class MultiActionsA extends Check implements PacketCheck {
public MultiActionsA(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.packetStateData.isSlowedByUsingItem() && (player.packetStateData.lastSlotSelected == player.packetStateData.getSlowedByUsingItemSlot() || player.packetStateData.eatingHand == InteractionHand.OFF_HAND) && event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
if (new WrapperPlayClientInteractEntity(event).getAction() == WrapperPlayClientInteractEntity.InteractAction.ATTACK) {
if (flagAndAlert() && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
}
}
}
@@ -0,0 +1,41 @@
package ac.grim.grimac.checks.impl.multiactions;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.player.InteractionHand;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import static ac.grim.grimac.events.packets.patch.ResyncWorldUtil.resyncPosition;
@CheckData(name = "MultiActionsB", description = "Breaking blocks while using an item", experimental = true)
public class MultiActionsB extends Check implements PacketCheck {
public MultiActionsB(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (player.packetStateData.isSlowedByUsingItem() && (player.packetStateData.lastSlotSelected == player.packetStateData.getSlowedByUsingItemSlot() || player.packetStateData.eatingHand == InteractionHand.OFF_HAND) && event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING) {
// this is vanilla on 1.7
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10)) {
return;
}
final WrapperPlayClientPlayerDigging packet = new WrapperPlayClientPlayerDigging(event);
if (packet.getAction() == DiggingAction.START_DIGGING || packet.getAction() == DiggingAction.CANCELLED_DIGGING || packet.getAction() == DiggingAction.FINISHED_DIGGING) {
if (flagAndAlert() && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
resyncPosition(player, packet.getBlockPosition());
}
}
}
}
}
@@ -0,0 +1,40 @@
package ac.grim.grimac.checks.impl.multiactions;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
@CheckData(name = "MultiActionsC", description = "Clicked in inventory while sprinting", experimental = true)
public class MultiActionsC extends Check implements PacketCheck {
public MultiActionsC(GrimPlayer player) {
super(player);
}
private boolean serverOpenedInventoryThisTick;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.CLICK_WINDOW) {
if (player.isSprinting && !player.isSwimming && !serverOpenedInventoryThisTick && flagAndAlert() && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
if (isTickPacket(event.getPacketType())) {
serverOpenedInventoryThisTick = false;
}
}
@Override
public void onPacketSend(PacketSendEvent event) {
if (event.getPacketType() == PacketType.Play.Server.OPEN_WINDOW) {
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> serverOpenedInventoryThisTick = true);
}
}
}
@@ -0,0 +1,25 @@
package ac.grim.grimac.checks.impl.multiactions;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
@CheckData(name = "MultiActionsD", description = "Closed inventory while sprinting", experimental = true)
public class MultiActionsD extends Check implements PacketCheck {
public MultiActionsD(GrimPlayer player) {
super(player);
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.CLOSE_WINDOW) {
if (player.isSprinting && !player.isSwimming && flagAndAlert() && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
}
}
@@ -0,0 +1,43 @@
package ac.grim.grimac.checks.impl.multiactions;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.protocol.player.InteractionHand;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
@CheckData(name = "MultiActionsE", description = "Swinging while using an item", experimental = true)
public class MultiActionsE extends Check implements PacketCheck {
public MultiActionsE(GrimPlayer player) {
super(player);
}
private boolean dropping;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (!dropping && player.packetStateData.isSlowedByUsingItem() && (player.packetStateData.lastSlotSelected == player.packetStateData.getSlowedByUsingItemSlot() || player.packetStateData.eatingHand == InteractionHand.OFF_HAND) && event.getPacketType() == PacketType.Play.Client.ANIMATION) {
// this is possible to false on 1.7
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10)) {
return;
}
if (flagAndAlert() && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
dropping = false;
if (event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING && player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_15)) {
DiggingAction action = new WrapperPlayClientPlayerDigging(event).getAction();
dropping = action == DiggingAction.DROP_ITEM || action == DiggingAction.DROP_ITEM_STACK;
}
}
}
@@ -0,0 +1,92 @@
package ac.grim.grimac.checks.impl.multiactions;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.BlockPlaceCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.BlockPlace;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import java.util.ArrayList;
import java.util.List;
import static ac.grim.grimac.events.packets.patch.ResyncWorldUtil.resyncPosition;
@CheckData(name = "MultiActionsF", description = "Interacting with a block and an entity in the same tick", experimental = true)
public class MultiActionsF extends BlockPlaceCheck {
public MultiActionsF(GrimPlayer player) {
super(player);
}
private final List<String> flags = new ArrayList<>();
boolean entity, block;
@Override
public void onBlockPlace(BlockPlace place) {
block = true;
if (entity) {
if (!player.canSkipTicks()) {
if (flagAndAlert("place") && shouldModifyPackets() && shouldCancel()) {
place.resync();
}
} else {
flags.add("place");
}
}
}
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
entity = true;
if (block) {
if (!player.canSkipTicks()) {
if (flagAndAlert("entity") && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
} else {
flags.add("entity");
}
}
}
if (event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING) {
WrapperPlayClientPlayerDigging packet = new WrapperPlayClientPlayerDigging(event);
if (packet.getAction() == DiggingAction.START_DIGGING || packet.getAction() == DiggingAction.FINISHED_DIGGING) {
block = true;
if (entity) {
if (!player.canSkipTicks()) {
if (flagAndAlert("dig") && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
resyncPosition(player, packet.getBlockPosition());
}
} else {
flags.add("dig");
}
}
}
}
if (isTickPacket(event.getPacketType())) {
block = entity = false;
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
flagAndAlert(verbose);
}
}
flags.clear();
}
}
@@ -0,0 +1,52 @@
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClickWindow;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClickWindow.WindowClickType;
@CheckData(name = "PacketOrderA", experimental = true)
public class PacketOrderA extends Check implements PostPredictionCheck {
public PacketOrderA(final GrimPlayer player) {
super(player);
}
private int invalid;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.CLICK_WINDOW) {
final WindowClickType clickType = new WrapperPlayClientClickWindow(event).getWindowClickType();
if ((clickType == WindowClickType.PICKUP || clickType == WindowClickType.PICKUP_ALL) && player.packetOrderProcessor.isQuickMoveClicking()
|| clickType == WindowClickType.QUICK_MOVE && player.packetOrderProcessor.isPickUpClicking()) {
if (!player.canSkipTicks()) {
if (flagAndAlert() && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
} else {
invalid++;
}
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (; invalid >= 1; invalid--) {
flagAndAlert();
}
}
invalid = 0;
}
}
@@ -1,4 +1,4 @@
package ac.grim.grimac.checks.impl.badpackets;
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
@@ -9,25 +9,33 @@ import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.InteractionHand;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
@CheckData(name = "BadPacketsM", experimental = true)
public class BadPacketsM extends Check implements PacketCheck {
public BadPacketsM(final GrimPlayer player) {
@CheckData(name = "PacketOrderC")
public class PacketOrderC extends Check implements PacketCheck {
public PacketOrderC(final GrimPlayer player) {
super(player);
}
// 1.7 players do not send INTERACT_AT, so we cannot check them
private final boolean exempt = player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10);
private boolean sentInteractAt = false;
private int requiredEntity;
private InteractionHand requiredHand;
private boolean requiredSneaking;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY && !exempt) {
if (exempt) {
return;
}
final WrapperPlayClientInteractEntity wrapper = new WrapperPlayClientInteractEntity(event);
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
final WrapperPlayClientInteractEntity packet = new WrapperPlayClientInteractEntity(event);
final PacketEntity entity = player.compensatedEntities.entityMap.get(wrapper.getEntityId());
final PacketEntity entity = player.compensatedEntities.entityMap.get(packet.getEntityId());
// For armor stands, vanilla clients send:
// - when renaming the armor stand or in spectator mode: INTERACT_AT + INTERACT
@@ -35,27 +43,49 @@ public class BadPacketsM extends Check implements PacketCheck {
// Just exempt armor stands to be safe
if (entity != null && entity.getType() == EntityTypes.ARMOR_STAND) return;
switch (wrapper.getAction()) {
final boolean sneaking = packet.isSneaking().orElse(false);
switch (packet.getAction()) {
// INTERACT_AT then INTERACT
case INTERACT:
if (!sentInteractAt) {
if (flagAndAlert("Missed Interact-At") && shouldModifyPackets()) {
if (flagAndAlert("Skipped Interact-At") && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
} else if (packet.getEntityId() != requiredEntity || packet.getHand() != requiredHand || sneaking != requiredSneaking) {
String verbose = "requiredEntity=" + requiredEntity + ", entity=" + packet.getEntityId()
+ ", requiredHand=" + requiredHand + ", hand=" + packet.getHand()
+ ", requiredSneaking=" + requiredSneaking + ", sneaking=" + sneaking;
if (flagAndAlert(verbose) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
sentInteractAt = false;
break;
case INTERACT_AT:
if (sentInteractAt) {
if (flagAndAlert("Missed Interact") && shouldModifyPackets()) {
if (flagAndAlert("Skipped Interact") && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
}
requiredHand = packet.getHand();
requiredEntity = packet.getEntityId();
requiredSneaking = sneaking;
sentInteractAt = true;
break;
}
}
if (WrapperPlayClientPlayerFlying.isFlying(event.getPacketType())) {
if (sentInteractAt) {
sentInteractAt = false;
flagAndAlert("Skipped Interact (Tick)");
}
}
}
}
@@ -0,0 +1,13 @@
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PacketCheck;
import ac.grim.grimac.player.GrimPlayer;
@CheckData(name = "PacketOrderD")
public class PacketOrderD extends Check implements PacketCheck {
public PacketOrderD(GrimPlayer player) {
super(player);
}
}
@@ -0,0 +1,76 @@
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import java.util.ArrayDeque;
@CheckData(name = "PacketOrderE", experimental = true)
public class PacketOrderE extends Check implements PostPredictionCheck {
public PacketOrderE(final GrimPlayer player) {
super(player);
}
private final ArrayDeque<String> flags = new ArrayDeque<>();
private boolean setback;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_CHANGE) {
if (player.packetOrderProcessor.isAttacking()
|| player.packetOrderProcessor.isRightClicking()
|| player.packetOrderProcessor.isOpeningInventory()
|| player.packetOrderProcessor.isReleasing()
|| player.packetOrderProcessor.isSneaking()
|| player.packetOrderProcessor.isSprinting()
|| player.packetOrderProcessor.isLeavingBed()
|| player.packetOrderProcessor.isStartingToGlide()
|| player.packetOrderProcessor.isJumpingWithMount()
) {
String verbose = "attacking=" + player.packetOrderProcessor.isAttacking()
+ ", rightClicking=" + player.packetOrderProcessor.isRightClicking()
+ ", openingInventory=" + player.packetOrderProcessor.isOpeningInventory()
+ ", releasing=" + player.packetOrderProcessor.isReleasing()
+ ", sneaking=" + player.packetOrderProcessor.isSneaking()
+ ", sprinting=" + player.packetOrderProcessor.isSprinting()
+ ", bed=" + player.packetOrderProcessor.isLeavingBed()
+ ", sprinting=" + player.packetOrderProcessor.isSprinting()
+ ", gliding=" + player.packetOrderProcessor.isStartingToGlide()
+ ", mountJumping=" + player.packetOrderProcessor.isJumpingWithMount();
if (player.canSkipTicks() && flags.add(verbose) || flagAndAlert(verbose)) {
if (player.packetOrderProcessor.isUsing()) {
setback = true;
}
}
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) {
if (setback) {
setback = false;
setbackIfAboveSetbackVL();
}
return;
}
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
if (flagAndAlert(verbose) && setback) {
setback = false;
setbackIfAboveSetbackVL();
}
}
}
setback = false;
flags.clear();
}
}
@@ -0,0 +1,69 @@
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClientStatus;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import java.util.ArrayDeque;
@CheckData(name = "PacketOrderF", experimental = true)
public class PacketOrderF extends Check implements PostPredictionCheck {
public PacketOrderF(GrimPlayer player) {
super(player);
}
private final ArrayDeque<String> flags = new ArrayDeque<>();
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY
|| event.getPacketType() == PacketType.Play.Client.PLAYER_BLOCK_PLACEMENT
|| event.getPacketType() == PacketType.Play.Client.USE_ITEM
|| event.getPacketType() == PacketType.Play.Client.PICK_ITEM
|| event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING
|| (event.getPacketType() == PacketType.Play.Client.CLIENT_STATUS
&& new WrapperPlayClientClientStatus(event).getAction() == WrapperPlayClientClientStatus.Action.OPEN_INVENTORY_ACHIEVEMENT)
) if (player.packetOrderProcessor.isSprinting() || player.packetOrderProcessor.isSneaking()) {
String verbose = "action=" + (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY ? "interact"
: event.getPacketType() == PacketType.Play.Client.PLAYER_BLOCK_PLACEMENT ? "place"
: event.getPacketType() == PacketType.Play.Client.USE_ITEM ? "use"
: event.getPacketType() == PacketType.Play.Client.PICK_ITEM ? "pick"
: event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING ? "dig"
: "openInventory")
+ ", sprinting=" + player.packetOrderProcessor.isSprinting()
+ ", sneaking=" + player.packetOrderProcessor.isSneaking();
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
if (event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING
&& new WrapperPlayClientPlayerDigging(event).getAction() == DiggingAction.RELEASE_USE_ITEM
) return; // don't cause a noslow
event.setCancelled(true);
player.onPacketCancel();
}
} else {
flags.add(verbose);
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
flagAndAlert(verbose);
}
}
flags.clear();
}
}
@@ -0,0 +1,74 @@
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.DiggingAction;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClientStatus;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import java.util.ArrayDeque;
@CheckData(name = "PacketOrderG", experimental = true)
public class PacketOrderG extends Check implements PostPredictionCheck {
public PacketOrderG(GrimPlayer player) {
super(player);
}
private final ArrayDeque<String> flags = new ArrayDeque<>();
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING || (event.getPacketType() == PacketType.Play.Client.CLIENT_STATUS
&& new WrapperPlayClientClientStatus(event).getAction() == WrapperPlayClientClientStatus.Action.OPEN_INVENTORY_ACHIEVEMENT)) {
DiggingAction action = null;
if (event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING) {
action = new WrapperPlayClientPlayerDigging(event).getAction();
if (action == DiggingAction.RELEASE_USE_ITEM
|| action == DiggingAction.START_DIGGING
|| action == DiggingAction.CANCELLED_DIGGING
|| action == DiggingAction.FINISHED_DIGGING
) return;
}
if (player.packetOrderProcessor.isAttacking()
|| player.packetOrderProcessor.isReleasing()
|| player.packetOrderProcessor.isRightClicking()
|| player.packetOrderProcessor.isPicking()
|| player.packetOrderProcessor.isDigging()
) {
String verbose = "action=" + (action == null ? "openInventory" : action == DiggingAction.SWAP_ITEM_WITH_OFFHAND ? "swap" : "drop")
+ ", attacking=" + player.packetOrderProcessor.isAttacking()
+ ", releasing=" + player.packetOrderProcessor.isReleasing()
+ ", rightClicking=" + player.packetOrderProcessor.isRightClicking()
+ ", picking=" + player.packetOrderProcessor.isPicking()
+ ", digging=" + player.packetOrderProcessor.isDigging();
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
} else {
flags.add(verbose);
}
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
flagAndAlert(verbose);
}
}
flags.clear();
}
}
@@ -0,0 +1,62 @@
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction;
@CheckData(name = "PacketOrderH", experimental = true)
public class PacketOrderH extends Check implements PostPredictionCheck {
public PacketOrderH(final GrimPlayer player) {
super(player);
}
private int invalid;
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION) {
switch (new WrapperPlayClientEntityAction(event).getAction()) {
case START_SPRINTING:
case STOP_SPRINTING:
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_21_2) && player.packetOrderProcessor.isSneaking()) {
if (!player.canSkipTicks()) {
flagAndAlert();
} else {
invalid++;
}
}
break;
case START_SNEAKING:
case STOP_SNEAKING:
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_21_2) && player.packetOrderProcessor.isSprinting()) {
if (!player.canSkipTicks()) {
flagAndAlert();
} else {
invalid++;
}
}
break;
}
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) return;
if (player.isTickingReliablyFor(3)) {
for (; invalid >= 1; invalid--) {
flagAndAlert();
}
}
invalid = 0;
}
}
@@ -0,0 +1,142 @@
package ac.grim.grimac.checks.impl.packetorder;
import ac.grim.grimac.api.config.ConfigManager;
import ac.grim.grimac.checks.Check;
import ac.grim.grimac.checks.CheckData;
import ac.grim.grimac.checks.type.PostPredictionCheck;
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.update.PredictionComplete;
import ac.grim.grimac.utils.nmsutil.BlockBreakSpeed;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerDigging;
import java.util.ArrayDeque;
@CheckData(name = "PacketOrderI", experimental = true)
public class PacketOrderI extends Check implements PostPredictionCheck {
public PacketOrderI(final GrimPlayer player) {
super(player);
}
private boolean exemptPlacingWhileDigging;
private boolean setback;
private boolean digging; // for placing
private final ArrayDeque<String> flags = new ArrayDeque<>();
@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
if (new WrapperPlayClientInteractEntity(event).getAction() == WrapperPlayClientInteractEntity.InteractAction.ATTACK) {
if (player.packetOrderProcessor.isRightClicking() || player.packetOrderProcessor.isPicking() || player.packetOrderProcessor.isReleasing() || player.packetOrderProcessor.isDigging()) {
String verbose = "type=attack, rightClicking=" + player.packetOrderProcessor.isRightClicking()
+ ", picking=" + player.packetOrderProcessor.isPicking()
+ ", releasing=" + player.packetOrderProcessor.isReleasing()
+ ", digging=" + player.packetOrderProcessor.isDigging();
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
} else {
flags.add(verbose);
}
}
} else if (player.packetOrderProcessor.isReleasing() || player.packetOrderProcessor.isDigging()) {
String verbose = "type=interact, releasing=" + player.packetOrderProcessor.isReleasing() + ", digging=" + player.packetOrderProcessor.isDigging();
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
} else {
flags.add(verbose);
}
}
}
if (event.getPacketType() == PacketType.Play.Client.PLAYER_BLOCK_PLACEMENT || event.getPacketType() == PacketType.Play.Client.USE_ITEM) {
if (player.packetOrderProcessor.isReleasing() || digging) {
String verbose = "type=place/use, releasing=" + player.packetOrderProcessor.isReleasing() + ", digging=" + digging;
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose) && shouldModifyPackets()) {
event.setCancelled(true);
player.onPacketCancel();
}
} else {
flags.add(verbose);
}
}
}
if (event.getPacketType() == PacketType.Play.Client.PLAYER_DIGGING) {
WrapperPlayClientPlayerDigging packet = new WrapperPlayClientPlayerDigging(event);
switch (packet.getAction()) {
case RELEASE_USE_ITEM:
if (player.packetOrderProcessor.isAttacking() || player.packetOrderProcessor.isRightClicking() || player.packetOrderProcessor.isPicking() || player.packetOrderProcessor.isDigging()) {
String verbose = "type=release, attacking=" + player.packetOrderProcessor.isAttacking()
+ ", rightClicking=" + player.packetOrderProcessor.isRightClicking()
+ ", picking=" + player.packetOrderProcessor.isPicking()
+ ", digging=" + player.packetOrderProcessor.isDigging();
if (!player.canSkipTicks()) {
if (flagAndAlert(verbose)) {
setback = true;
}
} else {
flags.add(verbose);
setback = true;
}
}
break;
case START_DIGGING:
double damage = BlockBreakSpeed.getBlockDamage(player, packet.getBlockPosition());
if (damage >= 1 || damage <= 0 && player.gamemode == GameMode.CREATIVE) {
return;
}
case CANCELLED_DIGGING:
case FINISHED_DIGGING:
if (exemptPlacingWhileDigging || player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10)) {
return;
}
digging = true;
}
}
if (isTickPacket(event.getPacketType())) {
digging = false;
}
}
@Override
public void onPredictionComplete(PredictionComplete predictionComplete) {
if (!player.canSkipTicks()) {
if (setback) {
setbackIfAboveSetbackVL();
setback = false;
}
return;
}
if (player.isTickingReliablyFor(3)) {
for (String verbose : flags) {
if (flagAndAlert(verbose) && setback) {
setbackIfAboveSetbackVL();
setback = false;
}
}
}
flags.clear();
setback = false;
}
@Override
public void onReload(ConfigManager config) {
exemptPlacingWhileDigging = config.getBooleanElse(getConfigName() + ".exempt-placing-while-digging", false);
}
}
Loaded 100 of 363 files, more files were not shown because too many files have changed in this diff. Show more