├── .deepsource.toml ├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── bypass.yml │ ├── config.yml │ ├── crash-or-error.yml │ ├── false-positive.yml │ ├── feature.yml │ ├── other-issues.yml │ └── simulation-false-positive.yml └── workflows │ ├── codeql-analysis.yml │ └── gradle-publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── SECURITY.md ├── build.gradle.kts ├── buildSrc ├── build.gradle.kts ├── settings.gradle.kts └── src │ └── main │ └── kotlin │ ├── grim.base-conventions.gradle.kts │ ├── grim.jij-conventions.gradle.kts │ ├── grim.shadow-conventions.gradle.kts │ └── versioning │ ├── BuildConfig.kt │ └── VersionUtil.kt ├── bukkit ├── build.gradle.kts └── src │ └── main │ └── java │ └── ac │ └── grim │ └── grimac │ └── platform │ └── bukkit │ ├── BukkitPlatformPlugin.java │ ├── BukkitPlatformServer.java │ ├── GrimACBukkitLoaderPlugin.java │ ├── command │ ├── BukkitPlayerSelectorAdapter.java │ └── BukkitPlayerSelectorParser.java │ ├── entity │ └── BukkitGrimEntity.java │ ├── events │ └── PistonEvent.java │ ├── initables │ ├── BukkitBStats.java │ ├── BukkitEventManager.java │ └── BukkitTickEndEvent.java │ ├── manager │ ├── BukkitItemResetHandler.java │ ├── BukkitMessagePlaceHolderManager.java │ ├── BukkitParserDescriptorFactory.java │ ├── BukkitPermissionRegistrationManager.java │ └── BukkitPlatformPluginManager.java │ ├── player │ ├── BukkitOfflinePlatformPlayer.java │ ├── BukkitPlatformInventory.java │ ├── BukkitPlatformPlayer.java │ └── BukkitPlatformPlayerFactory.java │ ├── scheduler │ ├── bukkit │ │ ├── BukkitAsyncScheduler.java │ │ ├── BukkitEntityScheduler.java │ │ ├── BukkitGlobalRegionScheduler.java │ │ ├── BukkitPlatformScheduler.java │ │ ├── BukkitRegionScheduler.java │ │ └── BukkitTaskHandle.java │ └── folia │ │ ├── FoliaAsyncScheduler.java │ │ ├── FoliaEntityScheduler.java │ │ ├── FoliaGlobalRegionScheduler.java │ │ ├── FoliaPlatformScheduler.java │ │ ├── FoliaRegionScheduler.java │ │ └── FoliaTaskHandle.java │ ├── sender │ └── BukkitSenderFactory.java │ ├── utils │ ├── anticheat │ │ └── MultiLibUtil.java │ ├── convert │ │ └── BukkitConversionUtils.java │ ├── placeholder │ │ └── PlaceholderAPIExpansion.java │ └── reflection │ │ └── PaperUtils.java │ └── world │ ├── BukkitPlatformChunk.java │ └── BukkitPlatformWorld.java ├── common ├── build.gradle.kts └── src │ └── main │ ├── java │ └── ac │ │ └── grim │ │ └── grimac │ │ ├── GrimAPI.java │ │ ├── GrimExternalAPI.java │ │ ├── checks │ │ ├── Check.java │ │ ├── CheckData.java │ │ ├── GrimProcessor.java │ │ ├── debug │ │ │ ├── AbstractDebugHandler.java │ │ │ └── HitboxDebugHandler.java │ │ ├── impl │ │ │ ├── aim │ │ │ │ ├── AimDuplicateLook.java │ │ │ │ ├── AimModulo360.java │ │ │ │ └── processor │ │ │ │ │ └── AimProcessor.java │ │ │ ├── badpackets │ │ │ │ ├── BadPacketsA.java │ │ │ │ ├── BadPacketsB.java │ │ │ │ ├── BadPacketsC.java │ │ │ │ ├── BadPacketsD.java │ │ │ │ ├── BadPacketsE.java │ │ │ │ ├── BadPacketsF.java │ │ │ │ ├── BadPacketsG.java │ │ │ │ ├── BadPacketsH.java │ │ │ │ ├── BadPacketsI.java │ │ │ │ ├── BadPacketsJ.java │ │ │ │ ├── BadPacketsK.java │ │ │ │ ├── BadPacketsL.java │ │ │ │ ├── BadPacketsM.java │ │ │ │ ├── BadPacketsN.java │ │ │ │ ├── BadPacketsO.java │ │ │ │ ├── BadPacketsP.java │ │ │ │ ├── BadPacketsQ.java │ │ │ │ ├── BadPacketsR.java │ │ │ │ ├── BadPacketsS.java │ │ │ │ ├── BadPacketsT.java │ │ │ │ ├── BadPacketsU.java │ │ │ │ ├── BadPacketsV.java │ │ │ │ ├── BadPacketsW.java │ │ │ │ ├── BadPacketsX.java │ │ │ │ └── BadPacketsY.java │ │ │ ├── baritone │ │ │ │ └── Baritone.java │ │ │ ├── breaking │ │ │ │ ├── AirLiquidBreak.java │ │ │ │ ├── FarBreak.java │ │ │ │ ├── FastBreak.java │ │ │ │ ├── InvalidBreak.java │ │ │ │ ├── MultiBreak.java │ │ │ │ ├── NoSwingBreak.java │ │ │ │ ├── PositionBreakA.java │ │ │ │ ├── PositionBreakB.java │ │ │ │ ├── RotationBreak.java │ │ │ │ └── WrongBreak.java │ │ │ ├── combat │ │ │ │ ├── EntityPierce.java │ │ │ │ ├── Hitboxes.java │ │ │ │ ├── MultiInteractA.java │ │ │ │ ├── MultiInteractB.java │ │ │ │ ├── Reach.java │ │ │ │ └── WallHit.java │ │ │ ├── crash │ │ │ │ ├── CrashA.java │ │ │ │ ├── CrashB.java │ │ │ │ ├── CrashC.java │ │ │ │ ├── CrashD.java │ │ │ │ ├── CrashE.java │ │ │ │ ├── CrashF.java │ │ │ │ ├── CrashG.java │ │ │ │ ├── CrashH.java │ │ │ │ └── CrashI.java │ │ │ ├── elytra │ │ │ │ ├── ElytraA.java │ │ │ │ ├── ElytraB.java │ │ │ │ ├── ElytraC.java │ │ │ │ ├── ElytraD.java │ │ │ │ ├── ElytraE.java │ │ │ │ ├── ElytraF.java │ │ │ │ ├── ElytraG.java │ │ │ │ ├── ElytraH.java │ │ │ │ └── ElytraI.java │ │ │ ├── exploit │ │ │ │ ├── ExploitA.java │ │ │ │ ├── ExploitB.java │ │ │ │ └── ExploitC.java │ │ │ ├── flight │ │ │ │ └── FlightA.java │ │ │ ├── groundspoof │ │ │ │ └── NoFall.java │ │ │ ├── inventory │ │ │ │ ├── InventoryA.java │ │ │ │ ├── InventoryB.java │ │ │ │ ├── InventoryC.java │ │ │ │ ├── InventoryD.java │ │ │ │ ├── InventoryE.java │ │ │ │ ├── InventoryF.java │ │ │ │ └── InventoryG.java │ │ │ ├── misc │ │ │ │ ├── ClientBrand.java │ │ │ │ ├── GhostBlockMitigation.java │ │ │ │ ├── Post.java │ │ │ │ └── TransactionOrder.java │ │ │ ├── movement │ │ │ │ ├── NoSlow.java │ │ │ │ ├── PredictionRunner.java │ │ │ │ ├── SetbackBlocker.java │ │ │ │ └── VehiclePredictionRunner.java │ │ │ ├── multiactions │ │ │ │ ├── MultiActionsA.java │ │ │ │ ├── MultiActionsB.java │ │ │ │ ├── MultiActionsC.java │ │ │ │ ├── MultiActionsD.java │ │ │ │ ├── MultiActionsE.java │ │ │ │ ├── MultiActionsF.java │ │ │ │ └── MultiActionsG.java │ │ │ ├── packetorder │ │ │ │ ├── PacketOrderA.java │ │ │ │ ├── PacketOrderB.java │ │ │ │ ├── PacketOrderC.java │ │ │ │ ├── PacketOrderD.java │ │ │ │ ├── PacketOrderE.java │ │ │ │ ├── PacketOrderF.java │ │ │ │ ├── PacketOrderG.java │ │ │ │ ├── PacketOrderH.java │ │ │ │ ├── PacketOrderI.java │ │ │ │ ├── PacketOrderJ.java │ │ │ │ ├── PacketOrderK.java │ │ │ │ ├── PacketOrderL.java │ │ │ │ ├── PacketOrderM.java │ │ │ │ ├── PacketOrderN.java │ │ │ │ └── PacketOrderProcessor.java │ │ │ ├── prediction │ │ │ │ ├── DebugHandler.java │ │ │ │ ├── GroundSpoof.java │ │ │ │ ├── OffsetHandler.java │ │ │ │ └── Phase.java │ │ │ ├── scaffolding │ │ │ │ ├── AirLiquidPlace.java │ │ │ │ ├── DuplicateRotPlace.java │ │ │ │ ├── FabricatedPlace.java │ │ │ │ ├── FarPlace.java │ │ │ │ ├── InvalidPlaceA.java │ │ │ │ ├── InvalidPlaceB.java │ │ │ │ ├── MultiPlace.java │ │ │ │ ├── PositionPlace.java │ │ │ │ └── RotationPlace.java │ │ │ ├── sprint │ │ │ │ ├── SprintA.java │ │ │ │ ├── SprintB.java │ │ │ │ ├── SprintC.java │ │ │ │ ├── SprintD.java │ │ │ │ ├── SprintE.java │ │ │ │ └── SprintF.java │ │ │ ├── timer │ │ │ │ ├── NegativeTimer.java │ │ │ │ ├── TickTimer.java │ │ │ │ ├── Timer.java │ │ │ │ ├── TimerLimit.java │ │ │ │ └── VehicleTimer.java │ │ │ ├── vehicle │ │ │ │ ├── VehicleA.java │ │ │ │ ├── VehicleB.java │ │ │ │ ├── VehicleC.java │ │ │ │ └── VehicleD.java │ │ │ └── velocity │ │ │ │ ├── ExplosionHandler.java │ │ │ │ └── KnockbackHandler.java │ │ └── type │ │ │ ├── BlockBreakCheck.java │ │ │ ├── BlockPlaceCheck.java │ │ │ ├── InventoryCheck.java │ │ │ ├── PacketCheck.java │ │ │ ├── PositionCheck.java │ │ │ ├── PostPredictionCheck.java │ │ │ ├── RotationCheck.java │ │ │ └── VehicleCheck.java │ │ ├── command │ │ ├── BuildableCommand.java │ │ ├── SenderRequirement.java │ │ ├── commands │ │ │ ├── GrimAlerts.java │ │ │ ├── GrimBrands.java │ │ │ ├── GrimDebug.java │ │ │ ├── GrimDump.java │ │ │ ├── GrimHelp.java │ │ │ ├── GrimHistory.java │ │ │ ├── GrimLog.java │ │ │ ├── GrimPerf.java │ │ │ ├── GrimProfile.java │ │ │ ├── GrimReload.java │ │ │ ├── GrimSendAlert.java │ │ │ ├── GrimSpectate.java │ │ │ ├── GrimStopSpectating.java │ │ │ ├── GrimVerbose.java │ │ │ └── GrimVersion.java │ │ ├── handler │ │ │ └── GrimCommandFailureHandler.java │ │ └── requirements │ │ │ └── PlayerSenderRequirement.java │ │ ├── events │ │ └── packets │ │ │ ├── CheckManagerListener.java │ │ │ ├── PacketBlockAction.java │ │ │ ├── PacketChangeGameState.java │ │ │ ├── PacketEntityAction.java │ │ │ ├── PacketEntityReplication.java │ │ │ ├── PacketHidePlayerInfo.java │ │ │ ├── PacketPingListener.java │ │ │ ├── PacketPlayerAbilities.java │ │ │ ├── PacketPlayerAttack.java │ │ │ ├── PacketPlayerCooldown.java │ │ │ ├── PacketPlayerDigging.java │ │ │ ├── PacketPlayerJoinQuit.java │ │ │ ├── PacketPlayerRespawn.java │ │ │ ├── PacketPlayerSteer.java │ │ │ ├── PacketPlayerWindow.java │ │ │ ├── PacketSelfMetadataListener.java │ │ │ ├── PacketServerTags.java │ │ │ ├── PacketServerTeleport.java │ │ │ ├── PacketWorldBorder.java │ │ │ ├── ProxyAlertMessenger.java │ │ │ └── worldreader │ │ │ ├── BasePacketWorldReader.java │ │ │ ├── PacketWorldReaderEight.java │ │ │ ├── PacketWorldReaderEighteen.java │ │ │ └── multiblockchange │ │ │ ├── LegacyMultiBlockChangeHandler.java │ │ │ ├── V1160MultiBlockChangeBitRepackHandler.java │ │ │ └── VersionedMultiBlockChangeHandler.java │ │ ├── manager │ │ ├── ActionManager.java │ │ ├── AlertManagerImpl.java │ │ ├── CheckManager.java │ │ ├── DiscordManager.java │ │ ├── InitManager.java │ │ ├── LastInstanceManager.java │ │ ├── PunishmentManager.java │ │ ├── SetbackTeleportUtil.java │ │ ├── SpectateManager.java │ │ ├── TickManager.java │ │ ├── config │ │ │ ├── BaseConfigManager.java │ │ │ └── ConfigManagerFileImpl.java │ │ ├── init │ │ │ ├── Initable.java │ │ │ ├── ReloadableInitable.java │ │ │ ├── load │ │ │ │ ├── LoadableInitable.java │ │ │ │ └── PacketEventsInit.java │ │ │ ├── start │ │ │ │ ├── AbstractTickEndEvent.java │ │ │ │ ├── CommandRegister.java │ │ │ │ ├── ExemptOnlinePlayersOnReload.java │ │ │ │ ├── JavaVersion.java │ │ │ │ ├── PacketLimiter.java │ │ │ │ ├── PacketManager.java │ │ │ │ ├── StartableInitable.java │ │ │ │ ├── SuperDebug.java │ │ │ │ ├── TAB.java │ │ │ │ ├── TickRunner.java │ │ │ │ ├── ViaBackwardsManager.java │ │ │ │ └── ViaVersion.java │ │ │ └── stop │ │ │ │ ├── StoppableInitable.java │ │ │ │ └── TerminatePacketEvents.java │ │ ├── player │ │ │ ├── features │ │ │ │ ├── FeatureBuilder.java │ │ │ │ ├── FeatureManagerImpl.java │ │ │ │ └── types │ │ │ │ │ ├── ExemptElytraFeature.java │ │ │ │ │ ├── ExperimentalChecksFeature.java │ │ │ │ │ └── GrimFeature.java │ │ │ └── handlers │ │ │ │ └── DefaultResyncHandler.java │ │ ├── tick │ │ │ ├── Tickable.java │ │ │ └── impl │ │ │ │ ├── ClearRecentlyUpdatedBlocks.java │ │ │ │ ├── ClientVersionSetter.java │ │ │ │ ├── ResetTick.java │ │ │ │ └── TickInventory.java │ │ └── violationdatabase │ │ │ ├── MySQLViolationDatabase.java │ │ │ ├── NoOpViolationDatabase.java │ │ │ ├── SQLiteViolationDatabase.java │ │ │ ├── Violation.java │ │ │ ├── ViolationDatabase.java │ │ │ └── ViolationDatabaseManager.java │ │ ├── platform │ │ └── api │ │ │ ├── Platform.java │ │ │ ├── PlatformLoader.java │ │ │ ├── PlatformPlugin.java │ │ │ ├── PlatformServer.java │ │ │ ├── command │ │ │ ├── AbstractPlayerSelectorParser.java │ │ │ └── PlayerSelector.java │ │ │ ├── entity │ │ │ └── GrimEntity.java │ │ │ ├── manager │ │ │ ├── ItemResetHandler.java │ │ │ ├── MessagePlaceHolderManager.java │ │ │ ├── ParserDescriptorFactory.java │ │ │ ├── PermissionRegistrationManager.java │ │ │ └── PlatformPluginManager.java │ │ │ ├── permissions │ │ │ └── PermissionDefaultValue.java │ │ │ ├── player │ │ │ ├── AbstractPlatformPlayerFactory.java │ │ │ ├── OfflinePlatformPlayer.java │ │ │ ├── PlatformInventory.java │ │ │ ├── PlatformPlayer.java │ │ │ ├── PlatformPlayerCache.java │ │ │ └── PlatformPlayerFactory.java │ │ │ ├── scheduler │ │ │ ├── AsyncScheduler.java │ │ │ ├── EntityScheduler.java │ │ │ ├── GlobalRegionScheduler.java │ │ │ ├── PlatformScheduler.java │ │ │ ├── RegionScheduler.java │ │ │ └── TaskHandle.java │ │ │ ├── sender │ │ │ ├── AbstractSender.java │ │ │ ├── Sender.java │ │ │ └── SenderFactory.java │ │ │ └── world │ │ │ ├── PlatformChunk.java │ │ │ └── PlatformWorld.java │ │ ├── player │ │ └── GrimPlayer.java │ │ ├── predictionengine │ │ ├── GhostBlockDetector.java │ │ ├── MovementCheckRunner.java │ │ ├── PlayerBaseTick.java │ │ ├── PointThreeEstimator.java │ │ ├── SneakingEstimator.java │ │ ├── UncertaintyHandler.java │ │ ├── movementtick │ │ │ ├── MovementTicker.java │ │ │ ├── MovementTickerCamel.java │ │ │ ├── MovementTickerHorse.java │ │ │ ├── MovementTickerLivingVehicle.java │ │ │ ├── MovementTickerPig.java │ │ │ ├── MovementTickerPlayer.java │ │ │ ├── MovementTickerRideable.java │ │ │ └── MovementTickerStrider.java │ │ └── predictions │ │ │ ├── PredictionEngine.java │ │ │ ├── PredictionEngineElytra.java │ │ │ ├── PredictionEngineLava.java │ │ │ ├── PredictionEngineNormal.java │ │ │ ├── PredictionEngineWater.java │ │ │ ├── PredictionEngineWaterLegacy.java │ │ │ └── rideable │ │ │ ├── BoatPredictionEngine.java │ │ │ ├── PredictionEngineRideableLava.java │ │ │ ├── PredictionEngineRideableNormal.java │ │ │ ├── PredictionEngineRideableUtils.java │ │ │ ├── PredictionEngineRideableWater.java │ │ │ └── PredictionEngineRideableWaterLegacy.java │ │ └── utils │ │ ├── Vec2.java │ │ ├── anticheat │ │ ├── LogUtil.java │ │ ├── MessageUtil.java │ │ ├── PlayerDataManager.java │ │ ├── Version.java │ │ └── update │ │ │ ├── BlockBreak.java │ │ │ ├── BlockPlace.java │ │ │ ├── PositionUpdate.java │ │ │ ├── PredictionComplete.java │ │ │ ├── RotationUpdate.java │ │ │ └── VehiclePositionUpdate.java │ │ ├── blockplace │ │ ├── BlockPlaceFactory.java │ │ ├── BlockPlaceResult.java │ │ └── ConsumesBlockPlace.java │ │ ├── blockstate │ │ └── helper │ │ │ └── BlockFaceHelper.java │ │ ├── change │ │ ├── BlockModification.java │ │ └── PlayerBlockHistory.java │ │ ├── chat │ │ └── ChatUtil.java │ │ ├── chunks │ │ └── Column.java │ │ ├── collisions │ │ ├── AxisSelect.java │ │ ├── AxisUtil.java │ │ ├── CollisionData.java │ │ ├── HitboxData.java │ │ ├── blocks │ │ │ ├── DoorHandler.java │ │ │ ├── DynamicChest.java │ │ │ ├── DynamicChorusPlant.java │ │ │ ├── DynamicStair.java │ │ │ ├── PistonBaseCollision.java │ │ │ ├── PistonHeadCollision.java │ │ │ ├── TrapDoorHandler.java │ │ │ └── connecting │ │ │ │ ├── DynamicCollisionFence.java │ │ │ │ ├── DynamicCollisionPane.java │ │ │ │ ├── DynamicCollisionWall.java │ │ │ │ ├── DynamicConnecting.java │ │ │ │ ├── DynamicHitboxFence.java │ │ │ │ ├── DynamicHitboxPane.java │ │ │ │ └── DynamicHitboxWall.java │ │ └── datatypes │ │ │ ├── BoundingBox.java │ │ │ ├── CollisionBox.java │ │ │ ├── CollisionFactory.java │ │ │ ├── ComplexCollisionBox.java │ │ │ ├── DynamicCollisionBox.java │ │ │ ├── HexCollisionBox.java │ │ │ ├── HexOffsetCollisionBox.java │ │ │ ├── HitBoxFactory.java │ │ │ ├── NoCollisionBox.java │ │ │ ├── OffsetCollisionBox.java │ │ │ └── SimpleCollisionBox.java │ │ ├── common │ │ └── ConfigReloadObserver.java │ │ ├── data │ │ ├── BlockHitData.java │ │ ├── BlockPlaceSnapshot.java │ │ ├── BlockPrediction.java │ │ ├── CooldownData.java │ │ ├── EntityHitData.java │ │ ├── HeadRotation.java │ │ ├── HitData.java │ │ ├── KnownInput.java │ │ ├── LastInstance.java │ │ ├── MainSupportingBlockData.java │ │ ├── PacketStateData.java │ │ ├── Pair.java │ │ ├── PistonTemplate.java │ │ ├── PlayerPistonData.java │ │ ├── ReachInterpolationData.java │ │ ├── RotationData.java │ │ ├── SetBackData.java │ │ ├── ShulkerData.java │ │ ├── TeleportAcceptData.java │ │ ├── TeleportData.java │ │ ├── TrackedPosition.java │ │ ├── TrackerData.java │ │ ├── VectorData.java │ │ ├── VehicleData.java │ │ ├── VelocityData.java │ │ ├── attribute │ │ │ └── ValuedAttribute.java │ │ ├── packetentity │ │ │ ├── PacketEntity.java │ │ │ ├── PacketEntityArmorStand.java │ │ │ ├── PacketEntityCamel.java │ │ │ ├── PacketEntityGuardian.java │ │ │ ├── PacketEntityHook.java │ │ │ ├── PacketEntityHorse.java │ │ │ ├── PacketEntityPainting.java │ │ │ ├── PacketEntityRideable.java │ │ │ ├── PacketEntitySelf.java │ │ │ ├── PacketEntityShulker.java │ │ │ ├── PacketEntitySizeable.java │ │ │ ├── PacketEntityStrider.java │ │ │ ├── PacketEntityTrackXRot.java │ │ │ ├── PacketEntityUnHittable.java │ │ │ ├── TypedPacketEntity.java │ │ │ └── dragon │ │ │ │ ├── DragonPart.java │ │ │ │ ├── PacketEntityEnderDragon.java │ │ │ │ └── PacketEntityEnderDragonPart.java │ │ └── tags │ │ │ ├── SyncedTag.java │ │ │ └── SyncedTags.java │ │ ├── enums │ │ ├── BoatEntityStatus.java │ │ ├── FluidTag.java │ │ └── Pose.java │ │ ├── inventory │ │ ├── BrewingHelper.java │ │ ├── ClickAction.java │ │ ├── EnchantmentHelper.java │ │ ├── EquipmentType.java │ │ ├── Inventory.java │ │ ├── InventoryDesyncStatus.java │ │ ├── InventoryStorage.java │ │ ├── NBTHelper.java │ │ ├── inventory │ │ │ ├── AbstractContainerMenu.java │ │ │ ├── BasicInventoryMenu.java │ │ │ ├── DispenserMenu.java │ │ │ ├── HopperMenu.java │ │ │ ├── MenuType.java │ │ │ └── NotImplementedMenu.java │ │ └── slot │ │ │ ├── EquipmentSlot.java │ │ │ ├── ResultSlot.java │ │ │ └── Slot.java │ │ ├── latency │ │ ├── CompensatedCooldown.java │ │ ├── CompensatedEntities.java │ │ ├── CompensatedFireworks.java │ │ ├── CompensatedInventory.java │ │ ├── CompensatedWorld.java │ │ ├── ILatencyUtils.java │ │ └── LatencyUtils.java │ │ ├── lazy │ │ └── LazyHolder.java │ │ ├── lists │ │ ├── CorrectingPlayerInventoryStorage.java │ │ ├── EvictingQueue.java │ │ ├── HookedListWrapper.java │ │ ├── ListWrapper.java │ │ └── RunningMode.java │ │ ├── math │ │ ├── GrimMath.java │ │ ├── LegacyFastMath.java │ │ ├── Location.java │ │ ├── OptifineFastMath.java │ │ ├── TrigHandler.java │ │ ├── VanillaMath.java │ │ ├── Vector3dm.java │ │ └── VectorUtils.java │ │ ├── nmsutil │ │ ├── BlockBreakSpeed.java │ │ ├── BlockProperties.java │ │ ├── BoundingBoxSize.java │ │ ├── CheckIfChunksLoaded.java │ │ ├── Collisions.java │ │ ├── Dripstone.java │ │ ├── FluidFallingAdjustedMovement.java │ │ ├── FluidTypeFlowing.java │ │ ├── GetBoundingBox.java │ │ ├── JumpPower.java │ │ ├── MainSupportingBlockPosFinder.java │ │ ├── Materials.java │ │ ├── Ray.java │ │ ├── ReachUtils.java │ │ ├── Riptide.java │ │ ├── WatchableIndexUtil.java │ │ └── WorldRayTrace.java │ │ ├── reflection │ │ ├── FloodgateUtil.java │ │ ├── GeyserUtil.java │ │ ├── ReflectionUtils.java │ │ └── ViaVersionUtil.java │ │ ├── team │ │ ├── EntityPredicates.java │ │ ├── EntityTeam.java │ │ └── TeamHandler.java │ │ └── webhook │ │ ├── Embed.java │ │ ├── EmbedAuthor.java │ │ ├── EmbedField.java │ │ ├── EmbedFooter.java │ │ ├── JsonSerializable.java │ │ └── WebhookMessage.java │ └── resources │ ├── config │ ├── de.yml │ ├── en.yml │ ├── es.yml │ ├── fr.yml │ ├── it.yml │ ├── ja.yml │ ├── nl.yml │ ├── pt.yml │ ├── ru.yml │ ├── tr.yml │ └── zh.yml │ ├── discord │ ├── de.yml │ ├── en.yml │ ├── es.yml │ ├── fr.yml │ ├── it.yml │ ├── ja.yml │ ├── nl.yml │ ├── pt.yml │ ├── ru.yml │ ├── tr.yml │ └── zh.yml │ ├── messages │ ├── de.yml │ ├── en.yml │ ├── es.yml │ ├── fr.yml │ ├── it.yml │ ├── ja.yml │ ├── nl.yml │ ├── pt.yml │ ├── ru.yml │ ├── tr.yml │ └── zh.yml │ └── punishments │ ├── de.yml │ ├── en.yml │ ├── es.yml │ ├── fr.yml │ ├── it.yml │ ├── ja.yml │ ├── nl.yml │ ├── pt.yml │ ├── ru.yml │ ├── tr.yml │ └── zh.yml ├── fabric ├── build.gradle.kts ├── gradle.properties ├── mc1161 │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── java │ │ └── ac │ │ │ └── grim │ │ │ └── grimac │ │ │ └── platform │ │ │ └── fabric │ │ │ └── mc1161 │ │ │ ├── Fabric1140PlatformServer.java │ │ │ ├── GrimACFabric1161LoaderPlugin.java │ │ │ ├── command │ │ │ └── Fabric1161PlayerSelectorAdapter.java │ │ │ ├── entity │ │ │ └── Fabric1161GrimEntity.java │ │ │ ├── player │ │ │ ├── Fabric1161PlatformInventory.java │ │ │ └── Fabric1161PlatformPlayer.java │ │ │ └── util │ │ │ └── convert │ │ │ ├── Fabric1140ConversionUtil.java │ │ │ └── Fabric1161MessageUtil.java │ │ └── resources │ │ ├── fabric.mod.json │ │ └── grimac.accesswidener ├── mc1171 │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── java │ │ └── ac │ │ │ └── grim │ │ │ └── grimac │ │ │ └── platform │ │ │ └── fabric │ │ │ └── mc1171 │ │ │ ├── Fabric1171PlatformServer.java │ │ │ ├── GrimACFabric1170LoaderPlugin.java │ │ │ ├── entity │ │ │ └── Fabric1170GrimEntity.java │ │ │ └── player │ │ │ └── Fabric1170PlatformPlayer.java │ │ └── resources │ │ ├── fabric.mod.json │ │ └── grimac.accesswidener ├── mc1194 │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── java │ │ └── ac │ │ │ └── grim │ │ │ └── grimac │ │ │ └── platform │ │ │ └── fabric │ │ │ └── mc1194 │ │ │ ├── Fabric1190PlatformServer.java │ │ │ ├── GrimACFabric1190LoaderPlugin.java │ │ │ ├── convert │ │ │ └── Fabric1190MessageUtil.java │ │ │ ├── entity │ │ │ └── Fabric1194GrimEntity.java │ │ │ └── player │ │ │ └── Fabric1193PlatformInventory.java │ │ └── resources │ │ ├── fabric.mod.json │ │ └── grimac.accesswidener ├── mc1205 │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── java │ │ └── ac │ │ │ └── grim │ │ │ └── grimac │ │ │ └── platform │ │ │ └── fabric │ │ │ └── mc1205 │ │ │ ├── Fabric1203PlatformServer.java │ │ │ ├── GrimACFabric1200LoaderPlugin.java │ │ │ ├── convert │ │ │ ├── Fabric1200MessageUtil.java │ │ │ └── Fabric1205ConversionUtil.java │ │ │ └── player │ │ │ └── Fabric1202PlatformPlayer.java │ │ └── resources │ │ ├── fabric.mod.json │ │ └── grimac.accesswidener ├── mc1215 │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── java │ │ └── ac │ │ │ └── grim │ │ │ └── grimac │ │ │ └── platform │ │ │ └── fabric │ │ │ └── mc1214 │ │ │ ├── GrimACFabric1212LoaderPlugin.java │ │ │ ├── command │ │ │ └── Fabric1212PlayerSelectorAdapter.java │ │ │ └── player │ │ │ ├── Fabric1212PlatformPlayer.java │ │ │ └── Fabric1215PlatformInventory.java │ │ └── resources │ │ ├── fabric.mod.json │ │ └── grimac.accesswidener └── src │ └── main │ ├── java │ └── ac │ │ └── grim │ │ └── grimac │ │ └── platform │ │ └── fabric │ │ ├── AbstractFabricPlatformServer.java │ │ ├── FabricPlatformPlugin.java │ │ ├── GrimACFabricEntryPoint.java │ │ ├── GrimACFabricLoaderPlugin.java │ │ ├── command │ │ └── FabricPlayerSelectorParser.java │ │ ├── entity │ │ └── AbstractFabricGrimEntity.java │ │ ├── initables │ │ ├── FabricBStats.java │ │ └── FabricTickEndEvent.java │ │ ├── manager │ │ ├── FabricItemResetHandler.java │ │ ├── FabricMessagePlaceHolderManager.java │ │ ├── FabricParserDescriptorFactory.java │ │ ├── FabricPermissionRegistrationManager.java │ │ └── FabricPlatformPluginManager.java │ │ ├── mixins │ │ └── ServerPlayerEntityMixin.java │ │ ├── player │ │ ├── AbstractFabricPlatformInventory.java │ │ ├── AbstractFabricPlatformPlayer.java │ │ ├── FabricOfflinePlatformPlayer.java │ │ └── FabricPlatformPlayerFactory.java │ │ ├── scheduler │ │ ├── FabricAsyncScheduler.java │ │ ├── FabricEntityScheduler.java │ │ ├── FabricGlobalRegionScheduler.java │ │ ├── FabricPlatformScheduler.java │ │ ├── FabricRegionScheduler.java │ │ └── FabricTaskHandle.java │ │ ├── sender │ │ └── FabricSenderFactory.java │ │ ├── utils │ │ ├── convert │ │ │ ├── FabricConversionUtil.java │ │ │ └── IFabricConversionUtil.java │ │ ├── message │ │ │ ├── IFabricMessageUtil.java │ │ │ ├── JULoggerFactory.java │ │ │ ├── Log4jBackedJULogger.java │ │ │ └── Slf4jBackedJULogger.java │ │ ├── metrics │ │ │ ├── BStatsConfig.java │ │ │ ├── CustomChart.java │ │ │ ├── JsonObjectBuilder.java │ │ │ ├── Metrics.java │ │ │ ├── MetricsBase.java │ │ │ └── MetricsFabric.java │ │ └── thread │ │ │ └── FabricFutureUtil.java │ │ └── world │ │ ├── FabricPlatformChunk.java │ │ └── FabricPlatformWorld.java │ └── resources │ ├── fabric.mod.json │ ├── grimac.accesswidener │ └── grimac.mixins.json ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs.versions.toml ├── settings.gradle.kts └── testlibs.versions.toml /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "java" 5 | enabled = true 6 | 7 | [analyzers.meta] 8 | runtime_version = "17" 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_size = 4 6 | indent_style = space 7 | insert_final_newline = true 8 | max_line_length = 100 9 | tab_width = 4 10 | 11 | # intellij specific configuration 12 | ij_continuation_indent_size = 8 13 | ij_formatter_off_tag = @formatter:off 14 | ij_formatter_on_tag = @formatter:on 15 | ij_formatter_tags_enabled = false 16 | ij_smart_tabs = false 17 | ij_wrap_on_typing = false 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bypass.yml: -------------------------------------------------------------------------------- 1 | name: Bypass 2 | description: Report a bypass here 3 | labels: ["bypass"] 4 | body: 5 | - type: textarea 6 | attributes: 7 | label: Describe the bypass and how to replicate it 8 | description: Provide a video, or detailed instructions to help replicate it. 9 | placeholder: | 10 | Step 1. Do this 11 | Step 2. Then do this 12 | Step 3. etc... 13 | validations: 14 | required: true 15 | 16 | - type: textarea 17 | attributes: 18 | label: Grim version 19 | description: | 20 | Provide the git commit or the version in the jar's name. 21 | placeholder: A example would be b85c2d0 or grim version 2.3.5, etc 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | attributes: 27 | label: Server version 28 | description: | 29 | Run `/version` on your server to check. Provide both the server type (paper, airplane, etc) & the minecraft version. 30 | validations: 31 | required: true 32 | 33 | - type: textarea 34 | attributes: 35 | label: Plugins 36 | description: | 37 | List all plugins or mods running on your server. To list plugins on bukkit, run `/plugins`. 38 | If your server is behind a proxy such as Bungeecord, you should list the proxy's plugins as well. 39 | validations: 40 | required: true 41 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.yml: -------------------------------------------------------------------------------- 1 | name: Feature suggestion 2 | description: Suggest a feature 3 | labels: ["enhancement"] 4 | body: 5 | - type: textarea 6 | attributes: 7 | label: Feature description 8 | description: Describe the feature and why it should be added 9 | validations: 10 | required: true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # https://gist.github.com/dedunumax/54e82214715e35439227 2 | ############################## 3 | ## Java 4 | ############################## 5 | .mtj.tmp/ 6 | *.class 7 | *.jar 8 | *.war 9 | *.ear 10 | *.nar 11 | hs_err_pid* 12 | 13 | ############################## 14 | ## Gradle 15 | ############################## 16 | bin/ 17 | build/ 18 | .gradle 19 | .gradletasknamecache 20 | gradle-app.setting 21 | !gradle-wrapper.jar 22 | buildSrc/.kotlin 23 | 24 | ############################## 25 | ## IntelliJ 26 | ############################## 27 | out/ 28 | .idea/ 29 | .idea_modules/ 30 | *.iml 31 | *.ipr 32 | *.iws 33 | 34 | ############################## 35 | ## Eclipse 36 | ############################## 37 | .settings/ 38 | tmp/ 39 | .metadata 40 | .classpath 41 | .project 42 | *.tmp 43 | *.bak 44 | *.swp 45 | *~.nib 46 | local.properties 47 | .loadpath 48 | .factorypath 49 | 50 | ############################## 51 | ## NetBeans 52 | ############################## 53 | nbproject/private/ 54 | nbbuild/ 55 | dist/ 56 | nbdist/ 57 | nbactions.xml 58 | nb-configuration.xml 59 | 60 | ############################## 61 | ## Visual Studio Code 62 | ############################## 63 | .vscode/ 64 | .code-workspace 65 | 66 | ############################## 67 | ## OS X 68 | ############################## 69 | .DS_Store 70 | 71 | ############################## 72 | ## Fabric 73 | ############################## 74 | run/ 75 | fabric/run/ 76 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Vulnerability must be reproducible on the latest grim commit. 6 | 7 | ## Reporting a Vulnerability 8 | 9 | If there's a major bypass that would affect gameplay if reported publicly then join Grim's discord [here](https://discord.com/invite/kqQAhTmkUF) and reach out to staff. 10 | -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | `kotlin-dsl` 3 | kotlin("plugin.serialization") version "1.9.0" // Use the same Kotlin version as your main project 4 | } 5 | 6 | repositories { 7 | mavenCentral() 8 | gradlePluginPortal() 9 | } 10 | 11 | dependencies { 12 | implementation(libs.spotless) 13 | implementation(libs.lombok) 14 | implementation(libs.shadow) 15 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") 16 | } 17 | -------------------------------------------------------------------------------- /buildSrc/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | versionCatalogs { 3 | create("libs") { 4 | from(files("../libs.versions.toml")) 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/BukkitPlatformPlugin.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit; 2 | 3 | import ac.grim.grimac.platform.api.PlatformPlugin; 4 | import org.bukkit.plugin.Plugin; 5 | 6 | public class BukkitPlatformPlugin implements PlatformPlugin { 7 | private final Plugin plugin; 8 | 9 | public BukkitPlatformPlugin(Plugin plugin) { 10 | this.plugin = plugin; 11 | } 12 | 13 | @Override 14 | public boolean isEnabled() { 15 | return plugin.isEnabled(); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return plugin.getName(); 21 | } 22 | 23 | @Override 24 | public String getVersion() { 25 | return plugin.getDescription().getVersion(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/BukkitPlatformServer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit; 2 | 3 | import ac.grim.grimac.platform.api.PlatformServer; 4 | import ac.grim.grimac.platform.api.sender.Sender; 5 | import io.github.retrooper.packetevents.util.SpigotReflectionUtil; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.command.CommandSender; 8 | 9 | 10 | public class BukkitPlatformServer implements PlatformServer { 11 | 12 | @Override 13 | public String getPlatformImplementationString() { 14 | return Bukkit.getVersion(); 15 | } 16 | 17 | @Override 18 | public void dispatchCommand(Sender sender, String command) { 19 | CommandSender commandSender = GrimACBukkitLoaderPlugin.LOADER.getBukkitSenderFactory().reverse(sender); 20 | Bukkit.dispatchCommand(commandSender, command); 21 | } 22 | 23 | @Override 24 | public Sender getConsoleSender() { 25 | return GrimACBukkitLoaderPlugin.LOADER.getBukkitSenderFactory().map(Bukkit.getConsoleSender()); 26 | } 27 | 28 | @Override 29 | public void registerOutgoingPluginChannel(String name) { 30 | GrimACBukkitLoaderPlugin.LOADER.getServer().getMessenger().registerOutgoingPluginChannel(GrimACBukkitLoaderPlugin.LOADER, name); 31 | } 32 | 33 | @Override 34 | public double getTPS() { 35 | return SpigotReflectionUtil.getTPS(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/command/BukkitPlayerSelectorAdapter.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.command; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.platform.api.command.PlayerSelector; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import ac.grim.grimac.platform.bukkit.sender.BukkitSenderFactory; 7 | 8 | import java.util.Collection; 9 | import java.util.Collections; 10 | 11 | public class BukkitPlayerSelectorAdapter implements PlayerSelector { 12 | private final org.incendo.cloud.bukkit.data.SinglePlayerSelector bukkitSelector; 13 | 14 | public BukkitPlayerSelectorAdapter(org.incendo.cloud.bukkit.data.SinglePlayerSelector bukkitSelector) { 15 | this.bukkitSelector = bukkitSelector; 16 | } 17 | 18 | @Override 19 | public boolean isSingle() { 20 | return true; 21 | } 22 | 23 | @Override 24 | public Sender getSinglePlayer() { 25 | return ((BukkitSenderFactory) GrimAPI.INSTANCE.getSenderFactory()).map(bukkitSelector.single()); 26 | } 27 | 28 | @Override 29 | public Collection getPlayers() { 30 | return Collections.singletonList(((BukkitSenderFactory) GrimAPI.INSTANCE.getSenderFactory()).map(bukkitSelector.single())); 31 | } 32 | 33 | @Override 34 | public String inputString() { 35 | return bukkitSelector.inputString(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/command/BukkitPlayerSelectorParser.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.command; 2 | 3 | import ac.grim.grimac.platform.api.command.AbstractPlayerSelectorParser; 4 | import ac.grim.grimac.platform.api.command.PlayerSelector; 5 | import org.incendo.cloud.bukkit.parser.selector.SinglePlayerSelectorParser; 6 | import org.incendo.cloud.context.CommandContext; 7 | import org.incendo.cloud.parser.ParserDescriptor; 8 | 9 | import java.util.concurrent.CompletableFuture; 10 | 11 | public class BukkitPlayerSelectorParser extends AbstractPlayerSelectorParser { 12 | 13 | @Override 14 | public ParserDescriptor descriptor() { 15 | return super.createDescriptor(); 16 | } 17 | 18 | @Override 19 | protected ParserDescriptor getPlatformSpecificDescriptor() { 20 | return SinglePlayerSelectorParser.singlePlayerSelectorParser(); 21 | } 22 | 23 | @Override 24 | protected CompletableFuture adaptToCommonSelector(CommandContext context, Object platformSpecificSelector) { 25 | return CompletableFuture.completedFuture(new BukkitPlayerSelectorAdapter((org.incendo.cloud.bukkit.data.SinglePlayerSelector) platformSpecificSelector)); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/initables/BukkitBStats.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.initables; 2 | 3 | import ac.grim.grimac.manager.init.start.StartableInitable; 4 | import ac.grim.grimac.platform.bukkit.GrimACBukkitLoaderPlugin; 5 | import io.github.retrooper.packetevents.bstats.bukkit.Metrics; 6 | 7 | public class BukkitBStats implements StartableInitable { 8 | @Override 9 | public void start() { 10 | int pluginId = 12820; // <-- Replace with the id of your plugin! 11 | try { 12 | new Metrics(GrimACBukkitLoaderPlugin.LOADER, pluginId); 13 | } catch (Exception ignored) { 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/initables/BukkitEventManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.initables; 2 | 3 | import ac.grim.grimac.manager.init.start.StartableInitable; 4 | import ac.grim.grimac.platform.bukkit.GrimACBukkitLoaderPlugin; 5 | import ac.grim.grimac.platform.bukkit.events.PistonEvent; 6 | import ac.grim.grimac.utils.anticheat.LogUtil; 7 | import org.bukkit.Bukkit; 8 | 9 | public class BukkitEventManager implements StartableInitable { 10 | public void start() { 11 | LogUtil.info("Registering singular bukkit event... (PistonEvent)"); 12 | 13 | Bukkit.getPluginManager().registerEvents(new PistonEvent(), GrimACBukkitLoaderPlugin.LOADER); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/manager/BukkitMessagePlaceHolderManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.manager; 2 | 3 | import ac.grim.grimac.platform.api.manager.MessagePlaceHolderManager; 4 | import ac.grim.grimac.platform.api.player.PlatformPlayer; 5 | import ac.grim.grimac.platform.bukkit.player.BukkitPlatformPlayer; 6 | import com.github.retrooper.packetevents.util.reflection.Reflection; 7 | import me.clip.placeholderapi.PlaceholderAPI; 8 | import org.checkerframework.checker.nullness.qual.NonNull; 9 | import org.checkerframework.checker.nullness.qual.Nullable; 10 | 11 | public class BukkitMessagePlaceHolderManager implements MessagePlaceHolderManager { 12 | public static final boolean hasPlaceholderAPI = Reflection.getClassByNameWithoutException("me.clip.placeholderapi.PlaceholderAPI") != null; 13 | 14 | @Override 15 | public @NonNull String replacePlaceholders(@Nullable PlatformPlayer player, @NonNull String string) { 16 | if (!hasPlaceholderAPI) return string; 17 | return PlaceholderAPI.setPlaceholders(player instanceof BukkitPlatformPlayer bukkitPlatformPlayer ? bukkitPlatformPlayer.getBukkitPlayer() : null, string); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/manager/BukkitParserDescriptorFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.manager; 2 | 3 | import ac.grim.grimac.platform.api.command.PlayerSelector; 4 | import ac.grim.grimac.platform.api.manager.ParserDescriptorFactory; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import ac.grim.grimac.platform.bukkit.command.BukkitPlayerSelectorParser; 7 | import org.incendo.cloud.parser.ParserDescriptor; 8 | 9 | public class BukkitParserDescriptorFactory implements ParserDescriptorFactory { 10 | 11 | BukkitPlayerSelectorParser bukkitPlayerSelectorParser = new BukkitPlayerSelectorParser<>(); 12 | 13 | @Override 14 | public ParserDescriptor getSinglePlayer() { 15 | return bukkitPlayerSelectorParser.descriptor(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/manager/BukkitPlatformPluginManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.manager; 2 | 3 | import ac.grim.grimac.platform.api.PlatformPlugin; 4 | import ac.grim.grimac.platform.api.manager.PlatformPluginManager; 5 | import ac.grim.grimac.platform.bukkit.BukkitPlatformPlugin; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.plugin.Plugin; 8 | import org.checkerframework.checker.nullness.qual.Nullable; 9 | 10 | public class BukkitPlatformPluginManager implements PlatformPluginManager { 11 | 12 | @Override 13 | public PlatformPlugin[] getPlugins() { 14 | Plugin[] bukkitPlugins = Bukkit.getPluginManager().getPlugins(); 15 | PlatformPlugin[] plugins = new PlatformPlugin[bukkitPlugins.length]; 16 | 17 | for (int i = 0; i < bukkitPlugins.length; i++) { 18 | plugins[i] = new BukkitPlatformPlugin(bukkitPlugins[i]); 19 | } 20 | 21 | return plugins; 22 | } 23 | 24 | @Override 25 | public @Nullable PlatformPlugin getPlugin(String pluginName) { 26 | Plugin bukkitPlugin = Bukkit.getPluginManager().getPlugin(pluginName); 27 | return bukkitPlugin == null ? null : new BukkitPlatformPlugin(bukkitPlugin); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/player/BukkitOfflinePlatformPlayer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.player; 2 | 3 | import ac.grim.grimac.platform.api.player.OfflinePlatformPlayer; 4 | import org.bukkit.OfflinePlayer; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.UUID; 8 | 9 | public class BukkitOfflinePlatformPlayer implements OfflinePlatformPlayer { 10 | private final OfflinePlayer offlinePlayer; 11 | 12 | public BukkitOfflinePlatformPlayer(OfflinePlayer offlinePlayer) { 13 | this.offlinePlayer = offlinePlayer; 14 | } 15 | 16 | @Override 17 | public boolean isOnline() { 18 | return offlinePlayer.isOnline(); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return offlinePlayer.getName(); 24 | } 25 | 26 | @Override 27 | public @NotNull UUID getUniqueId() { 28 | return offlinePlayer.getUniqueId(); 29 | } 30 | 31 | @Override 32 | public boolean equals(Object o) { 33 | if (o instanceof OfflinePlatformPlayer offlinePlatformPlayer) { 34 | return this.getUniqueId().equals(offlinePlatformPlayer.getUniqueId()); 35 | } 36 | return false; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/scheduler/bukkit/BukkitTaskHandle.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.scheduler.bukkit; 2 | 3 | import ac.grim.grimac.platform.api.scheduler.TaskHandle; 4 | import org.bukkit.scheduler.BukkitTask; 5 | 6 | public class BukkitTaskHandle implements TaskHandle { 7 | 8 | private final BukkitTask bukkitTask; 9 | 10 | public BukkitTaskHandle(BukkitTask bukkitTask) { 11 | this.bukkitTask = bukkitTask; 12 | } 13 | 14 | @Override 15 | public boolean isSync() { 16 | return bukkitTask.isSync(); 17 | } 18 | 19 | @Override 20 | public boolean isCancelled() { 21 | return bukkitTask.isCancelled(); 22 | } 23 | 24 | @Override 25 | public void cancel() { 26 | bukkitTask.cancel(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /bukkit/src/main/java/ac/grim/grimac/platform/bukkit/scheduler/folia/FoliaTaskHandle.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.bukkit.scheduler.folia; 2 | 3 | import ac.grim.grimac.platform.api.scheduler.TaskHandle; 4 | import io.papermc.paper.threadedregions.scheduler.ScheduledTask; 5 | 6 | public class FoliaTaskHandle implements TaskHandle { 7 | 8 | private final ScheduledTask task; 9 | 10 | public FoliaTaskHandle(ScheduledTask task) { 11 | this.task = task; 12 | } 13 | 14 | @Override 15 | public boolean isSync() { 16 | return false; 17 | } 18 | 19 | @Override 20 | public boolean isCancelled() { 21 | return task.isCancelled(); 22 | } 23 | 24 | @Override 25 | public void cancel() { 26 | task.cancel(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/CheckData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.TYPE) 10 | public @interface CheckData { 11 | String name() default "UNKNOWN"; 12 | 13 | String alternativeName() default "UNKNOWN"; 14 | 15 | String configName() default "DEFAULT"; 16 | 17 | String description() default "No description provided"; 18 | 19 | double decay() default 0.05; 20 | 21 | double setback() default 25; 22 | 23 | boolean experimental() default false; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/GrimProcessor.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.api.AbstractProcessor; 5 | import ac.grim.grimac.api.config.ConfigReloadable; 6 | import ac.grim.grimac.utils.common.ConfigReloadObserver; 7 | 8 | public abstract class GrimProcessor implements AbstractProcessor, ConfigReloadable, ConfigReloadObserver { 9 | 10 | // Not everything has to be a check for it to process packets & be configurable 11 | 12 | @Override 13 | public void reload() { 14 | reload(GrimAPI.INSTANCE.getConfigManager().getConfig()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/debug/AbstractDebugHandler.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.debug; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.player.GrimPlayer; 5 | 6 | public abstract class AbstractDebugHandler extends Check { 7 | 8 | protected final GrimPlayer grimPlayer; 9 | 10 | public AbstractDebugHandler(GrimPlayer grimPlayer) { 11 | super(grimPlayer); 12 | this.grimPlayer = grimPlayer; 13 | } 14 | 15 | public GrimPlayer getPlayer() { 16 | return grimPlayer; 17 | } 18 | 19 | public abstract boolean toggleListener(GrimPlayer player); 20 | 21 | public abstract boolean toggleConsoleOutput(); 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/aim/AimDuplicateLook.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.aim; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.RotationCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import ac.grim.grimac.utils.anticheat.update.RotationUpdate; 8 | 9 | @CheckData(name = "AimDuplicateLook") 10 | public class AimDuplicateLook extends Check implements RotationCheck { 11 | boolean exempt = false; 12 | 13 | public AimDuplicateLook(GrimPlayer playerData) { 14 | super(playerData); 15 | } 16 | 17 | @Override 18 | public void process(final RotationUpdate rotationUpdate) { 19 | if (player.packetStateData.lastPacketWasTeleport || player.packetStateData.lastPacketWasOnePointSeventeenDuplicate || player.compensatedEntities.self.getRiding() != null) { 20 | exempt = true; 21 | return; 22 | } 23 | 24 | if (exempt) { // Exempt for a tick on teleport 25 | exempt = false; 26 | return; 27 | } 28 | 29 | if (rotationUpdate.getFrom().equals(rotationUpdate.getTo())) { 30 | flagAndAlert(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsA.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientHeldItemChange; 10 | 11 | @CheckData(name = "BadPacketsA", description = "Sent duplicate slot id") 12 | public class BadPacketsA extends Check implements PacketCheck { 13 | int lastSlot = -1; 14 | 15 | public BadPacketsA(final GrimPlayer player) { 16 | super(player); 17 | } 18 | 19 | @Override 20 | public void onPacketReceive(PacketReceiveEvent event) { 21 | if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_CHANGE) { 22 | final int slot = new WrapperPlayClientHeldItemChange(event).getSlot(); 23 | 24 | if (slot == lastSlot && flagAndAlert("slot=" + slot) && shouldModifyPackets()) { 25 | event.setCancelled(true); 26 | player.onPacketCancel(); 27 | } 28 | 29 | lastSlot = slot; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsB.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | 9 | @CheckData(name = "BadPacketsB", description = "Ignored set rotation packet") 10 | public class BadPacketsB extends Check implements PacketCheck { 11 | 12 | public BadPacketsB(final GrimPlayer player) { 13 | super(player); 14 | } 15 | 16 | @Override 17 | public void onPacketReceive(PacketReceiveEvent event) { 18 | if (isTransaction(event.getPacketType())) { 19 | player.pendingRotations.removeIf(data -> { 20 | if (player.getLastTransactionReceived() > data.getTransaction()) { 21 | if (!data.isAccepted()) { 22 | flagAndAlert(); 23 | } 24 | 25 | return true; 26 | } 27 | 28 | return false; 29 | }); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsC.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.protocol.player.GameMode; 10 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity; 11 | 12 | @CheckData(name = "BadPacketsC", description = "Interacted with self") 13 | public class BadPacketsC extends Check implements PacketCheck { 14 | public BadPacketsC(GrimPlayer player) { 15 | super(player); 16 | } 17 | 18 | @Override 19 | public void onPacketReceive(PacketReceiveEvent event) { 20 | if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) { 21 | if (player.gamemode == GameMode.SPECTATOR) return; 22 | if (new WrapperPlayClientInteractEntity(event).getEntityId() == player.entityID) { 23 | // Instant ban 24 | if (flagAndAlert() && shouldModifyPackets()) { 25 | event.setCancelled(true); 26 | player.onPacketCancel(); 27 | } 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsI.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerAbilities; 10 | 11 | @CheckData(name = "BadPacketsI", description = "Claimed to be flying while unable to fly") 12 | public class BadPacketsI extends Check implements PacketCheck { 13 | public BadPacketsI(GrimPlayer player) { 14 | super(player); 15 | } 16 | 17 | @Override 18 | public void onPacketReceive(PacketReceiveEvent event) { 19 | if (event.getPacketType() == PacketType.Play.Client.PLAYER_ABILITIES) { 20 | if (new WrapperPlayClientPlayerAbilities(event).isFlying() && !player.canFly) { 21 | if (flagAndAlert() && shouldModifyPackets()) { 22 | event.setCancelled(true); 23 | player.onPacketCancel(); 24 | } 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsK.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.protocol.player.GameMode; 10 | 11 | @CheckData(name = "BadPacketsK", description = "Sent spectate packets while not in spectator mode") 12 | public class BadPacketsK extends Check implements PacketCheck { 13 | public BadPacketsK(GrimPlayer player) { 14 | super(player); 15 | } 16 | 17 | @Override 18 | public void onPacketReceive(PacketReceiveEvent event) { 19 | if (event.getPacketType() == PacketType.Play.Client.SPECTATE) { 20 | if (player.gamemode != GameMode.SPECTATOR) { 21 | if (flagAndAlert() && shouldModifyPackets()) { 22 | event.setCancelled(true); 23 | player.onPacketCancel(); 24 | } 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsN.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | 8 | @CheckData(name = "BadPacketsN", setback = 0) 9 | public class BadPacketsN extends Check implements PacketCheck { 10 | public BadPacketsN(final GrimPlayer player) { 11 | super(player); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsS.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientWindowConfirmation; 10 | 11 | @CheckData(name = "BadPacketsS") 12 | public class BadPacketsS extends Check implements PacketCheck { 13 | public BadPacketsS(GrimPlayer player) { 14 | super(player); 15 | } 16 | 17 | @Override 18 | public void onPacketReceive(PacketReceiveEvent event) { 19 | if (event.getPacketType() == PacketType.Play.Client.WINDOW_CONFIRMATION) { 20 | if (!new WrapperPlayClientWindowConfirmation(event).isAccepted() && flagAndAlert() && shouldModifyPackets()) { 21 | event.setCancelled(true); 22 | player.onPacketCancel(); 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsW.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | 8 | @CheckData(name = "BadPacketsW", description = "Interacted with non-existent entity", experimental = true) 9 | public class BadPacketsW extends Check implements PacketCheck { 10 | public BadPacketsW(GrimPlayer player) { 11 | super(player); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsY.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.badpackets; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientHeldItemChange; 10 | 11 | @CheckData(name = "BadPacketsY", description = "Sent out of bounds slot id") 12 | public class BadPacketsY extends Check implements PacketCheck { 13 | public BadPacketsY(GrimPlayer player) { 14 | super(player); 15 | } 16 | 17 | @Override 18 | public void onPacketReceive(PacketReceiveEvent event) { 19 | if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_CHANGE) { 20 | final int slot = new WrapperPlayClientHeldItemChange(event).getSlot(); 21 | if (slot > 8 || slot < 0) { // ban 22 | if (flagAndAlert("slot=" + slot) && shouldModifyPackets()) { 23 | event.setCancelled(true); 24 | player.onPacketCancel(); 25 | } 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/breaking/InvalidBreak.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.breaking; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.BlockBreakCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import ac.grim.grimac.utils.anticheat.update.BlockBreak; 8 | import com.github.retrooper.packetevents.protocol.player.ClientVersion; 9 | import com.github.retrooper.packetevents.protocol.player.DiggingAction; 10 | 11 | @CheckData(name = "InvalidBreak", description = "Sent impossible block face id") 12 | public class InvalidBreak extends Check implements BlockBreakCheck { 13 | public InvalidBreak(GrimPlayer player) { 14 | super(player); 15 | } 16 | 17 | @Override 18 | public void onBlockBreak(BlockBreak blockBreak) { 19 | if (blockBreak.faceId == 255 && blockBreak.action == DiggingAction.CANCELLED_DIGGING && player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_7_10)) { 20 | return; 21 | } 22 | 23 | if (blockBreak.faceId < 0 || blockBreak.faceId > 5) { 24 | // ban 25 | if (flagAndAlert("face=" + blockBreak.faceId + ", action=" + blockBreak.action) && shouldModifyPackets()) { 26 | blockBreak.cancel(); 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/combat/EntityPierce.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.combat; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | 8 | @CheckData(name = "EntityPierce", configName = "EntityPierce", setback = 30) 9 | public class EntityPierce extends Check implements PacketCheck { 10 | public EntityPierce(GrimPlayer player) { 11 | super(player); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/combat/Hitboxes.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.combat; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | 8 | @CheckData(name = "Hitboxes", setback = 10) 9 | public class Hitboxes extends Check implements PacketCheck { 10 | public Hitboxes(GrimPlayer player) { 11 | super(player); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/combat/WallHit.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.combat; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | 8 | @CheckData(name = "WallHit", configName = "WallHit", setback = 20) 9 | public class WallHit extends Check implements PacketCheck { 10 | public WallHit(GrimPlayer player) { 11 | super(player); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/crash/CrashB.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.crash; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.protocol.player.GameMode; 10 | 11 | @CheckData(name = "CrashB", description = "Sent creative mode inventory click packets while not in creative mode") 12 | public class CrashB extends Check implements PacketCheck { 13 | public CrashB(GrimPlayer player) { 14 | super(player); 15 | } 16 | 17 | @Override 18 | public void onPacketReceive(PacketReceiveEvent event) { 19 | if (event.getPacketType() == PacketType.Play.Client.CREATIVE_INVENTORY_ACTION) { 20 | if (player.gamemode != GameMode.CREATIVE) { 21 | event.setCancelled(true); 22 | player.onPacketCancel(); 23 | flagAndAlert(); // Could be transaction split, no need to setback though 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/crash/CrashE.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.crash; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientSettings; 10 | 11 | @CheckData(name = "CrashE") 12 | public class CrashE extends Check implements PacketCheck { 13 | 14 | public CrashE(GrimPlayer playerData) { 15 | super(playerData); 16 | } 17 | 18 | @Override 19 | public void onPacketReceive(final PacketReceiveEvent event) { 20 | if (event.getPacketType() == PacketType.Play.Client.CLIENT_SETTINGS) { 21 | WrapperPlayClientSettings wrapper = new WrapperPlayClientSettings(event); 22 | int viewDistance = wrapper.getViewDistance(); 23 | if (viewDistance < 2) { 24 | flagAndAlert("distance=" + viewDistance); 25 | wrapper.setViewDistance(2); 26 | } 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/exploit/ExploitB.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.exploit; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEditBook; 10 | 11 | @CheckData(name = "ExploitB", description = "Too long book title") 12 | public class ExploitB extends Check implements PacketCheck { 13 | public ExploitB(GrimPlayer playerData) { 14 | super(playerData); 15 | } 16 | 17 | @Override 18 | public void onPacketReceive(PacketReceiveEvent event) { 19 | if (event.getPacketType() == PacketType.Play.Client.EDIT_BOOK) { 20 | final String title = new WrapperPlayClientEditBook(event).getTitle(); 21 | 22 | if (title == null) return; // book was not signed 23 | 24 | if (title.length() > 15) { 25 | if (flagAndAlert("title=" + title) && shouldModifyPackets()) { 26 | event.setCancelled(true); 27 | player.onPacketCancel(); 28 | } 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/flight/FlightA.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.flight; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.type.PacketCheck; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 7 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying; 8 | 9 | // This check catches 100% of cheaters. 10 | public class FlightA extends Check implements PacketCheck { 11 | public FlightA(GrimPlayer player) { 12 | super(player); 13 | } 14 | 15 | @Override 16 | public void onPacketReceive(PacketReceiveEvent event) { 17 | // If the player sends a flying packet, but they aren't flying, then they are cheating. 18 | if (WrapperPlayClientPlayerFlying.isFlying(event.getPacketType()) && !player.isFlying) { 19 | flag(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/inventory/InventoryC.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.inventory; 2 | 3 | import ac.grim.grimac.checks.CheckData; 4 | import ac.grim.grimac.checks.type.InventoryCheck; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import ac.grim.grimac.utils.anticheat.update.BlockPlace; 7 | 8 | @CheckData(name = "InventoryC", setback = 3, description = "Placed a block while inventory is open") 9 | public class InventoryC extends InventoryCheck { 10 | 11 | public InventoryC(GrimPlayer player) { 12 | super(player); 13 | } 14 | 15 | public void onBlockPlace(final BlockPlace place) { 16 | // It is not possible to place a block while the inventory is open 17 | if (player.hasInventoryOpen) { 18 | if (flagAndAlert()) { 19 | if (shouldModifyPackets()) { 20 | place.resync(); 21 | } 22 | if (!isNoSetbackPermission()) { 23 | closeInventory(); 24 | } 25 | } 26 | } else { 27 | reward(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/misc/TransactionOrder.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.misc; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | 8 | @CheckData(name = "TransactionOrder") 9 | public class TransactionOrder extends Check implements PacketCheck { 10 | public TransactionOrder(GrimPlayer player) { 11 | super(player); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/movement/PredictionRunner.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.movement; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.type.PositionCheck; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import ac.grim.grimac.utils.anticheat.update.PositionUpdate; 7 | 8 | public class PredictionRunner extends Check implements PositionCheck { 9 | public PredictionRunner(GrimPlayer playerData) { 10 | super(playerData); 11 | } 12 | 13 | @Override 14 | public void onPositionUpdate(final PositionUpdate positionUpdate) { 15 | if (!player.inVehicle()) { 16 | player.movementCheckRunner.processAndCheckMovementPacket(positionUpdate); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/movement/VehiclePredictionRunner.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.movement; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.type.VehicleCheck; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import ac.grim.grimac.utils.anticheat.update.PositionUpdate; 7 | import ac.grim.grimac.utils.anticheat.update.VehiclePositionUpdate; 8 | 9 | public class VehiclePredictionRunner extends Check implements VehicleCheck { 10 | public VehiclePredictionRunner(GrimPlayer playerData) { 11 | super(playerData); 12 | } 13 | 14 | @Override 15 | public void process(final VehiclePositionUpdate vehicleUpdate) { 16 | // Vehicle onGround = false always 17 | // We don't do vehicle setbacks because vehicle netcode sucks. 18 | player.movementCheckRunner.processAndCheckMovementPacket(new PositionUpdate(vehicleUpdate.getFrom(), vehicleUpdate.getTo(), false, null, null, vehicleUpdate.isTeleport())); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/multiactions/MultiActionsC.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.multiactions; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | 10 | @CheckData(name = "MultiActionsC", description = "Clicked in inventory while sprinting", experimental = true) 11 | public class MultiActionsC extends Check implements PacketCheck { 12 | public MultiActionsC(GrimPlayer player) { 13 | super(player); 14 | } 15 | 16 | @Override 17 | public void onPacketReceive(PacketReceiveEvent event) { 18 | if (event.getPacketType() == PacketType.Play.Client.CLICK_WINDOW) { 19 | if (player.isSprinting && !player.isSwimming && !player.serverOpenedInventoryThisTick && flagAndAlert() && shouldModifyPackets()) { 20 | event.setCancelled(true); 21 | player.onPacketCancel(); 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/multiactions/MultiActionsD.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.multiactions; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | 10 | @CheckData(name = "MultiActionsD", description = "Closed inventory while sprinting", experimental = true) 11 | public class MultiActionsD extends Check implements PacketCheck { 12 | public MultiActionsD(GrimPlayer player) { 13 | super(player); 14 | } 15 | 16 | @Override 17 | public void onPacketReceive(PacketReceiveEvent event) { 18 | if (event.getPacketType() == PacketType.Play.Client.CLOSE_WINDOW) { 19 | if (player.isSprinting && !player.isSwimming && !player.serverOpenedInventoryThisTick && flagAndAlert() && shouldModifyPackets()) { 20 | event.setCancelled(true); 21 | player.onPacketCancel(); 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/scaffolding/InvalidPlaceA.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.scaffolding; 2 | 3 | import ac.grim.grimac.checks.CheckData; 4 | import ac.grim.grimac.checks.type.BlockPlaceCheck; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import ac.grim.grimac.utils.anticheat.update.BlockPlace; 7 | import com.github.retrooper.packetevents.util.Vector3f; 8 | 9 | @CheckData(name = "InvalidPlaceA") 10 | public class InvalidPlaceA extends BlockPlaceCheck { 11 | public InvalidPlaceA(GrimPlayer player) { 12 | super(player); 13 | } 14 | 15 | @Override 16 | public void onBlockPlace(final BlockPlace place) { 17 | Vector3f cursor = place.getCursor(); 18 | if (cursor == null) return; 19 | if (!Float.isFinite(cursor.getX()) || !Float.isFinite(cursor.getY()) || !Float.isFinite(cursor.getZ())) { 20 | if (flagAndAlert() && shouldModifyPackets() && shouldCancel()) { 21 | place.resync(); 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/scaffolding/InvalidPlaceB.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.scaffolding; 2 | 3 | import ac.grim.grimac.checks.CheckData; 4 | import ac.grim.grimac.checks.type.BlockPlaceCheck; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import ac.grim.grimac.utils.anticheat.update.BlockPlace; 7 | import com.github.retrooper.packetevents.PacketEvents; 8 | import com.github.retrooper.packetevents.manager.server.ServerVersion; 9 | 10 | @CheckData(name = "InvalidPlaceB", description = "Sent impossible block face id") 11 | public class InvalidPlaceB extends BlockPlaceCheck { 12 | public InvalidPlaceB(GrimPlayer player) { 13 | super(player); 14 | } 15 | 16 | @Override 17 | public void onBlockPlace(final BlockPlace place) { 18 | if (place.getFaceId() == 255 && PacketEvents.getAPI().getServerManager().getVersion().isOlderThanOrEquals(ServerVersion.V_1_8)) { 19 | return; 20 | } 21 | 22 | if (place.getFaceId() < 0 || place.getFaceId() > 5) { 23 | // ban 24 | if (flagAndAlert("direction=" + place.getFaceId()) && shouldModifyPackets() && shouldCancel()) { 25 | place.resync(); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/sprint/SprintF.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.sprint; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PostPredictionCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import ac.grim.grimac.utils.anticheat.update.PredictionComplete; 8 | import com.github.retrooper.packetevents.protocol.player.ClientVersion; 9 | 10 | @CheckData(name = "SprintF", description = "Sprinting while gliding", experimental = true) 11 | public class SprintF extends Check implements PostPredictionCheck { 12 | public SprintF(GrimPlayer player) { 13 | super(player); 14 | } 15 | 16 | @Override 17 | public void onPredictionComplete(final PredictionComplete predictionComplete) { 18 | if (player.wasGliding && player.isGliding && player.getClientVersion() == ClientVersion.V_1_21_4) { 19 | if (player.isSprinting) { 20 | flagAndAlertWithSetback(); 21 | } else { 22 | reward(); 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/timer/VehicleTimer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.timer; 2 | 3 | import ac.grim.grimac.checks.CheckData; 4 | import ac.grim.grimac.player.GrimPlayer; 5 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 6 | import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon; 7 | 8 | @CheckData(name = "VehicleTimer", setback = 10) 9 | public class VehicleTimer extends Timer { 10 | boolean isDummy = false; 11 | 12 | public VehicleTimer(GrimPlayer player) { 13 | super(player); 14 | } 15 | 16 | @Override 17 | public boolean shouldCountPacketForTimer(PacketTypeCommon packetType) { 18 | // Ignore teleports 19 | if (player.packetStateData.lastPacketWasTeleport) return false; 20 | 21 | if (packetType == PacketType.Play.Client.VEHICLE_MOVE) { 22 | isDummy = false; 23 | return true; // Client controlling vehicle 24 | } 25 | 26 | if (packetType == PacketType.Play.Client.STEER_VEHICLE) { 27 | if (isDummy) { // Server is controlling vehicle 28 | return true; 29 | } 30 | isDummy = true; // Client is controlling vehicle 31 | } 32 | 33 | return false; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/vehicle/VehicleA.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.vehicle; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientSteerVehicle; 10 | 11 | @CheckData(name = "VehicleA", description = "Impossible input values") 12 | public class VehicleA extends Check implements PacketCheck { 13 | public VehicleA(GrimPlayer player) { 14 | super(player); 15 | } 16 | 17 | @Override 18 | public void onPacketReceive(final PacketReceiveEvent event) { 19 | if (event.getPacketType() == PacketType.Play.Client.STEER_VEHICLE) { 20 | final WrapperPlayClientSteerVehicle packet = new WrapperPlayClientSteerVehicle(event); 21 | 22 | if (Math.abs(packet.getForward()) > 0.98f || Math.abs(packet.getSideways()) > 0.98f) { 23 | if (flagAndAlert("forwards=" + packet.getForward() + ", sideways=" + packet.getSideways()) && shouldModifyPackets()) { 24 | event.setCancelled(true); 25 | player.onPacketCancel(); 26 | } 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/vehicle/VehicleB.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.vehicle; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 8 | import com.github.retrooper.packetevents.protocol.packettype.PacketType; 9 | 10 | @CheckData(name = "VehicleB", description = "Claimed to be in a vehicle while not in a vehicle") 11 | public class VehicleB extends Check implements PacketCheck { 12 | public VehicleB(GrimPlayer player) { 13 | super(player); 14 | } 15 | 16 | @Override 17 | public void onPacketReceive(PacketReceiveEvent event) { 18 | if (event.getPacketType() == PacketType.Play.Client.STEER_VEHICLE) { 19 | if (!player.inVehicle()) { 20 | if (flagAndAlert() && shouldModifyPackets()) { 21 | event.setCancelled(true); 22 | player.onPacketCancel(); 23 | } 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/impl/vehicle/VehicleC.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.impl.vehicle; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.CheckData; 5 | import ac.grim.grimac.checks.type.PacketCheck; 6 | import ac.grim.grimac.player.GrimPlayer; 7 | 8 | @CheckData(name = "VehicleC") 9 | public class VehicleC extends Check implements PacketCheck { 10 | public VehicleC(GrimPlayer player) { 11 | super(player); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/type/BlockBreakCheck.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.type; 2 | 3 | import ac.grim.grimac.utils.anticheat.update.BlockBreak; 4 | 5 | public interface BlockBreakCheck extends PostPredictionCheck { 6 | default void onBlockBreak(final BlockBreak blockBreak) { 7 | } 8 | 9 | default void onPostFlyingBlockBreak(final BlockBreak blockBreak) { 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/type/PacketCheck.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.type; 2 | 3 | import ac.grim.grimac.api.AbstractCheck; 4 | import com.github.retrooper.packetevents.event.PacketReceiveEvent; 5 | import com.github.retrooper.packetevents.event.PacketSendEvent; 6 | 7 | public interface PacketCheck extends AbstractCheck { 8 | default void onPacketReceive(final PacketReceiveEvent event) { 9 | } 10 | 11 | default void onPacketSend(final PacketSendEvent event) { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/type/PositionCheck.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.type; 2 | 3 | import ac.grim.grimac.api.AbstractCheck; 4 | import ac.grim.grimac.utils.anticheat.update.PositionUpdate; 5 | 6 | public interface PositionCheck extends AbstractCheck { 7 | 8 | default void onPositionUpdate(final PositionUpdate positionUpdate) { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/type/PostPredictionCheck.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.type; 2 | 3 | import ac.grim.grimac.utils.anticheat.update.PredictionComplete; 4 | 5 | public interface PostPredictionCheck extends PacketCheck { 6 | 7 | default void onPredictionComplete(final PredictionComplete predictionComplete) { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/type/RotationCheck.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.type; 2 | 3 | import ac.grim.grimac.api.AbstractCheck; 4 | import ac.grim.grimac.utils.anticheat.update.RotationUpdate; 5 | 6 | public interface RotationCheck extends AbstractCheck { 7 | 8 | default void process(final RotationUpdate rotationUpdate) { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/checks/type/VehicleCheck.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.checks.type; 2 | 3 | import ac.grim.grimac.api.AbstractCheck; 4 | import ac.grim.grimac.utils.anticheat.update.VehiclePositionUpdate; 5 | 6 | public interface VehicleCheck extends AbstractCheck { 7 | 8 | void process(final VehiclePositionUpdate vehicleUpdate); 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/BuildableCommand.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command; 2 | 3 | import ac.grim.grimac.platform.api.sender.Sender; 4 | import org.incendo.cloud.CommandManager; 5 | 6 | public interface BuildableCommand { 7 | void register(CommandManager manager); 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/SenderRequirement.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command; 2 | 3 | import ac.grim.grimac.platform.api.sender.Sender; 4 | import net.kyori.adventure.text.Component; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.incendo.cloud.processors.requirements.Requirement; 7 | 8 | public interface SenderRequirement extends Requirement { 9 | @NonNull Component errorMessage(Sender sender); 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/commands/GrimAlerts.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command.commands; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.command.BuildableCommand; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import org.checkerframework.checker.nullness.qual.NonNull; 7 | import org.incendo.cloud.CommandManager; 8 | import org.incendo.cloud.context.CommandContext; 9 | import org.incendo.cloud.description.Description; 10 | 11 | public class GrimAlerts implements BuildableCommand { 12 | @Override 13 | public void register(CommandManager commandManager) { 14 | commandManager.command( 15 | commandManager.commandBuilder("grim", "grimac") 16 | .literal("alerts", Description.of("Toggle alerts for the sender")) 17 | .permission("grim.alerts") 18 | .handler(this::handleAlerts) 19 | ); 20 | } 21 | 22 | // Suppress warning as we've already checked sender is not console 23 | private void handleAlerts(@NonNull CommandContext context) { 24 | Sender sender = context.sender(); 25 | if (sender.isPlayer()) { 26 | GrimAPI.INSTANCE.getAlertManager().toggleAlerts(context.sender().getPlatformPlayer(), false); 27 | } else if (sender.isConsole()) { 28 | GrimAPI.INSTANCE.getAlertManager().toggleConsoleAlerts(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/commands/GrimBrands.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command.commands; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.command.BuildableCommand; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import org.checkerframework.checker.nullness.qual.NonNull; 7 | import org.incendo.cloud.CommandManager; 8 | import org.incendo.cloud.context.CommandContext; 9 | import org.incendo.cloud.description.Description; 10 | 11 | public class GrimBrands implements BuildableCommand { 12 | @Override 13 | public void register(CommandManager commandManager) { 14 | commandManager.command( 15 | commandManager.commandBuilder("grim", "grimac") 16 | .literal("brands", Description.of("Toggle brands for the sender")) 17 | .permission("grim.brand") 18 | .handler(this::handleBrands) 19 | ); 20 | } 21 | 22 | private void handleBrands(@NonNull CommandContext context) { 23 | Sender sender = context.sender(); 24 | if (sender.isPlayer()) { 25 | GrimAPI.INSTANCE.getAlertManager().toggleBrands(context.sender().getPlatformPlayer(), false); 26 | } else if (sender.isConsole()) { 27 | GrimAPI.INSTANCE.getAlertManager().toggleConsoleBrands(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/commands/GrimHelp.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command.commands; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.command.BuildableCommand; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import ac.grim.grimac.utils.anticheat.MessageUtil; 7 | import org.checkerframework.checker.nullness.qual.NonNull; 8 | import org.incendo.cloud.CommandManager; 9 | import org.incendo.cloud.context.CommandContext; 10 | import org.incendo.cloud.description.Description; 11 | 12 | public class GrimHelp implements BuildableCommand { 13 | @Override 14 | public void register(CommandManager commandManager) { 15 | commandManager.command( 16 | commandManager.commandBuilder("grim", "grimac") 17 | .literal("help", Description.of("Display help information")) 18 | .permission("grim.help") 19 | .handler(this::handleHelp) 20 | ); 21 | } 22 | 23 | private void handleHelp(@NonNull CommandContext context) { 24 | Sender sender = context.sender(); 25 | 26 | for (String string : GrimAPI.INSTANCE.getConfigManager().getConfig().getStringList("help")) { 27 | string = MessageUtil.replacePlaceholders(sender, string); 28 | sender.sendMessage(MessageUtil.miniMessage(string)); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/commands/GrimVerbose.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command.commands; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.command.BuildableCommand; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import org.checkerframework.checker.nullness.qual.NonNull; 7 | import org.incendo.cloud.CommandManager; 8 | import org.incendo.cloud.context.CommandContext; 9 | 10 | public class GrimVerbose implements BuildableCommand { 11 | @Override 12 | public void register(CommandManager commandManager) { 13 | commandManager.command( 14 | commandManager.commandBuilder("grim", "grimac") 15 | .literal("verbose") 16 | .permission("grim.verbose") 17 | .handler(this::handleVerbose) 18 | ); 19 | } 20 | 21 | private void handleVerbose(@NonNull CommandContext context) { 22 | Sender sender = context.sender(); 23 | if (sender.isPlayer()) { 24 | GrimAPI.INSTANCE.getAlertManager().toggleVerbose(context.sender().getPlatformPlayer(), false); 25 | } else if (sender.isConsole()) { 26 | GrimAPI.INSTANCE.getAlertManager().toggleConsoleVerbose(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/handler/GrimCommandFailureHandler.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command.handler; 2 | 3 | import ac.grim.grimac.command.SenderRequirement; 4 | import ac.grim.grimac.platform.api.sender.Sender; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.incendo.cloud.context.CommandContext; 7 | import org.incendo.cloud.processors.requirements.RequirementFailureHandler; 8 | 9 | public class GrimCommandFailureHandler implements RequirementFailureHandler { 10 | @Override 11 | public void handleFailure(@NonNull CommandContext context, @NonNull SenderRequirement requirement) { 12 | context.sender().sendMessage(requirement.errorMessage(context.sender())); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/command/requirements/PlayerSenderRequirement.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.command.requirements; 2 | 3 | import ac.grim.grimac.command.SenderRequirement; 4 | import ac.grim.grimac.platform.api.sender.Sender; 5 | import ac.grim.grimac.utils.anticheat.MessageUtil; 6 | import net.kyori.adventure.text.Component; 7 | import org.checkerframework.checker.nullness.qual.NonNull; 8 | import org.incendo.cloud.context.CommandContext; 9 | 10 | public final class PlayerSenderRequirement implements SenderRequirement { 11 | 12 | public static final PlayerSenderRequirement PLAYER_SENDER_REQUIREMENT = new PlayerSenderRequirement(); 13 | 14 | @Override 15 | public @NonNull Component errorMessage(Sender sender) { 16 | return MessageUtil.getParsedComponent(sender, "run-as-player", "%prefix% &cThis command can only be used by players!"); 17 | } 18 | 19 | @Override 20 | public boolean evaluateRequirement(@NonNull CommandContext commandContext) { 21 | return commandContext.sender().isPlayer(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/events/packets/worldreader/multiblockchange/VersionedMultiBlockChangeHandler.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.events.packets.worldreader.multiblockchange; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.event.PacketSendEvent; 5 | import io.netty.buffer.ByteBuf; 6 | 7 | public interface VersionedMultiBlockChangeHandler { 8 | 9 | int RANGE = 16; 10 | long TRANSACTION_COOLDOWN_MS = 2; // In milliseconds 11 | 12 | void handleMultiBlockChange(GrimPlayer player, PacketSendEvent event); 13 | default long readVarLong(ByteBuf buf) { 14 | long value = 0; 15 | int size = 0; 16 | int b; 17 | while (((b = buf.readByte()) & 0x80) == 0x80) { 18 | value |= (long) (b & 0x7F) << (size++ * 7); 19 | } 20 | return value | ((long) (b & 0x7F) << (size * 7)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/LastInstanceManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager; 2 | 3 | import ac.grim.grimac.checks.Check; 4 | import ac.grim.grimac.checks.type.PostPredictionCheck; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import ac.grim.grimac.utils.anticheat.update.PredictionComplete; 7 | import ac.grim.grimac.utils.data.LastInstance; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class LastInstanceManager extends Check implements PostPredictionCheck { 13 | private final List instances = new ArrayList<>(); 14 | 15 | public LastInstanceManager(GrimPlayer player) { 16 | super(player); 17 | } 18 | 19 | public void addInstance(LastInstance instance) { 20 | instances.add(instance); 21 | } 22 | 23 | @Override 24 | public void onPredictionComplete(final PredictionComplete predictionComplete) { 25 | for (LastInstance instance : instances) { 26 | instance.tick(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/Initable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init; 2 | 3 | public interface Initable { 4 | } 5 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/ReloadableInitable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init; 2 | 3 | public interface ReloadableInitable { 4 | void reload(); 5 | } 6 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/load/LoadableInitable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.load; 2 | 3 | import ac.grim.grimac.manager.init.Initable; 4 | 5 | public interface LoadableInitable extends Initable { 6 | void load(); 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/start/AbstractTickEndEvent.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.start; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.player.GrimPlayer; 5 | 6 | // Intended for future events we inject all platforms at the end of a tick 7 | public abstract class AbstractTickEndEvent implements StartableInitable { 8 | 9 | @Override 10 | public void start() { 11 | 12 | } 13 | 14 | protected void onEndOfTick(GrimPlayer player) { 15 | player.checkManager.getEntityReplication().onEndOfTickEvent(); 16 | } 17 | 18 | protected boolean shouldInjectEndTick() { 19 | return GrimAPI.INSTANCE.getConfigManager().getConfig().getBooleanElse("Reach.enable-post-packet", false); 20 | 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/start/ExemptOnlinePlayersOnReload.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.start; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.platform.api.player.PlatformPlayer; 5 | import com.github.retrooper.packetevents.PacketEvents; 6 | import com.github.retrooper.packetevents.protocol.player.User; 7 | 8 | public class ExemptOnlinePlayersOnReload implements StartableInitable { 9 | 10 | // Runs on plugin startup adding all online players to exempt list; will be empty unless reload 11 | // This essentially exists to stop you from shooting yourself in the foot by being stupid and using /reload 12 | @Override 13 | public void start() { 14 | for (PlatformPlayer player : GrimAPI.INSTANCE.getPlatformPlayerFactory().getOnlinePlayers()) { 15 | User user = PacketEvents.getAPI().getPlayerManager().getUser(player.getNative()); 16 | GrimAPI.INSTANCE.getPlayerDataManager().exemptUsers.add(user); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/start/PacketLimiter.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.start; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.player.GrimPlayer; 5 | 6 | public class PacketLimiter implements StartableInitable { 7 | @Override 8 | public void start() { 9 | GrimAPI.INSTANCE.getScheduler().getAsyncScheduler().runAtFixedRate(GrimAPI.INSTANCE.getGrimPlugin(), () -> { 10 | for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { 11 | // Avoid concurrent reading on an integer as it's results are unknown 12 | player.cancelledPackets.set(0); 13 | } 14 | }, 1, 20); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/start/StartableInitable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.start; 2 | 3 | import ac.grim.grimac.manager.init.Initable; 4 | 5 | public interface StartableInitable extends Initable { 6 | void start(); 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/start/TAB.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.start; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.utils.anticheat.LogUtil; 5 | import ac.grim.grimac.utils.reflection.ViaVersionUtil; 6 | import com.github.retrooper.packetevents.PacketEvents; 7 | import com.github.retrooper.packetevents.manager.server.ServerVersion; 8 | 9 | public class TAB implements StartableInitable { 10 | 11 | @Override 12 | public void start() { 13 | if (GrimAPI.INSTANCE.getPluginManager().getPlugin("TAB") == null) return; 14 | if (!ViaVersionUtil.isAvailable()) return; 15 | // I don't know when team limits were changed, 1.13 is reasonable enough 16 | if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_13)) 17 | return; 18 | 19 | LogUtil.warn("GrimAC has detected that you have installed TAB with ViaVersion."); 20 | LogUtil.warn("Please note that currently, TAB is incompatible as it sends illegal packets to players using versions newer than your server version."); 21 | LogUtil.warn("You may be able to remedy this by setting `compensate-for-packetevents-bug` to true in the TAB config."); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/start/TickRunner.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.start; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.platform.api.Platform; 5 | import ac.grim.grimac.utils.anticheat.LogUtil; 6 | 7 | public class TickRunner implements StartableInitable { 8 | @Override 9 | public void start() { 10 | LogUtil.info("Registering tick schedulers..."); 11 | 12 | if (GrimAPI.INSTANCE.getPlatform() == Platform.FOLIA) { 13 | GrimAPI.INSTANCE.getScheduler().getAsyncScheduler().runAtFixedRate(GrimAPI.INSTANCE.getGrimPlugin(), () -> { 14 | GrimAPI.INSTANCE.getTickManager().tickSync(); 15 | GrimAPI.INSTANCE.getTickManager().tickAsync(); 16 | }, 1, 1); 17 | } else { 18 | GrimAPI.INSTANCE.getScheduler().getGlobalRegionScheduler().runAtFixedRate(GrimAPI.INSTANCE.getGrimPlugin(), () -> GrimAPI.INSTANCE.getTickManager().tickSync(), 0, 1); 19 | GrimAPI.INSTANCE.getScheduler().getAsyncScheduler().runAtFixedRate(GrimAPI.INSTANCE.getGrimPlugin(), () -> GrimAPI.INSTANCE.getTickManager().tickAsync(), 0, 1); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/start/ViaBackwardsManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.start; 2 | 3 | public class ViaBackwardsManager implements StartableInitable { 4 | @Override 5 | public void start() { 6 | System.setProperty("com.viaversion.handlePingsAsInvAcknowledgements", "true"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/stop/StoppableInitable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.stop; 2 | 3 | import ac.grim.grimac.manager.init.Initable; 4 | 5 | public interface StoppableInitable extends Initable { 6 | void stop(); 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/init/stop/TerminatePacketEvents.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.init.stop; 2 | 3 | import ac.grim.grimac.utils.anticheat.LogUtil; 4 | import com.github.retrooper.packetevents.PacketEvents; 5 | 6 | public class TerminatePacketEvents implements StoppableInitable { 7 | @Override 8 | public void stop() { 9 | LogUtil.info("Terminating PacketEvents..."); 10 | PacketEvents.getAPI().terminate(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/player/features/FeatureBuilder.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.player.features; 2 | 3 | import ac.grim.grimac.manager.player.features.types.GrimFeature; 4 | import ac.grim.grimac.utils.anticheat.LogUtil; 5 | import com.google.common.collect.ImmutableMap; 6 | 7 | import java.util.regex.Pattern; 8 | 9 | public class FeatureBuilder { 10 | 11 | private static final Pattern VALID = Pattern.compile("[a-zA-Z0-9_]{1,64}"); 12 | private final ImmutableMap.Builder mapBuilder = ImmutableMap.builder(); 13 | 14 | public void register(T feature) { 15 | if (!VALID.matcher(feature.getName()).matches()) { 16 | LogUtil.error("Invalid feature name: " + feature.getName()); 17 | return; 18 | } 19 | mapBuilder.put(feature.getName(), feature); 20 | } 21 | 22 | public ImmutableMap buildMap() { 23 | return mapBuilder.build(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/player/features/types/ExemptElytraFeature.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.player.features.types; 2 | 3 | import ac.grim.grimac.api.config.ConfigManager; 4 | import ac.grim.grimac.api.feature.FeatureState; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | 7 | public class ExemptElytraFeature extends GrimFeature { 8 | 9 | public ExemptElytraFeature() { 10 | super("ExemptElytra"); 11 | } 12 | 13 | @Override 14 | public void setState(GrimPlayer player, ConfigManager config, FeatureState state) { 15 | switch (state) { 16 | case ENABLED -> player.setExemptElytra(true); 17 | case DISABLED -> player.setExemptElytra(false); 18 | default -> player.setExemptElytra(isEnabledInConfig(player, config)); 19 | } 20 | } 21 | 22 | @Override 23 | public boolean isEnabled(GrimPlayer player) { 24 | return player.isExemptElytra(); 25 | } 26 | 27 | @Override 28 | public boolean isEnabledInConfig(GrimPlayer player, ConfigManager config) { 29 | return config.getBooleanElse("exempt-elytra", false); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/player/features/types/ExperimentalChecksFeature.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.player.features.types; 2 | 3 | import ac.grim.grimac.api.config.ConfigManager; 4 | import ac.grim.grimac.api.feature.FeatureState; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | 7 | public class ExperimentalChecksFeature extends GrimFeature { 8 | 9 | public ExperimentalChecksFeature() { 10 | super("ExperimentalChecks"); 11 | } 12 | 13 | @Override 14 | public void setState(GrimPlayer player, ConfigManager config, FeatureState state) { 15 | switch (state) { 16 | case ENABLED -> player.setExperimentalChecks(true); 17 | case DISABLED -> player.setExperimentalChecks(false); 18 | default -> player.setExperimentalChecks(isEnabledInConfig(player, config)); 19 | } 20 | } 21 | 22 | @Override 23 | public boolean isEnabled(GrimPlayer player) { 24 | return player.isExperimentalChecks(); 25 | } 26 | 27 | @Override 28 | public boolean isEnabledInConfig(GrimPlayer player, ConfigManager config) { 29 | return config.getBooleanElse("experimental-checks", false); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/player/features/types/GrimFeature.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.player.features.types; 2 | 3 | import ac.grim.grimac.api.config.ConfigManager; 4 | import ac.grim.grimac.api.feature.FeatureState; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import lombok.Getter; 7 | import lombok.RequiredArgsConstructor; 8 | 9 | @RequiredArgsConstructor 10 | @Getter 11 | public abstract class GrimFeature { 12 | 13 | private final String name; 14 | 15 | public abstract void setState(GrimPlayer player, ConfigManager config, FeatureState state); 16 | 17 | public abstract boolean isEnabled(GrimPlayer player); 18 | 19 | public abstract boolean isEnabledInConfig(GrimPlayer player, ConfigManager config); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/tick/Tickable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.tick; 2 | 3 | public interface Tickable { 4 | void tick(); 5 | } 6 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/tick/impl/ClearRecentlyUpdatedBlocks.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.tick.impl; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.manager.tick.Tickable; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | 7 | public class ClearRecentlyUpdatedBlocks implements Tickable { 8 | 9 | private static final int maxTickAge = 2; 10 | 11 | @Override 12 | public void tick() { 13 | for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { 14 | player.blockHistory.cleanup(GrimAPI.INSTANCE.getTickManager().currentTick - maxTickAge); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/tick/impl/ClientVersionSetter.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.tick.impl; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.manager.tick.Tickable; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import com.github.retrooper.packetevents.netty.channel.ChannelHelper; 7 | 8 | public class ClientVersionSetter implements Tickable { 9 | @Override 10 | public void tick() { 11 | for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { 12 | // channel was somehow closed without us getting a disconnect event 13 | if (!ChannelHelper.isOpen(player.user.getChannel())) { 14 | GrimAPI.INSTANCE.getPlayerDataManager().onDisconnect(player.user); 15 | continue; 16 | } 17 | 18 | player.pollData(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/tick/impl/ResetTick.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.tick.impl; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.manager.tick.Tickable; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | 7 | public class ResetTick implements Tickable { 8 | @Override 9 | public void tick() { 10 | for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { 11 | player.checkManager.getEntityReplication().tickStartTick(); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/tick/impl/TickInventory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.tick.impl; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.manager.tick.Tickable; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | 7 | public class TickInventory implements Tickable { 8 | @Override 9 | public void tick() { 10 | for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { 11 | player.getInventory().inventory.getInventoryStorage().tickWithBukkit(); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/violationdatabase/NoOpViolationDatabase.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.violationdatabase; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public final class NoOpViolationDatabase implements ViolationDatabase { 9 | public static final NoOpViolationDatabase INSTANCE = new NoOpViolationDatabase(); 10 | private NoOpViolationDatabase() {} 11 | 12 | @Override public void connect() {} 13 | @Override public void disconnect() {} 14 | @Override public void logAlert(GrimPlayer p, String v, String c, int vl) {} 15 | @Override public int getLogCount(UUID player) { return 0; } 16 | @Override public List getViolations(UUID p, int page, int lim) { return List.of(); } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/violationdatabase/Violation.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.violationdatabase; 2 | 3 | import lombok.Data; 4 | 5 | import java.sql.ResultSet; 6 | import java.sql.SQLException; 7 | import java.util.ArrayList; 8 | import java.util.Date; 9 | import java.util.List; 10 | import java.util.UUID; 11 | 12 | @Data 13 | public class Violation { 14 | 15 | private final String serverName; 16 | private final UUID playerUUID; 17 | private final String checkName; 18 | private final String verbose; 19 | private final int vl; 20 | private final Date createdAt; 21 | 22 | public static List fromResultSet(ResultSet resultSet) throws SQLException { 23 | List violations = new ArrayList<>(); 24 | while(resultSet.next()) { 25 | String server = resultSet.getString("server"); 26 | UUID player = UUID.fromString(resultSet.getString("uuid")); 27 | String checkName = resultSet.getString("check_name"); 28 | String verbose = resultSet.getString("verbose"); 29 | int vl = resultSet.getInt("vl"); 30 | Date createdAt = new Date(resultSet.getLong("created_at")); 31 | 32 | violations.add(new Violation(server, player, checkName, verbose, vl, createdAt)); 33 | } 34 | 35 | return violations; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/manager/violationdatabase/ViolationDatabase.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.manager.violationdatabase; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | 5 | import java.util.List; 6 | import java.util.UUID; 7 | 8 | public interface ViolationDatabase { 9 | 10 | void connect(); 11 | 12 | void logAlert(GrimPlayer player, String verbose, String checkName, int vls); 13 | 14 | int getLogCount(UUID player); 15 | 16 | List getViolations(UUID player, int page, int limit); 17 | 18 | void disconnect(); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/Platform.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api; 2 | 3 | public enum Platform { 4 | FABRIC, 5 | BUKKIT, 6 | FOLIA 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/PlatformPlugin.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api; 2 | 3 | public interface PlatformPlugin { 4 | boolean isEnabled(); 5 | 6 | String getName(); 7 | 8 | String getVersion(); 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/PlatformServer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api; 2 | 3 | import ac.grim.grimac.platform.api.sender.Sender; 4 | 5 | public interface PlatformServer { 6 | 7 | String getPlatformImplementationString(); 8 | 9 | void dispatchCommand(Sender sender, String command); 10 | 11 | Sender getConsoleSender(); 12 | 13 | void registerOutgoingPluginChannel(String name); 14 | 15 | double getTPS(); 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/command/AbstractPlayerSelectorParser.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.command; 2 | 3 | import org.incendo.cloud.context.CommandContext; 4 | import org.incendo.cloud.parser.ParserDescriptor; 5 | 6 | import java.util.concurrent.CompletableFuture; 7 | 8 | public abstract class AbstractPlayerSelectorParser { 9 | 10 | public abstract ParserDescriptor descriptor(); 11 | 12 | protected abstract ParserDescriptor getPlatformSpecificDescriptor(); 13 | 14 | protected abstract CompletableFuture adaptToCommonSelector(CommandContext context, Object platformSpecificSelector); 15 | 16 | // Helper method to create the ParserDescriptor 17 | protected ParserDescriptor createDescriptor() { 18 | return ParserDescriptor.of( 19 | getPlatformSpecificDescriptor().parser().mapSuccess(this::adaptToCommonSelector), 20 | PlayerSelector.class 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/command/PlayerSelector.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.command; 2 | 3 | import ac.grim.grimac.platform.api.sender.Sender; 4 | 5 | import java.util.Collection; 6 | 7 | public interface PlayerSelector { 8 | boolean isSingle(); 9 | 10 | Sender getSinglePlayer(); // Throws an exception if not a single selection 11 | 12 | Collection getPlayers(); 13 | 14 | String inputString(); 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/entity/GrimEntity.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.entity; 2 | 3 | import ac.grim.grimac.api.GrimIdentity; 4 | import ac.grim.grimac.platform.api.world.PlatformWorld; 5 | import ac.grim.grimac.utils.math.Location; 6 | import org.checkerframework.checker.nullness.qual.NonNull; 7 | 8 | import java.util.concurrent.CompletableFuture; 9 | 10 | public interface GrimEntity extends GrimIdentity { 11 | /** 12 | * Eject any passenger. 13 | * 14 | * @return True if there was a passenger. 15 | */ 16 | boolean eject(); 17 | 18 | CompletableFuture teleportAsync(Location location); 19 | 20 | @NonNull 21 | Object getNative(); 22 | 23 | boolean isDead(); 24 | 25 | PlatformWorld getWorld(); 26 | 27 | Location getLocation(); 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/manager/ItemResetHandler.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.manager; 2 | 3 | import ac.grim.grimac.platform.api.player.PlatformPlayer; 4 | import com.github.retrooper.packetevents.protocol.player.InteractionHand; 5 | import org.jetbrains.annotations.Contract; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public interface ItemResetHandler { 9 | void resetItemUsage(@Nullable PlatformPlayer player); 10 | @Contract("null -> null") 11 | @Nullable InteractionHand getItemUsageHand(@Nullable PlatformPlayer player); 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/manager/MessagePlaceHolderManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.manager; 2 | 3 | import ac.grim.grimac.platform.api.player.PlatformPlayer; 4 | import org.checkerframework.checker.nullness.qual.NonNull; 5 | import org.checkerframework.checker.nullness.qual.Nullable; 6 | 7 | public interface MessagePlaceHolderManager { 8 | @NonNull 9 | String replacePlaceholders(@Nullable PlatformPlayer player, @NonNull String string); 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/manager/ParserDescriptorFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.manager; 2 | 3 | import ac.grim.grimac.platform.api.command.PlayerSelector; 4 | import ac.grim.grimac.platform.api.sender.Sender; 5 | import org.incendo.cloud.parser.ParserDescriptor; 6 | 7 | public interface ParserDescriptorFactory { 8 | ParserDescriptor getSinglePlayer(); 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/manager/PlatformPluginManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.manager; 2 | 3 | import ac.grim.grimac.platform.api.PlatformPlugin; 4 | 5 | public interface PlatformPluginManager { 6 | 7 | PlatformPlugin[] getPlugins(); 8 | 9 | PlatformPlugin getPlugin(String pluginName); 10 | 11 | default boolean isPluginEnabled(String pluginName) { 12 | PlatformPlugin plugin = getPlugin(pluginName); 13 | return plugin != null && plugin.isEnabled(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/permissions/PermissionDefaultValue.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.permissions; 2 | 3 | /** 4 | * Represents the default value for a permission, used across platforms. 5 | * This enum provides a cross-platform abstraction for permission defaults, 6 | * mapping to platform-specific values (e.g., Bukkit's PermissionDefault, Fabric's boolean). 7 | */ 8 | public enum PermissionDefaultValue { 9 | /** 10 | * Permission defaults to true (granted by default). 11 | * - Bukkit: Maps to PermissionDefault.TRUE 12 | * - Fabric: Maps to true 13 | */ 14 | TRUE, 15 | 16 | /** 17 | * Permission defaults to false (denied by default). 18 | * - Bukkit: Maps to PermissionDefault.FALSE 19 | * - Fabric: Maps to false 20 | */ 21 | FALSE, 22 | 23 | /** 24 | * Permission defaults to requiring operator (op) status. 25 | * - Bukkit: Maps to PermissionDefault.OP 26 | * - Fabric: Maps to requiring op-permission-level 27 | */ 28 | OP, 29 | 30 | /** 31 | * Permission defaults to not requiring operator (op) status. 32 | * - Bukkit: Maps to PermissionDefault.NOT_OP 33 | * - Fabric: Maps to requiring < op-permission-level 34 | */ 35 | NOT_OP 36 | } 37 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/player/OfflinePlatformPlayer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.player; 2 | 3 | import ac.grim.grimac.api.GrimIdentity; 4 | 5 | public interface OfflinePlatformPlayer extends GrimIdentity { 6 | 7 | boolean isOnline(); 8 | 9 | String getName(); 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/player/PlatformInventory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.player; 2 | 3 | import com.github.retrooper.packetevents.protocol.item.ItemStack; 4 | 5 | public interface PlatformInventory { 6 | ItemStack getItemInHand(); 7 | 8 | ItemStack getItemInOffHand(); 9 | 10 | ItemStack getStack(int bukkitSlot, int vanillaSlot); 11 | 12 | ItemStack getHelmet(); 13 | 14 | ItemStack getChestplate(); 15 | 16 | ItemStack getLeggings(); 17 | 18 | ItemStack getBoots(); 19 | 20 | ItemStack[] getContents(); 21 | 22 | String getOpenInventoryKey(); 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/player/PlatformPlayerFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.player; 2 | 3 | import java.util.Collection; 4 | import java.util.UUID; 5 | 6 | public interface PlatformPlayerFactory { 7 | OfflinePlatformPlayer getOfflineFromUUID(UUID uuid); 8 | 9 | OfflinePlatformPlayer getOfflineFromName(String name); 10 | 11 | PlatformPlayer getFromName(String name); 12 | 13 | PlatformPlayer getFromUUID(UUID uuid); 14 | 15 | PlatformPlayer getFromNativePlayerType(Object playerObject); 16 | 17 | void invalidatePlayer(UUID uuid); 18 | 19 | Collection getOnlinePlayers(); 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/scheduler/TaskHandle.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of packetevents - https://github.com/retrooper/packetevents 3 | * Copyright (C) 2024 retrooper and contributors 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package ac.grim.grimac.platform.api.scheduler; 20 | 21 | public interface TaskHandle { 22 | 23 | boolean isSync(); 24 | 25 | boolean isCancelled(); 26 | 27 | void cancel(); 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/world/PlatformChunk.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.world; 2 | 3 | public interface PlatformChunk { 4 | int getBlockID(int x, int y, int z); 5 | } 6 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/platform/api/world/PlatformWorld.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.api.world; 2 | 3 | import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; 4 | import org.jetbrains.annotations.Nullable; 5 | 6 | import java.util.UUID; 7 | 8 | public interface PlatformWorld { 9 | boolean isChunkLoaded(int chunkX, int chunkZ); 10 | 11 | WrappedBlockState getBlockAt(int x, int y, int z); 12 | 13 | String getName(); 14 | 15 | @Nullable UUID getUID(); 16 | 17 | PlatformChunk getChunkAt(int currChunkX, int currChunkZ); 18 | 19 | boolean isLoaded(); 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/predictionengine/movementtick/MovementTickerCamel.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.predictionengine.movementtick; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.data.packetentity.PacketEntityCamel; 5 | 6 | public class MovementTickerCamel extends MovementTickerHorse { 7 | 8 | public MovementTickerCamel(GrimPlayer player) { 9 | super(player); 10 | } 11 | 12 | @Override 13 | public float getExtraSpeed() { 14 | PacketEntityCamel camel = (PacketEntityCamel) player.compensatedEntities.self.getRiding(); 15 | 16 | // If jumping... speed wouldn't apply after this 17 | // This engine was not designed for this edge case 18 | final boolean wantsToJump = player.vehicleData.horseJump > 0.0F && !player.vehicleData.horseJumping && player.lastOnGround; 19 | if (wantsToJump) return 0; 20 | 21 | return player.isSprinting && player.vehicleData.camelDashCooldown <= 0 && !camel.dashing ? 0.1f : 0.0f; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/predictionengine/movementtick/MovementTickerPig.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.predictionengine.movementtick; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.data.packetentity.PacketEntityRideable; 5 | import ac.grim.grimac.utils.math.Vector3dm; 6 | import com.github.retrooper.packetevents.protocol.attribute.Attributes; 7 | 8 | public class MovementTickerPig extends MovementTickerRideable { 9 | public MovementTickerPig(GrimPlayer player) { 10 | super(player); 11 | movementInput = new Vector3dm(0, 0, 1); 12 | } 13 | 14 | @Override 15 | public float getSteeringSpeed() { // Vanilla multiples by 0.225f 16 | PacketEntityRideable pig = (PacketEntityRideable) player.compensatedEntities.self.getRiding(); 17 | return (float) pig.getAttributeValue(Attributes.MOVEMENT_SPEED) * 0.225f; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/predictionengine/predictions/rideable/PredictionEngineRideableLava.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.predictionengine.predictions.rideable; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.predictionengine.predictions.PredictionEngineLava; 5 | import ac.grim.grimac.utils.data.VectorData; 6 | import ac.grim.grimac.utils.math.Vector3dm; 7 | 8 | import java.util.List; 9 | import java.util.Set; 10 | 11 | public class PredictionEngineRideableLava extends PredictionEngineLava { 12 | 13 | Vector3dm movementVector; 14 | 15 | public PredictionEngineRideableLava(Vector3dm movementVector) { 16 | this.movementVector = movementVector; 17 | } 18 | 19 | @Override 20 | public void addJumpsToPossibilities(GrimPlayer player, Set existingVelocities) { 21 | PredictionEngineRideableUtils.handleJumps(player, existingVelocities); 22 | } 23 | 24 | @Override 25 | public List applyInputsToVelocityPossibilities(GrimPlayer player, Set possibleVectors, float speed) { 26 | return PredictionEngineRideableUtils.applyInputsToVelocityPossibilities(movementVector, player, possibleVectors, speed); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/predictionengine/predictions/rideable/PredictionEngineRideableNormal.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.predictionengine.predictions.rideable; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.predictionengine.predictions.PredictionEngineNormal; 5 | import ac.grim.grimac.utils.data.VectorData; 6 | import ac.grim.grimac.utils.math.Vector3dm; 7 | 8 | import java.util.List; 9 | import java.util.Set; 10 | 11 | public class PredictionEngineRideableNormal extends PredictionEngineNormal { 12 | 13 | Vector3dm movementVector; 14 | 15 | public PredictionEngineRideableNormal(Vector3dm movementVector) { 16 | this.movementVector = movementVector; 17 | } 18 | 19 | @Override 20 | public void addJumpsToPossibilities(GrimPlayer player, Set existingVelocities) { 21 | PredictionEngineRideableUtils.handleJumps(player, existingVelocities); 22 | } 23 | 24 | @Override 25 | public List applyInputsToVelocityPossibilities(GrimPlayer player, Set possibleVectors, float speed) { 26 | return PredictionEngineRideableUtils.applyInputsToVelocityPossibilities(movementVector, player, possibleVectors, speed); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/predictionengine/predictions/rideable/PredictionEngineRideableWater.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.predictionengine.predictions.rideable; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.predictionengine.predictions.PredictionEngineWater; 5 | import ac.grim.grimac.utils.data.VectorData; 6 | import ac.grim.grimac.utils.math.Vector3dm; 7 | 8 | import java.util.List; 9 | import java.util.Set; 10 | 11 | public class PredictionEngineRideableWater extends PredictionEngineWater { 12 | 13 | Vector3dm movementVector; 14 | 15 | public PredictionEngineRideableWater(Vector3dm movementVector) { 16 | this.movementVector = movementVector; 17 | } 18 | 19 | @Override 20 | public void addJumpsToPossibilities(GrimPlayer player, Set existingVelocities) { 21 | PredictionEngineRideableUtils.handleJumps(player, existingVelocities); 22 | } 23 | 24 | @Override 25 | public List applyInputsToVelocityPossibilities(GrimPlayer player, Set possibleVectors, float speed) { 26 | return PredictionEngineRideableUtils.applyInputsToVelocityPossibilities(movementVector, player, possibleVectors, speed); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/predictionengine/predictions/rideable/PredictionEngineRideableWaterLegacy.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.predictionengine.predictions.rideable; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.predictionengine.predictions.PredictionEngineWaterLegacy; 5 | import ac.grim.grimac.utils.data.VectorData; 6 | import ac.grim.grimac.utils.math.Vector3dm; 7 | 8 | import java.util.List; 9 | import java.util.Set; 10 | 11 | public class PredictionEngineRideableWaterLegacy extends PredictionEngineWaterLegacy { 12 | Vector3dm movementVector; 13 | 14 | public PredictionEngineRideableWaterLegacy(Vector3dm movementVector) { 15 | this.movementVector = movementVector; 16 | } 17 | 18 | @Override 19 | public void addJumpsToPossibilities(GrimPlayer player, Set existingVelocities) { 20 | PredictionEngineRideableUtils.handleJumps(player, existingVelocities); 21 | } 22 | 23 | @Override 24 | public List applyInputsToVelocityPossibilities(GrimPlayer player, Set possibleVectors, float speed) { 25 | return PredictionEngineRideableUtils.applyInputsToVelocityPossibilities(movementVector, player, possibleVectors, speed); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/anticheat/Version.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.anticheat; 2 | 3 | import com.github.retrooper.packetevents.PacketEvents; 4 | import com.github.retrooper.packetevents.manager.server.ServerVersion; 5 | 6 | public class Version { 7 | private static final boolean IS_FLAT = PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_13); 8 | 9 | public static boolean isFlat() { 10 | return IS_FLAT; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/anticheat/update/PositionUpdate.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.anticheat.update; 2 | 3 | import ac.grim.grimac.utils.data.SetBackData; 4 | import ac.grim.grimac.utils.data.TeleportData; 5 | import com.github.retrooper.packetevents.util.Vector3d; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | import lombok.Setter; 9 | 10 | @AllArgsConstructor 11 | @Getter 12 | @Setter 13 | public final class PositionUpdate { 14 | private final Vector3d from, to; 15 | private final boolean onGround; 16 | private final SetBackData setback; 17 | private final TeleportData teleportData; 18 | private boolean isTeleport; 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/anticheat/update/PredictionComplete.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.anticheat.update; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class PredictionComplete { 9 | private double offset; 10 | private PositionUpdate data; 11 | private boolean checked; 12 | private int identifier; 13 | 14 | public PredictionComplete(double offset, PositionUpdate update, boolean checked) { 15 | this.offset = offset; 16 | this.data = update; 17 | this.checked = checked; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/anticheat/update/RotationUpdate.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.anticheat.update; 2 | 3 | import ac.grim.grimac.checks.impl.aim.processor.AimProcessor; 4 | import ac.grim.grimac.utils.data.HeadRotation; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | public final class RotationUpdate { 11 | private HeadRotation from, to; 12 | private AimProcessor processor; 13 | private float deltaYRot, deltaXRot; 14 | private boolean isCinematic; 15 | private double sensitivityX, sensitivityY; 16 | 17 | public RotationUpdate(HeadRotation from, HeadRotation to, float deltaXRot, float deltaYRot) { 18 | this.from = from; 19 | this.to = to; 20 | this.deltaXRot = deltaXRot; 21 | this.deltaYRot = deltaYRot; 22 | } 23 | 24 | public float getDeltaXRotABS() { 25 | return Math.abs(deltaXRot); 26 | } 27 | 28 | public float getDeltaYRotABS() { 29 | return Math.abs(deltaYRot); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/anticheat/update/VehiclePositionUpdate.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.anticheat.update; 2 | 3 | import com.github.retrooper.packetevents.util.Vector3d; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @AllArgsConstructor 9 | @Getter 10 | @Setter 11 | public class VehiclePositionUpdate { 12 | private final Vector3d from, to; 13 | private final float xRot, yRot; 14 | private final boolean isTeleport; 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/blockplace/BlockPlaceFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.blockplace; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.anticheat.update.BlockPlace; 5 | 6 | public interface BlockPlaceFactory { 7 | void applyBlockPlaceToWorld(GrimPlayer player, BlockPlace place); 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/change/BlockModification.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.change; 2 | 3 | import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; 4 | import com.github.retrooper.packetevents.util.Vector3i; 5 | 6 | public record BlockModification(WrappedBlockState oldBlockContents, 7 | WrappedBlockState newBlockContents, 8 | Vector3i location, int tick, 9 | Cause cause) { 10 | 11 | @Override 12 | public String toString() { 13 | return String.format( 14 | "BlockModification{location=%s, old=%s, new=%s, tick=%d, cause=%s}", 15 | location, oldBlockContents, newBlockContents, tick, cause 16 | ); 17 | } 18 | 19 | public enum Cause { 20 | START_DIGGING, 21 | APPLY_BLOCK_CHANGES, 22 | HANDLE_NETTY_SYNC_TRANSACTION, 23 | OTHER 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/chat/ChatUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.chat; 2 | 3 | import org.jetbrains.annotations.Contract; 4 | import org.jetbrains.annotations.NotNull; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | import java.util.regex.Pattern; 8 | 9 | public class ChatUtil { 10 | 11 | private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + '§' + "[0-9A-FK-ORX]"); 12 | 13 | public static @NotNull String translateAlternateColorCodes(char altColorChar, @NotNull String textToTranslate) { 14 | char[] b = textToTranslate.toCharArray(); 15 | 16 | for (int i = 0; i < b.length - 1; ++i) { 17 | if (b[i] == altColorChar && "0123456789AaBbCcDdEeFfKkLlMmNnOoRrXx".indexOf(b[i + 1]) > -1) { 18 | b[i] = 167; 19 | b[i + 1] = Character.toLowerCase(b[i + 1]); 20 | } 21 | } 22 | 23 | return new String(b); 24 | } 25 | 26 | @Contract("!null -> !null; null -> null") 27 | public static @Nullable String stripColor(@Nullable String input) { 28 | return input == null ? null : STRIP_COLOR_PATTERN.matcher(input).replaceAll(""); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/chunks/Column.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.chunks; 2 | 3 | 4 | import com.github.retrooper.packetevents.protocol.world.chunk.BaseChunk; 5 | 6 | public record Column(int x, int z, BaseChunk[] chunks, int transaction) { 7 | 8 | // This ability was removed in 1.17 because of the extended world height 9 | // Therefore, the size of the chunks are ALWAYS 16! 10 | public void mergeChunks(BaseChunk[] toMerge) { 11 | for (int i = 0; i < 16; i++) { 12 | if (toMerge[i] != null) chunks[i] = toMerge[i]; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/AxisSelect.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions; 2 | 3 | import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox; 4 | 5 | public interface AxisSelect { 6 | SimpleCollisionBox modify(SimpleCollisionBox box); 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/blocks/PistonBaseCollision.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions.blocks; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.collisions.datatypes.CollisionBox; 5 | import ac.grim.grimac.utils.collisions.datatypes.CollisionFactory; 6 | import ac.grim.grimac.utils.collisions.datatypes.HexCollisionBox; 7 | import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox; 8 | import com.github.retrooper.packetevents.protocol.player.ClientVersion; 9 | import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; 10 | 11 | public class PistonBaseCollision implements CollisionFactory { 12 | 13 | @Override 14 | public CollisionBox fetch(GrimPlayer player, ClientVersion version, WrappedBlockState block, int x, int y, int z) { 15 | if (!block.isExtended()) return new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true); 16 | 17 | return switch (block.getFacing()) { 18 | case UP -> new HexCollisionBox(0, 0, 0, 16, 12, 16); 19 | case NORTH -> new HexCollisionBox(0, 0, 4, 16, 16, 16); 20 | case SOUTH -> new HexCollisionBox(0, 0, 0, 16, 16, 12); 21 | case WEST -> new HexCollisionBox(4, 0, 0, 16, 16, 16); 22 | case EAST -> new HexCollisionBox(0, 0, 0, 12, 16, 16); 23 | default -> new HexCollisionBox(0, 4, 0, 16, 16, 16); 24 | }; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/datatypes/CollisionBox.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions.datatypes; 2 | 3 | import com.github.retrooper.packetevents.protocol.world.BlockFace; 4 | 5 | import java.util.List; 6 | 7 | public interface CollisionBox { 8 | CollisionBox union(SimpleCollisionBox other); 9 | 10 | boolean isCollided(SimpleCollisionBox other); 11 | 12 | boolean isIntersected(SimpleCollisionBox other); 13 | 14 | CollisionBox copy(); 15 | 16 | CollisionBox offset(double x, double y, double z); 17 | 18 | void downCast(List list); 19 | 20 | /** 21 | * @param list - A list that will contain all of the SimpleCollisionBoxes representing the CollisionBox. 22 | * @return - int representing the size of elements in the array that belong to this downcast. 23 | * The contents of elements starting from list[size] and above are undefined and should not be iterated over. 24 | */ 25 | int downCast(SimpleCollisionBox[] list); 26 | 27 | boolean isNull(); 28 | 29 | boolean isFullBlock(); 30 | 31 | default boolean isSideFullBlock(BlockFace axis) { 32 | return isFullBlock(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/datatypes/CollisionFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions.datatypes; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.player.ClientVersion; 5 | import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; 6 | 7 | public interface CollisionFactory { 8 | CollisionBox fetch(GrimPlayer player, ClientVersion version, WrappedBlockState block, int x, int y, int z); 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/datatypes/HexCollisionBox.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions.datatypes; 2 | 3 | public class HexCollisionBox extends SimpleCollisionBox { 4 | 5 | /** 6 | * Creates a box defined by two points in 3d space; used to represent hitboxes and collision boxes. 7 | * Mojang's block hitbox values are all based on chunks, so they're stored in game as 16 * the actual size 8 | * When copying block hitbox values, it may be easier to simple copy the multiplied values and use this class 9 | * If your min/max values are < 1 you should probably check out {@link SimpleCollisionBox} 10 | * 11 | * @param minX 16 * x position of first corner 12 | * @param minY 16 * y position of first corner 13 | * @param minZ 16 * z position of first corner 14 | * @param maxX 16 * x position of second corner 15 | * @param maxY 16 * y position of second corner 16 | * @param maxZ 16 * z position of second corner 17 | */ 18 | public HexCollisionBox(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { 19 | this.minX = minX / 16d; 20 | this.minY = minY / 16d; 21 | this.minZ = minZ / 16d; 22 | this.maxX = maxX / 16d; 23 | this.maxY = maxY / 16d; 24 | this.maxZ = maxZ / 16d; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/datatypes/HexOffsetCollisionBox.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions.datatypes; 2 | 3 | import com.github.retrooper.packetevents.protocol.world.states.type.StateType; 4 | 5 | // Exists for the same reason as HexCollisionBox but for offset blocks; read comments there if unsure 6 | public class HexOffsetCollisionBox extends OffsetCollisionBox { 7 | public HexOffsetCollisionBox(StateType block, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { 8 | super(block, minX / 16d, minY / 16d, minZ / 16d, maxX / 16d, maxY / 16d, maxZ / 16d); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/datatypes/HitBoxFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions.datatypes; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.player.ClientVersion; 5 | import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; 6 | import com.github.retrooper.packetevents.protocol.world.states.type.StateType; 7 | 8 | public interface HitBoxFactory { 9 | CollisionBox fetch(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState block, boolean isTargetBlock, int x, int y, int z); 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/collisions/datatypes/NoCollisionBox.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.collisions.datatypes; 2 | 3 | import java.util.List; 4 | 5 | public class NoCollisionBox implements CollisionBox { 6 | 7 | public static final NoCollisionBox INSTANCE = new NoCollisionBox(); 8 | 9 | private NoCollisionBox() { 10 | } 11 | 12 | @Override 13 | public CollisionBox union(SimpleCollisionBox other) { 14 | return other; 15 | } 16 | 17 | @Override 18 | public boolean isCollided(SimpleCollisionBox other) { 19 | return false; 20 | } 21 | 22 | @Override 23 | public boolean isIntersected(SimpleCollisionBox other) { 24 | return false; 25 | } 26 | 27 | @Override 28 | public CollisionBox offset(double x, double y, double z) { 29 | return this; 30 | } 31 | 32 | @Override 33 | public void downCast(List list) { /**/ } 34 | 35 | @Override 36 | public int downCast(SimpleCollisionBox[] list) { 37 | return 0; 38 | } 39 | 40 | @Override 41 | public boolean isNull() { 42 | return true; 43 | } 44 | 45 | @Override 46 | public boolean isFullBlock() { 47 | return false; 48 | } 49 | 50 | @Override 51 | public CollisionBox copy() { 52 | return this; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/common/ConfigReloadObserver.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.common; 2 | 3 | 4 | import ac.grim.grimac.api.config.ConfigManager; 5 | 6 | public interface ConfigReloadObserver { 7 | 8 | void onReload(ConfigManager config); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/BlockHitData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.utils.math.Vector3dm; 4 | import com.github.retrooper.packetevents.protocol.world.BlockFace; 5 | import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; 6 | import com.github.retrooper.packetevents.util.Vector3d; 7 | import com.github.retrooper.packetevents.util.Vector3i; 8 | import lombok.Getter; 9 | import lombok.ToString; 10 | 11 | @Getter 12 | @ToString 13 | public class BlockHitData extends HitData { 14 | Vector3i position; 15 | WrappedBlockState state; 16 | BlockFace closestDirection; 17 | // public Boolean success; 18 | 19 | public BlockHitData(Vector3i position, Vector3dm blockHitLocation, BlockFace closestDirection, WrappedBlockState state 20 | // , Boolean success 21 | ) { 22 | super(blockHitLocation); 23 | this.position = position; 24 | this.closestDirection = closestDirection; 25 | this.state = state; 26 | // this.success = success; 27 | } 28 | 29 | public Vector3d getRelativeBlockHitLocation() { 30 | return new Vector3d(blockHitLocation.getX() - position.getX(), blockHitLocation.getY() - position.getY(), blockHitLocation.getZ() - position.getZ()); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/BlockPlaceSnapshot.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import com.github.retrooper.packetevents.wrapper.PacketWrapper; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | public class BlockPlaceSnapshot { 10 | PacketWrapper wrapper; 11 | boolean sneaking; 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/BlockPrediction.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import com.github.retrooper.packetevents.util.Vector3d; 4 | import com.github.retrooper.packetevents.util.Vector3i; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | 9 | import java.util.List; 10 | 11 | @AllArgsConstructor 12 | @Getter 13 | @Setter 14 | public class BlockPrediction { 15 | List forBlockUpdate; 16 | Vector3i blockPosition; 17 | int originalBlockId; 18 | Vector3d playerPosition; 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/CooldownData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | @AllArgsConstructor 8 | @Getter 9 | @Setter 10 | public class CooldownData { 11 | int ticksRemaining; 12 | int transaction; 13 | 14 | public void tick() { 15 | ticksRemaining--; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/EntityHitData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.utils.data.packetentity.PacketEntity; 4 | import ac.grim.grimac.utils.math.Vector3dm; 5 | import lombok.Getter; 6 | import lombok.ToString; 7 | 8 | @Getter 9 | @ToString 10 | public class EntityHitData extends HitData { 11 | private final PacketEntity entity; 12 | 13 | public EntityHitData(PacketEntity packetEntity) { 14 | this(packetEntity, new Vector3dm(packetEntity.trackedServerPosition.getPos().x, 15 | packetEntity.trackedServerPosition.getPos().y, 16 | packetEntity.trackedServerPosition.getPos().z)); 17 | } 18 | 19 | public EntityHitData(PacketEntity packetEntity, Vector3dm intersectionPoint) { 20 | super(intersectionPoint); // Use actual intersection point 21 | this.entity = packetEntity; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/HeadRotation.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class HeadRotation { 9 | float yaw, pitch; 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/HitData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.utils.math.Vector3dm; 4 | 5 | public class HitData { 6 | Vector3dm blockHitLocation; 7 | 8 | public HitData(Vector3dm blockHitLocation) { 9 | this.blockHitLocation = blockHitLocation; 10 | } 11 | 12 | public ac.grim.grimac.utils.math.Vector3dm getBlockHitLocation() { 13 | return this.blockHitLocation; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/KnownInput.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | public record KnownInput(boolean forward, boolean backward, boolean left, boolean right, 4 | boolean jump, boolean shift, boolean sprint) { 5 | } 6 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/LastInstance.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | 5 | public class LastInstance { 6 | int lastInstance = 100; 7 | 8 | public LastInstance(GrimPlayer player) { 9 | player.lastInstanceManager.addInstance(this); 10 | } 11 | 12 | public boolean hasOccurredSince(int time) { 13 | return lastInstance <= time; 14 | } 15 | 16 | public void reset() { 17 | lastInstance = 0; 18 | } 19 | 20 | public void tick() { 21 | // Don't overflow (a VERY long timer attack or a player playing for days could cause this to overflow) 22 | // The CPU can predict this branch, so it's only a few cycles. 23 | if (lastInstance == Integer.MAX_VALUE) lastInstance = 100; 24 | lastInstance++; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/MainSupportingBlockData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import com.github.retrooper.packetevents.util.Vector3i; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | public class MainSupportingBlockData { 11 | @Nullable 12 | Vector3i blockPos; 13 | boolean onGround; 14 | 15 | public boolean lastOnGroundAndNoBlock() { 16 | return blockPos == null && onGround; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/Pair.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of packetevents - https://github.com/retrooper/packetevents 3 | * Copyright (C) 2021 retrooper and contributors 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package ac.grim.grimac.utils.data; 20 | 21 | public record Pair(A first, B second) { 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/PistonTemplate.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox; 4 | import com.github.retrooper.packetevents.protocol.world.BlockFace; 5 | 6 | import java.util.List; 7 | 8 | public record PistonTemplate(BlockFace dir, 9 | List boxes, 10 | boolean push, boolean slime, boolean honey) { 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/PlayerPistonData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | 4 | 5 | public class PlayerPistonData { 6 | public final PistonTemplate pistonTemplate; 7 | public final int lastTransactionSent; 8 | 9 | // Calculate if the player has no-push, and when to end the possibility of applying piston 10 | int ticksOfPistonBeingAlive = 0; 11 | 12 | public PlayerPistonData(PistonTemplate playerPistonData, int lastTransactionSent) { 13 | this.pistonTemplate = playerPistonData; 14 | this.lastTransactionSent = lastTransactionSent; 15 | } 16 | 17 | // We don't know when the piston has applied, or what stage of pushing it is on 18 | // Therefore, we need to use what we have - the number of movement packets. 19 | // 10 is a very cautious number 20 | public boolean tickIfGuaranteedFinished() { 21 | return ++ticksOfPistonBeingAlive >= 10; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/RotationData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import lombok.EqualsAndHashCode; 4 | import lombok.Getter; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.ToString; 7 | import org.jetbrains.annotations.Contract; 8 | 9 | @Getter 10 | @RequiredArgsConstructor 11 | @EqualsAndHashCode 12 | @ToString 13 | public final class RotationData { 14 | private final float yaw; 15 | private final float pitch; 16 | private final int transaction; 17 | private boolean isAccepted; 18 | 19 | @Contract(mutates = "this") 20 | public void accept() { 21 | this.isAccepted = true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/SetBackData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.utils.math.Vector3dm; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import lombok.ToString; 7 | 8 | @Getter 9 | @Setter 10 | @ToString 11 | public class SetBackData { 12 | TeleportData teleportData; 13 | float xRot, yRot; 14 | Vector3dm velocity; 15 | boolean vehicle; 16 | boolean isComplete = false; 17 | // TODO: Rethink when we block movements for teleports, perhaps after 10 ticks or 5 blocks? 18 | boolean isPlugin = false; 19 | int ticksComplete = 0; 20 | 21 | public SetBackData(TeleportData teleportData, float xRot, float yRot, Vector3dm velocity, boolean vehicle, boolean isPlugin) { 22 | this.teleportData = teleportData; 23 | this.xRot = xRot; 24 | this.yRot = yRot; 25 | this.velocity = velocity; 26 | this.vehicle = vehicle; 27 | this.isPlugin = isPlugin; 28 | } 29 | 30 | public void tick() { 31 | if (isComplete) ticksComplete++; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/TeleportAcceptData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class TeleportAcceptData { 9 | boolean isTeleport; 10 | SetBackData setback; 11 | TeleportData teleportData; 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/TrackerData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class TrackerData { 8 | private double x, y, z; 9 | private float xRot, yRot; 10 | private EntityType entityType; 11 | private int lastTransactionHung; 12 | private int legacyPointEightMountedUpon; 13 | 14 | public TrackerData(double x, double y, double z, float xRot, float yRot, EntityType entityType, int lastTransactionHung) { 15 | this.x = x; 16 | this.y = y; 17 | this.z = z; 18 | this.xRot = xRot; 19 | this.yRot = yRot; 20 | this.entityType = entityType; 21 | this.lastTransactionHung = lastTransactionHung; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/VehicleData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.utils.enums.BoatEntityStatus; 4 | import com.github.retrooper.packetevents.util.Vector3d; 5 | 6 | import java.util.concurrent.ConcurrentLinkedQueue; 7 | 8 | public class VehicleData { 9 | public boolean boatUnderwater = false; 10 | public double lastYd; 11 | public double midTickY; 12 | public float landFriction; 13 | public BoatEntityStatus status; 14 | public BoatEntityStatus oldStatus; 15 | public double waterLevel; 16 | public float deltaRotation; 17 | public float nextVehicleHorizontal = 0f; 18 | public float nextVehicleForward = 0f; 19 | public float vehicleHorizontal = 0f; 20 | public float vehicleForward = 0f; 21 | public boolean lastDummy = false; 22 | public boolean wasVehicleSwitch = false; 23 | public ConcurrentLinkedQueue> vehicleTeleports = new ConcurrentLinkedQueue<>(); 24 | public float nextHorseJump = 0; 25 | public float horseJump = 0; 26 | public boolean horseJumping = false; 27 | public int camelDashCooldown; 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/VelocityData.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data; 2 | 3 | import ac.grim.grimac.utils.math.Vector3dm; 4 | 5 | public class VelocityData { 6 | public final Vector3dm vector; 7 | public final int entityID; 8 | public final int transaction; 9 | public double offset = Integer.MAX_VALUE; 10 | public boolean isSetback; 11 | 12 | public VelocityData(int entityID, int transaction, boolean isSetback, Vector3dm vector) { 13 | this.entityID = entityID; 14 | this.vector = vector; 15 | this.transaction = transaction; 16 | this.isSetback = isSetback; 17 | } 18 | 19 | // First bread last tick -> Required this tick = don't require kb twice 20 | public VelocityData(int entityID, int transaction, Vector3dm vector, boolean isSetback, double offset) { 21 | this.entityID = entityID; 22 | this.vector = vector; 23 | this.transaction = transaction; 24 | this.isSetback = isSetback; 25 | this.offset = offset; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityArmorStand.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | 6 | import java.util.UUID; 7 | 8 | public class PacketEntityArmorStand extends PacketEntity { 9 | 10 | public boolean isMarker = false; 11 | 12 | public PacketEntityArmorStand(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z, int extraData) { 13 | super(player, uuid, type, x, y, z); 14 | } 15 | 16 | @Override 17 | public boolean canHit() { 18 | return !isMarker && super.canHit(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityCamel.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.attribute.Attributes; 5 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 6 | 7 | import java.util.UUID; 8 | 9 | public class PacketEntityCamel extends PacketEntityHorse { 10 | 11 | public boolean dashing = false; 12 | 13 | public PacketEntityCamel(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z, float xRot) { 14 | super(player, uuid, type, x, y, z, xRot); 15 | 16 | setAttribute(Attributes.JUMP_STRENGTH, 0.42f); 17 | setAttribute(Attributes.MOVEMENT_SPEED, 0.09f); 18 | setAttribute(Attributes.STEP_HEIGHT, 1.5f); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityGuardian.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | 6 | import java.util.UUID; 7 | 8 | public class PacketEntityGuardian extends PacketEntity { 9 | // this is only actually stored as a field in legacy versions (1.8 - 1.10.2) 10 | // in newer versions Elder Guardians are separate entities, we use this field regardless for simplicity 11 | public boolean isElder; 12 | 13 | public PacketEntityGuardian(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z, boolean isElder) { 14 | super(player, uuid, type, x, y, z); 15 | this.isElder = isElder; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityHook.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | 6 | import java.util.UUID; 7 | 8 | public class PacketEntityHook extends PacketEntityUnHittable { 9 | public int owner; 10 | public int attached = -1; 11 | 12 | public PacketEntityHook(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z, int owner) { 13 | super(player, uuid, type, x, y, z); 14 | this.owner = owner; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityPainting.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; 5 | import com.github.retrooper.packetevents.protocol.world.Direction; 6 | import lombok.Getter; 7 | 8 | import java.util.UUID; 9 | 10 | @Getter 11 | public class PacketEntityPainting extends PacketEntity { 12 | 13 | private final Direction direction; 14 | 15 | public PacketEntityPainting(GrimPlayer player, UUID uuid, double x, double y, double z, Direction direction) { 16 | super(player, uuid, EntityTypes.PAINTING, x, y, z); 17 | this.direction = direction; 18 | } 19 | 20 | // This is incorrect, temporary measure to exempt paintings from HitboxEntity 21 | // Will properly model later 22 | @Override 23 | public boolean canHit() { 24 | return false; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityRideable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.data.attribute.ValuedAttribute; 5 | import com.github.retrooper.packetevents.protocol.attribute.Attributes; 6 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 7 | 8 | import java.util.UUID; 9 | 10 | public class PacketEntityRideable extends PacketEntity { 11 | 12 | public boolean hasSaddle = false; 13 | public int boostTimeMax = 0; 14 | public int currentBoostTime = 0; 15 | 16 | public PacketEntityRideable(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z) { 17 | super(player, uuid, type, x, y, z); 18 | setAttribute(Attributes.STEP_HEIGHT, 1.0f); 19 | trackAttribute(ValuedAttribute.ranged(Attributes.MOVEMENT_SPEED, 0.1f, 0, 1024)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityShulker.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | import com.github.retrooper.packetevents.protocol.world.BlockFace; 6 | 7 | import java.util.UUID; 8 | 9 | public class PacketEntityShulker extends PacketEntity { 10 | public BlockFace facing = BlockFace.DOWN; 11 | 12 | public PacketEntityShulker(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z) { 13 | super(player, uuid, type, x, y, z); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntitySizeable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | 6 | import java.util.UUID; 7 | 8 | public class PacketEntitySizeable extends PacketEntity { 9 | // It appears in modern versions (oldest tested was 1.16.5) 10 | // that no entity metadata is sent for a slime when {Size: 0} (which actually corresponds to size = 1, the smallest slime in vanilla) 11 | 12 | // Previously to support entity metadata being sent after spawn, we assumed max size of vanilla slime 13 | // as the default size; I'm not sure if we still need to do this. Will change behaviour if issues reported 14 | public int size = 1; 15 | 16 | public PacketEntitySizeable(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z) { 17 | super(player, uuid, type, x, y, z); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityStrider.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | 6 | import java.util.UUID; 7 | 8 | public class PacketEntityStrider extends PacketEntityRideable { 9 | public boolean isShaking = false; 10 | 11 | public PacketEntityStrider(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z) { 12 | super(player, uuid, type, x, y, z); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityTrackXRot.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | 6 | import java.util.UUID; 7 | 8 | // We use simple interpolation here to be "close enough" 9 | public class PacketEntityTrackXRot extends PacketEntity { 10 | public float packetYaw; 11 | public float interpYaw; 12 | public int steps = 0; 13 | 14 | public PacketEntityTrackXRot(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z, float xRot) { 15 | super(player, uuid, type, x, y, z); 16 | this.packetYaw = xRot; 17 | this.interpYaw = xRot; 18 | } 19 | 20 | @Override 21 | public void onMovement(boolean highBound) { 22 | super.onMovement(highBound); 23 | if (steps > 0) { 24 | interpYaw = interpYaw + ((packetYaw - interpYaw) / steps--); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/PacketEntityUnHittable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import com.github.retrooper.packetevents.protocol.entity.type.EntityType; 5 | import java.util.UUID; 6 | 7 | public class PacketEntityUnHittable extends PacketEntity { 8 | 9 | public PacketEntityUnHittable(GrimPlayer player, UUID uuid, EntityType type, double x, double y, double z) { 10 | super(player, uuid, type, x, y, z); 11 | } 12 | 13 | @Override 14 | public boolean canHit() { 15 | return false; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/dragon/DragonPart.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity.dragon; 2 | 3 | public enum DragonPart { 4 | HEAD, 5 | NECK, 6 | BODY, 7 | TAIL, 8 | WING 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/data/packetentity/dragon/PacketEntityEnderDragonPart.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.data.packetentity.dragon; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.data.packetentity.PacketEntity; 5 | import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; 6 | 7 | 8 | public final class PacketEntityEnderDragonPart extends PacketEntity { 9 | 10 | private final DragonPart part; 11 | private final float width, height; 12 | 13 | public PacketEntityEnderDragonPart(GrimPlayer player, DragonPart part, double x, double y, double z, float width, float height) { 14 | super(player, null, EntityTypes.ENDER_DRAGON, x, y, z); 15 | this.part = part; 16 | this.width = width; 17 | this.height = height; 18 | } 19 | 20 | public float getWidth() { 21 | return width; 22 | } 23 | 24 | public float getHeight() { 25 | return height; 26 | } 27 | 28 | public DragonPart getPart() { 29 | return part; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/enums/BoatEntityStatus.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.enums; 2 | 3 | public enum BoatEntityStatus { 4 | IN_WATER, 5 | UNDER_WATER, 6 | UNDER_FLOWING_WATER, 7 | ON_LAND, 8 | IN_AIR 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/enums/FluidTag.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.enums; 2 | 3 | public enum FluidTag { 4 | LAVA, 5 | WATER 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/enums/Pose.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.enums; 2 | 3 | public enum Pose { 4 | STANDING(0.6f, 1.8f, 1.62f), 5 | FALL_FLYING(0.6f, 0.6f, 0.4f), 6 | SLEEPING(0.2f, 0.2f, 0.2f), 7 | SWIMMING(0.6f, 0.6f, 0.4f), 8 | SPIN_ATTACK(0.6f, 0.6f, 0.4f), 9 | CROUCHING(0.6f, 1.5f, 1.27f), 10 | DYING(0.2f, 0.2f, 0.2f), 11 | 12 | // Non-player poses 13 | NINE_CROUCHING(0.6f, 1.65f, 1.54f), // 1.9-1.13 clients have a slightly different crouching hitbox 14 | LONG_JUMPING(0.6f, 1.8f, 1.54f); // DUMMY (players can't have this pose) 15 | 16 | public final float width; 17 | public final float height; 18 | public final float eyeHeight; 19 | 20 | Pose(float width, float height, float eyeHeight) { 21 | this.width = width; 22 | this.height = height; 23 | this.eyeHeight = eyeHeight; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/BrewingHelper.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory; 2 | 3 | import com.github.retrooper.packetevents.protocol.item.type.ItemType; 4 | import com.github.retrooper.packetevents.protocol.item.type.ItemTypes; 5 | 6 | public class BrewingHelper { 7 | public static boolean isBaseModifier(ItemType type) { 8 | return ItemTypes.NETHER_WART.equals(type) || ItemTypes.REDSTONE.equals(type) || ItemTypes.GLOWSTONE_DUST.equals(type) 9 | || ItemTypes.FERMENTED_SPIDER_EYE.equals(type) || ItemTypes.GUNPOWDER.equals(type) || ItemTypes.DRAGON_BREATH.equals(type); 10 | } 11 | 12 | public static boolean isEffectIngredient(ItemType type) { 13 | return ItemTypes.SUGAR.equals(type) || ItemTypes.RABBIT_FOOT.equals(type) || ItemTypes.GLISTERING_MELON_SLICE.equals(type) 14 | || ItemTypes.SPIDER_EYE.equals(type) || ItemTypes.PUFFERFISH.equals(type) || ItemTypes.MAGMA_CREAM.equals(type) 15 | || ItemTypes.GOLDEN_CARROT.equals(type) || ItemTypes.BLAZE_POWDER.equals(type) || ItemTypes.GHAST_TEAR.equals(type) 16 | || ItemTypes.TURTLE_HELMET.equals(type) || ItemTypes.PHANTOM_MEMBRANE.equals(type); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/ClickAction.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory; 2 | 3 | public enum ClickAction { 4 | PRIMARY, 5 | SECONDARY 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/InventoryDesyncStatus.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory; 2 | 3 | public enum InventoryDesyncStatus { 4 | BEACON, 5 | NETHER_PORTAL, 6 | NOT_DESYNCED 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/InventoryStorage.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory; 2 | 3 | import com.github.retrooper.packetevents.protocol.item.ItemStack; 4 | import lombok.Getter; 5 | 6 | public class InventoryStorage { 7 | protected ItemStack[] items; 8 | @Getter 9 | int size; 10 | 11 | public InventoryStorage(int size) { 12 | this.items = new ItemStack[size]; 13 | this.size = size; 14 | 15 | for (int i = 0; i < size; i++) { 16 | items[i] = ItemStack.EMPTY; 17 | } 18 | } 19 | 20 | public void setItem(int item, ItemStack stack) { 21 | items[item] = stack == null ? ItemStack.EMPTY : stack; 22 | } 23 | 24 | public ItemStack getItem(int index) { 25 | return items[index]; 26 | } 27 | 28 | public ItemStack removeItem(int slot, int amount) { 29 | return slot >= 0 && slot < items.length && !items[slot].isEmpty() && amount > 0 ? items[slot].split(amount) : ItemStack.EMPTY; 30 | } 31 | 32 | public int getMaxStackSize() { 33 | return 64; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/NBTHelper.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory; 2 | 3 | import com.github.retrooper.packetevents.protocol.item.ItemStack; 4 | import com.github.retrooper.packetevents.protocol.nbt.NBTNumber; 5 | 6 | public class NBTHelper { 7 | public static int getBaseRepairCost(ItemStack itemStack) { 8 | if (itemStack.getNBT() == null) 9 | return 0; 10 | 11 | NBTNumber tag = itemStack.getNBT().getNumberTagOrNull("RepairCost"); 12 | return tag == null ? 0 : tag.getAsInt(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/inventory/NotImplementedMenu.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory.inventory; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.inventory.Inventory; 5 | import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientClickWindow; 6 | 7 | public class NotImplementedMenu extends AbstractContainerMenu { 8 | public NotImplementedMenu(GrimPlayer player, Inventory playerInventory) { 9 | super(player, playerInventory); 10 | player.getInventory().isPacketInventoryActive = false; 11 | player.getInventory().needResend = true; 12 | } 13 | 14 | @Override 15 | public void doClick(int button, int slotID, WrapperPlayClientClickWindow.WindowClickType clickType) { 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/slot/EquipmentSlot.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory.slot; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.inventory.EquipmentType; 5 | import ac.grim.grimac.utils.inventory.InventoryStorage; 6 | import com.github.retrooper.packetevents.PacketEvents; 7 | import com.github.retrooper.packetevents.protocol.item.ItemStack; 8 | import com.github.retrooper.packetevents.protocol.item.enchantment.type.EnchantmentTypes; 9 | import com.github.retrooper.packetevents.protocol.player.GameMode; 10 | 11 | public class EquipmentSlot extends Slot { 12 | EquipmentType type; 13 | 14 | public EquipmentSlot(EquipmentType type, InventoryStorage menu, int slot) { 15 | super(menu, slot); 16 | this.type = type; 17 | } 18 | 19 | @Override 20 | public int getMaxStackSize() { 21 | return 1; 22 | } 23 | 24 | @Override 25 | public boolean mayPlace(ItemStack itemStack) { 26 | return type == EquipmentType.getEquipmentSlotForItem(itemStack); 27 | } 28 | 29 | public boolean mayPickup(GrimPlayer player) { 30 | ItemStack itemstack = this.getItem(); 31 | return (itemstack.isEmpty() || player.gamemode == GameMode.CREATIVE || itemstack.getEnchantmentLevel(EnchantmentTypes.BINDING_CURSE, PacketEvents.getAPI().getServerManager().getVersion().toClientVersion()) == 0) && super.mayPickup(player); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/inventory/slot/ResultSlot.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.inventory.slot; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.inventory.InventoryStorage; 5 | import com.github.retrooper.packetevents.protocol.item.ItemStack; 6 | 7 | public class ResultSlot extends Slot { 8 | 9 | public ResultSlot(InventoryStorage container, int slot) { 10 | super(container, slot); 11 | } 12 | 13 | @Override 14 | public boolean mayPlace(ItemStack itemStack) { 15 | return false; 16 | } 17 | 18 | @Override 19 | public void onTake(GrimPlayer player, ItemStack itemStack) { 20 | // Resync the player's inventory 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/latency/ILatencyUtils.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.latency; 2 | 3 | public interface ILatencyUtils { 4 | /** 5 | * Adds a task to be executed when the corresponding transaction ACK is received. 6 | * 7 | * @param transaction The transaction ID this task is associated with. 8 | * @param runnable The task to execute. 9 | */ 10 | void addRealTimeTask(int transaction, Runnable runnable); 11 | 12 | /** 13 | * Adds a task to be executed asynchronously via the player's event loop 14 | * when the corresponding transaction ACK is received. 15 | * (Note: Benchmark might simplify/ignore the async part unless specifically testing event loop contention) 16 | * 17 | * @param transaction The transaction ID this task is associated with. 18 | * @param runnable The task to execute. 19 | */ 20 | void addRealTimeTaskAsync(int transaction, Runnable runnable); 21 | 22 | /** 23 | * Processes received transaction ACKs and runs associated tasks. 24 | * 25 | * @param receivedTransactionId The ID of the transaction ACK received from the client. 26 | */ 27 | void handleNettySyncTransaction(int receivedTransactionId); 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/lists/EvictingQueue.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.lists; 2 | 3 | import java.util.ArrayList; 4 | 5 | // https://stackoverflow.com/a/21047889 6 | // License: Originally CC By-SA 4.0 licensed as GPL 7 | public class EvictingQueue extends ArrayList { 8 | private final int maxSize; 9 | 10 | public EvictingQueue(int size) { 11 | this.maxSize = size; 12 | } 13 | 14 | public boolean add(K k) { 15 | boolean r = super.add(k); 16 | if (size() > maxSize) { 17 | removeRange(0, size() - maxSize); 18 | } 19 | return r; 20 | } 21 | 22 | public K getYoungest() { 23 | return get(size() - 1); 24 | } 25 | 26 | public K getOldest() { 27 | return get(0); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/lists/ListWrapper.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.lists; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | import java.util.List; 7 | 8 | // https://github.com/ThomasOM/Pledge/blob/master/src/main/java/dev/thomazz/pledge/util/collection/ListWrapper.java 9 | @Getter 10 | @RequiredArgsConstructor 11 | public abstract class ListWrapper implements List { 12 | protected final List base; 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/math/LegacyFastMath.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.math; 2 | 3 | // My previous rant was wrong, we have 4 fastmath versions. what the fuck optifine. 4 | public class LegacyFastMath { 5 | private static final float[] SIN_TABLE_FAST = new float[4096]; 6 | 7 | static { 8 | for (int i = 0; i < 4096; ++i) { 9 | SIN_TABLE_FAST[i] = (float) Math.sin(((float) i + 0.5f) / 4096f * ((float) Math.PI * 2f)); 10 | } 11 | 12 | for (int i = 0; i < 360; i += 90) { 13 | SIN_TABLE_FAST[(int) ((float) i * 11.377778f) & 4095] = (float) Math.sin(GrimMath.radians((float) i)); 14 | } 15 | } 16 | 17 | public static float sin(float par0) { 18 | return SIN_TABLE_FAST[(int) (par0 * 651.8986f) & 4095]; 19 | } 20 | 21 | public static float cos(float par0) { 22 | return SIN_TABLE_FAST[(int) ((par0 + ((float) Math.PI / 2f)) * 651.8986f) & 4095]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/math/VanillaMath.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.math; 2 | 3 | public class VanillaMath { 4 | private static final float[] SIN = new float[65536]; 5 | 6 | static { 7 | for (int i = 0; i < SIN.length; ++i) { 8 | SIN[i] = (float) StrictMath.sin(i * 3.141592653589793 * 2d / 65536d); 9 | } 10 | } 11 | 12 | public static float sin(float f) { 13 | return SIN[(int) (f * 10430.378f) & 0xFFFF]; 14 | } 15 | 16 | public static float cos(float f) { 17 | return SIN[(int) (f * 10430.378f + 16384.0f) & 0xFFFF]; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/nmsutil/CheckIfChunksLoaded.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.nmsutil; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | 5 | public class CheckIfChunksLoaded { 6 | public static boolean isChunksUnloadedAt(GrimPlayer player, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { 7 | if (maxY < player.compensatedWorld.getMinHeight() || minY >= player.compensatedWorld.getMaxHeight()) { 8 | return true; 9 | } 10 | 11 | minX = minX >> 4; 12 | minZ = minZ >> 4; 13 | maxX = maxX >> 4; 14 | maxZ = maxZ >> 4; 15 | 16 | for (int i = minX; i <= maxX; ++i) { 17 | for (int j = minZ; j <= maxZ; ++j) { 18 | if (player.compensatedWorld.getChunk(i, j) == null) { 19 | return true; 20 | } 21 | } 22 | } 23 | 24 | return false; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/nmsutil/FluidFallingAdjustedMovement.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.nmsutil; 2 | 3 | import ac.grim.grimac.player.GrimPlayer; 4 | import ac.grim.grimac.utils.math.Vector3dm; 5 | import com.github.retrooper.packetevents.protocol.player.ClientVersion; 6 | 7 | public class FluidFallingAdjustedMovement { 8 | public static Vector3dm getFluidFallingAdjustedMovement(GrimPlayer player, double d, boolean bl, Vector3dm vec3) { 9 | if (player.hasGravity && !player.isSprinting) { 10 | boolean falling = player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_14) ? bl : vec3.getY() < 0; 11 | double d2 = falling && Math.abs(vec3.getY() - 0.005) >= 0.003 && Math.abs(vec3.getY() - d / 16.0) < 0.003 ? -0.003 : vec3.getY() - d / 16.0; 12 | return new Vector3dm(vec3.getX(), d2, vec3.getZ()); 13 | } 14 | return vec3; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/nmsutil/WatchableIndexUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.nmsutil; 2 | 3 | import com.github.retrooper.packetevents.protocol.entity.data.EntityData; 4 | 5 | import java.util.List; 6 | 7 | public class WatchableIndexUtil { 8 | public static EntityData getIndex(List> objects, int index) { 9 | for (EntityData object : objects) { 10 | if (object.getIndex() == index) return object; 11 | } 12 | 13 | return null; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/reflection/FloodgateUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.reflection; 2 | 3 | import org.geysermc.floodgate.api.FloodgateApi; 4 | 5 | import java.util.UUID; 6 | 7 | public class FloodgateUtil { 8 | 9 | private static boolean CHECKED_FOR_FLOODGATE; 10 | private static boolean FLOODGATE_PRESENT; 11 | 12 | public static boolean isFloodgatePlayer(UUID uuid) { 13 | if (!CHECKED_FOR_FLOODGATE) { 14 | try { 15 | Class.forName("org.geysermc.floodgate.api.FloodgateApi"); 16 | FLOODGATE_PRESENT = true; 17 | } catch (ClassNotFoundException e) { 18 | FLOODGATE_PRESENT = false; 19 | } 20 | CHECKED_FOR_FLOODGATE = true; 21 | } 22 | 23 | if (FLOODGATE_PRESENT) { 24 | return FloodgateApi.getInstance().isFloodgatePlayer(uuid); 25 | } else { 26 | return false; 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/reflection/ReflectionUtils.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.reflection; 2 | 3 | public class ReflectionUtils { 4 | 5 | public static boolean hasClass(String className) { 6 | try { 7 | Class.forName(className); 8 | return true; 9 | } catch (ClassNotFoundException e) { 10 | return false; 11 | } 12 | } 13 | 14 | public static boolean hasMethod(Class clazz, String methodName, Class... parameterTypes) { 15 | try { 16 | clazz.getDeclaredMethod(methodName, parameterTypes); 17 | return true; 18 | } catch (NoSuchMethodException e) { 19 | try { 20 | clazz.getMethod(methodName, parameterTypes); 21 | return true; 22 | } catch (NoSuchMethodException e2) { 23 | return false; 24 | } 25 | } 26 | } 27 | 28 | public static Class getClass(String className) { 29 | try { 30 | return Class.forName(className); 31 | } catch (ClassNotFoundException e) { 32 | return null; 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/reflection/ViaVersionUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.reflection; 2 | 3 | import ac.grim.grimac.utils.anticheat.LogUtil; 4 | import com.github.retrooper.packetevents.PacketEvents; 5 | 6 | public class ViaVersionUtil { 7 | private static final boolean isViaLoaded; 8 | 9 | static { 10 | ClassLoader classLoader = PacketEvents.getAPI().getPlugin().getClass().getClassLoader(); 11 | boolean temp; 12 | try { 13 | classLoader.loadClass("com.viaversion.viaversion.api.Via"); 14 | temp = true; 15 | } catch (Exception e) { 16 | try { 17 | classLoader.loadClass("us.myles.ViaVersion.api.Via"); 18 | LogUtil.error("Using unsupported ViaVersion 4.0 API, update ViaVersion to 5.0"); 19 | temp = false; 20 | } catch (ClassNotFoundException ex) { 21 | temp = false; 22 | } 23 | } 24 | isViaLoaded = temp; 25 | } 26 | 27 | private ViaVersionUtil() { 28 | } 29 | 30 | public static boolean isAvailable() { 31 | return isViaLoaded; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /common/src/main/java/ac/grim/grimac/utils/webhook/JsonSerializable.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.utils.webhook; 2 | 3 | import com.google.gson.JsonArray; 4 | import com.google.gson.JsonElement; 5 | import com.google.gson.JsonNull; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | import java.util.function.Function; 10 | import java.util.function.IntFunction; 11 | 12 | public interface JsonSerializable { 13 | @NotNull JsonElement toJson(); 14 | 15 | static @NotNull JsonArray serializeArray(@Nullable JsonSerializable @NotNull [] serializableArray) { 16 | JsonArray array = new JsonArray(); 17 | 18 | for (JsonSerializable serializable : serializableArray) { 19 | array.add(serializable == null ? JsonNull.INSTANCE : serializable.toJson()); 20 | } 21 | 22 | return array; 23 | } 24 | 25 | static T @NotNull [] deserializeArray(JsonArray jsonArray, IntFunction newArray, Function constructor) { 26 | T[] array = newArray.apply(jsonArray.size()); 27 | 28 | for (int i = 0; i < jsonArray.size(); i++) { 29 | array[i] = constructor.apply(jsonArray.get(i)); 30 | } 31 | 32 | return array; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/de.yml: -------------------------------------------------------------------------------- 1 | enabled: false 2 | webhook: "" 3 | embed-title: "**Grim Warnung**" 4 | embed-color: "#00FFFF" 5 | violation-content: 6 | - "**Spieler**: %player%" 7 | - "**Überprüfung**: %check%" 8 | - "**Verstöße**: %violations%" 9 | - "**Client-Version**: %version%" 10 | - "**Marke**: %brand%" 11 | - "**Ping**: %ping%" 12 | - "**TPS**: %tps%" 13 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/en.yml: -------------------------------------------------------------------------------- 1 | enabled: false 2 | webhook: "" 3 | embed-title: "**Grim Alert**" 4 | embed-color: "#00FFFF" 5 | violation-content: 6 | - "**Player**: %player%" 7 | - "**Check**: %check%" 8 | - "**Violations**: %violations%" 9 | - "**Client Version**: %version%" 10 | - "**Brand**: %brand%" 11 | - "**Ping**: %ping%" 12 | - "**TPS**: %tps%" 13 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/es.yml: -------------------------------------------------------------------------------- 1 | # Configuraciones del webhook de Discord 2 | # Si tienes dudas en como usarlos, puedes consultar el artículo de soporte de Discord: https://support.discord.com/hc/es/articles/228383668 3 | 4 | # ¿Deberíamos usar webhooks? 5 | enabled: false 6 | 7 | # La URL del webhook. 8 | webhook: "" 9 | 10 | embed-title: "**Grim Alert**" 11 | 12 | # El color del embed que se mandara por este webhook. 13 | embed-color: "#00FFFF" 14 | 15 | # El contenido del embed que se mandara por este webhook. 16 | violation-content: 17 | - "**Jugador**: %player%" 18 | - "**Comprobación**: %check%" 19 | - "**Violaciones**: %violations%" 20 | - "**Version del cliente**: %version%" 21 | - "**Marca del cliente**: %brand%" 22 | - "**Latencia**: %ping%" 23 | - "**TPS**: %tps%" 24 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/fr.yml: -------------------------------------------------------------------------------- 1 | enabled: false 2 | webhook: "" 3 | embed-title: "**Grim Alert**" 4 | embed-color: "#00FFFF" 5 | violation-content: 6 | - "**Joueur**: %player%" 7 | - "**Vérification**: %check%" 8 | - "**Violations**: %violations%" 9 | - "**Version du client**: %version%" 10 | - "**Nature du client**: %brand%" 11 | - "**Latence**: %ping%" 12 | - "**TPS**: %tps%" 13 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/it.yml: -------------------------------------------------------------------------------- 1 | enabled: false 2 | webhook: "" 3 | embed-title: "**Grim Alert**" 4 | embed-color: "#00FFFF" 5 | violation-content: 6 | - "**Giocatore**: %player%" 7 | - "**Cheats Rilevati**: %check%" 8 | - "**Violazioni**: %violations%" 9 | - "**Versione Client**: %version%" 10 | - "**Client**: %brand%" 11 | - "**Ping**: %ping%" 12 | - "**TPS**: %tps%" 13 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/ja.yml: -------------------------------------------------------------------------------- 1 | # このファイルは、アラートをDiscordに送信するための設定ファイルです。 2 | # webhookの取得方法は、以下を参照してください 3 | # https://support.discord.com/hc/ja/articles/228383668-Webhooks-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9 4 | enabled: false 5 | webhook: "" 6 | embed-title: "**Grim アラート**" 7 | embed-color: "#00FFFF" 8 | violation-content: 9 | - "**プレイヤー**: %player%" 10 | - "**違反項目**: %check%" 11 | - "**違反回数**: %violations%" 12 | - "**クライアントバージョン**: %version%" 13 | - "**ブランド**: %brand%" 14 | - "**Ping**: %ping%" 15 | - "**TPS**: %tps%" 16 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/nl.yml: -------------------------------------------------------------------------------- 1 | enabled: false 2 | webhook: "" 3 | embed-title: "**Grim Alert**" 4 | embed-color: "#00FFFF" 5 | violation-content: 6 | - "**Speler**: %player%" 7 | - "**Controleer**: %check%" 8 | - "**Overtredingen**: %violations%" 9 | - "**Client-versie**: %version%" 10 | - "**Client-merk**: %brand%" 11 | - "**Ping**: %ping%" 12 | - "**TPS**: %tps%" 13 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/pt.yml: -------------------------------------------------------------------------------- 1 | enabled: false 2 | webhook: "" 3 | embed-title: "**Grim Alert**" 4 | embed-color: "#00FFFF" 5 | violation-content: 6 | - "**Jogador**: %player%" 7 | - "**Verificação**: %check%" 8 | - "**Violações**: %violations%" 9 | - "**Versão do Cliente**: %version%" 10 | - "**Nome do Cliente**: %brand%" 11 | - "**Ping**: %ping%" 12 | - "**TPS**: %tps%" 13 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/ru.yml: -------------------------------------------------------------------------------- 1 | # Включать ли веб-крючок discord 2 | enabled: false 3 | webhook: "" 4 | embed-title: "**Grim Alert**" 5 | embed-color: "#00FFFF" 6 | violation-content: 7 | - "**Игрок**: %player%" 8 | - "**Проверка**: %check%" 9 | - "**Нарушения**: %violations%" 10 | - "**Версия Клиента**: %version%" 11 | - "**Бренд**: %brand%" 12 | - "**Пинг**: %ping%" 13 | - "**ТПС**: %tps%" 14 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/tr.yml: -------------------------------------------------------------------------------- 1 | enabled: false 2 | webhook: "" 3 | embed-color: "#00FFFF" 4 | violation-content: 5 | - "**Oyuncu**: %player%" 6 | - "**Kontrol**: %check%" 7 | - "**İhlaller**: %violations%" 8 | - "**Client Versiyonu**: %version%" 9 | - "**Kullanılan Client**: %brand%" 10 | - "**Gecikme**: %ping%" 11 | - "**TPS**: %tps%" 12 | -------------------------------------------------------------------------------- /common/src/main/resources/discord/zh.yml: -------------------------------------------------------------------------------- 1 | # 是否启用discord webhook 2 | enabled: false 3 | webhook: "" 4 | embed-title: "**Grim Alert**" 5 | embed-color: "#00FFFF" 6 | violation-content: 7 | - "**玩家名**: %player%" 8 | - "**检查**: %check%" 9 | - "**违规率**: %violations%" 10 | - "**游戏版本**: %version%" 11 | - "**客户端品牌**: %brand%" 12 | - "**延迟**: %ping%" 13 | - "**服务器卡顿程度**: %tps%" 14 | -------------------------------------------------------------------------------- /fabric/gradle.properties: -------------------------------------------------------------------------------- 1 | # Done to increase the memory available to gradle. 2 | org.gradle.jvmargs=-Xmx2G 3 | org.gradle.parallel=true 4 | # Fabric Properties 5 | # check these on https://fabricmc.net/develop 6 | minecraft_version=1.16.1 7 | yarn_mappings=1.16.1+build.21 8 | loader_version=0.16.13 9 | 10 | # Fabric API 11 | fabric_version=0.42.0+1.16 12 | -------------------------------------------------------------------------------- /fabric/mc1161/build.gradle.kts: -------------------------------------------------------------------------------- 1 | repositories { 2 | maven("https://oss.sonatype.org/content/repositories/snapshots") 3 | } 4 | 5 | dependencies { 6 | minecraft("com.mojang:minecraft:1.16.1") 7 | mappings("net.fabricmc:yarn:1.16.1+build.21:v2") 8 | 9 | modImplementation(fabricApi.module("fabric-lifecycle-events-v1", "0.42.0+1.16")) 10 | modImplementation("me.lucko:fabric-permissions-api:0.1-SNAPSHOT") 11 | } 12 | 13 | loom { 14 | accessWidenerPath = file("src/main/resources/grimac.accesswidener") 15 | } 16 | -------------------------------------------------------------------------------- /fabric/mc1161/src/main/java/ac/grim/grimac/platform/fabric/mc1161/Fabric1140PlatformServer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1161; 2 | 3 | import ac.grim.grimac.platform.api.sender.Sender; 4 | import ac.grim.grimac.platform.fabric.AbstractFabricPlatformServer; 5 | import ac.grim.grimac.platform.fabric.GrimACFabricLoaderPlugin; 6 | import net.minecraft.server.command.ServerCommandSource; 7 | 8 | public class Fabric1140PlatformServer extends AbstractFabricPlatformServer { 9 | 10 | @Override 11 | public void dispatchCommand(Sender sender, String command) { 12 | ServerCommandSource commandSource = GrimACFabricLoaderPlugin.LOADER.getFabricSenderFactory().reverse(sender); 13 | GrimACFabricLoaderPlugin.FABRIC_SERVER.getCommandManager().execute(commandSource, command); 14 | } 15 | 16 | // TODO (Cross-platform) implement proper bukkit equivalent for getting TPS over time 17 | @Override 18 | public double getTPS() { 19 | return Math.min(1000.0 / GrimACFabricLoaderPlugin.FABRIC_SERVER.getTickTime(), 20.0); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /fabric/mc1161/src/main/java/ac/grim/grimac/platform/fabric/mc1161/util/convert/Fabric1161MessageUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1161.util.convert; 2 | 3 | import ac.grim.grimac.platform.fabric.utils.message.IFabricMessageUtil; 4 | import net.minecraft.server.command.ServerCommandSource; 5 | import net.minecraft.text.LiteralText; 6 | import net.minecraft.text.Text; 7 | 8 | public class Fabric1161MessageUtil implements IFabricMessageUtil { 9 | @Override 10 | public Text textLiteral(String message) { 11 | return new LiteralText(message); 12 | } 13 | 14 | @Override 15 | public void sendMessage(ServerCommandSource target, Text message, boolean overlay) { 16 | target.sendFeedback(message, overlay); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /fabric/mc1161/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "grimac-mc1161", 4 | "version": "${version}", 5 | "name": "GrimAC for 1.16.1", 6 | "description": "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0.", 7 | "authors": [ 8 | "GrimAC" 9 | ], 10 | "license": "GPLv3", 11 | "environment": "server", 12 | "entrypoints": { 13 | "grimMainLoad": [ 14 | "ac.grim.grimac.platform.fabric.mc1161.GrimACFabric1161LoaderPlugin" 15 | ] 16 | }, 17 | "accessWidener": "grimac.accesswidener", 18 | "depends": { 19 | "fabricloader": "\u003e\u003d0.16", 20 | "minecraft": ">=1.16.1", 21 | "fabric-resource-loader-v0": "*" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /fabric/mc1161/src/main/resources/grimac.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v2 named 2 | accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; 3 | accessible field net/minecraft/server/command/ServerCommandSource output Lnet/minecraft/server/command/CommandOutput; 4 | -------------------------------------------------------------------------------- /fabric/mc1171/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | minecraft("com.mojang:minecraft:1.17.1") 3 | mappings("net.fabricmc:yarn:1.17.1+build.65:v2") 4 | compileOnly(project(":fabric:mc1161", configuration = "namedElements")) 5 | 6 | modImplementation(fabricApi.module("fabric-lifecycle-events-v1", "0.46.1+1.17")) 7 | modImplementation("me.lucko:fabric-permissions-api:0.3.1") 8 | } 9 | -------------------------------------------------------------------------------- /fabric/mc1171/src/main/java/ac/grim/grimac/platform/fabric/mc1171/Fabric1171PlatformServer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1171; 2 | 3 | import ac.grim.grimac.platform.fabric.GrimACFabricLoaderPlugin; 4 | import ac.grim.grimac.platform.fabric.mc1161.Fabric1140PlatformServer; 5 | import com.mojang.authlib.GameProfile; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | import java.util.Optional; 9 | 10 | 11 | public class Fabric1171PlatformServer extends Fabric1140PlatformServer { 12 | 13 | @Override @Nullable 14 | public GameProfile getProfileByName(String name) { 15 | Optional gameProfile = GrimACFabricLoaderPlugin.FABRIC_SERVER.getUserCache().findByName(name); 16 | return gameProfile.orElse(null); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /fabric/mc1171/src/main/java/ac/grim/grimac/platform/fabric/mc1171/entity/Fabric1170GrimEntity.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1171.entity; 2 | 3 | import ac.grim.grimac.platform.fabric.mc1161.entity.Fabric1161GrimEntity; 4 | import net.minecraft.entity.Entity; 5 | import net.minecraft.entity.LivingEntity; 6 | 7 | 8 | public class Fabric1170GrimEntity extends Fabric1161GrimEntity { 9 | 10 | public Fabric1170GrimEntity(Entity entity) { 11 | super(entity); 12 | } 13 | 14 | @Override 15 | public boolean isDead() { 16 | if (this.entity instanceof LivingEntity) 17 | return ((LivingEntity) entity).isDead(); 18 | return this.entity.isRemoved(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fabric/mc1171/src/main/java/ac/grim/grimac/platform/fabric/mc1171/player/Fabric1170PlatformPlayer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1171.player; 2 | 3 | import ac.grim.grimac.platform.fabric.mc1161.player.Fabric1161PlatformPlayer; 4 | import ac.grim.grimac.platform.fabric.utils.convert.FabricConversionUtil; 5 | import com.github.retrooper.packetevents.protocol.player.GameMode; 6 | import net.minecraft.server.network.ServerPlayerEntity; 7 | 8 | 9 | public class Fabric1170PlatformPlayer extends Fabric1161PlatformPlayer { 10 | public Fabric1170PlatformPlayer(ServerPlayerEntity player) { 11 | super(player); 12 | } 13 | 14 | @Override 15 | public void setGameMode(GameMode gameMode) { 16 | fabricPlayer.changeGameMode(FabricConversionUtil.toFabricGameMode(gameMode)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /fabric/mc1171/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "grimac-mc1171", 4 | "version": "${version}", 5 | "name": "GrimAC for 1.17+ built against 1.17.1", 6 | "description": "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0.", 7 | "authors": [ 8 | "GrimAC" 9 | ], 10 | "license": "GPLv3", 11 | "environment": "server", 12 | "entrypoints": { 13 | "grimMainLoad": [ 14 | "ac.grim.grimac.platform.fabric.mc1171.GrimACFabric1170LoaderPlugin" 15 | ] 16 | }, 17 | "accessWidener": "grimac.accesswidener", 18 | "depends": { 19 | "minecraft": ">=1.17", 20 | "fabric-lifecycle-events-v1": "*" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fabric/mc1171/src/main/resources/grimac.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v2 named 2 | accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; 3 | accessible field net/minecraft/server/command/ServerCommandSource output Lnet/minecraft/server/command/CommandOutput; 4 | -------------------------------------------------------------------------------- /fabric/mc1194/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | minecraft("com.mojang:minecraft:1.19.4") 3 | mappings("net.fabricmc:yarn:1.19.4+build.2:v2") 4 | compileOnly(project(":fabric:mc1161", configuration = "namedElements")) 5 | compileOnly(project(":fabric:mc1171", configuration = "namedElements")) 6 | 7 | modImplementation(fabricApi.module("fabric-lifecycle-events-v1", "0.87.2+1.19.4")) 8 | modImplementation("me.lucko:fabric-permissions-api:0.3.1") 9 | } 10 | 11 | tasks.compileJava { 12 | options.release.set(17) 13 | } 14 | -------------------------------------------------------------------------------- /fabric/mc1194/src/main/java/ac/grim/grimac/platform/fabric/mc1194/Fabric1190PlatformServer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1194; 2 | 3 | import ac.grim.grimac.platform.api.sender.Sender; 4 | import ac.grim.grimac.platform.fabric.GrimACFabricLoaderPlugin; 5 | import ac.grim.grimac.platform.fabric.mc1171.Fabric1171PlatformServer; 6 | import net.minecraft.server.command.ServerCommandSource; 7 | 8 | public class Fabric1190PlatformServer extends Fabric1171PlatformServer { 9 | @Override 10 | public void dispatchCommand(Sender sender, String command) { 11 | ServerCommandSource commandSource = GrimACFabricLoaderPlugin.LOADER.getFabricSenderFactory().reverse(sender); 12 | GrimACFabricLoaderPlugin.FABRIC_SERVER.getCommandManager().executeWithPrefix(commandSource, command); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /fabric/mc1194/src/main/java/ac/grim/grimac/platform/fabric/mc1194/convert/Fabric1190MessageUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1194.convert; 2 | 3 | import ac.grim.grimac.platform.fabric.mc1161.util.convert.Fabric1161MessageUtil; 4 | import net.minecraft.text.Text; 5 | 6 | public class Fabric1190MessageUtil extends Fabric1161MessageUtil { 7 | @Override 8 | public Text textLiteral(String message) { 9 | return Text.literal(message); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /fabric/mc1194/src/main/java/ac/grim/grimac/platform/fabric/mc1194/player/Fabric1193PlatformInventory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1194.player; 2 | 3 | import ac.grim.grimac.platform.fabric.mc1161.player.Fabric1161PlatformInventory; 4 | import net.minecraft.registry.Registries; 5 | import net.minecraft.screen.ScreenHandlerType; 6 | import net.minecraft.server.network.ServerPlayerEntity; 7 | import net.minecraft.util.Identifier; 8 | 9 | public class Fabric1193PlatformInventory extends Fabric1161PlatformInventory { 10 | public Fabric1193PlatformInventory(ServerPlayerEntity player) { 11 | super(player); 12 | } 13 | 14 | @Override 15 | protected Identifier getScreenID(ScreenHandlerType type) { 16 | return Registries.SCREEN_HANDLER.getId(type); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /fabric/mc1194/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "grimac-mc1194", 4 | "version": "${version}", 5 | "name": "GrimAC for 1.19+ built against 1.19.4", 6 | "description": "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0.", 7 | "authors": [ 8 | "GrimAC" 9 | ], 10 | "license": "GPLv3", 11 | "environment": "server", 12 | "entrypoints": { 13 | "grimMainLoad": [ 14 | "ac.grim.grimac.platform.fabric.mc1194.GrimACFabric1190LoaderPlugin" 15 | ] 16 | }, 17 | "accessWidener": "grimac.accesswidener", 18 | "depends": { 19 | "minecraft": ">=1.19", 20 | "fabric-lifecycle-events-v1": "*" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fabric/mc1194/src/main/resources/grimac.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v2 named 2 | accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; 3 | accessible field net/minecraft/server/command/ServerCommandSource output Lnet/minecraft/server/command/CommandOutput; 4 | -------------------------------------------------------------------------------- /fabric/mc1205/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | minecraft("com.mojang:minecraft:1.20.5") 3 | mappings("net.fabricmc:yarn:1.20.5+build.1:v2") 4 | compileOnly(project(":fabric:mc1161", configuration = "namedElements")) 5 | compileOnly(project(":fabric:mc1171", configuration = "namedElements")) 6 | compileOnly(project(":fabric:mc1194", configuration = "namedElements")) 7 | 8 | modImplementation(fabricApi.module("fabric-lifecycle-events-v1", "0.97.8+1.20.5")) 9 | modImplementation("me.lucko:fabric-permissions-api:0.3.1") 10 | } 11 | -------------------------------------------------------------------------------- /fabric/mc1205/src/main/java/ac/grim/grimac/platform/fabric/mc1205/Fabric1203PlatformServer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1205; 2 | 3 | import ac.grim.grimac.platform.api.sender.Sender; 4 | import ac.grim.grimac.platform.fabric.GrimACFabricLoaderPlugin; 5 | import ac.grim.grimac.platform.fabric.mc1194.Fabric1190PlatformServer; 6 | import net.minecraft.server.command.ServerCommandSource; 7 | 8 | public class Fabric1203PlatformServer extends Fabric1190PlatformServer { 9 | 10 | // TODO (Cross-platform) implement proper bukkit equivalent for getting TPS over time 11 | @Override 12 | public double getTPS() { 13 | return Math.min(1000.0 / GrimACFabricLoaderPlugin.FABRIC_SERVER.getAverageTickTime(), GrimACFabricLoaderPlugin.FABRIC_SERVER.getTickManager().getTickRate()); 14 | } 15 | 16 | // Return type changed from int -> void in 1.20.3 17 | @Override 18 | public void dispatchCommand(Sender sender, String command) { 19 | ServerCommandSource commandSource = GrimACFabricLoaderPlugin.LOADER.getFabricSenderFactory().reverse(sender); 20 | GrimACFabricLoaderPlugin.FABRIC_SERVER.getCommandManager().executeWithPrefix(commandSource, command); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fabric/mc1205/src/main/java/ac/grim/grimac/platform/fabric/mc1205/convert/Fabric1200MessageUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1205.convert; 2 | 3 | import ac.grim.grimac.platform.fabric.mc1194.convert.Fabric1190MessageUtil; 4 | import net.minecraft.server.command.ServerCommandSource; 5 | import net.minecraft.text.Text; 6 | 7 | public class Fabric1200MessageUtil extends Fabric1190MessageUtil { 8 | @Override 9 | public void sendMessage(ServerCommandSource target, Text message, boolean overlay) { 10 | target.sendFeedback(() -> message, overlay); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /fabric/mc1205/src/main/java/ac/grim/grimac/platform/fabric/mc1205/player/Fabric1202PlatformPlayer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1205.player; 2 | 3 | import ac.grim.grimac.platform.fabric.GrimACFabricLoaderPlugin; 4 | import ac.grim.grimac.platform.fabric.mc1171.player.Fabric1170PlatformPlayer; 5 | import net.minecraft.server.network.ServerPlayerEntity; 6 | 7 | 8 | public class Fabric1202PlatformPlayer extends Fabric1170PlatformPlayer { 9 | public Fabric1202PlatformPlayer(ServerPlayerEntity player) { 10 | super(player); 11 | } 12 | 13 | @Override 14 | public void kickPlayer(String textReason) { 15 | fabricPlayer.networkHandler.disconnect(GrimACFabricLoaderPlugin.LOADER.getFabricMessageUtils().textLiteral(textReason)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /fabric/mc1205/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "grimac-mc1205", 4 | "version": "${version}", 5 | "name": "GrimAC for 1.20+ built against 1.20.5", 6 | "description": "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0.", 7 | "authors": [ 8 | "GrimAC" 9 | ], 10 | "license": "GPLv3", 11 | "environment": "server", 12 | "entrypoints": { 13 | "grimMainLoad": [ 14 | "ac.grim.grimac.platform.fabric.mc1205.GrimACFabric1200LoaderPlugin" 15 | ] 16 | }, 17 | "accessWidener": "grimac.accesswidener", 18 | "depends": { 19 | "minecraft": ">=1.20", 20 | "fabric-lifecycle-events-v1": "*" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fabric/mc1205/src/main/resources/grimac.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v2 named 2 | accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; 3 | accessible field net/minecraft/server/command/ServerCommandSource output Lnet/minecraft/server/command/CommandOutput; 4 | -------------------------------------------------------------------------------- /fabric/mc1215/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | minecraft("com.mojang:minecraft:1.21.5") 3 | mappings("net.fabricmc:yarn:1.21.5+build.1:v2") 4 | compileOnly(project(":fabric:mc1161", configuration = "namedElements")) 5 | compileOnly(project(":fabric:mc1171", configuration = "namedElements")) 6 | compileOnly(project(":fabric:mc1194", configuration = "namedElements")) 7 | compileOnly(project(":fabric:mc1205", configuration = "namedElements")) 8 | 9 | modImplementation(fabricApi.module("fabric-lifecycle-events-v1", "0.121.0+1.21.5")) 10 | modImplementation("me.lucko:fabric-permissions-api:0.3.1") 11 | } 12 | 13 | 14 | tasks.compileJava { 15 | options.release.set(21) 16 | } 17 | -------------------------------------------------------------------------------- /fabric/mc1215/src/main/java/ac/grim/grimac/platform/fabric/mc1214/command/Fabric1212PlayerSelectorAdapter.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1214.command; 2 | 3 | 4 | import ac.grim.grimac.GrimAPI; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import ac.grim.grimac.platform.fabric.mc1161.command.Fabric1161PlayerSelectorAdapter; 7 | import ac.grim.grimac.platform.fabric.sender.FabricSenderFactory; 8 | 9 | 10 | public class Fabric1212PlayerSelectorAdapter extends Fabric1161PlayerSelectorAdapter { 11 | 12 | public Fabric1212PlayerSelectorAdapter(org.incendo.cloud.minecraft.modded.data.SinglePlayerSelector fabricSelector) { 13 | super(fabricSelector); 14 | } 15 | 16 | // 1.21.2 .getCommandSource() moves from entity to player 17 | @Override 18 | public Sender getSinglePlayer() { 19 | return ((FabricSenderFactory) GrimAPI.INSTANCE.getSenderFactory()).map(fabricSelector.single().getCommandSource()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /fabric/mc1215/src/main/java/ac/grim/grimac/platform/fabric/mc1214/player/Fabric1215PlatformInventory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mc1214.player; 2 | 3 | import ac.grim.grimac.platform.fabric.mc1194.player.Fabric1193PlatformInventory; 4 | import net.minecraft.registry.Registries; 5 | import net.minecraft.screen.ScreenHandlerType; 6 | import net.minecraft.server.network.ServerPlayerEntity; 7 | import net.minecraft.util.Identifier; 8 | 9 | public class Fabric1215PlatformInventory extends Fabric1193PlatformInventory { 10 | public Fabric1215PlatformInventory(ServerPlayerEntity player) { 11 | super(player); 12 | } 13 | 14 | @Override 15 | protected Identifier getScreenID(ScreenHandlerType type) { 16 | return Registries.SCREEN_HANDLER.getId(type); 17 | } 18 | 19 | @Override 20 | protected boolean isPlayerCreative() { 21 | return fabricPlayer.isCreative(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /fabric/mc1215/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "grimac-mc1215", 4 | "version": "${version}", 5 | "name": "GrimAC for 1.21.2+ built against 1.21.5", 6 | "description": "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0.", 7 | "authors": [ 8 | "GrimAC" 9 | ], 10 | "license": "GPLv3", 11 | "environment": "server", 12 | "entrypoints": { 13 | "grimMainLoad": [ 14 | "ac.grim.grimac.platform.fabric.mc1214.GrimACFabric1212LoaderPlugin" 15 | ] 16 | }, 17 | "accessWidener": "grimac.accesswidener", 18 | "depends": { 19 | "minecraft": ">=1.21.2", 20 | "fabric-lifecycle-events-v1": "*" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fabric/mc1215/src/main/resources/grimac.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v2 named 2 | accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; 3 | accessible field net/minecraft/server/command/ServerCommandSource output Lnet/minecraft/server/command/CommandOutput; 4 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/FabricPlatformPlugin.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric; 2 | 3 | import ac.grim.grimac.platform.api.PlatformPlugin; 4 | import net.fabricmc.loader.api.ModContainer; 5 | 6 | public class FabricPlatformPlugin implements PlatformPlugin { 7 | private final ModContainer modContainer; 8 | 9 | public FabricPlatformPlugin(ModContainer modContainer) { 10 | this.modContainer = modContainer; 11 | } 12 | 13 | @Override 14 | public boolean isEnabled() { 15 | // Fabric mods are always "enabled" if loaded, as there's no explicit enable/disable state 16 | // You can add custom logic if needed (e.g., check mod configuration) 17 | return true; 18 | } 19 | 20 | @Override 21 | public String getName() { 22 | // Get the mod ID (unique identifier) 23 | return modContainer.getMetadata().getId(); 24 | } 25 | 26 | @Override 27 | public String getVersion() { 28 | // Get the mod version from metadata 29 | return modContainer.getMetadata().getVersion().getFriendlyString(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/initables/FabricBStats.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.initables; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.manager.init.start.StartableInitable; 5 | import ac.grim.grimac.manager.init.stop.StoppableInitable; 6 | import ac.grim.grimac.platform.fabric.utils.metrics.MetricsFabric; 7 | 8 | public class FabricBStats implements StartableInitable, StoppableInitable { 9 | 10 | private MetricsFabric metricsFabric; 11 | 12 | @Override 13 | public void start() { 14 | int pluginId = 12820; // <-- Replace with the id of your plugin! 15 | try { 16 | metricsFabric = new MetricsFabric(GrimAPI.INSTANCE.getGrimPlugin(), pluginId); 17 | } catch (Exception ignored) {} 18 | } 19 | 20 | @Override 21 | public void stop() { 22 | if (metricsFabric != null) 23 | metricsFabric.shutdown(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/initables/FabricTickEndEvent.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.initables; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | import ac.grim.grimac.manager.init.start.AbstractTickEndEvent; 5 | import ac.grim.grimac.player.GrimPlayer; 6 | import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; 7 | import net.minecraft.server.MinecraftServer; 8 | 9 | 10 | public class FabricTickEndEvent extends AbstractTickEndEvent { 11 | 12 | @Override 13 | public void start() { 14 | if (!super.shouldInjectEndTick()) { 15 | return; 16 | } 17 | 18 | // Register the end-of-tick callback 19 | ServerTickEvents.END_SERVER_TICK.register(this::onEndServerTick); 20 | } 21 | 22 | private void onEndServerTick(MinecraftServer server) { 23 | tickAllPlayers(); 24 | } 25 | 26 | private void tickAllPlayers() { 27 | for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { 28 | if (player.disableGrim) continue; 29 | super.onEndOfTick(player); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/manager/FabricItemResetHandler.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.manager; 2 | 3 | import ac.grim.grimac.platform.api.manager.ItemResetHandler; 4 | import ac.grim.grimac.platform.api.player.PlatformPlayer; 5 | import ac.grim.grimac.platform.fabric.player.AbstractFabricPlatformPlayer; 6 | import ac.grim.grimac.platform.fabric.utils.convert.FabricConversionUtil; 7 | import com.github.retrooper.packetevents.protocol.player.InteractionHand; 8 | import net.minecraft.server.network.ServerPlayerEntity; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | public class FabricItemResetHandler implements ItemResetHandler { 12 | @Override 13 | public void resetItemUsage(@Nullable PlatformPlayer player) { 14 | if (player != null) { 15 | ((AbstractFabricPlatformPlayer) player).getFabricPlayer().clearActiveItem(); 16 | } 17 | } 18 | 19 | @Override 20 | public @Nullable InteractionHand getItemUsageHand(@Nullable PlatformPlayer platformPlayer) { 21 | if (platformPlayer == null) { 22 | return null; 23 | } 24 | 25 | ServerPlayerEntity player = ((AbstractFabricPlatformPlayer) platformPlayer).getFabricPlayer(); 26 | return player.isUsingItem() ? FabricConversionUtil.fromFabricHand(player.getActiveHand()) : null; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/manager/FabricMessagePlaceHolderManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.manager; 2 | 3 | import ac.grim.grimac.platform.api.manager.MessagePlaceHolderManager; 4 | import ac.grim.grimac.platform.api.player.PlatformPlayer; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | import org.checkerframework.checker.nullness.qual.Nullable; 7 | 8 | public class FabricMessagePlaceHolderManager implements MessagePlaceHolderManager { 9 | 10 | // PlaceHolderAPI doesn't exist on Fabric and no chosen replacement for the platform yet 11 | @Override 12 | public @NonNull String replacePlaceholders(@Nullable PlatformPlayer player, @NonNull String string) { 13 | return string; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/manager/FabricParserDescriptorFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.manager; 2 | 3 | import ac.grim.grimac.platform.api.command.PlayerSelector; 4 | import ac.grim.grimac.platform.api.manager.ParserDescriptorFactory; 5 | import ac.grim.grimac.platform.api.sender.Sender; 6 | import ac.grim.grimac.platform.fabric.command.FabricPlayerSelectorParser; 7 | import org.incendo.cloud.parser.ParserDescriptor; 8 | 9 | public class FabricParserDescriptorFactory implements ParserDescriptorFactory { 10 | 11 | private final FabricPlayerSelectorParser fabricPlayerSelectorParser; 12 | 13 | public FabricParserDescriptorFactory(FabricPlayerSelectorParser fabricPlayerSelectorParser) { 14 | this.fabricPlayerSelectorParser = fabricPlayerSelectorParser; 15 | } 16 | 17 | @Override 18 | public ParserDescriptor getSinglePlayer() { 19 | return fabricPlayerSelectorParser.descriptor(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/manager/FabricPlatformPluginManager.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.manager; 2 | 3 | import ac.grim.grimac.platform.api.PlatformPlugin; 4 | import ac.grim.grimac.platform.api.manager.PlatformPluginManager; 5 | import ac.grim.grimac.platform.fabric.FabricPlatformPlugin; 6 | import net.fabricmc.loader.api.FabricLoader; 7 | import net.fabricmc.loader.api.ModContainer; 8 | 9 | import java.util.Collection; 10 | import java.util.Optional; 11 | 12 | public class FabricPlatformPluginManager implements PlatformPluginManager { 13 | 14 | @Override 15 | public PlatformPlugin[] getPlugins() { 16 | // Get all loaded mods from Fabric Loader 17 | Collection mods = FabricLoader.getInstance().getAllMods(); 18 | PlatformPlugin[] plugins = new PlatformPlugin[mods.size()]; 19 | int i = 0; 20 | for (ModContainer mod : mods) { 21 | plugins[i++] = new FabricPlatformPlugin(mod); 22 | } 23 | return plugins; 24 | } 25 | 26 | @Override 27 | public PlatformPlugin getPlugin(String pluginName) { 28 | // Look up a mod by its ID 29 | Optional mod = FabricLoader.getInstance().getModContainer(pluginName); 30 | return mod.map(FabricPlatformPlugin::new).orElse(null); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/mixins/ServerPlayerEntityMixin.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.mixins; 2 | 3 | 4 | import ac.grim.grimac.GrimAPI; 5 | import ac.grim.grimac.platform.fabric.player.FabricPlatformPlayerFactory; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | import net.minecraft.server.network.ServerPlayerEntity; 12 | 13 | // Works from 1.14 - latest (1.21.5) 14 | @Mixin(ServerPlayerEntity.class) 15 | abstract class ServerPlayerEntityMixin { 16 | 17 | @Inject(method = "copyFrom", at = @At("TAIL")) 18 | private void onCopyFrom(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo ci) { 19 | ((FabricPlatformPlayerFactory) GrimAPI.INSTANCE.getPlatformPlayerFactory()).replaceNativePlayer(oldPlayer.getUuid(), (ServerPlayerEntity) (Object) this); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/player/FabricOfflinePlatformPlayer.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.player; 2 | 3 | import ac.grim.grimac.platform.api.player.OfflinePlatformPlayer; 4 | import ac.grim.grimac.platform.fabric.GrimACFabricLoaderPlugin; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.UUID; 8 | 9 | public class FabricOfflinePlatformPlayer implements OfflinePlatformPlayer { 10 | private final UUID uuid; 11 | private final String name; 12 | 13 | public FabricOfflinePlatformPlayer(@NotNull UUID uuid, @NotNull String name) { 14 | this.uuid = uuid; 15 | this.name = name; 16 | } 17 | 18 | @Override 19 | public boolean isOnline() { 20 | return GrimACFabricLoaderPlugin.FABRIC_SERVER.getPlayerManager().getPlayer(uuid) != null; 21 | } 22 | 23 | @Override 24 | public @NotNull String getName() { 25 | return name; 26 | } 27 | 28 | @Override 29 | public @NotNull UUID getUniqueId() { 30 | return uuid; 31 | } 32 | 33 | @Override 34 | public boolean equals(Object o) { 35 | if (o instanceof OfflinePlatformPlayer offlinePlatformPlayer) { 36 | return this.getUniqueId().equals(offlinePlatformPlayer.getUniqueId()); 37 | } 38 | return false; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/scheduler/FabricTaskHandle.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.scheduler; 2 | 3 | import ac.grim.grimac.platform.api.scheduler.TaskHandle; 4 | import lombok.Getter; 5 | 6 | public class FabricTaskHandle implements TaskHandle { 7 | private final Runnable cancellationTask; 8 | @Getter 9 | private boolean cancelled; 10 | @Getter 11 | private boolean sync; 12 | 13 | public FabricTaskHandle(Runnable cancellationTask) { 14 | this.cancellationTask = cancellationTask; 15 | } 16 | 17 | public FabricTaskHandle(Runnable cancellationTask, boolean sync) { 18 | this.cancellationTask = cancellationTask; 19 | this.sync = sync; 20 | } 21 | 22 | @Override 23 | public void cancel() { 24 | this.cancellationTask.run(); 25 | this.cancelled = true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/utils/convert/IFabricConversionUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.utils.convert; 2 | 3 | import com.github.retrooper.packetevents.protocol.item.ItemStack; 4 | import net.kyori.adventure.text.Component; 5 | import net.minecraft.text.Text; 6 | 7 | public interface IFabricConversionUtil { 8 | ItemStack fromFabricItemStack(net.minecraft.item.ItemStack fabricStack); 9 | Text toNativeText(Component component); 10 | } 11 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/utils/message/IFabricMessageUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.utils.message; 2 | 3 | import net.minecraft.server.command.ServerCommandSource; 4 | import net.minecraft.text.Text; 5 | 6 | public interface IFabricMessageUtil { 7 | Text textLiteral(String message); 8 | void sendMessage(ServerCommandSource target, Text message, boolean overlay); 9 | } 10 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/utils/message/JULoggerFactory.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.utils.message; 2 | 3 | import java.util.logging.Logger; 4 | 5 | public class JULoggerFactory { 6 | public static Logger createLogger(String name) { 7 | try { 8 | return new Slf4jBackedJULogger(name); 9 | } catch (NoClassDefFoundError | Exception ignored) { 10 | } 11 | try { 12 | return new Log4jBackedJULogger(name); 13 | } catch (NoClassDefFoundError | Exception ignored) { 14 | } 15 | 16 | return Logger.getLogger(name); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/utils/metrics/CustomChart.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.utils.metrics; 2 | 3 | import java.util.function.BiConsumer; 4 | 5 | public abstract class CustomChart { 6 | 7 | private final String chartId; 8 | 9 | protected CustomChart(String chartId) { 10 | if (chartId == null) { 11 | throw new IllegalArgumentException("chartId must not be null"); 12 | } 13 | this.chartId = chartId; 14 | } 15 | 16 | public JsonObjectBuilder.JsonObject getRequestJsonObject( 17 | BiConsumer errorLogger, boolean logErrors) { 18 | JsonObjectBuilder builder = new JsonObjectBuilder(); 19 | builder.appendField("chartId", chartId); 20 | try { 21 | JsonObjectBuilder.JsonObject data = getChartData(); 22 | if (data == null) { 23 | // If the data is null we don't send the chart. 24 | return null; 25 | } 26 | builder.appendField("data", data); 27 | } catch (Throwable t) { 28 | if (logErrors) { 29 | errorLogger.accept("Failed to get data for custom chart with id " + chartId, t); 30 | } 31 | return null; 32 | } 33 | return builder.build(); 34 | } 35 | 36 | protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception; 37 | } 38 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/utils/metrics/Metrics.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.utils.metrics; 2 | 3 | public interface Metrics { 4 | 5 | void shutdown(); 6 | } 7 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/utils/thread/FabricFutureUtil.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.utils.thread; 2 | 3 | import ac.grim.grimac.GrimAPI; 4 | 5 | import java.util.concurrent.CompletableFuture; 6 | import java.util.function.Supplier; 7 | 8 | public class FabricFutureUtil { 9 | public static CompletableFuture supplySync(Supplier entityTeleportSupplier) { 10 | CompletableFuture ret = new CompletableFuture<>(); 11 | GrimAPI.INSTANCE.getScheduler().getGlobalRegionScheduler().run(GrimAPI.INSTANCE.getGrimPlugin(), 12 | () -> ret.complete(entityTeleportSupplier.get())); 13 | return ret; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /fabric/src/main/java/ac/grim/grimac/platform/fabric/world/FabricPlatformChunk.java: -------------------------------------------------------------------------------- 1 | package ac.grim.grimac.platform.fabric.world; 2 | 3 | import ac.grim.grimac.platform.api.world.PlatformChunk; 4 | import net.minecraft.block.Block; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.chunk.WorldChunk; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class FabricPlatformChunk implements PlatformChunk { 10 | private final WorldChunk chunk; 11 | 12 | public FabricPlatformChunk(@NotNull WorldChunk chunk) { 13 | this.chunk = chunk; 14 | } 15 | 16 | @Override 17 | public int getBlockID(int x, int y, int z) { 18 | return Block.getRawIdFromState(chunk.getBlockState(new BlockPos( 19 | chunk.getPos().getStartX() + x, 20 | y, 21 | chunk.getPos().getStartZ() + z 22 | ))); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /fabric/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "grimac", 4 | "version": "${version}", 5 | "name": "GrimAC", 6 | "description": "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0.", 7 | "authors": [ 8 | "GrimAC" 9 | ], 10 | "license": "GPLv3", 11 | "environment": "server", 12 | "entrypoints": { 13 | "main": [ 14 | "ac.grim.grimac.platform.fabric.GrimACFabricEntryPoint" 15 | ], 16 | "preLaunch": [ 17 | "ac.grim.grimac.platform.fabric.GrimACFabricEntryPoint" 18 | ] 19 | }, 20 | "mixins": [ 21 | "grimac.mixins.json" 22 | ], 23 | "accessWidener": "grimac.accesswidener", 24 | "depends": { 25 | "fabricloader": "\u003e\u003d0.16", 26 | "fabric-lifecycle-events-v1": "*", 27 | "cloud": "*", 28 | "packetevents": "*" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /fabric/src/main/resources/grimac.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v2 named 2 | accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; 3 | accessible field net/minecraft/server/command/ServerCommandSource output Lnet/minecraft/server/command/CommandOutput; 4 | accessible field net/minecraft/entity/player/PlayerEntity inventory Lnet/minecraft/entity/player/PlayerInventory; 5 | accessible field net/minecraft/entity/Entity world Lnet/minecraft/world/World; # Required in newer versions, even though public in older ones -------------------------------------------------------------------------------- /fabric/src/main/resources/grimac.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "ac.grim.grimac.platform.fabric.mixins", 5 | "compatibilityLevel": "JAVA_17", 6 | "mixins": [ 7 | "ServerPlayerEntityMixin" 8 | ], 9 | "injectors": { 10 | "defaultRequire": 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axionize/LightningGrim/baa3d91c67499a573809d317d74ec139d81bebeb/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | versionCatalogs { 3 | create("libs") { 4 | from(files("libs.versions.toml")) 5 | } 6 | 7 | create("testlibs") { 8 | from(files("testlibs.versions.toml")) 9 | } 10 | } 11 | } 12 | 13 | pluginManagement { 14 | repositories { 15 | maven { 16 | name = "FabricMC" 17 | url = uri("https://maven.fabricmc.net/") 18 | } 19 | mavenCentral() 20 | gradlePluginPortal() 21 | } 22 | } 23 | 24 | plugins { 25 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" 26 | } 27 | 28 | rootProject.name = "grimac" 29 | include("common") 30 | include("bukkit") 31 | include("fabric") 32 | include(":fabric:mc1161") 33 | include(":fabric:mc1171") 34 | include(":fabric:mc1194") 35 | include(":fabric:mc1205") 36 | include(":fabric:mc1215") 37 | -------------------------------------------------------------------------------- /testlibs.versions.toml: -------------------------------------------------------------------------------- 1 | [versions] 2 | 3 | 4 | [libraries] 5 | 6 | 7 | [bundles] 8 | --------------------------------------------------------------------------------