├── .github ├── 1.1.1.png ├── 1.1.5.png └── workflows │ └── build.yml ├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src └── main ├── java └── xyz │ └── imxnoobx │ └── fufuclient │ ├── FuFuClient.java │ ├── commands │ ├── CustomizeHud.java │ ├── FakeGamemode.java │ ├── FuFuHelp.java │ └── TeleportToCoords.java │ ├── gui │ ├── GameHud.java │ └── OptionsScreen.java │ ├── mixin │ ├── MixinBlock.java │ ├── MixinClientConnection.java │ ├── MixinGameInfo.java │ ├── MixinGameOptionsScreen.java │ ├── MixinMain.java │ ├── MixinMinecraftClient.java │ ├── MixinPlayerMoveC2SPacket.java │ └── MixinVehicleMoveC2SPacket.java │ └── modules │ ├── Flight.java │ ├── NightVision.java │ ├── WorldGuardBypass.java │ └── xRayModule.java └── resources ├── assets └── fufuclient │ └── fufu.png ├── fabric.mod.json └── fufuclient.mixins.json /.github/1.1.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IMXNOOBX/FuFuClient/419480379f9e4519c2251d1a38a8042ebfeeb0a8/.github/1.1.1.png -------------------------------------------------------------------------------- /.github/1.1.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IMXNOOBX/FuFuClient/419480379f9e4519c2251d1a38a8042ebfeeb0a8/.github/1.1.5.png -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # Automatically build the project and run any configured tests for every push 2 | # and submitted pull request. This can help catch issues that only occur on 3 | # certain platforms or Java versions, and provides a first line of defence 4 | # against bad commits. 5 | 6 | name: build 7 | on: [pull_request, push] 8 | 9 | jobs: 10 | build: 11 | strategy: 12 | matrix: 13 | # Use these Java versions 14 | java: [ 15 | 17, # Current Java LTS & minimum supported by Minecraft 16 | ] 17 | # and run on both Linux and Windows 18 | os: [ubuntu-20.04, windows-2022] 19 | runs-on: ${{ matrix.os }} 20 | steps: 21 | - name: checkout repository 22 | uses: actions/checkout@v2 23 | - name: validate gradle wrapper # https://github.com/gradle/wrapper-validation-action#reporting-failures 24 | uses: gradle/wrapper-validation-action@v1 25 | - name: setup jdk ${{ matrix.java }} 26 | uses: actions/setup-java@v1 27 | with: 28 | java-version: ${{ matrix.java }} 29 | - name: make gradle wrapper executable 30 | if: ${{ runner.os != 'Windows' }} 31 | run: chmod +x ./gradlew 32 | - name: build 33 | run: ./gradlew build 34 | - name: capture build artifacts 35 | if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS 36 | uses: actions/upload-artifact@v2 37 | with: 38 | name: fufuclient-latest 39 | path: build/libs/ 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 2 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 3 | 4 | # User-specific stuff 5 | .idea/**/workspace.xml 6 | .idea/**/tasks.xml 7 | .idea/**/usage.statistics.xml 8 | .idea/**/dictionaries 9 | .idea/**/shelf 10 | 11 | # AWS User-specific 12 | .idea/**/aws.xml 13 | 14 | # Generated files 15 | .idea/**/contentModel.xml 16 | 17 | # Sensitive or high-churn files 18 | .idea/**/dataSources/ 19 | .idea/**/dataSources.ids 20 | .idea/**/dataSources.local.xml 21 | .idea/**/sqlDataSources.xml 22 | .idea/**/dynamic.xml 23 | .idea/**/uiDesigner.xml 24 | .idea/**/dbnavigator.xml 25 | 26 | # Gradle 27 | .idea/**/gradle.xml 28 | .idea/**/libraries 29 | 30 | # Gradle and Maven with auto-import 31 | # When using Gradle or Maven with auto-import, you should exclude module files, 32 | # since they will be recreated, and may cause churn. Uncomment if using 33 | # auto-import. 34 | # .idea/artifacts 35 | # .idea/compiler.xml 36 | # .idea/jarRepositories.xml 37 | # .idea/modules.xml 38 | # .idea/*.iml 39 | # .idea/modules 40 | # *.iml 41 | # *.ipr 42 | 43 | # CMake 44 | cmake-build-*/ 45 | 46 | # Mongo Explorer plugin 47 | .idea/**/mongoSettings.xml 48 | 49 | # File-based project format 50 | *.iws 51 | 52 | # IntelliJ 53 | out/ 54 | 55 | # mpeltonen/sbt-idea plugin 56 | .idea_modules/ 57 | 58 | # JIRA plugin 59 | atlassian-ide-plugin.xml 60 | 61 | # Cursive Clojure plugin 62 | .idea/replstate.xml 63 | 64 | # SonarLint plugin 65 | .idea/sonarlint/ 66 | 67 | # Crashlytics plugin (for Android Studio and IntelliJ) 68 | com_crashlytics_export_strings.xml 69 | crashlytics.properties 70 | crashlytics-build.properties 71 | fabric.properties 72 | 73 | # Editor-based Rest Client 74 | .idea/httpRequests 75 | 76 | # Android studio 3.1+ serialized cache file 77 | .idea/caches/build_file_checksums.ser 78 | # Compiled class file 79 | *.class 80 | 81 | # Log file 82 | *.log 83 | 84 | # BlueJ files 85 | *.ctxt 86 | 87 | # Mobile Tools for Java (J2ME) 88 | .mtj.tmp/ 89 | 90 | # Package Files #´ 91 | *.jar 92 | !gradle/wrapper/gradle-wrapper.jar 93 | *.war 94 | *.nar 95 | *.ear 96 | *.zip 97 | *.tar.gz 98 | *.rar 99 | 100 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 101 | hs_err_pid* 102 | # gradle 103 | 104 | .gradle/ 105 | build/ 106 | out/ 107 | classes/ 108 | 109 | # eclipse 110 | 111 | *.launch 112 | 113 | # idea 114 | 115 | .idea/ 116 | *.iml 117 | *.ipr 118 | *.iws 119 | 120 | # vscode 121 | 122 | .settings/ 123 | .vscode/ 124 | bin/ 125 | .classpath 126 | .project 127 | 128 | # macos 129 | 130 | *.DS_Store 131 | 132 | # fabric 133 | 134 | run/ 135 | fix_intellij.bat 136 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution-NonCommercial 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-NonCommercial 4.0 International Public 58 | License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-NonCommercial 4.0 International Public License ("Public 63 | License"). To the extent this Public License may be interpreted as a 64 | contract, You are granted the Licensed Rights in consideration of Your 65 | acceptance of these terms and conditions, and the Licensor grants You 66 | such rights in consideration of benefits the Licensor receives from 67 | making the Licensed Material available under these terms and 68 | conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. Copyright and Similar Rights means copyright and/or similar rights 88 | closely related to copyright including, without limitation, 89 | performance, broadcast, sound recording, and Sui Generis Database 90 | Rights, without regard to how the rights are labeled or 91 | categorized. For purposes of this Public License, the rights 92 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 93 | Rights. 94 | d. Effective Technological Measures means those measures that, in the 95 | absence of proper authority, may not be circumvented under laws 96 | fulfilling obligations under Article 11 of the WIPO Copyright 97 | Treaty adopted on December 20, 1996, and/or similar international 98 | agreements. 99 | 100 | e. Exceptions and Limitations means fair use, fair dealing, and/or 101 | any other exception or limitation to Copyright and Similar Rights 102 | that applies to Your use of the Licensed Material. 103 | 104 | f. Licensed Material means the artistic or literary work, database, 105 | or other material to which the Licensor applied this Public 106 | License. 107 | 108 | g. Licensed Rights means the rights granted to You subject to the 109 | terms and conditions of this Public License, which are limited to 110 | all Copyright and Similar Rights that apply to Your use of the 111 | Licensed Material and that the Licensor has authority to license. 112 | 113 | h. Licensor means the individual(s) or entity(ies) granting rights 114 | under this Public License. 115 | 116 | i. NonCommercial means not primarily intended for or directed towards 117 | commercial advantage or monetary compensation. For purposes of 118 | this Public License, the exchange of the Licensed Material for 119 | other material subject to Copyright and Similar Rights by digital 120 | file-sharing or similar means is NonCommercial provided there is 121 | no payment of monetary compensation in connection with the 122 | exchange. 123 | 124 | j. Share means to provide material to the public by any means or 125 | process that requires permission under the Licensed Rights, such 126 | as reproduction, public display, public performance, distribution, 127 | dissemination, communication, or importation, and to make material 128 | available to the public including in ways that members of the 129 | public may access the material from a place and at a time 130 | individually chosen by them. 131 | 132 | k. Sui Generis Database Rights means rights other than copyright 133 | resulting from Directive 96/9/EC of the European Parliament and of 134 | the Council of 11 March 1996 on the legal protection of databases, 135 | as amended and/or succeeded, as well as other essentially 136 | equivalent rights anywhere in the world. 137 | 138 | l. You means the individual or entity exercising the Licensed Rights 139 | under this Public License. Your has a corresponding meaning. 140 | 141 | 142 | Section 2 -- Scope. 143 | 144 | a. License grant. 145 | 146 | 1. Subject to the terms and conditions of this Public License, 147 | the Licensor hereby grants You a worldwide, royalty-free, 148 | non-sublicensable, non-exclusive, irrevocable license to 149 | exercise the Licensed Rights in the Licensed Material to: 150 | 151 | a. reproduce and Share the Licensed Material, in whole or 152 | in part, for NonCommercial purposes only; and 153 | 154 | b. produce, reproduce, and Share Adapted Material for 155 | NonCommercial purposes only. 156 | 157 | 2. Exceptions and Limitations. For the avoidance of doubt, where 158 | Exceptions and Limitations apply to Your use, this Public 159 | License does not apply, and You do not need to comply with 160 | its terms and conditions. 161 | 162 | 3. Term. The term of this Public License is specified in Section 163 | 6(a). 164 | 165 | 4. Media and formats; technical modifications allowed. The 166 | Licensor authorizes You to exercise the Licensed Rights in 167 | all media and formats whether now known or hereafter created, 168 | and to make technical modifications necessary to do so. The 169 | Licensor waives and/or agrees not to assert any right or 170 | authority to forbid You from making technical modifications 171 | necessary to exercise the Licensed Rights, including 172 | technical modifications necessary to circumvent Effective 173 | Technological Measures. For purposes of this Public License, 174 | simply making modifications authorized by this Section 2(a) 175 | (4) never produces Adapted Material. 176 | 177 | 5. Downstream recipients. 178 | 179 | a. Offer from the Licensor -- Licensed Material. Every 180 | recipient of the Licensed Material automatically 181 | receives an offer from the Licensor to exercise the 182 | Licensed Rights under the terms and conditions of this 183 | Public License. 184 | 185 | b. No downstream restrictions. You may not offer or impose 186 | any additional or different terms or conditions on, or 187 | apply any Effective Technological Measures to, the 188 | Licensed Material if doing so restricts exercise of the 189 | Licensed Rights by any recipient of the Licensed 190 | Material. 191 | 192 | 6. No endorsement. Nothing in this Public License constitutes or 193 | may be construed as permission to assert or imply that You 194 | are, or that Your use of the Licensed Material is, connected 195 | with, or sponsored, endorsed, or granted official status by, 196 | the Licensor or others designated to receive attribution as 197 | provided in Section 3(a)(1)(A)(i). 198 | 199 | b. Other rights. 200 | 201 | 1. Moral rights, such as the right of integrity, are not 202 | licensed under this Public License, nor are publicity, 203 | privacy, and/or other similar personality rights; however, to 204 | the extent possible, the Licensor waives and/or agrees not to 205 | assert any such rights held by the Licensor to the limited 206 | extent necessary to allow You to exercise the Licensed 207 | Rights, but not otherwise. 208 | 209 | 2. Patent and trademark rights are not licensed under this 210 | Public License. 211 | 212 | 3. To the extent possible, the Licensor waives any right to 213 | collect royalties from You for the exercise of the Licensed 214 | Rights, whether directly or through a collecting society 215 | under any voluntary or waivable statutory or compulsory 216 | licensing scheme. In all other cases the Licensor expressly 217 | reserves any right to collect such royalties, including when 218 | the Licensed Material is used other than for NonCommercial 219 | purposes. 220 | 221 | 222 | Section 3 -- License Conditions. 223 | 224 | Your exercise of the Licensed Rights is expressly made subject to the 225 | following conditions. 226 | 227 | a. Attribution. 228 | 229 | 1. If You Share the Licensed Material (including in modified 230 | form), You must: 231 | 232 | a. retain the following if it is supplied by the Licensor 233 | with the Licensed Material: 234 | 235 | i. identification of the creator(s) of the Licensed 236 | Material and any others designated to receive 237 | attribution, in any reasonable manner requested by 238 | the Licensor (including by pseudonym if 239 | designated); 240 | 241 | ii. a copyright notice; 242 | 243 | iii. a notice that refers to this Public License; 244 | 245 | iv. a notice that refers to the disclaimer of 246 | warranties; 247 | 248 | v. a URI or hyperlink to the Licensed Material to the 249 | extent reasonably practicable; 250 | 251 | b. indicate if You modified the Licensed Material and 252 | retain an indication of any previous modifications; and 253 | 254 | c. indicate the Licensed Material is licensed under this 255 | Public License, and include the text of, or the URI or 256 | hyperlink to, this Public License. 257 | 258 | 2. You may satisfy the conditions in Section 3(a)(1) in any 259 | reasonable manner based on the medium, means, and context in 260 | which You Share the Licensed Material. For example, it may be 261 | reasonable to satisfy the conditions by providing a URI or 262 | hyperlink to a resource that includes the required 263 | information. 264 | 265 | 3. If requested by the Licensor, You must remove any of the 266 | information required by Section 3(a)(1)(A) to the extent 267 | reasonably practicable. 268 | 269 | 4. If You Share Adapted Material You produce, the Adapter's 270 | License You apply must not prevent recipients of the Adapted 271 | Material from complying with this Public License. 272 | 273 | 274 | Section 4 -- Sui Generis Database Rights. 275 | 276 | Where the Licensed Rights include Sui Generis Database Rights that 277 | apply to Your use of the Licensed Material: 278 | 279 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 280 | to extract, reuse, reproduce, and Share all or a substantial 281 | portion of the contents of the database for NonCommercial purposes 282 | only; 283 | 284 | b. if You include all or a substantial portion of the database 285 | contents in a database in which You have Sui Generis Database 286 | Rights, then the database in which You have Sui Generis Database 287 | Rights (but not its individual contents) is Adapted Material; and 288 | 289 | c. You must comply with the conditions in Section 3(a) if You Share 290 | all or a substantial portion of the contents of the database. 291 | 292 | For the avoidance of doubt, this Section 4 supplements and does not 293 | replace Your obligations under this Public License where the Licensed 294 | Rights include other Copyright and Similar Rights. 295 | 296 | 297 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 298 | 299 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 300 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 301 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 302 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 303 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 304 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 305 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 306 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 307 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 308 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 309 | 310 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 311 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 312 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 313 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 314 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 315 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 316 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 317 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 318 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 319 | 320 | c. The disclaimer of warranties and limitation of liability provided 321 | above shall be interpreted in a manner that, to the extent 322 | possible, most closely approximates an absolute disclaimer and 323 | waiver of all liability. 324 | 325 | 326 | Section 6 -- Term and Termination. 327 | 328 | a. This Public License applies for the term of the Copyright and 329 | Similar Rights licensed here. However, if You fail to comply with 330 | this Public License, then Your rights under this Public License 331 | terminate automatically. 332 | 333 | b. Where Your right to use the Licensed Material has terminated under 334 | Section 6(a), it reinstates: 335 | 336 | 1. automatically as of the date the violation is cured, provided 337 | it is cured within 30 days of Your discovery of the 338 | violation; or 339 | 340 | 2. upon express reinstatement by the Licensor. 341 | 342 | For the avoidance of doubt, this Section 6(b) does not affect any 343 | right the Licensor may have to seek remedies for Your violations 344 | of this Public License. 345 | 346 | c. For the avoidance of doubt, the Licensor may also offer the 347 | Licensed Material under separate terms or conditions or stop 348 | distributing the Licensed Material at any time; however, doing so 349 | will not terminate this Public License. 350 | 351 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 352 | License. 353 | 354 | 355 | Section 7 -- Other Terms and Conditions. 356 | 357 | a. The Licensor shall not be bound by any additional or different 358 | terms or conditions communicated by You unless expressly agreed. 359 | 360 | b. Any arrangements, understandings, or agreements regarding the 361 | Licensed Material not stated herein are separate from and 362 | independent of the terms and conditions of this Public License. 363 | 364 | 365 | Section 8 -- Interpretation. 366 | 367 | a. For the avoidance of doubt, this Public License does not, and 368 | shall not be interpreted to, reduce, limit, restrict, or impose 369 | conditions on any use of the Licensed Material that could lawfully 370 | be made without permission under this Public License. 371 | 372 | b. To the extent possible, if any provision of this Public License is 373 | deemed unenforceable, it shall be automatically reformed to the 374 | minimum extent necessary to make it enforceable. If the provision 375 | cannot be reformed, it shall be severed from this Public License 376 | without affecting the enforceability of the remaining terms and 377 | conditions. 378 | 379 | c. No term or condition of this Public License will be waived and no 380 | failure to comply consented to unless expressly agreed to by the 381 | Licensor. 382 | 383 | d. Nothing in this Public License constitutes or may be interpreted 384 | as a limitation upon, or waiver of, any privileges and immunities 385 | that apply to the Licensor or You, including from the legal 386 | processes of any jurisdiction or authority. 387 | 388 | ======================================================================= 389 | 390 | Creative Commons is not a party to its public 391 | licenses. Notwithstanding, Creative Commons may elect to apply one of 392 | its public licenses to material it publishes and in those instances 393 | will be considered the “Licensor.” The text of the Creative Commons 394 | public licenses is dedicated to the public domain under the CC0 Public 395 | Domain Dedication. Except for the limited purpose of indicating that 396 | material is shared under a Creative Commons public license or as 397 | otherwise permitted by the Creative Commons policies published at 398 | creativecommons.org/policies, Creative Commons does not authorize the 399 | use of the trademark "Creative Commons" or any other trademark or logo 400 | of Creative Commons without its prior written consent including, 401 | without limitation, in connection with any unauthorized modifications 402 | to any of its public licenses or any other arrangements, 403 | understandings, or agreements concerning use of licensed material. For 404 | the avoidance of doubt, this paragraph does not form part of the 405 | public licenses. 406 | 407 | Creative Commons may be contacted at creativecommons.org. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | # 🎡 FuFu Client 5 | 6 |
7 | 8 | [![Build Status](https://github.com/IMXNOOBX/FuFuClient/workflows/build/badge.svg?branch=main)](https://github.com/IMXNOOBX/FuFuClient/actions) 9 | 10 |
11 | 12 | A BlockGame client mod I made with the purpose of learning java and playing in LiveOverflow's server. Mod idea inspired by LiveOverflow. 13 | 14 | 15 | 16 | # 📣 Whats New 17 | 18 | > 1.1.8 - Code cleanup and some improvements
19 | > 1.1.7 - Changed some features to improve the look, soon more updates!!!
20 | > 1.1.5 - Fixed many issues, implemented kaihack's bypass, improved xray
21 | > 1.1.4 - Added watermark, coordinates, server... while in game
22 | > 1.1.3 - Added some chat commands, fixed flight anti kick
23 | > 1.1.2 - Added some new features, NightVision, Flight
24 | > 1.1.1 - Fixed issue with .gitignore file ignoring gradle-wrapper.jar
25 | > 1.1.0 - Nothing new yet just Fabric Example Mod 26 | 27 | ## 🔺 Features 28 | 29 | ```diff 30 | + Working Features 31 | • NativeUi - Minecraft Native ui to interact with the features. 32 | • LiveOverflow Mode - Enables some features to properly play in LiveOverflow's server . 33 | • NightVision - aka Fulbright. 34 | • Flight - Flight like a bird, AntiKick and NoFall together. 35 | • XRay - Simple based xRay mod. 36 | • Chat Commands: 37 | - fufuhelp: little help, with the description of each command. 38 | - fakegamemode, Change your gamemode clientside. 39 | - teleport, Teleport to close coordinates. 40 | - hud, toggles in game items while i make each item toggle. 41 | toggle: enables/disables the hud 42 | coords: enables/disables the coordinates in the hud 43 | ip: enables/disables the IP in the hud. Hoping to not leak the server ip again :D 44 | watermak: enables/disables the coolest watermark ever. 45 | - To Do 46 | ... 47 | ``` 48 | 49 | ## 🪁 Simple Use 50 | 51 | ***IntelliJ*** 52 | 53 | > gradlew genIdeaWorkspace 54 | 55 | ***Eclipse*** 56 | 57 | > gradlew genSources eclipse 58 | 59 | ***Other IDE's*** 60 | 61 | Use [this link](https://fabricmc.net/wiki/tutorial:setup) for more information. 62 | 63 | ***Compile*** 64 | 65 | > gradlew build 66 | 67 | ## 🎯 Recommended Mods 68 | 69 | ***ViaFabric*** 70 | 71 | > [ViaFabric](https://github.com/ViaVersion/ViaFabric) is the mod I recommend you, to be able to connect to different versions from 1.19.2. 72 | 73 | # 🔖 License & Copyright 74 | 75 | This project is licensed under [**CC BY-NC 4.0**](https://creativecommons.org/licenses/by-nc/4.0/). 76 | ```diff 77 | + You are free to: 78 | • Share: Copy and redistribute the material in any medium or format. 79 | • Adapt: Remix, transform, and build upon the material. 80 | + Under the following terms: 81 | • Attribution: You must give appropriate credit, provide a link to original the source repository, and indicate if changes were made. 82 | • Non-Commercial: You may not use the material for commercial purposes. 83 | - You are not allowed to: 84 | • Sell: This license forbids selling original or modified material for commercial purposes. 85 | • Sublicense: This license forbids sublicensing original or modified material. 86 | ``` 87 | ### ©️ Copyright 88 | The content of this project is ©️ by [IMXNOOBX](https://github.com/IMXNOOBX) and the respective contributors. See the [LICENSE.md](LICENSE.md) file for details. -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'fabric-loom' version '1.0-SNAPSHOT' 3 | id 'maven-publish' 4 | } 5 | 6 | sourceCompatibility = JavaVersion.VERSION_17 7 | targetCompatibility = JavaVersion.VERSION_17 8 | 9 | archivesBaseName = project.archives_base_name 10 | version = project.mod_version 11 | group = project.maven_group 12 | 13 | repositories { 14 | // Add repositories to retrieve artifacts from in here. 15 | // You should only use this when depending on other mods because 16 | // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. 17 | // See https://docs.gradle.org/current/userguide/declaring_repositories.html 18 | // for more information about repositories. 19 | } 20 | 21 | dependencies { 22 | // To change the versions see the gradle.properties file 23 | minecraft "com.mojang:minecraft:${project.minecraft_version}" 24 | mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" 25 | modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" 26 | 27 | // Fabric API. This is technically optional, but you probably want it anyway. 28 | modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" 29 | 30 | // Uncomment the following line to enable the deprecated Fabric API modules. 31 | // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time. 32 | 33 | // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}" 34 | } 35 | 36 | processResources { 37 | inputs.property "version", project.version 38 | 39 | filesMatching("fabric.mod.json") { 40 | expand "version": project.version 41 | } 42 | } 43 | 44 | tasks.withType(JavaCompile).configureEach { 45 | // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. 46 | it.options.release = 17 47 | } 48 | 49 | java { 50 | // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task 51 | // if it is present. 52 | // If you remove this line, sources will not be generated. 53 | withSourcesJar() 54 | } 55 | 56 | jar { 57 | from("LICENSE") { 58 | rename { "${it}_${project.archivesBaseName}"} 59 | } 60 | } 61 | 62 | // configure the maven publication 63 | publishing { 64 | publications { 65 | mavenJava(MavenPublication) { 66 | from components.java 67 | } 68 | } 69 | 70 | // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. 71 | repositories { 72 | // Add repositories to publish to here. 73 | // Notice: This block does NOT have the same function as the block in the top level. 74 | // The repositories here will be used for publishing your artifact, not for 75 | // retrieving dependencies. 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Done to increase the memory available to gradle. 2 | org.gradle.jvmargs=-Xmx1G 3 | 4 | # Fabric Properties 5 | # check these on https://fabricmc.net/develop 6 | minecraft_version=1.19.2 7 | yarn_mappings=1.19.2+build.8 8 | loader_version=0.14.9 9 | 10 | # Mod Properties 11 | mod_version = 1.1.8 12 | maven_group = xyz.imxnoobx 13 | archives_base_name = FuFuClient 14 | 15 | # Dependencies 16 | fabric_version=0.60.0+1.19.2 17 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IMXNOOBX/FuFuClient/419480379f9e4519c2251d1a38a8042ebfeeb0a8/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-7.5.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit 84 | 85 | APP_NAME="Gradle" 86 | APP_BASE_NAME=${0##*/} 87 | 88 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 89 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 90 | 91 | # Use the maximum available, or set MAX_FD != -1 to use that value. 92 | MAX_FD=maximum 93 | 94 | warn () { 95 | echo "$*" 96 | } >&2 97 | 98 | die () { 99 | echo 100 | echo "$*" 101 | echo 102 | exit 1 103 | } >&2 104 | 105 | # OS specific support (must be 'true' or 'false'). 106 | cygwin=false 107 | msys=false 108 | darwin=false 109 | nonstop=false 110 | case "$( uname )" in #( 111 | CYGWIN* ) cygwin=true ;; #( 112 | Darwin* ) darwin=true ;; #( 113 | MSYS* | MINGW* ) msys=true ;; #( 114 | NONSTOP* ) nonstop=true ;; 115 | esac 116 | 117 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 118 | 119 | 120 | # Determine the Java command to use to start the JVM. 121 | if [ -n "$JAVA_HOME" ] ; then 122 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 123 | # IBM's JDK on AIX uses strange locations for the executables 124 | JAVACMD=$JAVA_HOME/jre/sh/java 125 | else 126 | JAVACMD=$JAVA_HOME/bin/java 127 | fi 128 | if [ ! -x "$JAVACMD" ] ; then 129 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 130 | 131 | Please set the JAVA_HOME variable in your environment to match the 132 | location of your Java installation." 133 | fi 134 | else 135 | JAVACMD=java 136 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | 142 | # Increase the maximum file descriptors if we can. 143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 144 | case $MAX_FD in #( 145 | max*) 146 | MAX_FD=$( ulimit -H -n ) || 147 | warn "Could not query maximum file descriptor limit" 148 | esac 149 | case $MAX_FD in #( 150 | '' | soft) :;; #( 151 | *) 152 | ulimit -n "$MAX_FD" || 153 | warn "Could not set maximum file descriptor limit to $MAX_FD" 154 | esac 155 | fi 156 | 157 | # Collect all arguments for the java command, stacking in reverse order: 158 | # * args from the command line 159 | # * the main class name 160 | # * -classpath 161 | # * -D...appname settings 162 | # * --module-path (only if needed) 163 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 164 | 165 | # For Cygwin or MSYS, switch paths to Windows format before running java 166 | if "$cygwin" || "$msys" ; then 167 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 168 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 169 | 170 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 171 | 172 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 173 | for arg do 174 | if 175 | case $arg in #( 176 | -*) false ;; # don't mess with options #( 177 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 178 | [ -e "$t" ] ;; #( 179 | *) false ;; 180 | esac 181 | then 182 | arg=$( cygpath --path --ignore --mixed "$arg" ) 183 | fi 184 | # Roll the args list around exactly as many times as the number of 185 | # args, so each arg winds up back in the position where it started, but 186 | # possibly modified. 187 | # 188 | # NB: a `for` loop captures its iteration list before it begins, so 189 | # changing the positional parameters here affects neither the number of 190 | # iterations, nor the values presented in `arg`. 191 | shift # remove old arg 192 | set -- "$@" "$arg" # push replacement arg 193 | done 194 | fi 195 | 196 | # Collect all arguments for the java command; 197 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 198 | # shell script including quotes and variable substitutions, so put them in 199 | # double quotes to make sure that they get re-expanded; and 200 | # * put everything else in single quotes, so that it's not re-expanded. 201 | 202 | set -- \ 203 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 204 | -classpath "$CLASSPATH" \ 205 | org.gradle.wrapper.GradleWrapperMain \ 206 | "$@" 207 | 208 | # Use "xargs" to parse quoted args. 209 | # 210 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 211 | # 212 | # In Bash we could simply go: 213 | # 214 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 215 | # set -- "${ARGS[@]}" "$@" 216 | # 217 | # but POSIX shell has neither arrays nor command substitution, so instead we 218 | # post-process each arg (as a line of input to sed) to backslash-escape any 219 | # character that might be a shell metacharacter, then use eval to reverse 220 | # that process (while maintaining the separation between arguments), and wrap 221 | # the whole thing up as a single "set" statement. 222 | # 223 | # This will of course break if any of these variables contains a newline or 224 | # an unmatched quote. 225 | # 226 | 227 | eval "set -- $( 228 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 229 | xargs -n1 | 230 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 231 | tr '\n' ' ' 232 | )" '"$@"' 233 | 234 | exec "$JAVACMD" "$@" 235 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven { 4 | name = 'Fabric' 5 | url = 'https://maven.fabricmc.net/' 6 | } 7 | mavenCentral() 8 | gradlePluginPortal() 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/FuFuClient.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient; 2 | 3 | import com.mojang.brigadier.CommandDispatcher; 4 | import net.fabricmc.api.ModInitializer; 5 | import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; 6 | import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; 7 | import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; 8 | import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; 9 | import net.minecraft.client.MinecraftClient; 10 | import net.minecraft.client.option.KeyBinding; 11 | import net.minecraft.client.util.InputUtil; 12 | import net.minecraft.command.CommandRegistryAccess; 13 | import net.minecraft.text.Text; 14 | import org.lwjgl.glfw.GLFW; 15 | import org.slf4j.Logger; 16 | import org.slf4j.LoggerFactory; 17 | import xyz.imxnoobx.fufuclient.gui.OptionsScreen; 18 | import xyz.imxnoobx.fufuclient.commands.*; 19 | import xyz.imxnoobx.fufuclient.modules.*; 20 | 21 | public class FuFuClient implements ModInitializer { 22 | public static String name = "FuFuClient"; 23 | public static String colorName = "\u00a75F\u00a7du\u00a75F\u00a7du\u00a79C\u00a7blient\u00a7f"; 24 | public static String author = "IMXNOOBX"; 25 | public static String version = "1.1.8"; 26 | public static String game = "1.19.2"; 27 | public static final Logger LOGGER = LoggerFactory.getLogger(name); 28 | 29 | public static final MinecraftClient mc = MinecraftClient.getInstance(); 30 | 31 | public static int FuFuMode = 0; 32 | public static boolean nightvisionSwitch = false; 33 | //public static boolean fakeCreative = false; 34 | public static boolean flightSwitch = false; 35 | //public static boolean worldBorder = false; 36 | public static boolean xRay = false; 37 | public static boolean wgBypass = false; 38 | // hud related 39 | public static boolean hud = true; 40 | public static boolean hudCoords = true; 41 | public static boolean hudIP = false; 42 | public static boolean hudWatermak = true; 43 | 44 | 45 | public void onInitialize() { 46 | LOGGER.info("Hello from FuFuClient"); 47 | 48 | ClientCommandRegistrationCallback.EVENT.register(FuFuClient::registerCommands); 49 | 50 | // Open Key 51 | KeyBinding modSettingsKey = KeyBindingHelper.registerKeyBinding(new KeyBinding("Open Key", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_F6, "FuFuClient")); 52 | 53 | ClientTickEvents.END_CLIENT_TICK.register(client -> { 54 | while (modSettingsKey.wasPressed()) { 55 | client.getInstance().setScreen(new OptionsScreen(null)); 56 | } 57 | }); 58 | 59 | ClientTickEvents.START_CLIENT_TICK.register(FuFuClient::registerModules); 60 | } 61 | // \u00a7 == § 62 | public static void chatLog(String text) { 63 | if(mc.player != null) mc.player.sendMessage(Text.literal("[" + colorName+ "] " + text)); 64 | } 65 | 66 | private static void registerModules(MinecraftClient client) { 67 | Flight.tick(client); 68 | NightVision.tick(client); 69 | xRayModule.tick(client); 70 | WorldGuardBypass.tick(client); 71 | } 72 | 73 | private static void registerCommands(CommandDispatcher commandDispatcher, CommandRegistryAccess commandRegistryAccess) { 74 | FuFuHelp.register(commandDispatcher); 75 | TeleportToCoords.register(commandDispatcher); 76 | FakeGamemode.register(commandDispatcher); 77 | CustomizeHud.register(commandDispatcher); 78 | //WorldBorder.register(commandDispatcher); 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/commands/CustomizeHud.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.commands; 2 | 3 | import com.mojang.brigadier.CommandDispatcher; 4 | import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; 5 | import xyz.imxnoobx.fufuclient.FuFuClient; 6 | 7 | 8 | import static com.mojang.brigadier.arguments.BoolArgumentType.bool; 9 | import static com.mojang.brigadier.arguments.BoolArgumentType.getBool; 10 | import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; 11 | import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; 12 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 13 | 14 | public class CustomizeHud { 15 | public static void register(CommandDispatcher dispatcher) { 16 | dispatcher.register(literal("hud") 17 | .then(literal("toggle") 18 | .then(argument("toggle", bool()) 19 | .executes(context -> hud(context.getSource(), getBool(context, "toggle"))))) 20 | .then(literal("coords") 21 | .then(argument("coords", bool()) 22 | .executes(context -> hudInfoCoords(context.getSource(), getBool(context, "coords"))))) 23 | .then(literal("ip") 24 | .then(argument("ip", bool()) 25 | .executes(context -> hudInfoIp(context.getSource(), getBool(context, "ip"))))) 26 | .then(literal("watermark") 27 | .then(argument("watermark", bool()) 28 | .executes(context -> hudInfoWatermark(context.getSource(), getBool(context, "watermark"))))) 29 | ); 30 | } 31 | 32 | private static int hudInfoCoords(FabricClientCommandSource source, boolean opt) { 33 | hudCoords = opt; 34 | FuFuClient.chatLog("Hud Coordinates: " + (hudCoords ? "\u00a7aEnabled" : "\u00a7cDisabled")); 35 | return 1; 36 | } 37 | 38 | private static int hudInfoIp(FabricClientCommandSource source, boolean opt) { 39 | hudIP = opt; 40 | FuFuClient.chatLog("Hud Ip Address: " + (hudIP ? "\u00a7aEnabled" : "\u00a7cDisabled")); 41 | return 1; 42 | } 43 | 44 | private static int hudInfoWatermark(FabricClientCommandSource source, boolean opt) { 45 | hudWatermak = opt; 46 | FuFuClient.chatLog("Hud Watermak: " + (hudWatermak ? "\u00a7aEnabled" : "\u00a7cDisabled")); 47 | return 1; 48 | } 49 | 50 | private static int hud(FabricClientCommandSource source, boolean opt) { 51 | hud = opt; 52 | FuFuClient.chatLog("Hud: " + (hudWatermak ? "\u00a7aEnabled" : "\u00a7cDisabled")); 53 | return 1; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/commands/FakeGamemode.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.commands; 2 | 3 | import com.mojang.brigadier.CommandDispatcher; 4 | import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; 5 | import net.minecraft.world.GameMode; 6 | import xyz.imxnoobx.fufuclient.FuFuClient; 7 | 8 | 9 | 10 | import static com.mojang.brigadier.arguments.ArgumentType.*; 11 | import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; 12 | import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; 13 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 14 | 15 | public class FakeGamemode { 16 | public static void register(CommandDispatcher dispatcher) { 17 | dispatcher.register(literal("fakegamemode") 18 | .then(literal("survival") 19 | .executes(context -> setGameMode(context.getSource(), 0))) 20 | .then(literal("creative") 21 | .executes(context -> setGameMode(context.getSource(), 1))) 22 | .then(literal("spectator") 23 | .executes(context -> setGameMode(context.getSource(), 2))) 24 | .then(literal("restore") 25 | .executes(context -> setGameMode(context.getSource(), -1))) 26 | ); 27 | } 28 | 29 | private static int setGameMode(FabricClientCommandSource source, int opt) { 30 | if(opt != -1) 31 | mc.interactionManager.setGameMode(GameMode.byId(opt)); 32 | else 33 | mc.interactionManager.setGameMode(mc.interactionManager.getPreviousGameMode()); 34 | FuFuClient.chatLog("Set Clientside game mode: " + (opt == 0 ? "\u00a7aSurvival" : opt == 1 ? "\u00a7aCreative" : opt == 1 ? "\u00a7aSepectator": "\u00a7cDisabled")); 35 | return 1; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/commands/FuFuHelp.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.commands; 2 | 3 | import com.mojang.brigadier.CommandDispatcher; 4 | import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; 5 | import net.minecraft.text.Text; 6 | import net.minecraft.world.GameMode; 7 | import xyz.imxnoobx.fufuclient.FuFuClient; 8 | 9 | import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; 10 | import static xyz.imxnoobx.fufuclient.FuFuClient.mc; 11 | 12 | public class FuFuHelp { 13 | public static void register(CommandDispatcher dispatcher) { 14 | dispatcher.register(literal("fufuhelp") 15 | .executes(context -> printHelp(context.getSource())) 16 | ); 17 | } 18 | 19 | private static int printHelp(FabricClientCommandSource source) { 20 | FuFuClient.chatLog("Commands:"); 21 | String helpCommands = "\u00a7b/fakegamemode\u00a7f: Sets your game mode clientside.\n" 22 | + "\u00a7b/hud\u00a7f: \n" 23 | + " \u00a79toggle\u00a7f: enables/disables the hud\n" 24 | + " \u00a79coords\u00a7f: enables/disables the coordinates in the hud\n" 25 | + " \u00a79ip\u00a7f: enables/disables the IP in the hud. Hoping to not leak the server ip again :D\n" 26 | + " \u00a79watermak\u00a7f: enables/disables the coolest watermark ever.\n" 27 | + "\u00a7b/teleport\u00a7f: teleport to close coordinates.\n"; 28 | 29 | source.sendFeedback(Text.literal(helpCommands)); 30 | return 1; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/commands/TeleportToCoords.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.commands; 2 | 3 | import com.mojang.brigadier.CommandDispatcher; 4 | import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; 5 | 6 | import static com.mojang.brigadier.arguments.IntegerArgumentType.*; 7 | import net.minecraft.text.Text; 8 | import xyz.imxnoobx.fufuclient.FuFuClient; 9 | 10 | import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; 11 | import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; 12 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 13 | 14 | public class TeleportToCoords { 15 | 16 | //private static final int ammount = 0; 17 | 18 | public static void register(CommandDispatcher dispatcher) { 19 | dispatcher.register(literal("teleport") 20 | .then(argument("x", integer()) 21 | .then(argument("y", integer()) 22 | .then(argument("z", integer()) 23 | .executes(context -> teleporTo(context.getSource(), getInteger(context, "x"), getInteger(context, "y"), getInteger(context, "z"))) 24 | ))) 25 | ); 26 | } 27 | 28 | private static int teleporTo(FabricClientCommandSource source, int x, int y, int z) { 29 | //mc.player.setPosition(mc.player.getX() + x, mc.player.getY() + y, mc.player.getZ() + z); 30 | if (x == 0) 31 | x = (int) mc.player.getX(); 32 | if(y == 0) 33 | y = (int) mc.player.getY(); 34 | if(z == 0) 35 | z = (int) mc.player.getZ(); 36 | mc.player.setPosition(x, y, z); 37 | String formatCoords = String.format("%.0fx, %.0fy, %.0fz", mc.player.getX() + x, mc.player.getY() + y, mc.player.getZ() + z); 38 | 39 | FuFuClient.chatLog("Teleported to [\u00a77" + formatCoords + "\u00a7f]"); 40 | return 1; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/gui/GameHud.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.gui; 2 | 3 | import com.mojang.blaze3d.systems.RenderSystem; 4 | import net.fabricmc.api.EnvType; 5 | import net.fabricmc.api.Environment; 6 | import net.minecraft.client.MinecraftClient; 7 | import net.minecraft.client.font.TextRenderer; 8 | import net.minecraft.client.network.ClientPlayerEntity; 9 | import net.minecraft.client.render.item.ItemRenderer; 10 | import net.minecraft.client.util.math.MatrixStack; 11 | import net.minecraft.text.Text; 12 | import net.minecraft.util.math.Direction; 13 | import xyz.imxnoobx.fufuclient.FuFuClient; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | import java.security.*; 18 | 19 | import static xyz.imxnoobx.fufuclient.FuFuClient.mc; 20 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 21 | @Environment(EnvType.CLIENT) 22 | public class GameHud { 23 | private final MinecraftClient client; 24 | private final TextRenderer fontRenderer; 25 | private ClientPlayerEntity player; 26 | private MatrixStack matrixStack; 27 | 28 | private float width, height; 29 | //private final ItemRenderer itemRenderer; 30 | public GameHud(MinecraftClient client) { 31 | this.client = client; 32 | this.fontRenderer = client.textRenderer; 33 | // this.itemRenderer = client.getItemRenderer(); 34 | 35 | this.width = client.getWindow().getWidth(); 36 | this.height = client.getWindow().getHeight(); 37 | 38 | } 39 | 40 | public void draw(MatrixStack matrixStack) { 41 | if (!hud) return; 42 | 43 | this.player = this.client.player; 44 | 45 | this.matrixStack = matrixStack; 46 | 47 | RenderSystem.enableBlend(); 48 | 49 | if(hudWatermak) this.drawWatermak(); 50 | this.drawInfo(); 51 | 52 | this.client.getProfiler().pop(); 53 | } 54 | 55 | private void drawInfo() { 56 | // Draw lines of Array of Game info in the screen 57 | List gameInfo = getGameInfo(); 58 | 59 | int lineHeight = this.fontRenderer.fontHeight; 60 | int top = client.getWindow().getHeight(); 61 | int left = 4; 62 | 63 | for (String line : gameInfo) { 64 | this.fontRenderer.drawWithShadow(this.matrixStack, line, left, top / 2 - (lineHeight + 4), 0x00E0E0E0); 65 | top -= lineHeight + 12; 66 | } 67 | } 68 | 69 | private void drawWatermak() { 70 | int top = 0; 71 | int left = 4; 72 | 73 | this.fontRenderer.drawWithShadow(this.matrixStack, FuFuClient.colorName + " - " + FuFuClient.version, left, top + 4, 0x00E0E0E0); 74 | } 75 | 76 | private List getGameInfo() { 77 | List gameInfo = new ArrayList<>(); 78 | 79 | String coordDirectionStatus = ""; 80 | String direction = this.player.getHorizontalFacing().asString(); 81 | 82 | if (hudCoords) { 83 | String coordsFormat = "%.0f, %.0f, %.0f"; 84 | if (this.player.getWorld().getRegistryKey().getValue().toString().equals("minecraft:overworld")) { 85 | gameInfo.add("\u00a7cNether: \u00a7f" + String.format(coordsFormat, this.player.getX() / 8, this.player.getY(), this.player.getZ() / 8)); 86 | } else if (this.player.getWorld().getRegistryKey().getValue().toString().equals("minecraft:the_nether")) { 87 | gameInfo.add("\u00a7aOverworld: \u00a7f" + String.format(coordsFormat, this.player.getX() * 8, this.player.getY(), this.player.getZ() * 8)); 88 | } 89 | } 90 | 91 | 92 | if (hudCoords) { 93 | String coordsFormat = "%.0f, %.0f, %.0f"; 94 | coordDirectionStatus += String.format(coordsFormat, this.player.getX(), this.player.getY(), this.player.getZ()); 95 | 96 | if (hudCoords) { 97 | coordDirectionStatus += " (" + direction + ")"; 98 | } 99 | gameInfo.add("\u00a78Cords: \u00a7f"+coordDirectionStatus); 100 | } 101 | 102 | 103 | 104 | if (false) { 105 | // gameInfo.add(client.fpsDebugString.substring(0, client.fpsDebugString.indexOf("s") + 1)); 106 | // gameInfo.add(String.format("%d fps", ((GameClientMixin) MinecraftClient.getInstance()).getCurrentFps())); 107 | } 108 | 109 | if (hudIP) { 110 | String serverName = "Single Player"; 111 | try { 112 | serverName = client.getCurrentServerEntry().address; 113 | } catch (Exception e) { } 114 | 115 | gameInfo.add("\u00a78Server: \u00a7f"+serverName); 116 | } 117 | 118 | return gameInfo; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/gui/OptionsScreen.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.gui; 2 | 3 | import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; 4 | import it.unimi.dsi.fastutil.ints.Int2ObjectMap; 5 | 6 | import net.minecraft.client.gui.screen.Screen; 7 | import net.minecraft.client.gui.widget.ButtonWidget; 8 | 9 | import net.minecraft.entity.effect.StatusEffects; 10 | import net.minecraft.text.Text; 11 | import net.minecraft.world.GameMode; 12 | import xyz.imxnoobx.fufuclient.FuFuClient; 13 | import xyz.imxnoobx.fufuclient.modules.WorldGuardBypass; 14 | import xyz.imxnoobx.fufuclient.modules.xRayModule; 15 | 16 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 17 | 18 | 19 | public class OptionsScreen extends Screen { 20 | private Screen parent; 21 | 22 | private static final int TITLE_FULL_BUTTON_WIDTH = 200; 23 | private static final int INGAME_FULL_BUTTON_WIDTH = 204; 24 | private static final int HALF_BUTTON_WIDTH = 98; 25 | private static final int BUTTON_HEIGHT = 20; 26 | private static final int BUTTON_VERICAL_SPACING = 24; 27 | 28 | private static double dmgPerblock; 29 | private static int warnPerblock; 30 | private static double size; 31 | private static double getSafe; 32 | 33 | private boolean initIsProcessing; 34 | public OptionsScreen(Screen parent) { 35 | super(Text.literal("Hack Options")); 36 | this.parent = parent; 37 | } 38 | 39 | @Override 40 | protected void init() { // https://github.com/roflmuffin/fabric-title-changer 41 | super.init(); 42 | if(initIsProcessing) return; 43 | initIsProcessing = true; 44 | 45 | addDrawableChild(new ButtonWidget(10, 10, 70, 20, Text.literal("Go Back"), button -> { 46 | client.setScreen(parent); 47 | FuFuClient.LOGGER.info("Button Clicked, Going back to the Parent screen!"); 48 | })); 49 | addDrawableChild(new ButtonWidget(this.width / 2 - 102/*half of the button width*/, this.height / 6 + BUTTON_VERICAL_SPACING, INGAME_FULL_BUTTON_WIDTH, 20, Text.literal("Fliying is " + (flightSwitch ? "\u00a7aEnabled" : "\u00a7cDisabled")), button -> { 50 | FuFuClient.LOGGER.info("Button Clicked, Toggling Flight!"); 51 | flightSwitch = !flightSwitch; 52 | clearAndInit(); 53 | })); 54 | addDrawableChild(new ButtonWidget(this.width / 2 - 102, this.height / 6 + BUTTON_VERICAL_SPACING * 2, INGAME_FULL_BUTTON_WIDTH, 20, Text.literal("NightVision is " + (nightvisionSwitch ? "\u00a7aEnabled" : "\u00a7cDisabled")), button -> { 55 | FuFuClient.LOGGER.info("Button Clicked, Toggling NightVision!"); 56 | nightvisionSwitch = !nightvisionSwitch; 57 | if (!nightvisionSwitch && mc.player != null) 58 | mc.player.removeStatusEffect(StatusEffects.NIGHT_VISION); 59 | clearAndInit(); 60 | })); 61 | addDrawableChild(new ButtonWidget(this.width / 2 - 102, this.height / 6 + BUTTON_VERICAL_SPACING * 3, INGAME_FULL_BUTTON_WIDTH, 20, Text.literal("Xray is " + (xRay ? "\u00a7aEnabled" : "\u00a7cDisabled")), button -> { 62 | FuFuClient.LOGGER.info("Button Clicked, Toggling Xray!"); 63 | xRay = !xRay; 64 | if(xRay) xRayModule.onStart(mc); else xRayModule.onDisable(mc); 65 | clearAndInit(); 66 | })); 67 | addDrawableChild(new ButtonWidget(this.width / 2 - 102, this.height / 6 + BUTTON_VERICAL_SPACING * 4, INGAME_FULL_BUTTON_WIDTH, 20, Text.literal("World Guard Bypass is " + (wgBypass ? "\u00a7aEnabled" : "\u00a7cDisabled")), button -> { 68 | FuFuClient.LOGGER.info("Button Clicked, Toggling HumanBypass!"); 69 | wgBypass = !wgBypass; 70 | if(wgBypass) WorldGuardBypass.onStart(mc); else WorldGuardBypass.onDisable(mc); 71 | clearAndInit(); 72 | })); 73 | addDrawableChild(new ButtonWidget(this.width - (HALF_BUTTON_WIDTH + 20), 10, HALF_BUTTON_WIDTH + 10, 20, Text.literal("Mode " + (FuFuMode == 0 ? "\u00a7cDisabled" : "\u00a7aLiveOverflow")), button -> { 74 | FuFuClient.LOGGER.info("Button Clicked, Switching FuFuMode!"); 75 | FuFuMode++; if(FuFuMode > 1) FuFuMode = 0; 76 | 77 | switch (FuFuMode) { 78 | case 1: // LiveOverflow 79 | mc.interactionManager.setGameMode(GameMode.byId(0)); 80 | FuFuClient.chatLog("Creative Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 81 | 82 | dmgPerblock = mc.world.getWorldBorder().getDamagePerBlock(); 83 | warnPerblock = mc.world.getWorldBorder().getWarningBlocks(); 84 | size = mc.world.getWorldBorder().getSize(); 85 | getSafe = mc.world.getWorldBorder().getSafeZone(); 86 | mc.world.getWorldBorder().setWarningBlocks(0); 87 | mc.world.getWorldBorder().setDamagePerBlock(0); 88 | mc.world.getWorldBorder().setSize(Integer.MAX_VALUE); 89 | mc.world.getWorldBorder().setSafeZone(Integer.MAX_VALUE); 90 | FuFuClient.chatLog("WorldBorder Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 91 | 92 | FuFuClient.chatLog("Human Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 93 | 94 | FuFuClient.chatLog("Demo Screen Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 95 | break; 96 | default: 97 | mc.interactionManager.setGameMode(GameMode.byId(0)); // mc.interactionManager.setGameMode(mc.interactionManager.getPreviousGameMode()); // forcing survival mode cuz it sets you to creative mode idk why 98 | FuFuClient.chatLog("Creative Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 99 | 100 | 101 | mc.world.getWorldBorder().setWarningBlocks(warnPerblock); 102 | mc.world.getWorldBorder().setDamagePerBlock(dmgPerblock); 103 | mc.world.getWorldBorder().setSize(size); 104 | mc.world.getWorldBorder().setSafeZone(getSafe); 105 | FuFuClient.chatLog("WorldBorder Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 106 | 107 | FuFuClient.chatLog("Human Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 108 | 109 | FuFuClient.chatLog("Demo Screen Bypass: " + (FuFuMode == 1 ? "\u00a7aEnabled" : "\u00a7cDisabled")); 110 | break; 111 | } 112 | clearAndInit(); 113 | })); 114 | 115 | initIsProcessing = false; 116 | } 117 | 118 | @Override 119 | public void close() { 120 | client.setScreen(parent); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinBlock.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.util.math.Direction; 7 | import net.minecraft.world.BlockView; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 12 | import xyz.imxnoobx.fufuclient.FuFuClient; 13 | 14 | import static xyz.imxnoobx.fufuclient.FuFuClient.xRay; 15 | 16 | @Mixin(value = Block.class) // https://github.com/ate47/Xray/blob/fabric-1.19/src/main/java/fr/atesab/xray/mixins/MixinBlock.java 17 | public class MixinBlock { 18 | 19 | @Inject(at = @At("RETURN"), method = "shouldDrawSide(" + "Lnet/minecraft/block/BlockState;" + // state 20 | "Lnet/minecraft/world/BlockView;" + // reader 21 | "Lnet/minecraft/util/math/BlockPos;" + // pos 22 | "Lnet/minecraft/util/math/Direction;" + // face 23 | "Lnet/minecraft/util/math/BlockPos;" + // blockPosaaa 24 | ")Z", // ci 25 | cancellable = true) 26 | private static void shouldDrawSide(BlockState state, BlockView reader, BlockPos pos, Direction face, 27 | BlockPos blockPos, CallbackInfoReturnable ci) { 28 | //XrayMain.getMod().shouldSideBeRendered(state, reader, pos, face, ci); 29 | 30 | if(xRay) { 31 | ci.setReturnValue(state.getBlock().toString().contains("ore") ? true : false); 32 | } 33 | } 34 | 35 | private MixinBlock() { 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinClientConnection.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.entity.Entity; 5 | import net.minecraft.network.ClientConnection; 6 | import net.minecraft.network.Packet; 7 | import net.minecraft.network.PacketByteBuf; 8 | import net.minecraft.network.PacketCallbacks; 9 | import net.minecraft.network.listener.ClientPlayPacketListener; 10 | import net.minecraft.network.listener.PacketListener; 11 | import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; 12 | import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; 13 | import net.minecraft.network.packet.s2c.play.*; 14 | 15 | import org.spongepowered.asm.mixin.Mixin; 16 | import org.spongepowered.asm.mixin.Shadow; 17 | import org.spongepowered.asm.mixin.injection.At; 18 | import org.spongepowered.asm.mixin.injection.Inject; 19 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 20 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 21 | 22 | import io.netty.channel.Channel; 23 | import io.netty.channel.ChannelHandlerContext; 24 | import io.netty.util.concurrent.Future; 25 | import io.netty.util.concurrent.GenericFutureListener; 26 | import xyz.imxnoobx.fufuclient.*; 27 | 28 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 29 | 30 | @Mixin(ClientConnection.class) 31 | public class MixinClientConnection { 32 | 33 | @Shadow private Channel channel; 34 | 35 | @Shadow private PacketListener packetListener; 36 | 37 | @ModifyVariable(method = "sendImmediately", at = @At ("HEAD"), ordinal = 0) // Modify outgoing packets 38 | private Packet modifyPacket(Packet packet) { 39 | 40 | if (FuFuMode == 1 && packet instanceof VehicleMoveC2SPacket) { 41 | VehicleMoveC2SPacket pkt = (VehicleMoveC2SPacket) packet; 42 | 43 | Entity vehicle = FuFuClient.mc.player.getVehicle(); 44 | 45 | vehicle.setPos((double) (long)(pkt.getX() * 100.0) / 100.0, pkt.getY(), (double) (long)(pkt.getZ() * 100.0) / 100.0); // Hope this works 46 | 47 | return new VehicleMoveC2SPacket( 48 | vehicle 49 | ); 50 | } 51 | 52 | return packet; 53 | 54 | } 55 | 56 | // Read: Incoming packets 57 | @Inject(method = "handlePacket", at = @At("HEAD"), cancellable = true) 58 | private static void handlePacket(Packet packet, PacketListener listener, CallbackInfo callback) { 59 | 60 | if(FuFuMode == 1) { 61 | if (packet instanceof GameStateChangeS2CPacket) { 62 | GameStateChangeS2CPacket pkt = (GameStateChangeS2CPacket) packet; 63 | 64 | if (pkt.getReason().equals(GameStateChangeS2CPacket.DEMO_MESSAGE_SHOWN)/* || pkt.getValue() == 104*/) { 65 | LOGGER.info("GameStateChangeS2CPacket called with reason DEMO_MESSAGE_SHOWN and callback blocked!"); 66 | callback.cancel(); 67 | } 68 | 69 | if (pkt.getReason().equals(GameStateChangeS2CPacket.GAME_MODE_CHANGED)) { 70 | LOGGER.info("GameStateChangeS2CPacket called with reason GAME_MODE_CHANGED and callback blocked!"); 71 | callback.cancel(); 72 | } 73 | } 74 | 75 | if(packet instanceof WorldBorderSizeChangedS2CPacket){ 76 | LOGGER.info("WorldBorderSizeChangedS2CPacket called and callback blocked!"); 77 | callback.cancel(); 78 | } 79 | 80 | if(packet instanceof WorldBorderInitializeS2CPacket){ 81 | LOGGER.info("WorldBorderInitializeS2CPacket called and callback blocked!"); 82 | callback.cancel(); 83 | } 84 | } 85 | } 86 | 87 | 88 | // Send: Outgoing packets 89 | @Inject(method = "send(Lnet/minecraft/network/Packet;Lnet/minecraft/network/PacketCallbacks;)V", at = @At("HEAD"), cancellable = true) 90 | private void send(Packet packet, PacketCallbacks packetCallback, CallbackInfo callback) { 91 | // https://maven.fabricmc.net/docs/yarn-1.19.2+build.5/net/minecraft/network/ClientConnection.html 92 | // callback.cancel(); to cancel the packet 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinGameInfo.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import net.fabricmc.api.EnvType; 4 | import net.fabricmc.api.Environment; 5 | import net.minecraft.client.MinecraftClient; 6 | import net.minecraft.client.gui.hud.InGameHud; 7 | import net.minecraft.client.render.item.ItemRenderer; 8 | import net.minecraft.client.util.math.MatrixStack; 9 | import org.spongepowered.asm.mixin.Final; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.Shadow; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 15 | import xyz.imxnoobx.fufuclient.gui.GameHud; 16 | 17 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 18 | 19 | @Environment(EnvType.CLIENT) 20 | @Mixin(value = InGameHud.class) 21 | public class MixinGameInfo { 22 | 23 | private GameHud hudInfo; 24 | 25 | @Shadow 26 | @Final 27 | private MinecraftClient client; 28 | 29 | @Inject(method = "(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/render/item/ItemRenderer;)V", at = @At(value = "RETURN")) 30 | private void onInit(MinecraftClient client, ItemRenderer render, CallbackInfo ci) { 31 | this.hudInfo = new GameHud(client); 32 | } 33 | 34 | @Inject(method = "render", at = @At("HEAD")) 35 | private void onDraw(MatrixStack matrixStack, float esp, CallbackInfo ci) { 36 | if (hud) { 37 | this.hudInfo.draw(matrixStack); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinGameOptionsScreen.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.gui.screen.Screen; 9 | import net.minecraft.client.gui.screen.GameMenuScreen; 10 | import net.minecraft.client.gui.widget.ButtonWidget; 11 | 12 | import xyz.imxnoobx.fufuclient.FuFuClient; 13 | import xyz.imxnoobx.fufuclient.gui.OptionsScreen; 14 | 15 | import net.minecraft.text.Text; 16 | 17 | @Mixin(GameMenuScreen.class) 18 | public class MixinGameOptionsScreen extends Screen { 19 | private MixinGameOptionsScreen(Text title) { 20 | super(title); 21 | } 22 | 23 | @Inject(method = "init", at = @At("RETURN")) 24 | private void init(CallbackInfo callback) { 25 | addDrawableChild(new ButtonWidget(10, 10, 100, 20, Text.literal("FuFu Client"), button -> { 26 | FuFuClient.LOGGER.info("Button Clicked!, Going to the Options screen!"); 27 | client.setScreen(new OptionsScreen(this)); 28 | })); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinMain.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import net.minecraft.entity.effect.StatusEffectInstance; 4 | import net.minecraft.entity.effect.StatusEffects; 5 | import xyz.imxnoobx.fufuclient.FuFuClient; 6 | import net.minecraft.client.gui.screen.TitleScreen; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | import xyz.imxnoobx.fufuclient.modules.*; 12 | 13 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 14 | 15 | @Mixin(TitleScreen.class) 16 | public class MixinMain { 17 | // @Inject(at = @At("HEAD"), method = "init()V") 18 | // private void init(CallbackInfo info) { 19 | // FuFuClient.LOGGER.info("This line is printed by FuFuClient's mixin!"); 20 | // } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinMinecraftClient.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.client.gui.screen.CreditsScreen; 5 | import net.minecraft.client.gui.screen.DemoScreen; 6 | import net.minecraft.client.gui.screen.Screen; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | 12 | import static xyz.imxnoobx.fufuclient.FuFuClient.FuFuMode; 13 | 14 | @Mixin(MinecraftClient.class) 15 | public class MixinMinecraftClient { 16 | 17 | @Inject(at = @At("HEAD"), method = "setScreen", cancellable = true) 18 | public void openScreen(Screen screen, CallbackInfo callback) { 19 | if(FuFuMode == 1) { 20 | if(screen instanceof DemoScreen) { 21 | System.out.println("DemoScreen called and callback blocked!"); 22 | callback.cancel(); 23 | } else if(screen instanceof CreditsScreen) { 24 | System.out.println("CreditsScreen called and callback blocked!"); 25 | callback.cancel(); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinPlayerMoveC2SPacket.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 6 | 7 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 8 | 9 | @Mixin(net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.class) 10 | public class MixinPlayerMoveC2SPacket { 11 | private static double lastModifyX; 12 | private static double lastModifyZ; 13 | 14 | @ModifyVariable(method = "(DDDFFZZZ)V", at = @At("HEAD"), ordinal = 0, argsOnly = true) // Credits: https://github.com/ProtoByter/kaihack, doesn't glitch pitch and yaw + if rounding error we restore the last packet 15 | private static double modifyX(double value) 16 | { 17 | if(FuFuMode != 1) return value; 18 | 19 | double modifyX = (double) (long)(value * 100.0) / 100.0; 20 | 21 | if (((long)modifyX * 1000) % 10 != 0) { 22 | LOGGER.info("Rounding error in \"X\"! Restoring last packet."); 23 | return lastModifyX; 24 | } 25 | lastModifyX = modifyX; 26 | return modifyX; 27 | } 28 | 29 | @ModifyVariable(method = "(DDDFFZZZ)V", at = @At("HEAD"), ordinal = 2, argsOnly = true) 30 | private static double modifyZ(double value) 31 | { 32 | if(FuFuMode != 1) return value; 33 | 34 | double modifyZ = (double) (long)(value * 100.0) / 100.0; 35 | 36 | if (((long)modifyZ * 1000) % 10 != 0) { 37 | LOGGER.info("Rounding error in \"Z\"! Restoring last packet."); 38 | return lastModifyZ; 39 | } 40 | lastModifyZ = modifyZ; 41 | return modifyZ; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/mixin/MixinVehicleMoveC2SPacket.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 6 | 7 | import static xyz.imxnoobx.fufuclient.FuFuClient.FuFuMode; 8 | import static xyz.imxnoobx.fufuclient.FuFuClient.LOGGER; 9 | 10 | 11 | @Mixin(net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket.class) 12 | public class MixinVehicleMoveC2SPacket { 13 | private static double lastModifyX; 14 | private static double lastModifyZ; 15 | 16 | /** Looking foward to make it this way 17 | @ModifyVariable(method = "(DDDFFZZZ)V", at = @At("HEAD"), ordinal = 0, argsOnly = true) 18 | private static double modifyX(double value) 19 | { 20 | if(FuFuMode != 1) return value; 21 | 22 | double modifyX = (double) (long)(value * 100.0) / 100.0; 23 | 24 | if (((long)modifyX * 1000) % 10 != 0) { 25 | LOGGER.info("Rounding error in \"X\"! Restoring last packet."); 26 | return lastModifyX; 27 | } 28 | lastModifyX = modifyX; 29 | return modifyX; 30 | } 31 | 32 | @ModifyVariable(method = "(DDDFFZZZ)V", at = @At("HEAD"), ordinal = 2, argsOnly = true) 33 | private static double modifyZ(double value) 34 | { 35 | if(FuFuMode != 1) return value; 36 | 37 | double modifyZ = (double) (long)(value * 100.0) / 100.0; 38 | 39 | if (((long)modifyZ * 1000) % 10 != 0) { 40 | LOGGER.info("Rounding error in \"Z\"! Restoring last packet."); 41 | return lastModifyZ; 42 | } 43 | lastModifyZ = modifyZ; 44 | return modifyZ; 45 | } 46 | */ 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/modules/Flight.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.modules; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.entity.Entity; 5 | import net.minecraft.entity.effect.StatusEffectInstance; 6 | import net.minecraft.entity.effect.StatusEffects; 7 | import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; 8 | import net.minecraft.util.math.Vec3d; 9 | 10 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 11 | 12 | public class Flight { 13 | 14 | static int tickCount = 0; 15 | static double aceleration = 0.1; 16 | public static void tick(MinecraftClient mc) { // Spaghetti carbonara 17 | 18 | if(!flightSwitch || mc.player == null) 19 | return; 20 | 21 | if (!mc.player.hasVehicle()) { 22 | mc.player.getAbilities().allowFlying = true; 23 | } else { 24 | Vec3d vel = mc.player.getVelocity(); 25 | boolean upKey = mc.options.jumpKey.isPressed(); 26 | boolean forwardKey = mc.options.forwardKey.isPressed(); 27 | boolean backwardKey = mc.options.backKey.isPressed(); 28 | if (upKey) { 29 | if (forwardKey) 30 | vel = mc.player.getRotationVector().multiply(aceleration); 31 | if (backwardKey) 32 | vel = mc.player.getRotationVector().negate().multiply(aceleration); 33 | mc.player.getVehicle().setVelocity(new Vec3d(vel.x, tickCount < 40 ? 0.3 : -0.04, vel.z)); // just so you don't get kicked while flying up 34 | if (aceleration <= 3.0) 35 | aceleration += 0.1; 36 | } else if (aceleration > 0.3) { 37 | aceleration -= 0.2; 38 | } 39 | // mc.player.setVelocity(mc.player.getVelocity().add(0, motionY, 0)); 40 | } 41 | 42 | if(tickCount > 40) 43 | tickCount = 0; 44 | 45 | if(!mc.player.isOnGround()) { 46 | // LOGGER.info("AntiKick tickCount: "+tickCount); 47 | tickCount++; 48 | if (tickCount >= 40) mc.player.setVelocity(mc.player.getVelocity().add(0, -0.04, 0)); 49 | } else tickCount = 0; 50 | 51 | if (mc.player.fallDistance > 2.5f) { // no fall damage 52 | if (mc.player.isFallFlying()) 53 | return; 54 | mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true)); 55 | } 56 | 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/modules/NightVision.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.modules; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.entity.effect.*; 5 | 6 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 7 | 8 | public class NightVision { 9 | public static void tick(MinecraftClient mc) { 10 | 11 | if(!nightvisionSwitch || mc.player == null) 12 | return; 13 | 14 | mc.player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 500, 0)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/modules/WorldGuardBypass.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.modules; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.entity.effect.StatusEffectInstance; 5 | import net.minecraft.entity.effect.StatusEffects; 6 | import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; 7 | import net.minecraft.util.math.Vec3d; 8 | 9 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 10 | import static xyz.imxnoobx.fufuclient.FuFuClient.mc; 11 | 12 | public class WorldGuardBypass { 13 | private static double gamma; 14 | private static boolean nv; 15 | 16 | static double movement = 0.16; 17 | static boolean restoreTick = false; 18 | 19 | public static void tick(MinecraftClient mc) { 20 | if(!wgBypass || mc.player == null) 21 | return; 22 | 23 | boolean forwardKey = mc.options.forwardKey.isPressed(); 24 | boolean backwardKey = mc.options.backKey.isPressed(); 25 | boolean leftKey = mc.options.leftKey.isPressed(); 26 | boolean rightKey = mc.options.rightKey.isPressed(); 27 | boolean downKey = mc.options.sprintKey.isPressed(); //mc.options.sneakKey.isPressed(); 28 | boolean upKey = mc.options.jumpKey.isPressed(); //mc.options.sprintKey.isPressed(); 29 | 30 | Vec3d pos = new Vec3d(0, 0, 0); 31 | 32 | if(forwardKey) { 33 | pos = pos.add(new Vec3d(0, 0, 0.1)); 34 | } else if(backwardKey) { 35 | pos = pos.add(new Vec3d(0, 0, -0.1)); 36 | } else if (leftKey) { 37 | pos = pos.add(new Vec3d(-0.1, 0, 0)); 38 | } else if (rightKey) { 39 | pos = pos.add(new Vec3d(0.1, 0, 0)); 40 | } else if (downKey) { 41 | pos = pos.add(new Vec3d(0, -0.1, 0)); 42 | } 43 | else if (upKey) { 44 | pos = pos.add(new Vec3d(0, 0.1, 0)); 45 | } 46 | 47 | if(pos.length() <= 0) // Credits https://github.com/JorianWoltjer/LiveOverflowMod/ 48 | return; 49 | 50 | pos = pos.normalize(); 51 | 52 | if (!(pos.x == 0 && pos.z == 0)) { // Rotate by looking yaw (won't change length) 53 | double moveAngle = Math.atan2(pos.x, pos.z) + Math.toRadians(mc.player.getYaw() + 90); 54 | double x = Math.cos(moveAngle); 55 | double z = Math.sin(moveAngle); 56 | pos = new Vec3d(x, pos.y, z); 57 | } 58 | 59 | if(!mc.player.isOnGround()) { 60 | double y = -0.02; 61 | pos = new Vec3d(pos.x, y, pos.z); 62 | } 63 | 64 | pos = pos.multiply(0.05); // Scale to maxDelta 65 | 66 | Vec3d newPos = new Vec3d(mc.player.getX() + pos.x, mc.player.getY() + pos.y, mc.player.getZ() + pos.z); 67 | 68 | // Max: 0.0626 69 | if ((newPos.x >= mc.player.prevX + 0.05 || newPos.y >= mc.player.prevY + 0.05|| newPos.z >= mc.player.prevZ + 0.05) || (newPos.x <= mc.player.prevX - 0.05 || newPos.y <= mc.player.prevY - 0.05 || newPos.z <= mc.player.prevZ - 0.05)) { 70 | LOGGER.info("Blocking movement: " + String.format("%.02f", (mc.player.prevX - newPos.x)) + "x " + String.format("%.02f", (mc.player.prevY - newPos.y)) + "y " + String.format("%.02f", (mc.player.prevZ - newPos.z)) + "z , Setting restoreTick to true"); 71 | newPos = newPos.add(pos); 72 | restoreTick = true; 73 | } 74 | 75 | if(!restoreTick) { // (forwardKey || backwardKey || rightKey || leftKey || upKey || downKey) 76 | LOGGER.info("Sending movement packet: " + String.format("%.02f", (mc.player.prevX - newPos.x)) + "x " + String.format("%.02f", (mc.player.prevY - newPos.y)) + "y " + String.format("%.02f", (mc.player.prevZ - newPos.z)) + "z, restoreTick: "+restoreTick); 77 | mc.getNetworkHandler().getConnection().send( 78 | new PlayerMoveC2SPacket.Full( 79 | newPos.x,// pos.x, 80 | newPos.y,// pos.y, 81 | newPos.z,// pos.z, 82 | mc.player.getYaw(), 83 | mc.player.getPitch(), 84 | mc.player.isOnGround()) 85 | ); 86 | } 87 | 88 | if(restoreTick) { 89 | LOGGER.info("Restore packet sent, restoreTick: "+restoreTick); 90 | // mc.player.setPosition(mc.player.getX(), -42069, mc.player.getZ()); 91 | mc.getNetworkHandler().getConnection().send(new PlayerMoveC2SPacket.Full( // make the server teleport you back 92 | newPos.x, 93 | newPos.y + 1337.0, 94 | newPos.z, 95 | mc.player.getYaw(), 96 | mc.player.getPitch(), 97 | mc.player.isOnGround()) 98 | ); 99 | restoreTick = false; 100 | } 101 | } 102 | 103 | public static void onStart(MinecraftClient mc) { 104 | 105 | } 106 | 107 | public static void onDisable(MinecraftClient mc) { 108 | 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/main/java/xyz/imxnoobx/fufuclient/modules/xRayModule.java: -------------------------------------------------------------------------------- 1 | package xyz.imxnoobx.fufuclient.modules; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.entity.effect.StatusEffectInstance; 5 | import net.minecraft.entity.effect.StatusEffects; 6 | 7 | import static xyz.imxnoobx.fufuclient.FuFuClient.*; 8 | 9 | public class xRayModule { 10 | 11 | private static double gamma; 12 | private static boolean nv = false; 13 | 14 | 15 | public static void tick(MinecraftClient mc) { 16 | if(!xRay || mc.player == null) 17 | return; 18 | 19 | // mc.options.getGamma().setValue(Math.min(mc.options.getGamma().getValue() + 1, 69)); 20 | mc.player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 500, 1000)); 21 | } 22 | 23 | public static void onStart(MinecraftClient mc) { 24 | gamma = mc.options.getGamma().getValue(); 25 | 26 | mc.chunkCullingEnabled = false; 27 | mc.worldRenderer.reload(); 28 | 29 | if(nightvisionSwitch) 30 | nightvisionSwitch = false; nv = true; 31 | } 32 | 33 | public static void onDisable(MinecraftClient mc) { 34 | mc.options.getGamma().setValue(gamma); 35 | 36 | mc.chunkCullingEnabled = true; 37 | mc.worldRenderer.reload(); 38 | 39 | 40 | if(nv == true) 41 | nightvisionSwitch = true; nv = false; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/resources/assets/fufuclient/fufu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IMXNOOBX/FuFuClient/419480379f9e4519c2251d1a38a8042ebfeeb0a8/src/main/resources/assets/fufuclient/fufu.png -------------------------------------------------------------------------------- /src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "fufuclient", 4 | "version": "${version}", 5 | 6 | "name": "FuFuClient", 7 | "description": "A BlockGame client mod i made with the purpose of learning java and playing in LiveOverflow's server.", 8 | "authors": [ 9 | "IMXNOOBX" 10 | ], 11 | "contact": { 12 | "homepage": "https://github.com/IMXNOOBX/FuFuClient#readme", 13 | "sources": "https://github.com/IMXNOOBX/FuFuClient" 14 | }, 15 | 16 | "license": "CC0-1.0", 17 | "icon": "assets/fufuclient/fufu.png", 18 | 19 | "environment": "*", 20 | "entrypoints": { 21 | "main": [ 22 | "xyz.imxnoobx.fufuclient.FuFuClient" 23 | ] 24 | }, 25 | "mixins": [ 26 | "fufuclient.mixins.json" 27 | ], 28 | 29 | "depends": { 30 | "fabricloader": ">=0.14.9", 31 | "fabric-api": "*", 32 | "minecraft": "~1.19", 33 | "java": ">=17" 34 | }, 35 | "suggests": { 36 | "another-mod": "*" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/resources/fufuclient.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "xyz.imxnoobx.fufuclient.mixin", 5 | "compatibilityLevel": "JAVA_17", 6 | "mixins": [ 7 | ], 8 | "client": [ 9 | "MixinClientConnection", 10 | "MixinGameOptionsScreen", 11 | "MixinGameInfo", 12 | "MixinBlock", 13 | "MixinMain", 14 | "MixinMinecraftClient", 15 | "MixinVehicleMoveC2SPacket", 16 | "MixinPlayerMoveC2SPacket" 17 | ], 18 | "injectors": { 19 | "defaultRequire": 1 20 | } 21 | } 22 | --------------------------------------------------------------------------------