From a6bce45230ddfe06661b5ba9f0451d61248210b2 Mon Sep 17 00:00:00 2001 From: Tschipp Date: Mon, 17 Dec 2018 16:43:53 +0100 Subject: [PATCH] Initial work on 1.14 --- .gitignore | 37 +- LICENSE | 262 +++--- README.md | 16 +- build.bat | 2 - build.gradle | 70 +- carryon-scripts | 0 gradle.properties | 3 - gradle/wrapper/gradle-wrapper.jar | Bin 52271 -> 52818 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 57 +- gradlew.bat | 14 +- settings.gradle | 10 + setup.bat | 2 - src/main/java/tschipp/carryon/CarryOn.java | 66 +- .../java/tschipp/carryon/PickupHandler.java | 21 + .../java/tschipp/carryon/RegistryHandler.java | 25 + .../tschipp/carryon/client/ClientProxy.java | 32 - .../client/event/RenderEntityEvents.java | 390 --------- .../carryon/client/event/RenderEvents.java | 827 ------------------ .../carryon/client/gui/GuiConfigCarryOn.java | 48 - .../carryon/client/gui/GuiFactoryCarryOn.java | 47 - .../client/keybinds/CarryOnKeybinds.java | 44 - .../client/model/ModelPlayerCarrying.java | 23 - .../tschipp/carryon/common/CommonProxy.java | 63 -- .../common/capabilities/IPosition.java | 16 - .../common/capabilities/PositionProvider.java | 37 - .../common/capabilities/PositionStorage.java | 41 - .../common/capabilities/TEPosition.java | 34 - .../event/PositionClientEvents.java | 91 -- .../event/PositionCommonEvents.java | 60 -- .../common/command/CommandCarryOn.java | 194 ---- .../common/command/CommandCarryOnReload.java | 80 -- .../carryon/common/config/CarryOnConfig.java | 102 --- .../carryon/common/config/Configs.java | 262 ------ .../common/event/ItemEntityEvents.java | 259 ------ .../carryon/common/event/ItemEvents.java | 375 -------- .../handler/CustomPickupOverrideHandler.java | 125 --- .../carryon/common/handler/ListHandler.java | 138 --- .../common/handler/ModelOverridesHandler.java | 269 ------ .../carryon/common/handler/PickupHandler.java | 222 ----- .../common/handler/RegistrationHandler.java | 64 -- .../common/helper/InvalidConfigException.java | 31 - .../carryon/common/helper/ReflectionUtil.java | 76 -- .../common/helper/ScriptParseHelper.java | 372 -------- .../carryon/common/helper/StringParser.java | 158 ---- .../carryon/common/item/ItemEntity.java | 221 ----- .../tschipp/carryon/common/item/ItemTile.java | 333 ------- .../carryon/interfaces/ICarryOnData.java | 11 + .../tschipp/carryon/items/ItemEntity.java | 213 +++++ .../java/tschipp/carryon/items/ItemTile.java | 351 ++++++++ .../carryon/keybinds/CarryOnKeybinds.java | 45 + .../mixin/client/ArmorRendererMixin.java | 48 + .../carryon/mixin/client/BipedModelMixin.java | 74 ++ .../mixin/client/FirstPersonMixin.java | 31 + .../carryon/mixin/client/KeyboardMixin.java | 60 ++ .../carryon/mixin/client/MouseMixin.java | 46 + .../mixin/client/PlayerRendererMixin.java | 49 ++ .../carryon/mixin/common/BlockStateMixin.java | 117 +++ .../carryon/mixin/common/EntityMixin.java | 72 ++ .../carryon/mixin/common/PlayerMixin.java | 42 + .../network/client/CarrySlotPacket.java | 54 -- .../client/CarrySlotPacketHandler.java | 59 -- .../network/client/ScriptReloadPacket.java | 26 - .../client/ScriptReloadPacketHandler.java | 35 - .../network/server/SyncKeybindPacket.java | 35 - .../server/SyncKeybindPacketHandler.java | 34 - .../carryon/render/BlockRendererLayer.java | 95 ++ .../carryon/render/EntityRendererLayer.java | 123 +++ .../tschipp/carryon/render/ICarrying.java | 11 + .../scripting/CarryOnOverride.java | 84 +- .../{common => }/scripting/ScriptChecker.java | 89 +- .../{common => }/scripting/ScriptReader.java | 27 +- .../resources/assets/carryon/lang/en_UD.lang | 14 - .../resources/assets/carryon/lang/en_US.lang | 14 - src/main/resources/assets/carryon/logo.png | Bin 173666 -> 0 bytes .../carryon/models/item/entity_item.json | 6 + .../assets/carryon/models/item/tile.json | 33 - .../assets/carryon/models/item/tile_item.json | 6 + src/main/resources/assets/carryon/pack.png | Bin 0 -> 54069 bytes .../carryon/textures/{items => item}/tile.png | Bin src/main/resources/carryon.client.json | 16 + src/main/resources/carryon.common.json | 13 + src/main/resources/fabric.mod.json | 12 + src/main/resources/mcmod.info | 16 - 84 files changed, 1879 insertions(+), 5705 deletions(-) delete mode 100644 build.bat delete mode 100644 carryon-scripts delete mode 100644 gradle.properties create mode 100644 settings.gradle delete mode 100644 setup.bat create mode 100644 src/main/java/tschipp/carryon/PickupHandler.java create mode 100644 src/main/java/tschipp/carryon/RegistryHandler.java delete mode 100644 src/main/java/tschipp/carryon/client/ClientProxy.java delete mode 100644 src/main/java/tschipp/carryon/client/event/RenderEntityEvents.java delete mode 100644 src/main/java/tschipp/carryon/client/event/RenderEvents.java delete mode 100644 src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java delete mode 100644 src/main/java/tschipp/carryon/client/gui/GuiFactoryCarryOn.java delete mode 100644 src/main/java/tschipp/carryon/client/keybinds/CarryOnKeybinds.java delete mode 100644 src/main/java/tschipp/carryon/client/model/ModelPlayerCarrying.java delete mode 100644 src/main/java/tschipp/carryon/common/CommonProxy.java delete mode 100644 src/main/java/tschipp/carryon/common/capabilities/IPosition.java delete mode 100644 src/main/java/tschipp/carryon/common/capabilities/PositionProvider.java delete mode 100644 src/main/java/tschipp/carryon/common/capabilities/PositionStorage.java delete mode 100644 src/main/java/tschipp/carryon/common/capabilities/TEPosition.java delete mode 100644 src/main/java/tschipp/carryon/common/capabilities/event/PositionClientEvents.java delete mode 100644 src/main/java/tschipp/carryon/common/capabilities/event/PositionCommonEvents.java delete mode 100644 src/main/java/tschipp/carryon/common/command/CommandCarryOn.java delete mode 100644 src/main/java/tschipp/carryon/common/command/CommandCarryOnReload.java delete mode 100644 src/main/java/tschipp/carryon/common/config/CarryOnConfig.java delete mode 100644 src/main/java/tschipp/carryon/common/config/Configs.java delete mode 100644 src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java delete mode 100644 src/main/java/tschipp/carryon/common/event/ItemEvents.java delete mode 100644 src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java delete mode 100644 src/main/java/tschipp/carryon/common/handler/ListHandler.java delete mode 100644 src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java delete mode 100644 src/main/java/tschipp/carryon/common/handler/PickupHandler.java delete mode 100644 src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java delete mode 100644 src/main/java/tschipp/carryon/common/helper/InvalidConfigException.java delete mode 100644 src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java delete mode 100644 src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java delete mode 100644 src/main/java/tschipp/carryon/common/helper/StringParser.java delete mode 100644 src/main/java/tschipp/carryon/common/item/ItemEntity.java delete mode 100644 src/main/java/tschipp/carryon/common/item/ItemTile.java create mode 100644 src/main/java/tschipp/carryon/interfaces/ICarryOnData.java create mode 100644 src/main/java/tschipp/carryon/items/ItemEntity.java create mode 100644 src/main/java/tschipp/carryon/items/ItemTile.java create mode 100644 src/main/java/tschipp/carryon/keybinds/CarryOnKeybinds.java create mode 100644 src/main/java/tschipp/carryon/mixin/client/ArmorRendererMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/client/BipedModelMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/client/FirstPersonMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/client/KeyboardMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/client/MouseMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/client/PlayerRendererMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/common/BlockStateMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/common/EntityMixin.java create mode 100644 src/main/java/tschipp/carryon/mixin/common/PlayerMixin.java delete mode 100644 src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java delete mode 100644 src/main/java/tschipp/carryon/network/client/CarrySlotPacketHandler.java delete mode 100644 src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java delete mode 100644 src/main/java/tschipp/carryon/network/client/ScriptReloadPacketHandler.java delete mode 100644 src/main/java/tschipp/carryon/network/server/SyncKeybindPacket.java delete mode 100644 src/main/java/tschipp/carryon/network/server/SyncKeybindPacketHandler.java create mode 100644 src/main/java/tschipp/carryon/render/BlockRendererLayer.java create mode 100644 src/main/java/tschipp/carryon/render/EntityRendererLayer.java create mode 100644 src/main/java/tschipp/carryon/render/ICarrying.java rename src/main/java/tschipp/carryon/{common => }/scripting/CarryOnOverride.java (88%) rename src/main/java/tschipp/carryon/{common => }/scripting/ScriptChecker.java (59%) rename src/main/java/tschipp/carryon/{common => }/scripting/ScriptReader.java (89%) delete mode 100644 src/main/resources/assets/carryon/lang/en_UD.lang delete mode 100644 src/main/resources/assets/carryon/lang/en_US.lang delete mode 100644 src/main/resources/assets/carryon/logo.png create mode 100644 src/main/resources/assets/carryon/models/item/entity_item.json delete mode 100644 src/main/resources/assets/carryon/models/item/tile.json create mode 100644 src/main/resources/assets/carryon/models/item/tile_item.json create mode 100644 src/main/resources/assets/carryon/pack.png rename src/main/resources/assets/carryon/textures/{items => item}/tile.png (100%) create mode 100644 src/main/resources/carryon.client.json create mode 100644 src/main/resources/carryon.common.json create mode 100644 src/main/resources/fabric.mod.json delete mode 100644 src/main/resources/mcmod.info diff --git a/.gitignore b/.gitignore index fc5b5b3..2d13044 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,24 @@ +# gradle + +.gradle/ +build/ +out/ +bin/ + + +# idea + +.idea/ +*.iml +*.ipr +*.iws + +#vscode +.vscode/ +.project +.classpath + + # eclipse bin *.launch @@ -7,17 +28,5 @@ bin .project .DS_Store -# idea -out -*.ipr -*.iws -*.iml -.idea - -# gradle -build -.gradle - -# other -eclipse -run +# fabric +run/ \ No newline at end of file diff --git a/LICENSE b/LICENSE index 65c5ca8..0e259d4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,165 +1,121 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +Creative Commons Legal Code - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +CC0 1.0 Universal + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. +Statement of Purpose - 0. Additional Definitions. +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. - 1. Exception to Section 3 of the GNU GPL. +4. Limitations and Disclaimers. - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/README.md b/README.md index aea4cfe..10fc90e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,16 @@ +# Fabric Example Mod -# Carry On [![](http://cf.way2muchnoise.eu/carry-on.svg)](https://minecraft.curseforge.com/projects/carry-on) [![](http://cf.way2muchnoise.eu/versions/carry-on.svg)](https://minecraft.curseforge.com/projects/carry-on) +## Setup + +1. Edit build.gradle and mod.json to suit your needs. + * The "mixins" object can be removed from mod.json if you do not need to use mixins. + * Please replace all occurences of "modid" with your own mod ID - sometimes, a different string may also suffice. +2. Run the following command: + +``` +./gradlew idea +``` + +## License + +This template is available under the CC0 license. Feel free to learn from it and incorporate it in your own projects. diff --git a/build.bat b/build.bat deleted file mode 100644 index 9691829..0000000 --- a/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -gradlew build -pause \ No newline at end of file diff --git a/build.gradle b/build.gradle index 0dc116a..3af29ad 100644 --- a/build.gradle +++ b/build.gradle @@ -1,70 +1,20 @@ -buildscript { - repositories { - jcenter() - maven { url = "http://files.minecraftforge.net/maven" } - - } - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - } +plugins { + id 'fabric-loom' version '0.1.0-SNAPSHOT' } +sourceCompatibility = 1.8 +targetCompatibility = 1.8 - - -apply plugin: 'net.minecraftforge.gradle.forge' - -version = "1.0" -group = "tschipp.carryon" -archivesBaseName = "carryon" - -sourceCompatibility = targetCompatibility = '1.8' -compileJava { - sourceCompatibility = targetCompatibility = '1.8' -} +archivesBaseName = "CarryOn" +version = "1.0.0" minecraft { - version = "1.11.2-13.20.1.2386" - runDir = "run" - - mappings = "snapshot_20161220" - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. } -repositories { - - maven { url 'http://maven.epoxide.org' } - - ivy { - name "LatMod" - artifactPattern "http://mods.latmod.com/[module]/[revision]/[module]-[revision](-[classifier]).[ext]" - } -} - - - dependencies { - - deobfCompile "net.darkhax.gamestages:GameStages-1.11.2:1.0.11" - - deobfCompile "LatMod:FTBUtilities:1.1x-3.6.5" - deobfCompile "LatMod:FTBLib:1.1x-3.6.5" + minecraft "com.mojang:minecraft:18w50a" + mappings "net.fabricmc:yarn:18w50a.33" + modCompile "net.fabricmc:fabric-loader:0.2.0.70" - -} - -processResources { - - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version - - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - - expand 'version':project.version, 'mcversion':project.minecraft.version - } - - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' - } + modCompile "net.fabricmc:fabric:0.1.1.53" } diff --git a/carryon-scripts b/carryon-scripts deleted file mode 100644 index e69de29..0000000 diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index e9b9fd5..0000000 --- a/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -# This is required to provide enough memory for the Minecraft decompilation process. -org.gradle.jvmargs=-Xmx3G diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 30d399d8d2bf522ff5de94bf434a7cc43a9a74b5..deedc7fa5e6310eac3148a7dd0b1f069b07364cb 100644 GIT binary patch delta 19066 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 delta 18830 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

=6C>7^OR^cI**d4XXUQ+ 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 T1y!Ke)zXK1VnO`Ov!wGM$BkMr diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e18cba7..b9e1d2c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Sep 14 12:28:28 PDT 2015 +#Mon Aug 22 17:36:22 EDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip diff --git a/gradlew b/gradlew index 91a7e26..9aa616c 100644 --- a/gradlew +++ b/gradlew @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -161,4 +161,9 @@ function splitJvmOpts() { eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282..f955316 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..683b201 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + jcenter() + maven { + name = 'Fabric' + url = 'http://maven.fabricmc.net/' + } + gradlePluginPortal() + } +} diff --git a/setup.bat b/setup.bat deleted file mode 100644 index a2b532d..0000000 --- a/setup.bat +++ /dev/null @@ -1,2 +0,0 @@ -gradlew setupDecompWorkspace && gradlew eclipse -pause \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/CarryOn.java b/src/main/java/tschipp/carryon/CarryOn.java index 9636537..fc31415 100644 --- a/src/main/java/tschipp/carryon/CarryOn.java +++ b/src/main/java/tschipp/carryon/CarryOn.java @@ -1,70 +1,24 @@ package tschipp.carryon; - -import java.io.File; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import net.minecraft.client.Minecraft; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.Mod.Instance; -import net.minecraftforge.fml.common.SidedProxy; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.event.FMLServerStartingEvent; -import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; -import tschipp.carryon.common.CommonProxy; -import tschipp.carryon.common.command.CommandCarryOn; -import tschipp.carryon.common.command.CommandCarryOnReload; +import net.fabricmc.api.ModInitializer; +import tschipp.carryon.keybinds.CarryOnKeybinds; -@EventBusSubscriber -@Mod(modid = CarryOn.MODID, name = CarryOn.NAME, version = CarryOn.VERSION, guiFactory = "tschipp.carryon.client.gui.GuiFactoryCarryOn", dependencies = "required-after:forge@[13.20.1.2386,)", updateJSON = CarryOn.UPDATE_JSON, acceptedMinecraftVersions = CarryOn.ACCEPTED_VERSIONS) -public class CarryOn { - @SidedProxy(clientSide = "tschipp.carryon.client.ClientProxy", serverSide = "tschipp.carryon.common.CommonProxy") - public static CommonProxy proxy; +public class CarryOn implements ModInitializer { - // Instance - @Instance(CarryOn.MODID) - public static CarryOn instance; - - public static final String MODID = "carryon"; - public static final String VERSION = "1.9.1"; - public static final String NAME = "Carry On"; - public static final String ACCEPTED_VERSIONS = "[1.11,1.12)"; - public static final String UPDATE_JSON = "https://gist.githubusercontent.com/Tschipp/dccadee7c90d7a34e6e76a35d9d6fa2e/raw/"; + public static String MODID = "carryon"; public static final Logger LOGGER = LogManager.getFormatterLogger("CarryOn"); - public static File CONFIGURATION_FILE; - - public static SimpleNetworkWrapper network; - @EventHandler - public void preInit(FMLPreInitializationEvent event){ - CarryOn.proxy.preInit(event); + + @Override + public void onInitialize() { + RegistryHandler.regItems(); + CarryOnKeybinds.init(); } - @EventHandler - public void init(FMLInitializationEvent event) { - CarryOn.proxy.init(event); - } - @EventHandler - public void postInit(FMLPostInitializationEvent event) { - CarryOn.proxy.postInit(event); - } - @EventHandler - public void serverLoad(FMLServerStartingEvent event) - { - event.registerServerCommand(new CommandCarryOn()); - event.registerServerCommand(new CommandCarryOnReload()); - } - - - -} \ No newline at end of file +} diff --git a/src/main/java/tschipp/carryon/PickupHandler.java b/src/main/java/tschipp/carryon/PickupHandler.java new file mode 100644 index 0000000..147f163 --- /dev/null +++ b/src/main/java/tschipp/carryon/PickupHandler.java @@ -0,0 +1,21 @@ +package tschipp.carryon; + +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class PickupHandler { + + public static boolean canPlayerPickUpBlock(PlayerEntity player, BlockEntity te, World world, BlockPos pos) + { + return true; + } + + public static boolean canPlayerPickUpEntity(PlayerEntity player, Entity entity) + { + return true; + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/RegistryHandler.java b/src/main/java/tschipp/carryon/RegistryHandler.java new file mode 100644 index 0000000..93d3389 --- /dev/null +++ b/src/main/java/tschipp/carryon/RegistryHandler.java @@ -0,0 +1,25 @@ +package tschipp.carryon; + +import net.minecraft.item.Item; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import tschipp.carryon.items.ItemEntity; +import tschipp.carryon.items.ItemTile; + +public class RegistryHandler { + + public static Item TILE_ITEM; + public static Item ENTITY_ITEM; + + public static void regItems() + { + TILE_ITEM = register(new ItemTile(), "tile_item"); + ENTITY_ITEM = register(new ItemEntity(), "entity_item"); + } + + private static Item register(Item item, String name) + { + return Registry.register(Registry.ITEM, new Identifier(CarryOn.MODID, name), item); + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/client/ClientProxy.java b/src/main/java/tschipp/carryon/client/ClientProxy.java deleted file mode 100644 index f42de29..0000000 --- a/src/main/java/tschipp/carryon/client/ClientProxy.java +++ /dev/null @@ -1,32 +0,0 @@ -package tschipp.carryon.client; - -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import tschipp.carryon.client.keybinds.CarryOnKeybinds; -import tschipp.carryon.common.CommonProxy; -import tschipp.carryon.common.handler.RegistrationHandler; - -public class ClientProxy extends CommonProxy { - - @Override - public void preInit(FMLPreInitializationEvent event) - { - super.preInit(event); - RegistrationHandler.regItemRenders(); - RegistrationHandler.regClientEvents(); - } - - @Override - public void init(FMLInitializationEvent event) - { - CarryOnKeybinds.init(); - super.init(event); - } - - @Override - public void postInit(FMLPostInitializationEvent e) - { - super.postInit(e); - } -} diff --git a/src/main/java/tschipp/carryon/client/event/RenderEntityEvents.java b/src/main/java/tschipp/carryon/client/event/RenderEntityEvents.java deleted file mode 100644 index 1ab616a..0000000 --- a/src/main/java/tschipp/carryon/client/event/RenderEntityEvents.java +++ /dev/null @@ -1,390 +0,0 @@ -package tschipp.carryon.client.event; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.client.event.GuiOpenEvent; -import net.minecraftforge.client.event.MouseEvent; -import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.client.event.RenderPlayerEvent; -import net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import tschipp.carryon.common.handler.RegistrationHandler; -import tschipp.carryon.common.helper.ScriptParseHelper; -import tschipp.carryon.common.item.ItemEntity; -import tschipp.carryon.common.item.ItemTile; -import tschipp.carryon.common.scripting.CarryOnOverride; -import tschipp.carryon.common.scripting.ScriptChecker; - -public class RenderEntityEvents -{ - /* - * Prevents the Player from scrolling - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onScroll(MouseEvent event) throws IllegalArgumentException, IllegalAccessException - { - if (event.getDwheel() > 0 || event.getDwheel() < 0 || Minecraft.getMinecraft().gameSettings.keyBindPickBlock.isPressed()) - { - ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand(); - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity) - { - if (ItemEntity.hasEntityData(stack)) - { - event.setCanceled(true); - } - } - } - } - - /* - * Prevents the Player from opening Guis - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onGuiInit(InitGuiEvent.Pre event) - { - if (event.getGui() != null) - { - boolean inventory = event.getGui() instanceof GuiContainer; - EntityPlayer player = Minecraft.getMinecraft().player; - - if (player != null && inventory) - { - ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND); - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - Minecraft.getMinecraft().player.closeScreen(); - Minecraft.getMinecraft().currentScreen = null; - Minecraft.getMinecraft().setIngameFocus(); - - } - } - } - } - - /* - * Prevents the Player from switching Slots - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void inputEvent(InputEvent event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException - { - GameSettings settings = Minecraft.getMinecraft().gameSettings; - Field field = KeyBinding.class.getDeclaredFields()[7]; - field.setAccessible(true); - ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand(); - EntityPlayer player = Minecraft.getMinecraft().player; - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - if (settings.keyBindDrop.isPressed()) - { - field.set(settings.keyBindDrop, false); - } - if (settings.keyBindSwapHands.isPressed()) - { - field.set(settings.keyBindSwapHands, false); - } - for (KeyBinding keyBind : settings.keyBindsHotbar) - { - if (keyBind.isPressed()) - { - field.set(keyBind, false); - } - } - } - - int current = player.inventory.currentItem; - - if (player.getEntityData().hasKey("carrySlot") ? player.getEntityData().getInteger("carrySlot") != current : false) - { - player.inventory.currentItem = player.getEntityData().getInteger("carrySlot"); - } - } - - /* - * Renders the Entity in First Person - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void renderHand(RenderHandEvent event) - { - World world = Minecraft.getMinecraft().world; - EntityPlayer player = Minecraft.getMinecraft().player; - ItemStack stack = player.getHeldItemMainhand(); - int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView; - float partialticks = event.getPartialTicks(); - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - if(Loader.isModLoaded("realrender") || Loader.isModLoaded("rfpr")) - return; - - - Entity entity = ItemEntity.getEntity(stack, world); - - if (entity != null) - { - double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialticks; - double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialticks; - double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialticks; - - entity.setPosition(d0, d1, d2); - entity.rotationYaw = 0.0f; - entity.prevRotationYaw = 0.0f; - entity.setRotationYawHead(0.0f); - - float height = entity.height; - float width = entity.width; - GlStateManager.pushMatrix(); - GlStateManager.scale(.8, .8, .8); - GlStateManager.rotate(180, 0, 1, 0); - GlStateManager.translate(0.0, -height - .1, width + 0.1); - GlStateManager.enableAlpha(); - - if (perspective == 0) - { - RenderHelper.enableStandardItemLighting(); - Minecraft.getMinecraft().getRenderManager().setRenderShadow(false); - - CarryOnOverride carryOverride = ScriptChecker.getOverride(player); - if (carryOverride != null) - { - double[] translation = ScriptParseHelper.getXYZArray(carryOverride.getRenderTranslation()); - double[] rotation = ScriptParseHelper.getXYZArray(carryOverride.getRenderRotation()); - double[] scale = ScriptParseHelper.getScale(carryOverride.getRenderScale()); - String entityname = carryOverride.getRenderNameEntity(); - if (entityname != null) - { - Entity newEntity = EntityList.createEntityByIDFromName(new ResourceLocation(entityname), world); - if (newEntity != null) - { - NBTTagCompound nbttag = carryOverride.getRenderNBT(); - if (nbttag != null) - newEntity.readFromNBT(nbttag); - entity = newEntity; - entity.setPosition(d0, d1, d2); - entity.rotationYaw = 0.0f; - entity.prevRotationYaw = 0.0f; - entity.setRotationYawHead(0.0f); - } - } - - GlStateManager.translate(translation[0], translation[1], translation[2]); - GlStateManager.rotate((float) rotation[0], 1, 0, 0); - GlStateManager.rotate((float) rotation[1], 0, 1, 0); - GlStateManager.rotate((float) rotation[2], 0, 0, 1); - GlStateManager.scale(scale[0], scale[1], scale[2]); - - } - - this.renderEntityStatic(entity); - Minecraft.getMinecraft().getRenderManager().setRenderShadow(true); - } - - GlStateManager.disableAlpha(); - GlStateManager.scale(1, 1, 1); - GlStateManager.popMatrix(); - - RenderHelper.disableStandardItemLighting(); - GlStateManager.disableRescaleNormal(); - GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); - GlStateManager.disableTexture2D(); - GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); - - if (perspective == 0) - { - event.setCanceled(true); - } - } - } - } - - @SideOnly(Side.CLIENT) - private void renderEntityStatic(Entity entity) - { - if (entity.ticksExisted == 0) - { - entity.lastTickPosX = entity.posX; - entity.lastTickPosY = entity.posY; - entity.lastTickPosZ = entity.posZ; - } - - float f = entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw); - int i = this.getBrightnessForRender(entity, Minecraft.getMinecraft().player); - - if (entity.isBurning()) - { - i = 15728880; - } - - int j = i % 65536; - int k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, j, k); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - - this.setLightmapDisabled(false); - - - - Minecraft.getMinecraft().getRenderManager().doRenderEntity(entity, 0.0D, 0.0D, 0.0D, f, 0.0F, true); - this.setLightmapDisabled(true); - } - - @SideOnly(Side.CLIENT) - private int getBrightnessForRender(Entity entity, EntityPlayer player) - { - BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(MathHelper.floor(player.posX), 0, MathHelper.floor(player.posZ)); - - if (entity.world.isBlockLoaded(blockpos$mutableblockpos)) - { - blockpos$mutableblockpos.setY(MathHelper.floor(player.posY + entity.getEyeHeight())); - return entity.world.getCombinedLight(blockpos$mutableblockpos, 0); - } - else - { - return 0; - } - } - - @SideOnly(Side.CLIENT) - private void setLightmapDisabled(boolean disabled) - { - GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); - - if (disabled) - { - GlStateManager.disableTexture2D(); - } - else - { - GlStateManager.enableTexture2D(); - } - - GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); - } - - /* - * Renders the Block in Third Person - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onPlayerRenderPost(RenderPlayerEvent.Post event) - { - World world = Minecraft.getMinecraft().world; - EntityPlayer player = event.getEntityPlayer(); - event.getRenderer().getMainModel(); - EntityPlayerSP clientPlayer = Minecraft.getMinecraft().player; - ItemStack stack = player.getHeldItemMainhand(); - float partialticks = event.getPartialRenderTick(); - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - Entity entity = ItemEntity.getEntity(stack, world); - float rotation = -(player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialticks); - - if (entity != null) - { - double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialticks; - double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialticks; - double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialticks; - - double c0 = clientPlayer.lastTickPosX + (clientPlayer.posX - clientPlayer.lastTickPosX) * partialticks; - double c1 = clientPlayer.lastTickPosY + (clientPlayer.posY - clientPlayer.lastTickPosY) * partialticks; - double c2 = clientPlayer.lastTickPosZ + (clientPlayer.posZ - clientPlayer.lastTickPosZ) * partialticks; - - double xOffset = d0 - c0; - double yOffset = d1 - c1; - double zOffset = d2 - c2; - - float height = entity.height; - float width = entity.width; - float multiplier = height * width; - - entity.setPosition(c0, c1, c2); - entity.rotationYaw = 0.0f; - entity.prevRotationYaw = 0.0f; - entity.setRotationYawHead(0.0f); - - GlStateManager.pushMatrix(); - GlStateManager.translate(xOffset, yOffset, zOffset); - GlStateManager.scale((10 - multiplier) * 0.08, (10 - multiplier) * 0.08, (10 - multiplier) * 0.08); - GlStateManager.rotate(rotation, 0, 1f, 0); - GlStateManager.translate(0.0, height / 2 + -(height / 2) + 1, width - 0.1 < 0.7 ? width - 0.1 + (0.7 - (width - 0.1)) : width - 0.1); - - if((Loader.isModLoaded("realrender") || Loader.isModLoaded("rfpr")) && Minecraft.getMinecraft().gameSettings.thirdPersonView == 0) - GlStateManager.translate(0, 0, -0.3); - - if (player.isSneaking()) - { - GlStateManager.translate(0, -0.3, 0); - } - - Minecraft.getMinecraft().getRenderManager().setRenderShadow(false); - - CarryOnOverride carryOverride = ScriptChecker.getOverride(player); - if (carryOverride != null) - { - double[] translation = ScriptParseHelper.getXYZArray(carryOverride.getRenderTranslation()); - double[] rot = ScriptParseHelper.getXYZArray(carryOverride.getRenderRotation()); - double[] scale = ScriptParseHelper.getScale(carryOverride.getRenderScale()); - String entityname = carryOverride.getRenderNameEntity(); - if (entityname != null) - { - Entity newEntity = EntityList.createEntityByIDFromName(new ResourceLocation(entityname), world); - if (newEntity != null) - { - NBTTagCompound nbttag = carryOverride.getRenderNBT(); - if (nbttag != null) - newEntity.readFromNBT(nbttag); - entity = newEntity; - entity.setPosition(c0, c1, c2); - entity.rotationYaw = 0.0f; - entity.prevRotationYaw = 0.0f; - entity.setRotationYawHead(0.0f); - } - } - - GlStateManager.translate(translation[0], translation[1], translation[2]); - GlStateManager.rotate((float) rot[0], 1, 0, 0); - GlStateManager.rotate((float) rot[1], 0, 1, 0); - GlStateManager.rotate((float) rot[2], 0, 0, 1); - GlStateManager.scale(scale[0], scale[1], scale[2]); - - } - - Minecraft.getMinecraft().getRenderManager().renderEntityStatic(entity, 0.0f, false); - Minecraft.getMinecraft().getRenderManager().setRenderShadow(true); - - GlStateManager.scale(1, 1, 1); - GlStateManager.popMatrix(); - } - } - } -} diff --git a/src/main/java/tschipp/carryon/client/event/RenderEvents.java b/src/main/java/tschipp/carryon/client/event/RenderEvents.java deleted file mode 100644 index 486d2ed..0000000 --- a/src/main/java/tschipp/carryon/client/event/RenderEvents.java +++ /dev/null @@ -1,827 +0,0 @@ -package tschipp.carryon.client.event; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.model.ModelPlayer; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.resources.DefaultPlayerSkin; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EnumPlayerModelParts; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent; -import net.minecraftforge.client.event.MouseEvent; -import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.client.event.RenderPlayerEvent; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import tschipp.carryon.CarryOn; -import tschipp.carryon.client.keybinds.CarryOnKeybinds; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.handler.ModelOverridesHandler; -import tschipp.carryon.common.handler.RegistrationHandler; -import tschipp.carryon.common.helper.ScriptParseHelper; -import tschipp.carryon.common.helper.StringParser; -import tschipp.carryon.common.item.ItemEntity; -import tschipp.carryon.common.item.ItemTile; -import tschipp.carryon.common.scripting.CarryOnOverride; -import tschipp.carryon.common.scripting.ScriptChecker; -import tschipp.carryon.network.server.SyncKeybindPacket; - -public class RenderEvents -{ - private static boolean initModels; - private ModelRenderer fakeLeftArm; - private ModelRenderer fakeRightArm; - private ModelRenderer fakeLeftArmwear; - private ModelRenderer fakeRightArmwear; - - /* - * Prevents the Player from scrolling - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onScroll(MouseEvent event) - { - if (event.getDwheel() > 0 || event.getDwheel() < 0 || Minecraft.getMinecraft().gameSettings.keyBindPickBlock.isPressed()) - { - ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand(); - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile) - { - if (ItemTile.hasTileData(stack)) - { - event.setCanceled(true); - } - } - } - } - - @SubscribeEvent - @SideOnly(Side.CLIENT) - public void onPlayerTick(PlayerTickEvent event) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException - { - EntityPlayer player = event.player; - - if (player != null && event.side == Side.CLIENT) - { - boolean keyPressed = CarryOnKeybinds.carryKey.isKeyDown(); - boolean playerKeyPressed = CarryOnKeybinds.isKeyPressed(player); - - if (keyPressed && !playerKeyPressed) - { - CarryOnKeybinds.setKeyPressed(player, true); - CarryOn.network.sendToServer(new SyncKeybindPacket(true)); - } - else if (!keyPressed && playerKeyPressed) - { - CarryOnKeybinds.setKeyPressed(player, false); - CarryOn.network.sendToServer(new SyncKeybindPacket(false)); - } - } - } - - /* - * Prevents the Player from opening Guis - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onGuiInit(InitGuiEvent.Pre event) - { - if (event.getGui() != null) - { - boolean inventory = event.getGui() instanceof GuiContainer; - EntityPlayer player = Minecraft.getMinecraft().player; - - if (player != null && inventory) - { - ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND); - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) - { - Minecraft.getMinecraft().player.closeScreen(); - Minecraft.getMinecraft().currentScreen = null; - Minecraft.getMinecraft().setIngameFocus(); - - } - } - } - } - - /* - * Prevents the Player from switching Slots - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void inputEvent(InputEvent event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException - { - GameSettings settings = Minecraft.getMinecraft().gameSettings; - Field field = KeyBinding.class.getDeclaredFields()[7]; - field.setAccessible(true); - ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand(); - EntityPlayer player = Minecraft.getMinecraft().player; - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) - { - if (settings.keyBindDrop.isPressed()) - { - field.set(settings.keyBindDrop, false); - } - if (settings.keyBindSwapHands.isPressed()) - { - field.set(settings.keyBindSwapHands, false); - } - for (KeyBinding keyBind : settings.keyBindsHotbar) - { - if (keyBind.isPressed()) - { - field.set(keyBind, false); - } - } - } - - int current = player.inventory.currentItem; - - if (player.getEntityData().hasKey("carrySlot") ? player.getEntityData().getInteger("carrySlot") != current : false) - { - player.inventory.currentItem = player.getEntityData().getInteger("carrySlot"); - } - } - - /* - * Renders the Block in First Person - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void renderHand(RenderHandEvent event) - { - World world = Minecraft.getMinecraft().world; - EntityPlayer player = Minecraft.getMinecraft().player; - AbstractClientPlayer aplayer = (AbstractClientPlayer) player; - ItemStack stack = player.getHeldItemMainhand(); - int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView; - boolean f1 = Minecraft.getMinecraft().gameSettings.hideGUI; - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack) && perspective == 0 && !f1) - { - if (Loader.isModLoaded("realrender") || Loader.isModLoaded("rfpr")) - return; - - Block block = ItemTile.getBlock(stack); - NBTTagCompound tag = ItemTile.getTileData(stack); - IBlockState state = ItemTile.getBlockState(stack); - ItemStack tileStack = ItemTile.getItemStack(stack); - - GlStateManager.pushMatrix(); - GlStateManager.scale(2.5, 2.5, 2.5); - GlStateManager.translate(0, -0.6, -1); - - if (CarryOnConfig.settings.facePlayer ? !isChest(block) : isChest(block)) - { - GlStateManager.rotate(180, 0, 1f, 0); - GlStateManager.rotate(-8, 1f, 0, 0); - } - else - { - GlStateManager.rotate(8, 1f, 0, 0); - } - - IBakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, world, player) : Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(tileStack, world, player); - - CarryOnOverride carryOverride = ScriptChecker.getOverride(player); - if (carryOverride != null) - { - double[] translation = ScriptParseHelper.getXYZArray(carryOverride.getRenderTranslation()); - double[] rotation = ScriptParseHelper.getXYZArray(carryOverride.getRenderRotation()); - double[] scale = ScriptParseHelper.getScale(carryOverride.getRenderScale()); - Block b = StringParser.getBlock(carryOverride.getRenderNameBlock()); - if (b != null) - { - ItemStack s = new ItemStack(b, 1, carryOverride.getRenderMeta()); - s.setTagCompound(carryOverride.getRenderNBT()); - model = Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(s, world, player); - } - - GlStateManager.translate(translation[0], translation[1], translation[2]); - GlStateManager.rotate((float) rotation[0], 1, 0, 0); - GlStateManager.rotate((float) rotation[1], 0, 1, 0); - GlStateManager.rotate((float) rotation[2], 0, 0, 1); - GlStateManager.scale(scale[0], scale[1], scale[2]); - - } - - int i = this.getBrightnessForRender(Minecraft.getMinecraft().player); - int j = i % 65536; - int k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, j, k); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.setLightmapDisabled(false); - - Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); - - if (ModelOverridesHandler.hasCustomOverrideModel(state, tag)) - { - Object override = ModelOverridesHandler.getOverrideObject(state, tag); - - if (override instanceof ItemStack) - { - - Minecraft.getMinecraft().getRenderItem().renderItem((ItemStack) override, model); - } - else - { - Minecraft.getMinecraft().getRenderItem().renderItem(tileStack.isEmpty() ? stack : tileStack, model); - } - } - else - { - Minecraft.getMinecraft().getRenderItem().renderItem(tileStack.isEmpty() ? stack : tileStack, model); - } - - this.setLightmapDisabled(true); - - if (perspective == 0) - { - event.setCanceled(true); - } - - GlStateManager.scale(1, 1, 1); - GlStateManager.popMatrix(); - - } - else - { - if (stack.isEmpty() ? true : stack.getItem() != RegistrationHandler.itemEntity) - { - event.setCanceled(false); - Minecraft mc = Minecraft.getMinecraft(); - RenderManager manager = mc.getRenderManager(); - RenderPlayer renderPlayer = manager.getSkinMap().get(aplayer.getSkinType()); - ModelPlayer modelPlayer = renderPlayer.getMainModel(); - - if (modelPlayer != null) - { - if (modelPlayer.bipedLeftArm != null && modelPlayer.bipedRightArm != null) - { - modelPlayer.bipedLeftArm.isHidden = false; - modelPlayer.bipedRightArm.isHidden = false; - modelPlayer.bipedLeftArmwear.isHidden = false; - modelPlayer.bipedRightArmwear.isHidden = false; - } - } - } - } - } - - @SideOnly(Side.CLIENT) - private int getBrightnessForRender(EntityPlayer player) - { - BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(MathHelper.floor(player.posX), 0, MathHelper.floor(player.posZ)); - - if (player.world.isBlockLoaded(blockpos$mutableblockpos)) - { - blockpos$mutableblockpos.setY(MathHelper.floor(player.posY + player.getEyeHeight())); - return player.world.getCombinedLight(blockpos$mutableblockpos, 0); - } - else - { - return 0; - } - } - - @SideOnly(Side.CLIENT) - private void setLightmapDisabled(boolean disabled) - { - GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); - - if (disabled) - { - GlStateManager.disableTexture2D(); - } - else - { - GlStateManager.enableTexture2D(); - } - - GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); - } - - /* - * Renders the Block in Third Person - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onPlayerRenderPost(RenderPlayerEvent.Post event) - { - World world = Minecraft.getMinecraft().world; - EntityPlayer player = event.getEntityPlayer(); - EntityPlayerSP clientPlayer = Minecraft.getMinecraft().player; - ItemStack stack = player.getHeldItemMainhand(); - float partialticks = event.getPartialRenderTick(); - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) - { - Block block = ItemTile.getBlock(stack); - IBlockState state = ItemTile.getBlockState(stack); - NBTTagCompound tag = ItemTile.getTileData(stack); - ItemStack tileItem = ItemTile.getItemStack(stack); - - float rotation = -(player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialticks); - - double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialticks; - double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialticks; - double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialticks; - - double c0 = clientPlayer.lastTickPosX + (clientPlayer.posX - clientPlayer.lastTickPosX) * partialticks; - double c1 = clientPlayer.lastTickPosY + (clientPlayer.posY - clientPlayer.lastTickPosY) * partialticks; - double c2 = clientPlayer.lastTickPosZ + (clientPlayer.posZ - clientPlayer.lastTickPosZ) * partialticks; - - double xOffset = d0 - c0; - double yOffset = d1 - c1; - double zOffset = d2 - c2; - - GlStateManager.pushMatrix(); - GlStateManager.translate(xOffset, yOffset, zOffset); - GlStateManager.scale(0.6, 0.6, 0.6); - - if (CarryOnConfig.settings.facePlayer ? !isChest(block) : isChest(block)) - { - GlStateManager.rotate(rotation, 0, 1.0f, 0); - GlStateManager.translate(0, 1.6, 0.65); - if ((Loader.isModLoaded("realrender") || Loader.isModLoaded("rfpr")) && Minecraft.getMinecraft().gameSettings.thirdPersonView == 0) - GlStateManager.translate(0, 0, -0.4); - } - else - { - GlStateManager.rotate(rotation + 180, 0, 1.0f, 0); - GlStateManager.translate(0, 1.6, -0.65); - if ((Loader.isModLoaded("realrender") || Loader.isModLoaded("rfpr")) && Minecraft.getMinecraft().gameSettings.thirdPersonView == 0) - GlStateManager.translate(0, 0, 0.4); - } - - if (player.isSneaking()) - { - GlStateManager.translate(0, -0.3, 0); - } - - IBakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, world, player) : Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(tileItem, world, player); - - CarryOnOverride carryOverride = ScriptChecker.getOverride(player); - if (carryOverride != null) - { - double[] translation = ScriptParseHelper.getXYZArray(carryOverride.getRenderTranslation()); - double[] rot = ScriptParseHelper.getXYZArray(carryOverride.getRenderRotation()); - double[] scale = ScriptParseHelper.getScale(carryOverride.getRenderScale()); - Block b = StringParser.getBlock(carryOverride.getRenderNameBlock()); - if (b != null) - { - ItemStack s = new ItemStack(b, 1, carryOverride.getRenderMeta()); - s.setTagCompound(carryOverride.getRenderNBT()); - model = Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(s, world, player); - } - - GlStateManager.translate(translation[0], translation[1], translation[2]); - GlStateManager.rotate((float) rot[0], 1, 0, 0); - GlStateManager.rotate((float) rot[1], 0, 1, 0); - GlStateManager.rotate((float) rot[2], 0, 0, 1); - GlStateManager.scale(scale[0], scale[1], scale[2]); - - } - - Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); - - if (ModelOverridesHandler.hasCustomOverrideModel(state, tag)) - { - Object override = ModelOverridesHandler.getOverrideObject(state, tag); - - if (override instanceof ItemStack) - { - Minecraft.getMinecraft().getRenderItem().renderItem((ItemStack) override, model); - } - else - { - Minecraft.getMinecraft().getRenderItem().renderItem(tileItem.isEmpty() ? stack : tileItem, model); - } - } - else - { - Minecraft.getMinecraft().getRenderItem().renderItem(tileItem.isEmpty() ? stack : tileItem, model); - } - - GlStateManager.scale(1, 1, 1); - GlStateManager.popMatrix(); - } - } - - /* - * Renders correct arm rotation - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onPlayerRenderPre(RenderPlayerEvent.Pre event) - { - if (!Loader.isModLoaded("mobends") && CarryOnConfig.settings.renderArms) - { - EntityPlayer player = event.getEntityPlayer(); - AbstractClientPlayer aplayer = (AbstractClientPlayer) player; - ItemStack stack = player.getHeldItemMainhand(); - ModelPlayer model = event.getRenderer().getMainModel(); - ResourceLocation skinLoc = DefaultPlayerSkin.getDefaultSkin(player.getPersistentID()); - - if (!initModels) - { - this.fakeLeftArm = new ModelRenderer(model, 32, 48); - this.fakeRightArm = new ModelRenderer(model, 40, 16); - this.fakeLeftArmwear = new ModelRenderer(model, 48, 48); - this.fakeRightArmwear = new ModelRenderer(model, 40, 32); - initModels = true; - } - - player.setArrowCountInEntity(0); // TODO Temporary Fix - - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - CarryOnOverride overrider = ScriptChecker.getOverride(player); - if (overrider != null) - { - if (model.bipedBody.childModels != null && !model.bipedBody.childModels.isEmpty()) - { - for (int k = 0; k < model.bipedBody.childModels.size(); k++) - { - double[] rotLeft1 = ScriptParseHelper.getXYZArray(overrider.getRenderRotationLeftArm()); - double[] rotRight1 = ScriptParseHelper.getXYZArray(overrider.getRenderRotationRightArm()); - - float rotX = model.bipedBody.childModels.get(k).rotateAngleX; - float rotY = model.bipedBody.childModels.get(k).rotateAngleY; - float rotZ = model.bipedBody.childModels.get(k).rotateAngleZ; - - if (rotLeft1[0] == rotX || rotLeft1[1] == rotY || rotRight1[2] == rotZ || rotRight1[0] == rotX || rotRight1[1] == rotY || rotRight1[2] == rotZ || rotX == rotLeft1[0] - 0.5f || rotX == rotRight1[0] - 0.5f) - { - model.bipedBody.childModels.remove(k); - k = k - 1; - } - } - } - } - else - { - if (model.bipedBody.childModels != null && !model.bipedBody.childModels.isEmpty()) - { - for (int k = 0; k < model.bipedBody.childModels.size(); k++) - { - float chkRot = model.bipedBody.childModels.get(k).rotateAngleX; - - if (chkRot == -0.9001F || chkRot == -1.2001F || chkRot == -1.4001F || chkRot == -1.7001F) - { - model.bipedBody.childModels.remove(k); - k = k - 1; - } - } - } - } - - Item item = stack.getItem(); - - model.bipedLeftArm.isHidden = true; - model.bipedRightArm.isHidden = true; - model.bipedLeftArmwear.isHidden = true; - model.bipedRightArmwear.isHidden = true; - this.fakeLeftArm.isHidden = false; - this.fakeLeftArmwear.isHidden = false; - this.fakeRightArm.isHidden = false; - this.fakeRightArmwear.isHidden = false; - - Minecraft.getMinecraft().getTextureManager().bindTexture(skinLoc); - - if (aplayer.getSkinType().equals("default")) - { - // left arm - this.fakeLeftArm.addBox(model.bipedLeftArm.offsetX + 4.2F, model.bipedLeftArm.offsetY, model.bipedLeftArm.offsetZ, 4, 12, 4, .08F); - this.fakeLeftArmwear.addBox(model.bipedLeftArm.offsetX + 4.2F, model.bipedLeftArm.offsetY, model.bipedLeftArm.offsetZ, 4, 12, 4, .08F + 0.25F); - - // right arm - this.fakeRightArm.addBox(model.bipedRightArm.offsetX - 7.9F, model.bipedRightArm.offsetY, model.bipedRightArm.offsetZ, 4, 12, 4, .08F); - this.fakeRightArmwear.addBox(model.bipedRightArm.offsetX - 7.9F, model.bipedRightArm.offsetY, model.bipedRightArm.offsetZ, 4, 12, 4, .08F + 0.25F); - } - else - { - // left arm - this.fakeLeftArm.addBox(model.bipedLeftArm.offsetX + 4.2F, model.bipedLeftArm.offsetY, model.bipedLeftArm.offsetZ, 3, 12, 4, .08F); - this.fakeLeftArmwear.addBox(model.bipedLeftArm.offsetX + 4.2F, model.bipedLeftArm.offsetY, model.bipedLeftArm.offsetZ, 3, 12, 4, .08F + 0.25F); - - // right arm - this.fakeRightArm.addBox(model.bipedRightArm.offsetX - 7.2F, model.bipedRightArm.offsetY, model.bipedRightArm.offsetZ, 3, 12, 4, .08F); - this.fakeRightArmwear.addBox(model.bipedRightArm.offsetX - 7.2F, model.bipedRightArm.offsetY, model.bipedRightArm.offsetZ, 3, 12, 4, .08F + 0.25F); - } - - CarryOnOverride override = ScriptChecker.getOverride(player); - if (override != null) - { - double[] rotLeft = null; - double[] rotRight = null; - if (override.getRenderRotationLeftArm() != null) - rotLeft = ScriptParseHelper.getXYZArray(override.getRenderRotationLeftArm()); - if (override.getRenderRotationRightArm() != null) - rotRight = ScriptParseHelper.getXYZArray(override.getRenderRotationRightArm()); - - boolean renderRight = override.isRenderRightArm(); - boolean renderLeft = override.isRenderLeftArm(); - - if (!renderRight) - { - this.fakeRightArm.isHidden = true; - this.fakeRightArmwear.isHidden = true; - model.bipedRightArm.isHidden = false; - model.bipedRightArmwear.isHidden = false; - } - - if (!renderLeft) - { - this.fakeLeftArm.isHidden = true; - this.fakeLeftArmwear.isHidden = true; - model.bipedLeftArm.isHidden = false; - model.bipedLeftArmwear.isHidden = false; - } - - if (rotLeft != null) - { - if (!player.isSneaking()) - { - this.fakeLeftArm.rotateAngleX = (float) rotLeft[0]; - this.fakeLeftArmwear.rotateAngleX = (float) rotLeft[0]; - } - else - { - this.fakeLeftArm.rotateAngleX = (float) rotLeft[0] - 0.5f; - this.fakeLeftArmwear.rotateAngleX = (float) rotLeft[0] - 0.5f; - } - - this.fakeLeftArmwear.rotateAngleY = (float) rotLeft[1]; - this.fakeLeftArmwear.rotateAngleZ = (float) rotLeft[2]; - this.fakeLeftArm.rotateAngleY = (float) rotLeft[1]; - this.fakeLeftArm.rotateAngleZ = (float) rotLeft[2]; - } - else - { - if (item == RegistrationHandler.itemTile) - { - if (!player.isSneaking()) - { - this.fakeLeftArm.rotateAngleX = -.9001F; - this.fakeLeftArmwear.rotateAngleX = -.9001F; - } - else - { - this.fakeLeftArm.rotateAngleX = -1.4001F; - this.fakeLeftArmwear.rotateAngleX = -1.4001F; - } - } - else - { - if (!player.isSneaking()) - { - this.fakeLeftArm.rotateAngleX = -1.2001F; - this.fakeLeftArmwear.rotateAngleX = -1.2001F; - } - else - { - this.fakeLeftArm.rotateAngleX = -1.7001F; - this.fakeLeftArmwear.rotateAngleX = -1.7001F; - } - - this.fakeLeftArm.rotateAngleY = 0.15f; - this.fakeLeftArmwear.rotateAngleY = 0.15f; - } - } - - if (rotRight != null) - { - if (!player.isSneaking()) - { - this.fakeRightArm.rotateAngleX = (float) rotRight[0]; - this.fakeRightArmwear.rotateAngleX = (float) rotRight[0]; - } - else - { - this.fakeRightArm.rotateAngleX = (float) rotRight[0] - 0.5f; - this.fakeRightArmwear.rotateAngleX = (float) rotRight[0] - 0.5f; - } - - this.fakeRightArmwear.rotateAngleY = (float) rotRight[1]; - this.fakeRightArmwear.rotateAngleZ = (float) rotRight[2]; - this.fakeRightArm.rotateAngleY = (float) rotRight[1]; - this.fakeRightArm.rotateAngleZ = (float) rotRight[2]; - } - else - { - if (item == RegistrationHandler.itemTile) - { - if (!player.isSneaking()) - { - this.fakeRightArm.rotateAngleX = -.9001F; - this.fakeRightArmwear.rotateAngleX = -.9001F; - } - else - { - this.fakeRightArm.rotateAngleX = -1.4001F; - this.fakeRightArmwear.rotateAngleX = -1.4001F; - } - } - else - { - if (!player.isSneaking()) - { - this.fakeRightArm.rotateAngleX = -1.2001F; - this.fakeRightArmwear.rotateAngleX = -1.2001F; - } - else - { - this.fakeRightArm.rotateAngleX = -1.7001F; - this.fakeRightArmwear.rotateAngleX = -1.7001F; - } - - this.fakeRightArm.rotateAngleY = -0.15f; - this.fakeRightArmwear.rotateAngleY = -0.15f; - } - } - } - else - { - if (item == RegistrationHandler.itemTile) - { - if (!player.isSneaking()) - { - this.fakeRightArm.rotateAngleX = -.9001F; - this.fakeLeftArm.rotateAngleX = -.9001F; - this.fakeLeftArmwear.rotateAngleX = -.9001F; - this.fakeRightArmwear.rotateAngleX = -.9001F; - } - else - { - this.fakeRightArm.rotateAngleX = -1.4001F; - this.fakeLeftArm.rotateAngleX = -1.4001F; - this.fakeLeftArmwear.rotateAngleX = -1.4001F; - this.fakeRightArmwear.rotateAngleX = -1.4001F; - } - - this.fakeRightArm.rotateAngleY = 0f; - this.fakeLeftArm.rotateAngleY = 0f; - this.fakeLeftArmwear.rotateAngleY = 0f; - this.fakeRightArmwear.rotateAngleY = 0f; - } - else - { - if (!player.isSneaking()) - { - this.fakeRightArm.rotateAngleX = -1.2001F; - this.fakeLeftArm.rotateAngleX = -1.2001F; - this.fakeLeftArmwear.rotateAngleX = -1.2001F; - this.fakeRightArmwear.rotateAngleX = -1.2001F; - } - else - { - this.fakeRightArm.rotateAngleX = -1.7001F; - this.fakeLeftArm.rotateAngleX = -1.7001F; - this.fakeLeftArmwear.rotateAngleX = -1.7001F; - this.fakeRightArmwear.rotateAngleX = -1.7001F; - } - - this.fakeRightArm.rotateAngleY = -0.15f; - this.fakeLeftArm.rotateAngleY = 0.15f; - this.fakeLeftArmwear.rotateAngleY = 0.15f; - this.fakeRightArmwear.rotateAngleY = -0.15f; - } - - this.fakeRightArm.rotateAngleZ = 0F; - this.fakeLeftArm.rotateAngleZ = 0F; - this.fakeLeftArmwear.rotateAngleZ = 0F; - this.fakeRightArmwear.rotateAngleZ = 0F; - } - - model.bipedBody.addChild(this.fakeLeftArm); - model.bipedBody.addChild(this.fakeRightArm); - - if (player.isWearing(EnumPlayerModelParts.LEFT_SLEEVE)) - { - model.bipedBody.addChild(this.fakeLeftArmwear); - } - if (player.isWearing(EnumPlayerModelParts.RIGHT_SLEEVE)) - { - model.bipedBody.addChild(this.fakeRightArmwear); - } - } - else - { - model.bipedLeftArm.isHidden = false; - model.bipedRightArm.isHidden = false; - model.bipedLeftArmwear.isHidden = false; - model.bipedRightArmwear.isHidden = false; - - CarryOnOverride overrider = ScriptChecker.getOverride(player); - if (overrider != null) - { - if (model.bipedBody.childModels != null && !model.bipedBody.childModels.isEmpty()) - { - for (int k = 0; k < model.bipedBody.childModels.size(); k++) - { - double[] rotLeft1 = ScriptParseHelper.getXYZArray(overrider.getRenderRotationLeftArm()); - double[] rotRight1 = ScriptParseHelper.getXYZArray(overrider.getRenderRotationRightArm()); - - float rotX = model.bipedBody.childModels.get(k).rotateAngleX; - float rotY = model.bipedBody.childModels.get(k).rotateAngleY; - float rotZ = model.bipedBody.childModels.get(k).rotateAngleZ; - - if (rotLeft1[0] == rotX || rotLeft1[1] == rotY || rotRight1[2] == rotZ || rotRight1[0] == rotX || rotRight1[1] == rotY || rotRight1[2] == rotZ || rotX == rotLeft1[0] - 0.5f || rotX == rotRight1[0] - 0.5f) - { - model.bipedBody.childModels.remove(k); - k = k - 1; - } - } - } - } - else - { - if (model.bipedBody.childModels != null && !model.bipedBody.childModels.isEmpty()) - { - for (int k = 0; k < model.bipedBody.childModels.size(); k++) - { - float chkRot = model.bipedBody.childModels.get(k).rotateAngleX; - - if (chkRot == -0.9001F || chkRot == -1.2001F || chkRot == -1.4001F || chkRot == -1.7001F) - { - model.bipedBody.childModels.remove(k); - k = k - 1; - } - } - } - } - } - - if (stack.isEmpty() || stack.getItem() != RegistrationHandler.itemTile && stack.getItem() != RegistrationHandler.itemEntity) - { - model.bipedLeftArm.isHidden = false; - model.bipedRightArm.isHidden = false; - model.bipedLeftArmwear.isHidden = false; - model.bipedRightArmwear.isHidden = false; - } - } - } - - public static boolean isChest(Block block) - { - return block == Blocks.CHEST || block == Blocks.ENDER_CHEST || block == Blocks.TRAPPED_CHEST; - } - - @SideOnly(Side.CLIENT) - private static RenderPlayer getRenderPlayer(AbstractClientPlayer player) - { - Minecraft mc = Minecraft.getMinecraft(); - RenderManager manager = mc.getRenderManager(); - return manager.getSkinMap().get(player.getSkinType()); - } - - @SideOnly(Side.CLIENT) - private static ModelPlayer getPlayerModel(AbstractClientPlayer player) - { - return getRenderPlayer(player).getMainModel(); - } - - @SubscribeEvent - @SideOnly(Side.CLIENT) - public void hideItems(RenderPlayerEvent.Specials.Pre event) - { - EntityPlayer player = event.getEntityPlayer(); - ItemStack stack = player.getHeldItemMainhand(); - - if (stack != null && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) - { - event.setRenderItem(false); - } - } -} diff --git a/src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java b/src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java deleted file mode 100644 index d09828c..0000000 --- a/src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java +++ /dev/null @@ -1,48 +0,0 @@ -package tschipp.carryon.client.gui; - -import java.util.List; - -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.common.config.ConfigCategory; -import net.minecraftforge.common.config.ConfigElement; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fml.client.config.GuiConfig; -import net.minecraftforge.fml.client.config.IConfigElement; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.config.CarryOnConfig; - -public class GuiConfigCarryOn extends GuiConfig -{ - private static final String LANG_PREFIX = CarryOn.MODID + ".category."; - - public GuiConfigCarryOn(GuiScreen parent) { - super(parent, getConfigElements(), CarryOn.MODID, false, false, "Carry On Configuration"); - } - - private static List getConfigElements() { - - final Configuration configuration = CarryOnConfig.EventHandler.getConfiguration(); - - final ConfigCategory topLevelCategory = configuration.getCategory(Configuration.CATEGORY_GENERAL); - topLevelCategory.getChildren() - .forEach(configCategory -> configCategory.setLanguageKey(GuiConfigCarryOn.LANG_PREFIX + configCategory.getName())); - - return new ConfigElement(topLevelCategory).getChildElements(); - } - - @Override - public void initGui() { - super.initGui(); - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - super.drawScreen(mouseX, mouseY, partialTicks); - } - - @Override - protected void actionPerformed(GuiButton button) { - super.actionPerformed(button); - } -} diff --git a/src/main/java/tschipp/carryon/client/gui/GuiFactoryCarryOn.java b/src/main/java/tschipp/carryon/client/gui/GuiFactoryCarryOn.java deleted file mode 100644 index dd74b43..0000000 --- a/src/main/java/tschipp/carryon/client/gui/GuiFactoryCarryOn.java +++ /dev/null @@ -1,47 +0,0 @@ -package tschipp.carryon.client.gui; - -import java.util.Set; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.fml.client.IModGuiFactory; - -public class GuiFactoryCarryOn implements IModGuiFactory -{ - @Override - public void initialize(Minecraft minecraftInstance) { - // Do nothing - } - - @Override - public Class mainConfigGuiClass() { - return GuiConfigCarryOn.class; - } - - @Override - public Set runtimeGuiCategories() { - return null; - } - - @Override - public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) { - return null; - } - - - @Override - public boolean hasConfigGui() - { - return true; - } - - @Override - public GuiScreen createConfigGui(GuiScreen parentScreen) - { - - return new GuiConfigCarryOn(parentScreen); - } - - - -} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/client/keybinds/CarryOnKeybinds.java b/src/main/java/tschipp/carryon/client/keybinds/CarryOnKeybinds.java deleted file mode 100644 index 25eaad2..0000000 --- a/src/main/java/tschipp/carryon/client/keybinds/CarryOnKeybinds.java +++ /dev/null @@ -1,44 +0,0 @@ -package tschipp.carryon.client.keybinds; - -import org.lwjgl.input.Keyboard; - -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public class CarryOnKeybinds -{ - - public static final String KEYBIND_KEY = "carryOnKeyPressed"; - public static KeyBinding carryKey; - - @SideOnly(Side.CLIENT) - public static void init() - { - carryKey = new KeyBinding("key.carry.desc", Keyboard.KEY_LSHIFT, "key.carry.category"); - - ClientRegistry.registerKeyBinding(carryKey); - } - - public static boolean isKeyPressed(EntityPlayer player) - { - NBTTagCompound tag = player.getEntityData(); - if(tag != null && tag.hasKey(KEYBIND_KEY)) - { - return tag.getBoolean(KEYBIND_KEY); - } - return false; - } - - public static void setKeyPressed(EntityPlayer player, boolean pressed) - { - NBTTagCompound tag = player.getEntityData(); - tag.setBoolean(KEYBIND_KEY, pressed); - } - - - -} diff --git a/src/main/java/tschipp/carryon/client/model/ModelPlayerCarrying.java b/src/main/java/tschipp/carryon/client/model/ModelPlayerCarrying.java deleted file mode 100644 index 956366f..0000000 --- a/src/main/java/tschipp/carryon/client/model/ModelPlayerCarrying.java +++ /dev/null @@ -1,23 +0,0 @@ -package tschipp.carryon.client.model; - -import net.minecraft.client.model.ModelPlayer; -import net.minecraft.entity.Entity; - -public class ModelPlayerCarrying extends ModelPlayer -{ - - public ModelPlayerCarrying(float modelSize, boolean smallArmsIn) - { - super(modelSize, smallArmsIn); - } - - @Override - public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) - { - super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor, entityIn); - - - - } - -} diff --git a/src/main/java/tschipp/carryon/common/CommonProxy.java b/src/main/java/tschipp/carryon/common/CommonProxy.java deleted file mode 100644 index 123c13b..0000000 --- a/src/main/java/tschipp/carryon/common/CommonProxy.java +++ /dev/null @@ -1,63 +0,0 @@ -package tschipp.carryon.common; - -import java.io.FileNotFoundException; - -import com.google.gson.JsonIOException; -import com.google.gson.JsonSyntaxException; - -import net.minecraft.nbt.NBTException; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.network.NetworkRegistry; -import net.minecraftforge.fml.relauncher.Side; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.handler.RegistrationHandler; -import tschipp.carryon.common.scripting.ScriptReader; -import tschipp.carryon.network.client.CarrySlotPacket; -import tschipp.carryon.network.client.CarrySlotPacketHandler; -import tschipp.carryon.network.client.ScriptReloadPacket; -import tschipp.carryon.network.client.ScriptReloadPacketHandler; -import tschipp.carryon.network.server.SyncKeybindPacket; -import tschipp.carryon.network.server.SyncKeybindPacketHandler; - -public class CommonProxy -{ - - @EventHandler - public void preInit(FMLPreInitializationEvent event) - { - ScriptReader.preInit(event); - - CarryOn.network = NetworkRegistry.INSTANCE.newSimpleChannel("CarryOn"); - - CarryOn.network.registerMessage(SyncKeybindPacketHandler.class, SyncKeybindPacket.class, 0, Side.SERVER); - CarryOn.network.registerMessage(CarrySlotPacketHandler.class, CarrySlotPacket.class, 1, Side.CLIENT); - CarryOn.network.registerMessage(ScriptReloadPacketHandler.class, ScriptReloadPacket.class, 2, Side.CLIENT); - - RegistrationHandler.regItems(); - RegistrationHandler.regCommonEvents(); - } - - @EventHandler - public void init(FMLInitializationEvent event) - { - try - { - ScriptReader.parseScripts(); - } - catch (JsonIOException | JsonSyntaxException | FileNotFoundException | NBTException e) - { - e.printStackTrace(); - } - RegistrationHandler.regOverrideList(); - RegistrationHandler.regCaps(); - } - - @EventHandler - public void postInit(FMLPostInitializationEvent e) - { - } - -} diff --git a/src/main/java/tschipp/carryon/common/capabilities/IPosition.java b/src/main/java/tschipp/carryon/common/capabilities/IPosition.java deleted file mode 100644 index 35d90e2..0000000 --- a/src/main/java/tschipp/carryon/common/capabilities/IPosition.java +++ /dev/null @@ -1,16 +0,0 @@ -package tschipp.carryon.common.capabilities; - -import net.minecraft.util.math.BlockPos; - -public interface IPosition { - - public BlockPos getPos(); - - public void setPos(BlockPos pos); - - public boolean isBlockActivated(); - - public void setBlockActivated(boolean b); - - -} diff --git a/src/main/java/tschipp/carryon/common/capabilities/PositionProvider.java b/src/main/java/tschipp/carryon/common/capabilities/PositionProvider.java deleted file mode 100644 index 6f46a79..0000000 --- a/src/main/java/tschipp/carryon/common/capabilities/PositionProvider.java +++ /dev/null @@ -1,37 +0,0 @@ -package tschipp.carryon.common.capabilities; - -import net.minecraft.nbt.NBTBase; -import net.minecraft.util.EnumFacing; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.CapabilityInject; -import net.minecraftforge.common.capabilities.ICapabilitySerializable; - -public class PositionProvider implements ICapabilitySerializable { - - @CapabilityInject(IPosition.class) - public static final Capability POSITION_CAPABILITY = null; - - private IPosition instance = POSITION_CAPABILITY.getDefaultInstance(); - - - @Override - public boolean hasCapability(Capability capability, EnumFacing facing) { - return capability == POSITION_CAPABILITY; - } - - @Override - public T getCapability(Capability capability, EnumFacing facing) { - return capability == POSITION_CAPABILITY ? POSITION_CAPABILITY.cast(instance) : null; - } - - @Override - public NBTBase serializeNBT() { - return POSITION_CAPABILITY.getStorage().writeNBT(POSITION_CAPABILITY, instance, null); - } - - @Override - public void deserializeNBT(NBTBase nbt) { - POSITION_CAPABILITY.getStorage().readNBT(POSITION_CAPABILITY, instance, null, nbt); - } - -} diff --git a/src/main/java/tschipp/carryon/common/capabilities/PositionStorage.java b/src/main/java/tschipp/carryon/common/capabilities/PositionStorage.java deleted file mode 100644 index d3a4973..0000000 --- a/src/main/java/tschipp/carryon/common/capabilities/PositionStorage.java +++ /dev/null @@ -1,41 +0,0 @@ -package tschipp.carryon.common.capabilities; - -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.Capability.IStorage; - -public class PositionStorage implements IStorage { - - @Override - public NBTBase writeNBT(Capability capability, IPosition instance, EnumFacing side) { - - NBTTagCompound tag = new NBTTagCompound(); - - tag.setBoolean("blockActivated", instance.isBlockActivated()); - tag.setInteger("x", instance.getPos().getX()); - tag.setInteger("y", instance.getPos().getY()); - tag.setInteger("z", instance.getPos().getZ()); - - return tag; - - } - - @Override - public void readNBT(Capability capability, IPosition instance, EnumFacing side, NBTBase nbt) { - - NBTTagCompound tag = (NBTTagCompound) nbt; - - int x = tag.getInteger("x"); - int y = tag.getInteger("y"); - int z = tag.getInteger("z"); - - BlockPos pos = new BlockPos(x,y,z); - - instance.setPos(pos); - instance.setBlockActivated(tag.getBoolean("blockActivated")); - } - -} diff --git a/src/main/java/tschipp/carryon/common/capabilities/TEPosition.java b/src/main/java/tschipp/carryon/common/capabilities/TEPosition.java deleted file mode 100644 index 7398fc0..0000000 --- a/src/main/java/tschipp/carryon/common/capabilities/TEPosition.java +++ /dev/null @@ -1,34 +0,0 @@ -package tschipp.carryon.common.capabilities; - -import net.minecraft.util.math.BlockPos; - -public class TEPosition implements IPosition { - - private BlockPos pos = new BlockPos(0, 0, 0); - private boolean blockActivated = false; - - @Override - public BlockPos getPos() - { - return pos; - } - @Override - public void setPos(BlockPos pos) - { - this.pos = pos; - } - @Override - public boolean isBlockActivated() - { - return blockActivated; - } - @Override - public void setBlockActivated(boolean b) - { - this.blockActivated = b; - } - - - - -} diff --git a/src/main/java/tschipp/carryon/common/capabilities/event/PositionClientEvents.java b/src/main/java/tschipp/carryon/common/capabilities/event/PositionClientEvents.java deleted file mode 100644 index 1d6e3e8..0000000 --- a/src/main/java/tschipp/carryon/common/capabilities/event/PositionClientEvents.java +++ /dev/null @@ -1,91 +0,0 @@ -package tschipp.carryon.common.capabilities.event; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.event.entity.player.PlayerContainerEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import tschipp.carryon.common.capabilities.IPosition; -import tschipp.carryon.common.capabilities.PositionProvider; - -public class PositionClientEvents -{ - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onGui(GuiScreenEvent.DrawScreenEvent event) - { - if (event.getGui() != null) - { - EntityPlayer player = Minecraft.getMinecraft().player; - boolean inventory = event.getGui() instanceof GuiContainer; - - if (player != null && inventory) - { - if(player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) - { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); - if(cap.isBlockActivated()) - { - World world = player.world; - BlockPos pos = cap.getPos(); - if(world != null) - { - TileEntity te = world.getTileEntity(pos); - if(te == null) - { -// player.openContainer = null; - Minecraft.getMinecraft().currentScreen = null; - Minecraft.getMinecraft().setIngameFocus(); - cap.setBlockActivated(false); - cap.setPos(new BlockPos(0,0,0)); - } - } - } - } - } - } - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onGuiClose(PlayerContainerEvent.Close event) - { - EntityPlayer player = event.getEntityPlayer(); - if(player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) - { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); - cap.setBlockActivated(false); - cap.setPos(new BlockPos(0,0,0)); - } - } - - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onPlayerTick(PlayerTickEvent event) - { - if (event.side == Side.CLIENT) - { - EntityPlayer player = event.player; - if (player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) - { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); - if (cap.isBlockActivated() && Minecraft.getMinecraft().currentScreen == null) - { - cap.setBlockActivated(false); - cap.setPos(new BlockPos(0, 0, 0)); - } - } - } - } - - -} diff --git a/src/main/java/tschipp/carryon/common/capabilities/event/PositionCommonEvents.java b/src/main/java/tschipp/carryon/common/capabilities/event/PositionCommonEvents.java deleted file mode 100644 index ae25abd..0000000 --- a/src/main/java/tschipp/carryon/common/capabilities/event/PositionCommonEvents.java +++ /dev/null @@ -1,60 +0,0 @@ -package tschipp.carryon.common.capabilities.event; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.capabilities.IPosition; -import tschipp.carryon.common.capabilities.PositionProvider; - -public class PositionCommonEvents -{ - - @SubscribeEvent - public void onAttachCaps(AttachCapabilitiesEvent event) - { - if (event.getObject() instanceof EntityPlayer) - { - event.addCapability(new ResourceLocation(CarryOn.MODID, "position"), new PositionProvider()); - } - - } - - @SubscribeEvent - public void onBlockRight(PlayerInteractEvent.RightClickBlock event) - { - BlockPos pos = event.getPos(); - World world = event.getWorld(); - EntityPlayer player = event.getEntityPlayer(); - - if (event.isCanceled()) - return; - - if (player == null) - return; - - if (player instanceof FakePlayer) - return; - - TileEntity te = world.getTileEntity(pos); - if (te != null) - { - if (player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) - { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); - cap.setBlockActivated(true); - cap.setPos(pos); - } - } - } - - - -} diff --git a/src/main/java/tschipp/carryon/common/command/CommandCarryOn.java b/src/main/java/tschipp/carryon/common/command/CommandCarryOn.java deleted file mode 100644 index 571a8ff..0000000 --- a/src/main/java/tschipp/carryon/common/command/CommandCarryOn.java +++ /dev/null @@ -1,194 +0,0 @@ -package tschipp.carryon.common.command; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.command.WrongUsageException; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentString; -import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.handler.CustomPickupOverrideHandler; -import tschipp.carryon.common.handler.ModelOverridesHandler; -import tschipp.carryon.common.handler.RegistrationHandler; -import tschipp.carryon.common.item.ItemEntity; -import tschipp.carryon.common.item.ItemTile; -import tschipp.carryon.common.scripting.ScriptReader; -import tschipp.carryon.network.client.CarrySlotPacket; - -public class CommandCarryOn extends CommandBase implements ICommand -{ - - private final List names; - - public CommandCarryOn() - { - names = new ArrayList(); - names.add("carryon"); - } - - @Override - public int compareTo(ICommand o) - { - return this.getName().compareTo(o.getName()); - } - - @Override - public String getName() - { - return "carryon"; - } - - @Override - public String getUsage(ICommandSender sender) - { - - return "/carryon "; - } - - @Override - public List getAliases() - { - return this.names; - } - - @Override - public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException - { - if (args.length > 0) - { - // Handling clear - if (args[0].toLowerCase().equals("clear")) - { - if (sender instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) sender; - - int cleared = 0; - cleared += player.inventory.clearMatchingItems(RegistrationHandler.itemTile, 0, 64, null); - cleared += player.inventory.clearMatchingItems(RegistrationHandler.itemEntity, 0, 64, null); - - CarryOn.network.sendTo(new CarrySlotPacket(9, player.getEntityId()), (EntityPlayerMP) player); - - if (cleared != 1) - player.sendMessage(new TextComponentString("Cleared " + cleared + " Items!")); - else - player.sendMessage(new TextComponentString("Cleared " + cleared + " Item!")); - } - - } - // Handling debug - else if (args[0].toLowerCase().equals("debug")) - { - - if (sender instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) sender; - ItemStack main = player.getHeldItemMainhand(); - if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemTile) - { - player.sendMessage(new TextComponentString("Block: " + ItemTile.getBlock(main))); - player.sendMessage(new TextComponentString("BlockState: " + ItemTile.getBlockState(main))); - player.sendMessage(new TextComponentString("Meta: " + ItemTile.getMeta(main))); - player.sendMessage(new TextComponentString("ItemStack: " + ItemTile.getItemStack(main))); - - if(ModelOverridesHandler.hasCustomOverrideModel(ItemTile.getBlockState(main), ItemTile.getTileData(main))) - player.sendMessage(new TextComponentString("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemTile.getBlockState(main), ItemTile.getTileData(main)))); - - if(CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemTile.getBlockState(main))) - player.sendMessage(new TextComponentString("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemTile.getBlockState(main)))); - - - CarryOn.LOGGER.info("Block: " + ItemTile.getBlock(main)); - CarryOn.LOGGER.info("BlockState: " + ItemTile.getBlockState(main)); - CarryOn.LOGGER.info("Meta: " + ItemTile.getMeta(main)); - CarryOn.LOGGER.info("ItemStack: " + ItemTile.getItemStack(main)); - - if(ModelOverridesHandler.hasCustomOverrideModel(ItemTile.getBlockState(main), ItemTile.getTileData(main))) - CarryOn.LOGGER.info("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemTile.getBlockState(main), ItemTile.getTileData(main))); - - if(CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemTile.getBlockState(main))) - CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemTile.getBlockState(main))); - - } - else if(!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity) - { - player.sendMessage(new TextComponentString("Entity: " + ItemEntity.getEntity(main, server.getEntityWorld()))); - player.sendMessage(new TextComponentString("Entity Name: " + ItemEntity.getEntityName(main))); - - if(CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemEntity.getEntity(main, server.getEntityWorld()))) - player.sendMessage(new TextComponentString("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemEntity.getEntity(main, server.getEntityWorld())))); - - CarryOn.LOGGER.info("Entity: " + ItemEntity.getEntity(main, server.getEntityWorld())); - CarryOn.LOGGER.info("Entity Name: " + ItemEntity.getEntityName(main)); - - if(CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemEntity.getEntity(main, server.getEntityWorld()))) - CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemEntity.getEntity(main, server.getEntityWorld()))); - - } - } - } - else - { - throw new WrongUsageException(this.getUsage(sender)); - } - - } - else - { - throw new WrongUsageException(this.getUsage(sender)); - } - - } - - @Override - public boolean checkPermission(MinecraftServer server, ICommandSender sender) - { - return true; - } - - @Override - public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) - { - - if (args.length > 0) - { - if (args.length == 1) - { - return CommandBase.getListOfStringsMatchingLastWord(args, "debug", "clear"); - } - - else - { - return Collections.emptyList(); - } - - } - - return Collections.emptyList(); - - } - - @Override - public boolean isUsernameIndex(String[] args, int index) - { - - return false; - } - - @Override - public int getRequiredPermissionLevel() - { - return 2; - } - -} diff --git a/src/main/java/tschipp/carryon/common/command/CommandCarryOnReload.java b/src/main/java/tschipp/carryon/common/command/CommandCarryOnReload.java deleted file mode 100644 index 9f5c48e..0000000 --- a/src/main/java/tschipp/carryon/common/command/CommandCarryOnReload.java +++ /dev/null @@ -1,80 +0,0 @@ -package tschipp.carryon.common.command; - -import java.util.Collections; -import java.util.List; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentString; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.scripting.ScriptReader; -import tschipp.carryon.network.client.ScriptReloadPacket; - -public class CommandCarryOnReload extends CommandBase -{ - - @Override - public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException - { - - if (CarryOnConfig.settings.useScripts) - { - ScriptReader.reloadScripts(); - CarryOn.network.sendToAll(new ScriptReloadPacket()); - sender.sendMessage(new TextComponentString("Successfully reloaded scripts!")); - } - else - sender.sendMessage(new TextComponentString("To use custom Carry On scripts, enable them in the config!")); - - } - - @Override - public boolean checkPermission(MinecraftServer server, ICommandSender sender) - { - return sender.canUseCommand(this.getRequiredPermissionLevel(), this.getName()); - } - - @Override - public int getRequiredPermissionLevel() - { - return 2; - } - - @Override - public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) - { - - if (args.length > 0) - { - if (args.length == 1) - { - return CommandBase.getListOfStringsMatchingLastWord(args, "reload"); - } - - else - { - return Collections.emptyList(); - } - - } - - return Collections.emptyList(); - - } - - @Override - public String getName() - { - return "reloadscripts"; - } - - @Override - public String getUsage(ICommandSender sender) - { - return "/reloadscripts"; - } -} diff --git a/src/main/java/tschipp/carryon/common/config/CarryOnConfig.java b/src/main/java/tschipp/carryon/common/config/CarryOnConfig.java deleted file mode 100644 index 5bd4b75..0000000 --- a/src/main/java/tschipp/carryon/common/config/CarryOnConfig.java +++ /dev/null @@ -1,102 +0,0 @@ -package tschipp.carryon.common.config; - -import java.io.File; -import java.lang.invoke.MethodHandle; -import java.util.Map; -import java.util.Optional; - -import net.minecraftforge.common.config.Config; -import net.minecraftforge.common.config.ConfigManager; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fml.client.config.IConfigElement; -import net.minecraftforge.fml.client.event.ConfigChangedEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.helper.ReflectionUtil; - -@Config(modid = CarryOn.MODID) -public class CarryOnConfig { - - @Config.LangKey(CarryOn.MODID) - @Config.Comment("General Mod Settings") - public static Configs.Settings settings = new Configs.Settings(); - - @Config.LangKey(CarryOn.MODID) - @Config.Comment("Blacklist for Blocks and Entities") - public static Configs.Blacklist blacklist = new Configs.Blacklist(); - - @Config.LangKey(CarryOn.MODID) - @Config.Comment("Whitelist for Blocks and Entities (useWhitelist must be true!)") - public static Configs.WhiteList whitelist = new Configs.WhiteList(); - - @Config.LangKey(CarryOn.MODID) - @Config.Comment("Model Overrides based on NBT or on Meta. Advanced Users Only!") - public static Configs.ModelOverrides modelOverrides = new Configs.ModelOverrides(); - - @Config.LangKey(CarryOn.MODID) - @Config.Comment("Custom Pickup Conditions for certain blocks. ONLY WORKS WHEN GAMESTAGES IS INSTALLED! Advanced Users Only!") - public static Configs.CustomPickupConditions customPickupConditions = new Configs.CustomPickupConditions(); - - @Mod.EventBusSubscriber - public static class EventHandler { - - /** - * The {@link ConfigManager#CONFIGS} getter. - */ - private static final MethodHandle CONFIGS_GETTER = ReflectionUtil.findFieldGetter(ConfigManager.class, "CONFIGS"); - - - /** - * The {@link Configuration} instance. - */ - private static Configuration configuration; - - /** - * Get the {@link Configuration} instance from {@link ConfigManager}. - *

- * TODO: Use a less hackish method of getting the - * {@link Configuration}/{@link IConfigElement}s when possible. - * - * @return The Configuration instance - */ - public static Configuration getConfiguration() { - if (EventHandler.configuration == null) - try { - final String fileName = CarryOn.MODID + ".cfg"; - - @SuppressWarnings("unchecked") - final Map configsMap = (Map) EventHandler.CONFIGS_GETTER - .invokeExact(); - - final Optional> entryOptional = configsMap.entrySet().stream() - .filter(entry -> fileName.equals(new File(entry.getKey()).getName())).findFirst(); - - entryOptional - .ifPresent(stringConfigurationEntry -> EventHandler.configuration = stringConfigurationEntry - .getValue()); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - - return EventHandler.configuration; - } - - /** - * Inject the new values and save to the config file when the config has - * been changed from the GUI. - * - * @param event - * The event - */ - @SubscribeEvent - public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) { - if (event.getModID().equals(CarryOn.MODID)) - ConfigManager.load(CarryOn.MODID, Config.Type.INSTANCE); - - } - - } - -} diff --git a/src/main/java/tschipp/carryon/common/config/Configs.java b/src/main/java/tschipp/carryon/common/config/Configs.java deleted file mode 100644 index fe44531..0000000 --- a/src/main/java/tschipp/carryon/common/config/Configs.java +++ /dev/null @@ -1,262 +0,0 @@ -package tschipp.carryon.common.config; - -import net.minecraftforge.common.config.Config; -import net.minecraftforge.common.config.Config.Comment; - -public class Configs { - - public static class Settings - { - @Comment("If the front of the Tile Entities should face the player or should face outward") - public boolean facePlayer = false; - - @Comment("More complex Tile Entities slow down the player more") - public boolean heavyTiles = true; - - @Comment("Allow all blocks to be picked up, not just Tile Entites") - public boolean pickupAllBlocks = false; - - @Comment("Whether Blocks and Entities slow the creative player down when carried") - public boolean slownessInCreative = true; - - @Config.RangeDouble(min = 0) - @Comment("Maximum distance from where Blocks and Entities can be picked up") - public double maxDistance = 2.5; - - @Config.RangeDouble(min = 0, max = 10) - @Comment("Max width of entities that can be picked up in survival mode") - public float maxEntityWidth = 1.5f; - - @Config.RangeDouble(min = 0, max = 10) - @Comment("Max height of entities that can be picked up in survival mode") - public float maxEntityHeight = 1.5f; - - @Comment("Whether hostile mobs should be able to picked up in survival mode") - public boolean pickupHostileMobs = false; - - @Comment("Larger Entities slow down the player more") - public boolean heavyEntities = true; - - @Comment("Slowness multiplier for blocks") - public double blockSlownessMultiplier = 1.0; - - @Comment("Slowness multiplier for entities") - public double entitySlownessMultiplier = 1.0; - - @Comment("Arms should render on sides when carrying") - public boolean renderArms = true; - - @Comment("Allow babies to be carried even when adult mob is blacklisted (or not whitelisted)") - public boolean allowBabies = false; - - @Comment("Use Whitelist instead of Blacklist for Blocks") - public boolean useWhitelistBlocks=false; - - @Comment("Use Whitelist instead of Blacklist for Entities") - public boolean useWhitelistEntities=false; - - @Comment("Whether the player can hit blocks and entities while carrying or not") - public boolean hitWhileCarrying=false; - - @Comment("Whether the player drops the carried object when hit or not") - public boolean dropCarriedWhenHit=false; - - @Config.RequiresMcRestart() - @Comment("Use custom Pickup Scripts. Having this set to false, will not allow you to run scripts, but will increase your performance") - public boolean useScripts=false; - - @Comment("Allows entities to be stacked using Carry On") - public boolean stackableEntities = true; - - @Config.RangeInt(min = 1) - @Comment("Maximum stack limit for entities") - public int maxEntityStackLimit = 10; - - @Comment("Whether entities' size matters when stacking or not") - public boolean entitySizeMattersStacking = true; - } - - public static class WhiteList - { - @Config.RequiresMcRestart() - @Comment("Entities that CAN be picked up") - public String[] allowedEntities=new String[] - { - }; - - @Config.RequiresMcRestart() - @Comment("Blocks that CAN be picked up") - public String[] allowedBlocks=new String[] - { - }; - } - - public static class Blacklist - { - @Config.RequiresMcRestart() - @Comment("Tile Entities that cannot be picked up") - public String[] forbiddenTiles = new String[] - { - "minecraft:end_portal", - "minecraft:end_gateway", - "minecraft:double_plant", - "minecraft:bed", - "minecraft:wooden_door", - "minecraft:iron_door", - "minecraft:spruce_door", - "minecraft:birch_door", - "minecraft:jungle_door", - "minecraft:acacia_door", - "minecraft:dark_oak_door", - "minecraft:waterlily", - "minecraft:cake", - "animania:block_trough", - "animania:block_invisiblock", - "colossalchests:*", - "ic2:*", - "bigreactors:*", - "forestry:*", - "tconstruct:*", - "rustic:*", - "botania:*", - "astralsorcery:*", - "quark:colored_bed_*", - "immersiveengineering:*", - "embers:block_furnace", - "embers:ember_bore", - "embers:ember_activator", - "embers:mixer", - "embers:heat_coil", - "embers:large_tank", - "embers:crystal_cell", - "embers:alchemy_pedestal", - "embers:boiler", - "embers:combustor", - "embers:catalzyer", - "embers:field_chart", - "embers:inferno_forge", - "storagedrawers:framingtable", - "skyresources:*", - "lootbags:*", - "exsartagine:*", - "aquamunda:tank", - "opencomputers:*", - "malisisdoors:*", - "industrialforegoing:*", - "minecolonies:*", - }; - - @Config.RequiresMcRestart() - @Comment("Entities that cannot be picked up") - public String[] forbiddenEntities = new String[] - { - "minecraft:ender_crystal", - "minecraft:ender_dragon", - "minecraft:ghast", - "minecraft:shulker", - "minecraft:leash_knot", - "minecraft:armor_stand", - "minecraft:item_frame", - "minecraft:painting", - "minecraft:shulker_bullet", - "animania:textures/entity/pigs/hamster_tarou.png", - "animania:hamster", - "animania:ferret*", - "animania:hedgehog*", - "animania:cart", - "animania:wagon", - "mynko:*" - }; - } - - public static class ModelOverrides - { - @Config.RequiresMcRestart() - @Comment("Model Overrides based on NBT or on Meta. Advanced Users Only!") - public String[] modelOverrides = new String[] - { - "minecraft:lit_furnace->minecraft:furnace", - "minecraft:hopper->(block)minecraft:hopper", - "minecraft:unpowered_comparator->(block)minecraft:unpowered_comparator", - "minecraft:unpowered_repeater->(block)minecraft:unpowered_repeater", - "minecraft:powered_comparator->(block)minecraft:powered_comparator", - "minecraft:powered_repeater->(block)minecraft:powered_repeater", - "minecraft:cauldron->(block)minecraft:cauldron", - "minecraft:brewing_stand->(item)minecraft:brewing_stand", - "minecraft:tallgrass;1->(item)minecraft:tallgrass;1", - "minecraft:tallgrass;2->(item)minecraft:tallgrass;2", - "minecraft:flower_pot->(block)minecraft:flower_pot", - "minecraft:leaves2->(item)minecraft:leaves2", - "minecraft:reeds->(block)minecraft:reeds", - "minecraft:daylight_detector_inverted->minecraft:daylight_detector", - "quark:custom_chest{type:\"spruce\"}->quark:custom_chest;0", - "quark:custom_chest{type:\"birch\"}->quark:custom_chest;1", - "quark:custom_chest{type:\"jungle\"}->quark:custom_chest;2", - "quark:custom_chest{type:\"acacia\"}->quark:custom_chest;3", - "quark:custom_chest{type:\"dark_oak\"}->quark:custom_chest;4", - "quark:custom_chest_trap{type:\"spruce\"}->quark:custom_chest_trap;0", - "quark:custom_chest_trap{type:\"birch\"}->quark:custom_chest_trap;1", - "quark:custom_chest_trap{type:\"jungle\"}->quark:custom_chest_trap;2", - "quark:custom_chest_trap{type:\"acacia\"}->quark:custom_chest_trap;3", - "quark:custom_chest_trap{type:\"dark_oak\"}->quark:custom_chest_trap;4", - "storagedrawers:basicdrawers;0{Mat:\"spruce\"}->storagedrawers:basicdrawers;0{material:\"spruce\"}", - "storagedrawers:basicdrawers;0{Mat:\"birch\"}->storagedrawers:basicdrawers;0{material:\"birch\"}", - "storagedrawers:basicdrawers;0{Mat:\"jungle\"}->storagedrawers:basicdrawers;0{material:\"jungle\"}", - "storagedrawers:basicdrawers;0{Mat:\"acacia\"}->storagedrawers:basicdrawers;0{material:\"acacia\"}", - "storagedrawers:basicdrawers;0{Mat:\"dark_oak\"}->storagedrawers:basicdrawers;0{material:\"dark_oak\"}", - "storagedrawers:basicdrawers;1{Mat:\"spruce\"}->storagedrawers:basicdrawers;1{material:\"spruce\"}", - "storagedrawers:basicdrawers;1{Mat:\"birch\"}->storagedrawers:basicdrawers;1{material:\"birch\"}", - "storagedrawers:basicdrawers;1{Mat:\"jungle\"}->storagedrawers:basicdrawers;1{material:\"jungle\"}", - "storagedrawers:basicdrawers;1{Mat:\"acacia\"}->storagedrawers:basicdrawers;1{material:\"acacia\"}", - "storagedrawers:basicdrawers;1{Mat:\"dark_oak\"}->storagedrawers:basicdrawers;1{material:\"dark_oak\"}", - "storagedrawers:basicdrawers;2{Mat:\"spruce\"}->storagedrawers:basicdrawers;2{material:\"spruce\"}", - "storagedrawers:basicdrawers;2{Mat:\"birch\"}->storagedrawers:basicdrawers;2{material:\"birch\"}", - "storagedrawers:basicdrawers;2{Mat:\"jungle\"}->storagedrawers:basicdrawers;2{material:\"jungle\"}", - "storagedrawers:basicdrawers;2{Mat:\"acacia\"}->storagedrawers:basicdrawers;2{material:\"acacia\"}", - "storagedrawers:basicdrawers;2{Mat:\"dark_oak\"}->storagedrawers:basicdrawers;2{material:\"dark_oak\"}", - "storagedrawers:basicdrawers;3{Mat:\"spruce\"}->storagedrawers:basicdrawers;3{material:\"spruce\"}", - "storagedrawers:basicdrawers;3{Mat:\"birch\"}->storagedrawers:basicdrawers;3{material:\"birch\"}", - "storagedrawers:basicdrawers;3{Mat:\"jungle\"}->storagedrawers:basicdrawers;3{material:\"jungle\"}", - "storagedrawers:basicdrawers;3{Mat:\"acacia\"}->storagedrawers:basicdrawers;3{material:\"acacia\"}", - "storagedrawers:basicdrawers;3{Mat:\"dark_oak\"}->storagedrawers:basicdrawers;3{material:\"dark_oak\"}", - "storagedrawers:basicdrawers;4{Mat:\"spruce\"}->storagedrawers:basicdrawers;4{material:\"spruce\"}", - "storagedrawers:basicdrawers;4{Mat:\"birch\"}->storagedrawers:basicdrawers;4{material:\"birch\"}", - "storagedrawers:basicdrawers;4{Mat:\"jungle\"}->storagedrawers:basicdrawers;4{material:\"jungle\"}", - "storagedrawers:basicdrawers;4{Mat:\"acacia\"}->storagedrawers:basicdrawers;4{material:\"acacia\"}", - "storagedrawers:basicdrawers;4{Mat:\"dark_oak\"}->storagedrawers:basicdrawers;4{material:\"dark_oak\"}", - "animania:block_nest->(block)animania:block_nest", - "animania:cheese_mold;0->(block)animania:cheese_mold;0", - "animania:cheese_mold;1->(block)animania:cheese_mold;1", - "animania:cheese_mold;2->(block)animania:cheese_mold;2", - "animania:cheese_mold;3->(block)animania:cheese_mold;3", - "animania:cheese_mold;4->(block)animania:cheese_mold;4", - "animania:cheese_mold;5->(block)animania:cheese_mold;5", - "animania:cheese_mold;6->(block)animania:cheese_mold;6", - "animania:cheese_mold;7->(block)animania:cheese_mold;7", - "animania:cheese_mold;8->(block)animania:cheese_mold;8", - "animania:cheese_mold;9->(block)animania:cheese_mold;9", - "animania:cheese_mold;10->(block)animania:cheese_mold;10", - - }; - } - - - - public static class CustomPickupConditions - { - @Config.RequiresMcRestart() - @Comment("Custom Pickup Conditions for Blocks") - public String[] customPickupConditionsBlocks = new String[] - { - - }; - - @Config.RequiresMcRestart() - @Comment("Custom Pickup Conditions for Entities") - public String[] customPickupConditionsEntities = new String[] - { - - }; - } - -} diff --git a/src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java b/src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java deleted file mode 100644 index f844549..0000000 --- a/src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java +++ /dev/null @@ -1,259 +0,0 @@ -package tschipp.carryon.common.event; - -import java.util.List; - -import com.google.common.collect.Lists; - -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.fml.common.eventhandler.Event.Result; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; -import tschipp.carryon.CarryOn; -import tschipp.carryon.client.keybinds.CarryOnKeybinds; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.handler.PickupHandler; -import tschipp.carryon.common.handler.RegistrationHandler; -import tschipp.carryon.common.item.ItemEntity; -import tschipp.carryon.common.scripting.CarryOnOverride; -import tschipp.carryon.common.scripting.ScriptChecker; -import tschipp.carryon.network.client.CarrySlotPacket; - -public class ItemEntityEvents -{ - - @SubscribeEvent(priority = EventPriority.HIGH) - public void onBlockClick(PlayerInteractEvent.RightClickBlock event) - { - EntityPlayer player = event.getEntityPlayer(); - ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - player.getEntityData().removeTag("carrySlot"); - event.setUseBlock(Result.DENY); - } - - } - - @SubscribeEvent(priority = EventPriority.HIGH) - public void onItemDropped(EntityJoinWorldEvent event) - { - Entity e = event.getEntity(); - World world = event.getWorld(); - if (e instanceof EntityItem) - { - EntityItem eitem = (EntityItem) e; - ItemStack stack = eitem.getEntityItem(); - Item item = stack.getItem(); - if (item == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - BlockPos pos = eitem.getPosition(); - Entity entity = ItemEntity.getEntity(stack, world); - entity.setPosition(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - world.spawnEntity(entity); - - ItemEntity.clearEntityData(stack); - eitem.setEntityItemStack(ItemStack.EMPTY); - } - } - } - - @SubscribeEvent(priority = EventPriority.HIGH) - public void onEntityRightClick(PlayerInteractEvent.EntityInteract event) - { - EntityPlayer player = event.getEntityPlayer(); - - if (player instanceof EntityPlayerMP) - { - ItemStack main = player.getHeldItemMainhand(); - ItemStack off = player.getHeldItemOffhand(); - World world = event.getWorld(); - Entity entity = event.getTarget(); - BlockPos pos = entity.getPosition(); - - if (main.isEmpty() && off.isEmpty() && CarryOnKeybinds.isKeyPressed(player)) - { - ItemStack stack = new ItemStack(RegistrationHandler.itemEntity); - - if (entity.hurtResistantTime == 0) - { - if (entity instanceof EntityAnimal) - ((EntityAnimal) entity).clearLeashed(true, true); - - if (PickupHandler.canPlayerPickUpEntity(player, entity)) - { - if (ItemEntity.storeEntityData(entity, world, stack)) - { - if (entity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)) - { - IItemHandler handler = entity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); - for (int i = 0; i < handler.getSlots(); i++) - { - handler.extractItem(i, 64, false); - } - } - - CarryOnOverride override = ScriptChecker.inspectEntity(entity); - int overrideHash = 0; - if (override != null) - overrideHash = override.hashCode(); - - CarryOn.network.sendToAllAround(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), overrideHash), new TargetPoint(world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - entity.setDead(); - player.setHeldItem(EnumHand.MAIN_HAND, stack); - event.setCanceled(true); - } - } - } - - } - else if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(main) && !CarryOnKeybinds.isKeyPressed(player) && CarryOnConfig.settings.stackableEntities) - { - Entity entityHeld = ItemEntity.getEntity(main, world); - - if (entity.hurtResistantTime == 0 && entityHeld instanceof EntityLivingBase) - { - - if (!world.isRemote && entityHeld.getUniqueID() != entity.getUniqueID() && !entityHeld.isDead && !entity.isDead) - { - - double sizeHeldEntity = entityHeld.height * entityHeld.width; - double distance = pos.distanceSqToCenter(player.posX, player.posY + 0.5, player.posZ); - Entity lowestEntity = entity.getLowestRidingEntity(); - int numPassengers = getAllPassengers(lowestEntity); - if (numPassengers < CarryOnConfig.settings.maxEntityStackLimit - 1) - { - Entity topEntity = getTopPassenger(lowestEntity); - - double sizeEntity = topEntity.height * topEntity.width; - if ((CarryOnConfig.settings.entitySizeMattersStacking && sizeHeldEntity <= sizeEntity) || !CarryOnConfig.settings.entitySizeMattersStacking) - { - if (topEntity instanceof EntityHorse) - { - EntityHorse horse = (EntityHorse) topEntity; - horse.setHorseTamed(true); - } - - if (distance < 6) - { - double tempX = entity.posX; - double tempY = entity.posY; - double tempZ = entity.posZ; - entityHeld.setPosition(tempX, tempY + 2.6, tempZ); - world.spawnEntity(entityHeld); - entityHeld.startRiding(topEntity, false); - entityHeld.setPositionAndUpdate(tempX, tempY, tempZ); - } - else - { - entityHeld.setPosition(entity.posX, entity.posY, entity.posZ); - world.spawnEntity(entityHeld); - entityHeld.startRiding(topEntity, false); - } - - - ItemEntity.clearEntityData(main); - player.setHeldItem(EnumHand.MAIN_HAND, ItemStack.EMPTY); - CarryOn.network.sendToAllAround(new CarrySlotPacket(9, player.getEntityId()), new TargetPoint(world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - event.setCanceled(true); - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_HORSE_SADDLE, SoundCategory.PLAYERS, 0.5F, 1.5F); - } - else - { - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_NOTE_BASS, SoundCategory.PLAYERS, 0.5F, 1.5F); - return; - } - } - else - { - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_NOTE_BASS, SoundCategory.PLAYERS, 0.5F, 1.5F); - return; - } - } - - } - - } - } - - } - - public static int getAllPassengers(Entity entity) - { - int passengers = 0; - while (entity.isBeingRidden()) - { - List pass = entity.getPassengers(); - if (!pass.isEmpty()) - { - entity = pass.get(0); - passengers++; - } - } - - return passengers; - } - - public static Entity getTopPassenger(Entity entity) - { - Entity top = entity; - while (entity.isBeingRidden()) - { - List pass = entity.getPassengers(); - if (!pass.isEmpty()) - { - entity = pass.get(0); - top = entity; - } - } - - return top; - } - - @SubscribeEvent - public void onLivingUpdate(LivingUpdateEvent event) - { - EntityLivingBase entity = event.getEntityLiving(); - World world = entity.world; - ItemStack main = entity.getHeldItemMainhand(); - if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(main)) - { - BlockPos pos = entity.getPosition(); - BlockPos below = pos.offset(EnumFacing.DOWN); - - if (world.getBlockState(pos).getMaterial() == Material.WATER || world.getBlockState(below).getMaterial() == Material.WATER) - { - Entity contained = ItemEntity.getEntity(main, world); - if (contained != null) - { - float height = contained.height; - float width = contained.width; - - entity.addVelocity(0, -0.01 * height * width, 0); - } - } - } - } - -} diff --git a/src/main/java/tschipp/carryon/common/event/ItemEvents.java b/src/main/java/tschipp/carryon/common/event/ItemEvents.java deleted file mode 100644 index 7c79c71..0000000 --- a/src/main/java/tschipp/carryon/common/event/ItemEvents.java +++ /dev/null @@ -1,375 +0,0 @@ -package tschipp.carryon.common.event; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.util.text.event.ClickEvent; -import net.minecraft.util.text.event.ClickEvent.Action; -import net.minecraft.world.GameRules; -import net.minecraft.world.World; -import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import net.minecraftforge.event.entity.living.LivingAttackEvent; -import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.BreakSpeed; -import net.minecraftforge.event.entity.player.PlayerEvent.StartTracking; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.world.BlockEvent.BreakEvent; -import net.minecraftforge.fml.common.eventhandler.Event.Result; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; -import tschipp.carryon.CarryOn; -import tschipp.carryon.client.keybinds.CarryOnKeybinds; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.handler.PickupHandler; -import tschipp.carryon.common.handler.RegistrationHandler; -import tschipp.carryon.common.item.ItemEntity; -import tschipp.carryon.common.item.ItemTile; -import tschipp.carryon.common.scripting.CarryOnOverride; -import tschipp.carryon.common.scripting.ScriptChecker; -import tschipp.carryon.network.client.CarrySlotPacket; - -public class ItemEvents -{ - - @SubscribeEvent(priority = EventPriority.HIGH) - public void onBlockClick(PlayerInteractEvent.RightClickBlock event) - { - EntityPlayer player = event.getEntityPlayer(); - ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) - { - player.getEntityData().removeTag("carrySlot"); - event.setUseBlock(Result.DENY); - } - - } - - @SubscribeEvent(priority = EventPriority.HIGH) - public void onItemDropped(EntityJoinWorldEvent event) - { - Entity e = event.getEntity(); - World world = event.getWorld(); - if (e instanceof EntityItem) - { - EntityItem eitem = (EntityItem) e; - ItemStack stack = eitem.getEntityItem(); - Item item = stack.getItem(); - if (item == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) - { - BlockPos pos = eitem.getPosition(); - BlockPos finalPos = pos; - Block block = ItemTile.getBlock(stack); - if (!world.getBlockState(pos).getBlock().isReplaceable(world, pos) || !block.canPlaceBlockAt(world, pos)) - { - for (EnumFacing facing : EnumFacing.VALUES) - { - BlockPos offsetPos = pos.offset(facing); - if (world.getBlockState(offsetPos).getBlock().isReplaceable(world, offsetPos) && block.canPlaceBlockAt(world, offsetPos)) - { - finalPos = offsetPos; - break; - } - } - } - world.setBlockState(finalPos, ItemTile.getBlockState(stack)); - TileEntity tile = world.getTileEntity(finalPos); - if (tile != null) - { - tile.readFromNBT(ItemTile.getTileData(stack)); - tile.setPos(finalPos); - } - ItemTile.clearTileData(stack); - eitem.setEntityItemStack(ItemStack.EMPTY); - } - } - - } - - @SubscribeEvent - public void onPlayerLogin(PlayerLoggedInEvent event) - { - if (event.player instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) event.player; - World world = player.getEntityWorld(); - - ItemStack carried = player.getHeldItemMainhand(); - if (!carried.isEmpty() && carried.getItem() == RegistrationHandler.itemTile || carried.getItem() == RegistrationHandler.itemEntity) - { - if (carried.getItem() == RegistrationHandler.itemTile) - { - CarryOnOverride override = ScriptChecker.inspectBlock(((ItemTile) carried.getItem()).getBlockState(carried), world, player.getPosition(), ((ItemTile) carried.getItem()).getTileData(carried)); - if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) player); - else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) player); - } - else - { - CarryOnOverride override = ScriptChecker.inspectEntity(((ItemEntity) carried.getItem()).getEntity(carried, world)); - if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) player); - else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) player); - } - } - - } - } - - @SubscribeEvent - public void onEntityStartTracking(StartTracking event) - { - Entity e = event.getTarget(); - EntityPlayer tracker = event.getEntityPlayer(); - - if (e instanceof EntityPlayer && tracker instanceof EntityPlayerMP) - { - EntityPlayer player = (EntityPlayer) e; - World world = player.getEntityWorld(); - - ItemStack carried = player.getHeldItemMainhand(); - if (!carried.isEmpty() && carried.getItem() == RegistrationHandler.itemTile || carried.getItem() == RegistrationHandler.itemEntity) - { - if (carried.getItem() == RegistrationHandler.itemTile) - { - CarryOnOverride override = ScriptChecker.inspectBlock(((ItemTile) carried.getItem()).getBlockState(carried), world, player.getPosition(), ((ItemTile) carried.getItem()).getTileData(carried)); - if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) tracker); - else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) tracker); - } - else - { - CarryOnOverride override = ScriptChecker.inspectEntity(((ItemEntity) carried.getItem()).getEntity(carried, world)); - if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) tracker); - else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) tracker); - } - } - - } - } - - @SubscribeEvent - public void harvestSpeed(BreakSpeed event) - { - EntityPlayer player = event.getEntityPlayer(); - if (player != null && !CarryOnConfig.settings.hitWhileCarrying) - { - ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) - event.setNewSpeed(0); - } - } - - @SubscribeEvent - public void attackEntity(AttackEntityEvent event) - { - EntityPlayer player = event.getEntityPlayer(); - ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && !CarryOnConfig.settings.hitWhileCarrying && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) - { - event.setCanceled(true); - } - } - - @SubscribeEvent - public void harvestSpeed(BreakEvent event) - { - EntityPlayer player = event.getPlayer(); - if (player != null && !CarryOnConfig.settings.hitWhileCarrying) - { - ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) - event.setCanceled(true); - } - } - - - @SubscribeEvent - public void playerAttack(LivingAttackEvent event) - { - EntityLivingBase eliving = event.getEntityLiving(); - if (eliving instanceof EntityPlayer && CarryOnConfig.settings.dropCarriedWhenHit) - { - EntityPlayer player = (EntityPlayer) eliving; - ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) - { - if (!player.world.isRemote) - { - player.setHeldItem(EnumHand.MAIN_HAND, ItemStack.EMPTY); - EntityItem item = new EntityItem(player.world, player.posX, player.posY, player.posZ, stack); - CarryOn.network.sendToAllAround(new CarrySlotPacket(9, player.getEntityId()), new TargetPoint(player.world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - player.world.spawnEntity(item); - } - } - - } - } - - @SubscribeEvent - public void onBlockRightClick(PlayerInteractEvent.RightClickBlock event) throws InstantiationException, IllegalAccessException - { - EntityPlayer player = event.getEntityPlayer(); - - if (player instanceof EntityPlayerMP) - { - - ItemStack main = player.getHeldItemMainhand(); - ItemStack off = player.getHeldItemOffhand(); - World world = event.getWorld(); - BlockPos pos = event.getPos(); - Block block = world.getBlockState(pos).getBlock(); - IBlockState state = world.getBlockState(pos); - - if (main.isEmpty() && off.isEmpty() && CarryOnKeybinds.isKeyPressed(player)) - { - ItemStack stack = new ItemStack(RegistrationHandler.itemTile); - - TileEntity te = world.getTileEntity(pos); - if (PickupHandler.canPlayerPickUpBlock(player, te, world, pos)) - { - if (ItemTile.storeTileData(te, world, pos, state.getActualState(world, pos), stack)) - { - IBlockState statee = world.getBlockState(pos); - NBTTagCompound tag = new NBTTagCompound(); - tag = world.getTileEntity(pos) != null ? world.getTileEntity(pos).writeToNBT(tag) : new NBTTagCompound(); - CarryOnOverride override = ScriptChecker.inspectBlock(state, world, pos, tag); - int overrideHash = 0; - if (override != null) - overrideHash = override.hashCode(); - - try - { - CarryOn.network.sendToAllAround(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), overrideHash), new TargetPoint(world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - world.removeTileEntity(pos); - world.setBlockToAir(pos); - player.setHeldItem(EnumHand.MAIN_HAND, stack); - event.setUseBlock(Result.DENY); - event.setCanceled(true); - } - catch (Exception e) - { - try - { - CarryOn.network.sendToAllAround(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), overrideHash), new TargetPoint(world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - emptyTileEntity(te); - world.setBlockToAir(pos); - player.setHeldItem(EnumHand.MAIN_HAND, stack); - event.setUseBlock(Result.DENY); - event.setCanceled(true); - } - catch (Exception ex) - { - CarryOn.network.sendToAllAround(new CarrySlotPacket(9, player.getEntityId()), new TargetPoint(world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - world.setBlockState(pos, statee); - if (!tag.hasNoTags()) - TileEntity.create(world, tag); - - player.sendMessage(new TextComponentString(TextFormatting.RED + "Error detected. Cannot pick up block.")); - TextComponentString s = new TextComponentString(TextFormatting.GOLD + "here"); - s.getStyle().setClickEvent(new ClickEvent(Action.OPEN_URL, "https://github.com/Tschipp/CarryOn/issues")); - player.sendMessage(new TextComponentString(TextFormatting.RED + "Please report this error ").appendSibling(s)); - } - } - - } - - } - - } - } - } - - public static void emptyTileEntity(TileEntity te) - { - if (te != null && !te.isInvalid()) - { - for (EnumFacing facing : EnumFacing.VALUES) - { - if (te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing)) - { - IItemHandler itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing); - for (int i = 0; i < itemHandler.getSlots(); i++) - { - itemHandler.extractItem(i, 64, false); - } - } - } - - if (te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)) - { - IItemHandler itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); - for (int i = 0; i < itemHandler.getSlots(); i++) - { - itemHandler.extractItem(i, 64, false); - } - } - - if (te instanceof IInventory) - { - IInventory inv = (IInventory) te; - inv.clear(); - } - - if (te instanceof IItemHandler) - { - IItemHandler itemHandler = (IItemHandler) te; - for (int i = 0; i < itemHandler.getSlots(); i++) - { - itemHandler.extractItem(i, 64, false); - } - } - } - } - - @SubscribeEvent - public void onRespawn(PlayerEvent.Clone event) - { - EntityPlayer original = event.getOriginal(); - EntityPlayer player = event.getEntityPlayer(); - boolean wasDead = event.isWasDeath(); - GameRules rules = player.world.getGameRules(); - boolean keepInv = rules.getBoolean("keepInventory"); - boolean wasCarrying = player.inventory.hasItemStack(new ItemStack(RegistrationHandler.itemTile)) || player.inventory.hasItemStack(new ItemStack(RegistrationHandler.itemEntity)); - - if ((wasDead ? keepInv : true) && wasCarrying) - { - int carrySlot = original.inventory.currentItem; - - ItemStack stack = player.inventory.removeStackFromSlot(carrySlot); - World world = player.world; - - EntityItem item = new EntityItem(world); - item.setEntityItemStack(stack); - BlockPos pos = original.getBedLocation(); - if (pos == null) - pos = player.getPosition(); - item.setPosition(pos.getX(), pos.getY(), pos.getZ()); - world.spawnEntity(item); - } - } - -} diff --git a/src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java b/src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java deleted file mode 100644 index 38ce4ac..0000000 --- a/src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java +++ /dev/null @@ -1,125 +0,0 @@ -package tschipp.carryon.common.handler; - -import java.util.HashMap; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraftforge.fml.common.Loader; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.helper.InvalidConfigException; - -public class CustomPickupOverrideHandler -{ - - public static HashMap PICKUP_CONDITIONS = new HashMap(); - public static HashMap PICKUP_CONDITIONS_ENTITIES = new HashMap(); - - public static void initPickupOverrides() - { - if (Loader.isModLoaded("gamestages")) - { - - String[] conditions = CarryOnConfig.customPickupConditions.customPickupConditionsBlocks; - - for (int i = 0; i < conditions.length; i++) - { - String line = conditions[i]; - - if (!line.contains("(") || !line.contains(")")) - new InvalidConfigException("Invalid Condition at line " + i + ": " + line).printException(); - - String condition = line.substring(line.indexOf("(")); - String blockname = line.replace(condition, ""); - condition = condition.replace("(", ""); - condition = condition.replace(")", ""); - - if (blockname.contains("*")) - { - String modid = blockname.replace("*", ""); - for (int k = 0; k < Block.REGISTRY.getKeys().size(); k++) - { - if (Block.REGISTRY.getKeys().toArray()[k].toString().contains(modid)) - { - PICKUP_CONDITIONS.put(Block.REGISTRY.getKeys().toArray()[k].toString() + ";any", condition); - } - } - } - else - { - if (!blockname.contains(";")) - blockname = blockname + ";any"; - - PICKUP_CONDITIONS.put(blockname, condition); - } - } - - String[] entityConditions = CarryOnConfig.customPickupConditions.customPickupConditionsEntities; - - for (int i = 0; i < entityConditions.length; i++) - { - String line = entityConditions[i]; - - if (!line.contains("(") || !line.contains(")")) - new InvalidConfigException("Invalid Condition at line " + i + ": " + line).printException(); - - String condition = line.substring(line.indexOf("(")); - String entityname = line.replace(condition, ""); - condition = condition.replace("(", ""); - condition = condition.replace(")", ""); - - PICKUP_CONDITIONS_ENTITIES.put(entityname, condition); - - } - } - } - - public static boolean hasSpecialPickupConditions(IBlockState state) - { - if (!Loader.isModLoaded("gamestages")) - return false; - - String block = state.getBlock().getRegistryName().toString(); - String meta = "" + state.getBlock().getMetaFromState(state); - - boolean absolute = PICKUP_CONDITIONS.containsKey(block + ";" + meta); - boolean any = PICKUP_CONDITIONS.containsKey(block + ";any"); - - return absolute || any; - } - - public static String getPickupCondition(IBlockState state) - { - String block = state.getBlock().getRegistryName().toString(); - String meta = "" + state.getBlock().getMetaFromState(state); - - String absolute = PICKUP_CONDITIONS.get(block + ";" + meta); - String any = PICKUP_CONDITIONS.get(block + ";any"); - - if (absolute != null) - return absolute; - else - return any; - } - - public static boolean hasSpecialPickupConditions(Entity entity) - { - if (!Loader.isModLoaded("gamestages")) - return false; - - String entityname = EntityList.getKey(entity).toString(); - boolean condition = PICKUP_CONDITIONS_ENTITIES.containsKey(entityname); - - return condition; - } - - public static String getPickupCondition(Entity entity) - { - String entityname = EntityList.getKey(entity).toString(); - String condition = PICKUP_CONDITIONS_ENTITIES.get(entityname); - - return condition; - } - -} diff --git a/src/main/java/tschipp/carryon/common/handler/ListHandler.java b/src/main/java/tschipp/carryon/common/handler/ListHandler.java deleted file mode 100644 index 83a23bc..0000000 --- a/src/main/java/tschipp/carryon/common/handler/ListHandler.java +++ /dev/null @@ -1,138 +0,0 @@ -package tschipp.carryon.common.handler; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraftforge.fml.common.registry.ForgeRegistries; -import tschipp.carryon.common.config.CarryOnConfig; - -public class ListHandler -{ - public static List FORBIDDEN_TILES; - public static List FORBIDDEN_ENTITIES; - public static List ALLOWED_ENTITIES; - public static List ALLOWED_TILES; - - public static boolean isForbidden(Block block) - { - String name = block.getRegistryName().toString(); - if (FORBIDDEN_TILES.contains(name)) - return true; - else - { - boolean contains = false; - for (String s : FORBIDDEN_TILES) - { - if (s.contains("*")) - { - if(name.contains(s.replace("*", ""))) - contains = true; - } - } - - return contains; - } - } - - public static boolean isForbidden(Entity entity) - { - if (EntityList.getKey(entity) != null) - { - String name = EntityList.getKey(entity).toString(); - boolean contains = FORBIDDEN_ENTITIES.contains(name); - return contains; - } - return true; - } - - public static boolean isAllowed(Entity entity) - { - if (EntityList.getKey(entity) != null) - { - String name = EntityList.getKey(entity).toString(); - boolean contains = ALLOWED_ENTITIES.contains(name); - return contains; - } - return true; - } - - public static boolean isAllowed(Block block) - { - String name = block.getRegistryName().toString(); - if (ALLOWED_TILES.contains(name)) - return true; - else - { - boolean contains = false; - for (String s : ALLOWED_TILES) - { - if (s.contains("*")) - { - if(name.contains(s.replace("*", ""))) - contains = true; - } - } - return contains; - } - - } - - public static void initForbiddenTiles() - { - String[] forbidden = CarryOnConfig.blacklist.forbiddenTiles; - FORBIDDEN_TILES = new ArrayList(); - - for (int i = 0; i < forbidden.length; i++) - { - FORBIDDEN_TILES.add(forbidden[i]); - } - - String[] forbiddenEntity = CarryOnConfig.blacklist.forbiddenEntities; - FORBIDDEN_ENTITIES = new ArrayList(); - - for (int i = 0; i < forbiddenEntity.length; i++) - { - if (forbiddenEntity[i].contains("*")) - { - String modid = forbiddenEntity[i].replace("*", ""); - for (int k = 0; k < ForgeRegistries.ENTITIES.getKeys().size(); k++) - { - if (ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString().contains(modid)) - { - FORBIDDEN_ENTITIES.add(ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString()); - } - } - } - FORBIDDEN_ENTITIES.add(forbiddenEntity[i]); - } - - String[] allowedEntities = CarryOnConfig.whitelist.allowedEntities; - ALLOWED_ENTITIES = new ArrayList(); - for (int i = 0; i < allowedEntities.length; i++) - { - if (allowedEntities[i].contains("*")) - { - String modid = allowedEntities[i].replace("*", ""); - for (int k = 0; k < ForgeRegistries.ENTITIES.getKeys().size(); k++) - { - if (ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString().contains(modid)) - { - ALLOWED_ENTITIES.add(ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString()); - } - } - } - ALLOWED_ENTITIES.add(allowedEntities[i]); - } - - String[] allowedBlocks = CarryOnConfig.whitelist.allowedBlocks; - ALLOWED_TILES = new ArrayList(); - for (int i = 0; i < allowedBlocks.length; i++) - { - ALLOWED_TILES.add(allowedBlocks[i]); - } - } - -} diff --git a/src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java b/src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java deleted file mode 100644 index 2d8885c..0000000 --- a/src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java +++ /dev/null @@ -1,269 +0,0 @@ -package tschipp.carryon.common.handler; - -import java.util.HashMap; -import java.util.Set; - -import org.apache.commons.lang3.StringUtils; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.JsonToNBT; -import net.minecraft.nbt.NBTException; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.helper.InvalidConfigException; -import tschipp.carryon.common.helper.StringParser; - -public class ModelOverridesHandler -{ - public static HashMap OVERRIDE_OBJECTS = new HashMap(); - - /* - * This class is really ugly, will probably be replaced by something else - - * Tschipp - */ - public static void initOverrides() - { - String[] overrides = CarryOnConfig.modelOverrides.modelOverrides; - - for (int i = 0; i < overrides.length; i++) - { - boolean errored = false; - - Object toOverrideObject; - Object overrideObject; - NBTTagCompound tag = new NBTTagCompound(); - - String currentline = overrides[i]; - if (StringUtils.isEmpty(currentline) || !StringUtils.contains(currentline, "->")) - new InvalidConfigException("Missing Override Model at line " + i + " : " + currentline).printException(); - - String[] sa = currentline.split("->"); - String toOverride = ""; - String override = ""; - try - { - toOverride = sa[0]; - override = sa[1]; - } - catch (ArrayIndexOutOfBoundsException e) - { - errored = true; - new InvalidConfigException("Missing Override Model at line " + i + " : " + currentline).printException(); - } - - if (toOverride.contains("{")) - { - if (!toOverride.contains("}")) - { - errored = true; - new InvalidConfigException("Missing } at line " + i + " : " + currentline).printException(); - } - - String nbt = toOverride.substring(toOverride.indexOf("{")); - toOverride = toOverride.replace(nbt, ""); - try - { - tag = JsonToNBT.getTagFromJson(nbt); - } - catch (NBTException e) - { - errored = true; - new InvalidConfigException("Error while parsing NBT at line " + i + " : " + e.getMessage()).printException(); - } - - } - else if (toOverride.contains("}")) - { - errored = true; - new InvalidConfigException("Missing { at line " + i + " : " + currentline).printException(); - } - - String overridetype = "item"; - if (override.contains("(")) - { - if (!override.contains(")")) - { - errored = true; - new InvalidConfigException("Missing ) at line " + i + " : " + currentline).printException(); - } - - overridetype = override.substring(0, override.indexOf(")") + 1); - override =override.replace(overridetype, ""); - overridetype = overridetype.replace("(", ""); - overridetype = overridetype.replace(")", ""); - - } - else if (override.contains(")")) - { - errored = true; - new InvalidConfigException("Missing ( at line " + i + " : " + currentline).printException(); - } - - String modidToOverride = "minecraft"; - String modidOverride = "minecraft"; - - if (toOverride.contains(":")) - modidToOverride = toOverride.replace(toOverride.substring(toOverride.indexOf(":")), ""); - - if (override.contains(":")) - modidOverride = override.replace(override.substring(override.indexOf(":")), ""); - - if (Loader.isModLoaded(modidOverride) && Loader.isModLoaded(modidToOverride) && !errored) - { - - int meta = StringParser.getMeta(toOverride); - if (meta == 0) - toOverrideObject = StringParser.getBlock(toOverride); - else - toOverrideObject = StringParser.getBlockState(toOverride); - - if (toOverrideObject != null) - { - if (overridetype.equals("block")) - overrideObject = StringParser.getBlockState(override); - else - overrideObject = StringParser.getItemStack(override); - - if (overrideObject != null) - { - NBTTagCompound keyComp = new NBTTagCompound(); - keyComp.setTag("nbttag", tag); - if (toOverrideObject instanceof Block) - { - keyComp.setString("block", ((Block) toOverrideObject).getRegistryName().toString()); - } - else - { - keyComp.setInteger("stateid", Block.getStateId((IBlockState) toOverrideObject)); - keyComp.setString("block", ((IBlockState) toOverrideObject).getBlock().getRegistryName().toString()); - } - OVERRIDE_OBJECTS.put(keyComp, overrideObject); - } - } - } - } - } - - public static boolean hasCustomOverrideModel(IBlockState state, NBTTagCompound tag) - { - if (OVERRIDE_OBJECTS.isEmpty()) - return false; - - int stateid = Block.getStateId(state); - NBTTagCompound[] keys = new NBTTagCompound[OVERRIDE_OBJECTS.size()]; - OVERRIDE_OBJECTS.keySet().toArray(keys); - for (NBTTagCompound key : keys) - { - int id = key.getInteger("stateid"); - Block block = StringParser.getBlock(key.getString("block")); - if (id == 0 ? block == state.getBlock() : id == stateid) - { - NBTTagCompound toCheckForCompound = key.getCompoundTag("nbttag"); - Set kSetToCheck = toCheckForCompound.getKeySet(); - Set kSetTile = tag.getKeySet(); - - boolean flag = true; - if (kSetTile.containsAll(kSetToCheck)) - { - for (String skey : kSetToCheck) - { - if (!NBTUtil.areNBTEquals(tag.getTag(skey), toCheckForCompound.getTag(skey), true)) - flag = false; - } - if (flag) - return true; - } - } - } - - return false; - } - - @SideOnly(Side.CLIENT) - public static IBakedModel getCustomOverrideModel(IBlockState state, NBTTagCompound tag, World world, EntityPlayer player) - { - int stateid = Block.getStateId(state); - NBTTagCompound[] keys = new NBTTagCompound[OVERRIDE_OBJECTS.size()]; - OVERRIDE_OBJECTS.keySet().toArray(keys); - for (NBTTagCompound key : keys) - { - int id = key.getInteger("stateid"); - Block block = StringParser.getBlock(key.getString("block")); - if (id == 0 ? block == state.getBlock() : id == stateid) - { - NBTTagCompound toCheckForCompound = key.getCompoundTag("nbttag"); - Set kSetToCheck = toCheckForCompound.getKeySet(); - Set kSetTile = tag.getKeySet(); - - boolean flag = true; - if (kSetTile.containsAll(kSetToCheck)) - { - for (String skey : kSetToCheck) - { - if (!NBTUtil.areNBTEquals(tag.getTag(skey), toCheckForCompound.getTag(skey), true)) - flag = false; - } - if (flag) - { - Object override = OVERRIDE_OBJECTS.get(key); - - if (override == null) - return null; - - if (override instanceof IBlockState) - return Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState((IBlockState) override); - else - return Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides((ItemStack) override, world, player); - } - } - } - } - return null; - - } - - public static Object getOverrideObject(IBlockState state, NBTTagCompound tag) - { - int stateid = Block.getStateId(state); - NBTTagCompound[] keys = new NBTTagCompound[OVERRIDE_OBJECTS.size()]; - OVERRIDE_OBJECTS.keySet().toArray(keys); - for (NBTTagCompound key : keys) - { - int id = key.getInteger("stateid"); - Block block = StringParser.getBlock(key.getString("block")); - if (id == 0 ? block == state.getBlock() : id == stateid) - { - NBTTagCompound toCheckForCompound = key.getCompoundTag("nbttag"); - Set kSetToCheck = toCheckForCompound.getKeySet(); - Set kSetTile = tag.getKeySet(); - - boolean flag = true; - if (kSetTile.containsAll(kSetToCheck)) - { - for (String skey : kSetToCheck) - { - if (!NBTUtil.areNBTEquals(tag.getTag(skey), toCheckForCompound.getTag(skey), true)) - flag = false; - } - if (flag) - { - Object override = OVERRIDE_OBJECTS.get(key); - return override; - } - } - } - } - return null; - } - -} diff --git a/src/main/java/tschipp/carryon/common/handler/PickupHandler.java b/src/main/java/tschipp/carryon/common/handler/PickupHandler.java deleted file mode 100644 index 31502f3..0000000 --- a/src/main/java/tschipp/carryon/common/handler/PickupHandler.java +++ /dev/null @@ -1,222 +0,0 @@ -package tschipp.carryon.common.handler; - -import java.util.UUID; - -import javax.annotation.Nullable; - -import net.darkhax.gamestages.capabilities.PlayerDataHandler; -import net.darkhax.gamestages.capabilities.PlayerDataHandler.IStageData; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.passive.EntityTameable; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.event.world.BlockEvent; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.item.ItemTile; -import tschipp.carryon.common.scripting.CarryOnOverride; -import tschipp.carryon.common.scripting.ScriptChecker; - -public class PickupHandler -{ - - public static boolean canPlayerPickUpBlock(EntityPlayer player, @Nullable TileEntity tile, World world, BlockPos pos) - { - IBlockState state = world.getBlockState(pos); - Block block = state.getBlock(); - - player.closeScreen(); - - NBTTagCompound tag = new NBTTagCompound(); - if (tile != null) - tile.writeToNBT(tag); - - CarryOnOverride override = ScriptChecker.inspectBlock(world.getBlockState(pos), world, pos, tag); - if (override != null) - { - return (ScriptChecker.fulfillsConditions(override, player)) && handleProtections((EntityPlayerMP) player, world, pos, state); - } - else - { - if (CarryOnConfig.settings.useWhitelistBlocks) - { - if (!ListHandler.isAllowed(world.getBlockState(pos).getBlock())) - { - return false; - } - CarryOn.LOGGER.info("Block is allowed"); - } - else - { - if (ListHandler.isForbidden(world.getBlockState(pos).getBlock())) - { - return false; - } - } - - if ((block.getBlockHardness(state, world, pos) != -1 || player.isCreative())) - { - double distance = pos.distanceSqToCenter(player.posX, player.posY + 0.5, player.posZ); - - if (distance < Math.pow(CarryOnConfig.settings.maxDistance, 2)) - { - - if (!ItemTile.isLocked(pos, world)) - { - - if (CustomPickupOverrideHandler.hasSpecialPickupConditions(state)) - { - IStageData stageData = PlayerDataHandler.getStageData(player); - String condition = CustomPickupOverrideHandler.getPickupCondition(state); - if (stageData.hasUnlockedStage(condition)) - return true && handleProtections((EntityPlayerMP) player, world, pos, state); - - } - else if (CarryOnConfig.settings.pickupAllBlocks ? true : tile != null) - { - - return true && handleProtections((EntityPlayerMP) player, world, pos, state); - } - - } - } - } - } - - return false; - } - - public static boolean canPlayerPickUpEntity(EntityPlayer player, Entity toPickUp) - { - BlockPos pos = toPickUp.getPosition(); - - if (toPickUp instanceof EntityPlayer) - return false; - - CarryOnOverride override = ScriptChecker.inspectEntity(toPickUp); - if (override != null) - { - return (ScriptChecker.fulfillsConditions(override, player)) && handleProtections((EntityPlayerMP) player, toPickUp); - } - else - { - - // check for allow babies to be picked up - if (toPickUp instanceof EntityAgeable && CarryOnConfig.settings.allowBabies) - { - EntityAgeable living = (EntityAgeable) toPickUp; - if (living.getGrowingAge() < 0 || living.isChild()) - { - - double distance = pos.distanceSqToCenter(player.posX, player.posY + 0.5, player.posZ); - if (distance < Math.pow(CarryOnConfig.settings.maxDistance, 2)) - { - if (toPickUp instanceof EntityTameable) - { - EntityTameable tame = (EntityTameable) toPickUp; - if (tame.getOwnerId() != null && tame.getOwnerId() != player.getUUID(player.getGameProfile())) - return false; - } - } - - if (CustomPickupOverrideHandler.hasSpecialPickupConditions(toPickUp)) - { - IStageData stageData = PlayerDataHandler.getStageData(player); - String condition = CustomPickupOverrideHandler.getPickupCondition(toPickUp); - if (stageData.hasUnlockedStage(condition)) - return true && handleProtections((EntityPlayerMP) player, toPickUp); - } - else - return true && handleProtections((EntityPlayerMP) player, toPickUp); - } - } - - if (CarryOnConfig.settings.useWhitelistEntities) - { - if (!ListHandler.isAllowed(toPickUp)) - { - return false; - } - } - else - { - if (ListHandler.isForbidden(toPickUp)) - { - return false; - } - } - - if ((CarryOnConfig.settings.pickupHostileMobs ? true : !toPickUp.isCreatureType(EnumCreatureType.MONSTER, false) || player.isCreative())) - { - if ((CarryOnConfig.settings.pickupHostileMobs ? true : !toPickUp.isCreatureType(EnumCreatureType.MONSTER, false) || player.isCreative())) - { - if ((toPickUp.height <= CarryOnConfig.settings.maxEntityHeight && toPickUp.width <= CarryOnConfig.settings.maxEntityWidth || player.isCreative())) - { - double distance = pos.distanceSqToCenter(player.posX, player.posY + 0.5, player.posZ); - if (distance < Math.pow(CarryOnConfig.settings.maxDistance, 2)) - { - if (toPickUp instanceof EntityTameable) - { - EntityTameable tame = (EntityTameable) toPickUp; - UUID owner = tame.getOwnerId(); - UUID playerID = player.getUUID(player.getGameProfile()); - if (owner != null && !owner.equals(playerID)) - return false; - } - - if (CustomPickupOverrideHandler.hasSpecialPickupConditions(toPickUp)) - { - IStageData stageData = PlayerDataHandler.getStageData(player); - String condition = CustomPickupOverrideHandler.getPickupCondition(toPickUp); - if (stageData.hasUnlockedStage(condition)) - return true && handleProtections((EntityPlayerMP) player, toPickUp); - } - else - return true && handleProtections((EntityPlayerMP) player, toPickUp); - } - } - } - - } - } - - return false; - } - - private static boolean handleProtections(EntityPlayerMP player, World world, BlockPos pos, IBlockState state) - { - boolean breakable = true; - - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, state, player); - MinecraftForge.EVENT_BUS.post(event); - - if(event.isCanceled()) - breakable = false; - - return breakable; - } - - private static boolean handleProtections(EntityPlayerMP player, Entity entity) - { - boolean canPickup = true; - - AttackEntityEvent event = new AttackEntityEvent(player, entity); - MinecraftForge.EVENT_BUS.post(event); - - if(event.isCanceled()) - canPickup = false; - - return canPickup; - } - -} diff --git a/src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java b/src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java deleted file mode 100644 index 35fa825..0000000 --- a/src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package tschipp.carryon.common.handler; - -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.item.Item; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.CapabilityManager; -import tschipp.carryon.CarryOn; -import tschipp.carryon.client.event.RenderEntityEvents; -import tschipp.carryon.client.event.RenderEvents; -import tschipp.carryon.common.capabilities.IPosition; -import tschipp.carryon.common.capabilities.PositionStorage; -import tschipp.carryon.common.capabilities.TEPosition; -import tschipp.carryon.common.capabilities.event.PositionClientEvents; -import tschipp.carryon.common.capabilities.event.PositionCommonEvents; -import tschipp.carryon.common.event.ItemEntityEvents; -import tschipp.carryon.common.event.ItemEvents; -import tschipp.carryon.common.item.ItemEntity; -import tschipp.carryon.common.item.ItemTile; - -public class RegistrationHandler -{ - public static Item itemTile; - public static Item itemEntity; - - public static void regItems() - { - itemTile = new ItemTile(); - itemEntity = new ItemEntity(); - } - - public static void regItemRenders() - { - ModelLoader.setCustomModelResourceLocation(itemTile, 0, new ModelResourceLocation(CarryOn.MODID + ":" + "tile", "inventory")); - ModelLoader.setCustomModelResourceLocation(itemEntity, 0, new ModelResourceLocation(CarryOn.MODID + ":" + "tile", "inventory")); - } - - public static void regCommonEvents() - { - MinecraftForge.EVENT_BUS.register(new ItemEvents()); - MinecraftForge.EVENT_BUS.register(new ItemEntityEvents()); - MinecraftForge.EVENT_BUS.register(new PositionCommonEvents()); - } - - public static void regClientEvents() - { - MinecraftForge.EVENT_BUS.register(new RenderEvents()); - MinecraftForge.EVENT_BUS.register(new RenderEntityEvents()); - MinecraftForge.EVENT_BUS.register(new PositionClientEvents()); - } - - public static void regOverrideList() - { - ModelOverridesHandler.initOverrides(); - CustomPickupOverrideHandler.initPickupOverrides(); - ListHandler.initForbiddenTiles(); - } - - public static void regCaps() - { - CapabilityManager.INSTANCE.register(IPosition.class, new PositionStorage(), TEPosition::new); - } - -} diff --git a/src/main/java/tschipp/carryon/common/helper/InvalidConfigException.java b/src/main/java/tschipp/carryon/common/helper/InvalidConfigException.java deleted file mode 100644 index fdabc9c..0000000 --- a/src/main/java/tschipp/carryon/common/helper/InvalidConfigException.java +++ /dev/null @@ -1,31 +0,0 @@ -package tschipp.carryon.common.helper; - -import tschipp.carryon.CarryOn; - -public class InvalidConfigException extends Exception -{ - - public InvalidConfigException(String cause) - { - super(cause); - } - - public void printException() - { - CarryOn.LOGGER.error(this.getMessage()); - for (int i = 0; i < this.getStackTrace().length; i++) - { - StackTraceElement element = this.getStackTrace()[i]; - CarryOn.LOGGER.error(element.toString()); - - if(i >= 10) - { - CarryOn.LOGGER.error((this.getStackTrace().length - 10) + " more..."); - break; - } - } - - CarryOn.LOGGER.info(""); - } - -} diff --git a/src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java b/src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java deleted file mode 100644 index 6f7f376..0000000 --- a/src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java +++ /dev/null @@ -1,76 +0,0 @@ -package tschipp.carryon.common.helper; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -import net.minecraftforge.fml.relauncher.ReflectionHelper; - -/** - * Utility methods for reflection. - * - * @author Choonster - */ -public class ReflectionUtil -{ - /** - * Get a {@link MethodHandle} for a method. - * - * @param clazz - * The class - * @param methodNames - * The possible names of the method - * @param methodTypes - * The argument types of the method - * @param - * The class - * @return The MethodHandle - */ - public static MethodHandle findMethod(Class clazz, String[] methodNames, Class... methodTypes) { - final Method method = ReflectionHelper.findMethod(clazz, null, methodNames, methodTypes); - try { - return MethodHandles.lookup().unreflect(method); - } catch (IllegalAccessException e) { - throw new ReflectionHelper.UnableToFindMethodException(methodNames, e); - } - } - - /** - * Get a {@link MethodHandle} for a field's getter. - * - * @param clazz - * The class - * @param fieldNames - * The possible names of the field - * @return The MethodHandle - */ - public static MethodHandle findFieldGetter(Class clazz, String... fieldNames) { - final Field field = ReflectionHelper.findField(clazz, fieldNames); - - try { - return MethodHandles.lookup().unreflectGetter(field); - } catch (IllegalAccessException e) { - throw new ReflectionHelper.UnableToAccessFieldException(fieldNames, e); - } - } - - /** - * Get a {@link MethodHandle} for a field's setter. - * - * @param clazz - * The class - * @param fieldNames - * The possible names of the field - * @return The MethodHandle - */ - public static MethodHandle findFieldSetter(Class clazz, String... fieldNames) { - final Field field = ReflectionHelper.findField(clazz, fieldNames); - - try { - return MethodHandles.lookup().unreflectSetter(field); - } catch (IllegalAccessException e) { - throw new ReflectionHelper.UnableToAccessFieldException(fieldNames, e); - } - } -} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java b/src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java deleted file mode 100644 index 0163a55..0000000 --- a/src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java +++ /dev/null @@ -1,372 +0,0 @@ -package tschipp.carryon.common.helper; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.scoreboard.Score; -import net.minecraft.scoreboard.ScoreObjective; -import net.minecraft.scoreboard.Scoreboard; -import net.minecraft.stats.Achievement; -import net.minecraft.stats.AchievementList; -import net.minecraft.util.math.BlockPos; - -public class ScriptParseHelper -{ - - public static boolean matches(double number, String cond) - { - if (cond == null) - return true; - - try - { - if (cond.contains("<=")) - { - return number <= Double.parseDouble(cond.replace("<=", "")); - } - if (cond.contains(">=")) - { - return number >= Double.parseDouble(cond.replace(">=", "")); - } - if (cond.contains("<")) - { - return number < Double.parseDouble(cond.replace("<", "")); - } - if (cond.contains(">")) - { - return number > Double.parseDouble(cond.replace(">", "")); - } - if (cond.contains("=")) - { - return number == Double.parseDouble(cond.replace("=", "")); - } - else - return number == Double.parseDouble(cond); - - } - catch (Exception e) - { - new InvalidConfigException(e.getMessage()).printException(); - } - - return false; - } - - public static boolean matches(Block block, String cond) - { - if (cond == null) - return true; - - Block toCheck = StringParser.getBlock(cond); - if (toCheck != null) - return block == toCheck; - - return false; - } - - public static boolean matches(NBTTagCompound toCheck, NBTTagCompound toMatch) - { - if (toCheck == null || toMatch == null) - return true; - - boolean matching = true; - for (String key : toMatch.getKeySet()) - { - NBTBase tag = toMatch.getTag(key); - key = key.replace("\"", ""); - NBTBase tagToCheck = toCheck.getTag(key); - if (!tag.equals(tagToCheck)) - matching = false; - } - - return matching; - } - - public static double[] getXYZArray(String s) - { - double[] d = new double[3]; - d[0] = getValueFromString(s, "x"); - d[1] = getValueFromString(s, "y"); - d[2] = getValueFromString(s, "z"); - - return d; - } - - - public static double[] getScale(String s) - { - double[] d = new double[3]; - d[0] = getScaleValueFromString(s, "x"); - d[1] = getScaleValueFromString(s, "y"); - d[2] = getScaleValueFromString(s, "z"); - - return d; - } - - public static double getScaleValueFromString(String toGetFrom, String key) - { - if(toGetFrom == null) - return 1; - - String[] s = toGetFrom.split(","); - for (String string : s) - { - if (string.contains(key) && string.contains("=")) - { - double numb = 1; - string = string.replace(key + "=", ""); - - try - { - numb = Double.parseDouble(string); - } - catch (Exception e) - { - } - - return numb; - } - } - - return 1; - } - - public static Achievement getAchievementFromString(String s) - { - if (s == null) - return null; - - for (Achievement a : AchievementList.ACHIEVEMENTS) - { - if (a.statId.equals(s)) - return a; - } - - return null; - } - - public static boolean matchesScore(EntityPlayer player, String cond) - { - if (cond == null) - return true; - - Scoreboard score = player.getWorldScoreboard(); - String numb; - String scorename; - int iE = cond.indexOf("="); - int iG = cond.indexOf(">"); - int iL = cond.indexOf("<"); - - if (iG == -1 ? true : iE < iG && iL == -1 ? true : iE < iL && iE != -1) - numb = cond.substring(iE); - else if (iE == -1 ? true : iG < iE && iL == -1 ? true : iG < iL && iG != -1) - numb = cond.substring(iG); - else - numb = cond.substring(iL); - - scorename = cond.replace(numb, ""); - Map o = score.getObjectivesForEntity(player.getGameProfile().getName()); - if (o != null) - { - Score sc = o.get(score.getObjective(scorename)); - if (sc != null) - { - int points = sc.getScorePoints(); - - return matches(points, numb); - } - } - - return false; - } - - public static boolean matches(BlockPos pos, String cond) - { - if (cond == null) - return true; - - BlockPos blockpos = new BlockPos(getValueFromString(cond, "x"), getValueFromString(cond, "y"), getValueFromString(cond, "z")); - BlockPos expand = new BlockPos(getValueFromString(cond, "dx"), getValueFromString(cond, "dy"), getValueFromString(cond, "dz")); - BlockPos expanded = blockpos.add(expand); - - boolean x = (pos.getX() >= blockpos.getX() && pos.getX() <= expanded.getX()) || blockpos.getX() == 0; - boolean y = (pos.getY() >= blockpos.getY() && pos.getY() <= expanded.getY()) || blockpos.getY() == 0; - boolean z = (pos.getZ() >= blockpos.getZ() && pos.getZ() <= expanded.getZ()) || blockpos.getZ() == 0; - - return x && y && z; - } - - public static double getValueFromString(String toGetFrom, String key) - { - if(toGetFrom == null) - return 0; - - String[] s = toGetFrom.split(","); - for (String string : s) - { - if (string.contains(key) && string.contains("=")) - { - double numb = 0; - string = string.replace(key + "=", ""); - - try - { - numb = Double.parseDouble(string); - } - catch (Exception e) - { - } - - return numb; - } - } - - return 0; - } - - public static boolean hasEffects(EntityPlayer player, String cond) - { - if(cond == null) - return true; - - Collection effects = player.getActivePotionEffects(); - String[] potions = cond.split(","); - - List names = new ArrayList(); - List levels = new ArrayList(); - - for(int i = 0; i < potions.length; i++) - { - String pot = potions[i]; - if(pot.contains("#")) - { - String level = pot.substring(pot.indexOf("#")); - String name = pot.substring(0, pot.indexOf("#")); - level = level.replace("#", ""); - int lev = 0; - try - { - lev = Integer.parseInt(level); - } - catch(Exception e) - {} - - levels.add(lev); - names.add(name); - } - else - { - levels.add(0); - names.add(pot); - } - } - - int matches = 0; - for(PotionEffect effect : effects) - { - int amp = effect.getAmplifier(); - String name = effect.getPotion().getRegistryName().toString(); - - if(names.contains(name)) - { - int idx = names.indexOf(name); - int lev = levels.get(idx); - - if(lev == amp) - matches++; - } - } - - return matches == potions.length; - } - - public static boolean matches(Material material, String cond) - { - if (cond == null) - return true; - - switch (cond) - { - case "air": - return material == Material.AIR; - case "anvil": - return material == Material.ANVIL; - case "barrier": - return material == Material.BARRIER; - case "cactus": - return material == Material.CACTUS; - case "cake": - return material == Material.CAKE; - case "carpet": - return material == Material.CARPET; - case "circuits": - return material == Material.CIRCUITS; - case "clay": - return material == Material.CLAY; - case "cloth": - return material == Material.CLOTH; - case "coral": - return material == Material.CORAL; - case "dragon_egg": - return material == Material.DRAGON_EGG; - case "fire": - return material == Material.FIRE; - case "glass": - return material == Material.GLASS; - case "gourd": - return material == Material.GOURD; - case "grass": - return material == Material.GRASS; - case "ground": - return material == Material.GROUND; - case "ice": - return material == Material.ICE; - case "iron": - return material == Material.IRON; - case "lava": - return material == Material.LAVA; - case "leaves": - return material == Material.LEAVES; - case "packed_ice": - return material == Material.PACKED_ICE; - case "piston": - return material == Material.PISTON; - case "plants": - return material == Material.PLANTS; - case "portal": - return material == Material.PORTAL; - case "redstone_light": - return material == Material.REDSTONE_LIGHT; - case "rock": - return material == Material.ROCK; - case "sand": - return material == Material.SAND; - case "snow": - return material == Material.SNOW; - case "sponge": - return material == Material.SPONGE; - case "structure_void": - return material == Material.STRUCTURE_VOID; - case "tnt": - return material == Material.TNT; - case "vine": - return material == Material.VINE; - case "water": - return material == Material.WATER; - case "web": - return material == Material.WEB; - case "wood": - return material == Material.WOOD; - } - - return false; - } -} diff --git a/src/main/java/tschipp/carryon/common/helper/StringParser.java b/src/main/java/tschipp/carryon/common/helper/StringParser.java deleted file mode 100644 index edd9184..0000000 --- a/src/main/java/tschipp/carryon/common/helper/StringParser.java +++ /dev/null @@ -1,158 +0,0 @@ -package tschipp.carryon.common.helper; - -import javax.annotation.Nullable; - -import org.apache.logging.log4j.Level; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.JsonToNBT; -import net.minecraft.nbt.NBTException; -import net.minecraft.nbt.NBTTagCompound; -import tschipp.carryon.CarryOn; - -public class StringParser -{ - - @Nullable - public static Block getBlock(String string) - { - if(string == null) - return null; - - NBTTagCompound tag = getTagCompound(string); - if (tag != null) - string = string.replace(tag.toString(), ""); - - if (string.contains(";")) - string = string.replace(string.substring(string.indexOf(";")), ""); - - Block block = Block.getBlockFromName(string); - if (block == null) - new InvalidConfigException("Block Parsing Error. Invalid Name: " + string).printException(); - - return block; - } - - public static int getMeta(String string) - { - if(string == null) - return 0; - - NBTTagCompound tag = getTagCompound(string); - if (tag != null) - string = string.replace(tag.toString(), ""); - - if (string.contains(";")) - { - int meta = 0; - try - { - meta = Integer.parseInt(string.substring(string.indexOf(";")).replace(";", "")); - } - catch (Exception e) - { - new InvalidConfigException("Meta Parsing Error at: " + string + " : " + e.getMessage()).printException(); - } - - return meta; - } - return 0; - } - - @Nullable - public static IBlockState getBlockState(String string) - { - if(string == null) - return null; - - NBTTagCompound tag = getTagCompound(string); - if (tag != null) - string = string.replace(tag.toString(), ""); - - int meta = getMeta(string); - if (meta == 0) - { - Block block = getBlock(string); - if(block != null) - return block.getDefaultState(); - } - try - { - return getBlock(string).getStateFromMeta(meta); - } - catch (Exception e) - { - new InvalidConfigException("Blockstate parsing Exception at: " + string + " : " + e.getMessage()).printException(); - return null; - } - } - - @Nullable - public static Item getItem(String string) - { - if(string == null) - return null; - - NBTTagCompound tag = getTagCompound(string); - if (tag != null) - string = string.replace(tag.toString(), ""); - - if (string.contains(";")) - string = string.replace(string.substring(string.indexOf(";")), ""); - - return Item.getByNameOrId(string); - } - - public static ItemStack getItemStack(String string) - { - if(string == null) - return null; - - Item item = getItem(string); - - if(item == null) - return ItemStack.EMPTY; - - ItemStack stack = new ItemStack(item, 1, getMeta(string)); - NBTTagCompound tag = getTagCompound(string); - if (tag != null) - stack.setTagCompound(tag); - - return stack; - } - - @Nullable - public static NBTTagCompound getTagCompound(String string) - { - NBTTagCompound tag = null; - if(string == null) - return null; - - if (string.contains("{")) - { - if (!string.contains("}")) - new InvalidConfigException("Missing } at : " + string).printException(); - - String nbt = string.substring(string.indexOf("{")); - string = string.replace(nbt, ""); - try - { - tag = JsonToNBT.getTagFromJson(nbt); - } - catch (NBTException e) - { - new InvalidConfigException("Error while parsing NBT: " + e.getMessage()).printException(); - return null; - } - - } - else if (string.contains("}")) - new InvalidConfigException("Missing { at : " + string).printException(); - - return tag; - } - -} diff --git a/src/main/java/tschipp/carryon/common/item/ItemEntity.java b/src/main/java/tschipp/carryon/common/item/ItemEntity.java deleted file mode 100644 index 392c879..0000000 --- a/src/main/java/tschipp/carryon/common/item/ItemEntity.java +++ /dev/null @@ -1,221 +0,0 @@ -package tschipp.carryon.common.item; - -import javax.annotation.Nonnull; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.translation.I18n; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraftforge.fml.common.registry.GameRegistry; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.network.client.CarrySlotPacket; - -public class ItemEntity extends Item -{ - - public static final String ENTITY_DATA_KEY = "entityData"; - - public ItemEntity() - { - this.setUnlocalizedName("entity_item"); - this.setRegistryName(CarryOn.MODID, "entity_item"); - GameRegistry.register(this); - this.setMaxStackSize(1); - } - - @Override - public String getItemStackDisplayName(ItemStack stack) - { - if (hasEntityData(stack)) - { - return I18n.translateToLocal("entity."+EntityList.getTranslationName(new ResourceLocation(getEntityName(stack))) + ".name"); - } - - return ""; - } - - public static boolean hasEntityData(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - return tag.hasKey(ENTITY_DATA_KEY) && tag.hasKey("entity"); - } - return false; - } - - public static boolean storeEntityData(@Nonnull Entity entity, World world, ItemStack stack) - { - if (entity == null) - return false; - - if (stack.isEmpty()) - return false; - - NBTTagCompound entityData = new NBTTagCompound(); - entityData = entity.writeToNBT(entityData); - - String name = EntityList.getKey(entity).toString(); - - NBTTagCompound tag = stack.hasTagCompound() ? stack.getTagCompound() : new NBTTagCompound(); - if (tag.hasKey(ENTITY_DATA_KEY)) - return false; - - tag.setTag(ENTITY_DATA_KEY, entityData); - tag.setString("entity", name); - stack.setTagCompound(tag); - return true; - } - - @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { - ItemStack stack = player.getHeldItem(hand); - Block block = world.getBlockState(pos).getBlock(); - - if (hasEntityData(stack)) - { - BlockPos finalPos = pos; - - if (!block.isReplaceable(world, pos)) - { - finalPos = pos.offset(facing); - } - - Entity entity = getEntity(stack, world); - if (entity != null) - { - if (!world.isRemote) - { - entity.setPositionAndRotation(finalPos.getX() + 0.5, finalPos.getY(), finalPos.getZ() + 0.5, 180 + player.rotationYawHead, 0.0f); - world.spawnEntity(entity); - if (entity instanceof EntityLiving) - { - ((EntityLiving) entity).playLivingSound(); - } - clearEntityData(stack); - player.setHeldItem(hand, ItemStack.EMPTY); - CarryOn.network.sendToAllAround(new CarrySlotPacket(9, player.getEntityId()), new TargetPoint(world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - } - player.getEntityData().removeTag("overrideKey"); - return EnumActionResult.SUCCESS; - } - } - - return EnumActionResult.FAIL; - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) - { - if (hasEntityData(stack)) - { - if(getEntity(stack, world) == null) - stack = ItemStack.EMPTY; - - if (entity instanceof EntityLivingBase) - { - if(entity instanceof EntityPlayer && CarryOnConfig.settings.slownessInCreative ? false : ((EntityPlayer)entity).isCreative()) - return; - - ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 1, potionLevel(stack, world), false, false)); - } - - } - else - { - stack = ItemStack.EMPTY; - } - } - - public static void clearEntityData(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - tag.removeTag(ENTITY_DATA_KEY); - tag.removeTag("entity"); - } - } - - public static NBTTagCompound getEntityData(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - return tag.getCompoundTag(ENTITY_DATA_KEY); - } - return null; - } - - public static Entity getEntity(ItemStack stack, World world) - { - if (world == null) - return null; - - String name = getEntityName(stack); - - NBTTagCompound e = getEntityData(stack); - Entity entity = EntityList.createEntityByIDFromName(new ResourceLocation(name), world); - if (entity != null) - entity.readFromNBT(e); - - return entity; - } - - public static String getEntityName(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - return tag.getString("entity"); - } - return null; - } - - public static String getCustomName(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - if (tag.hasKey("CustomName") && !tag.getString("CustomName").isEmpty()) { - return tag.toString(); - } else { - return tag.toString(); - } - } - return null; - } - - private int potionLevel(ItemStack stack, World world) - { - Entity e = getEntity(stack, world); - if(e == null) - return 1; - - int i = (int)(e.height * e.width); - if (i > 4) - i = 4; - - if (!CarryOnConfig.settings.heavyEntities) - i = 1; - - return (int) (i * CarryOnConfig.settings.entitySlownessMultiplier); - } -} diff --git a/src/main/java/tschipp/carryon/common/item/ItemTile.java b/src/main/java/tschipp/carryon/common/item/ItemTile.java deleted file mode 100644 index 9b26c0f..0000000 --- a/src/main/java/tschipp/carryon/common/item/ItemTile.java +++ /dev/null @@ -1,333 +0,0 @@ -package tschipp.carryon.common.item; - -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -import javax.annotation.Nullable; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockStairs; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.properties.PropertyDirection; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.util.text.event.ClickEvent; -import net.minecraft.util.text.event.ClickEvent.Action; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraftforge.fml.common.registry.GameRegistry; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.config.CarryOnConfig; -import tschipp.carryon.common.handler.CustomPickupOverrideHandler; -import tschipp.carryon.common.handler.ModelOverridesHandler; -import tschipp.carryon.network.client.CarrySlotPacket; - -public class ItemTile extends Item -{ - - public static final String TILE_DATA_KEY = "tileData"; - - public ItemTile() - { - this.setUnlocalizedName("tile_item"); - this.setRegistryName(CarryOn.MODID, "tile_item"); - GameRegistry.register(this); - this.setMaxStackSize(1); - } - - @Override - public String getItemStackDisplayName(ItemStack stack) - { - if (hasTileData(stack)) - { - IBlockState state = getBlockState(stack); - NBTTagCompound nbt = getTileData(stack); - - if (ModelOverridesHandler.hasCustomOverrideModel(state, nbt)) - { - Object override = ModelOverridesHandler.getOverrideObject(state, nbt); - if (override instanceof ItemStack) - return ((ItemStack) override).getDisplayName(); - else - { - IBlockState ostate = (IBlockState) override; - ItemStack itemstack = new ItemStack(ostate.getBlock().getItemDropped(ostate, this.itemRand, 0), 1, state.getBlock().damageDropped(ostate)); - return itemstack.getDisplayName(); - } - } - - return getItemStack(stack).getDisplayName(); - } - - return ""; - } - - @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) - { - Block block = world.getBlockState(pos).getBlock(); - ItemStack stack = player.getHeldItem(hand); - if (hasTileData(stack)) - { - try - { - Vec3d vec = player.getLookVec(); - EnumFacing facing2 = EnumFacing.getFacingFromVector((float) vec.xCoord, 0f, (float) vec.zCoord); - BlockPos pos2 = pos; - Block containedblock = getBlock(stack); - int meta = getMeta(stack); - IBlockState containedstate = getBlockState(stack); - if (!world.getBlockState(pos2).getBlock().isReplaceable(world, pos2)) - { - pos2 = pos.offset(facing); - } - - if (world.getBlockState(pos2).getBlock().isReplaceable(world, pos2) && containedblock != null) - { - boolean canPlace = containedblock.canPlaceBlockAt(world, pos2); - - if (canPlace) - { - if (player.canPlayerEdit(pos, facing, stack) && world.mayPlace(containedblock, pos2, false, facing, (Entity) null)) - { - boolean set = false; - - Iterator> iterator = containedblock.getDefaultState().getPropertyKeys().iterator(); - while (iterator.hasNext()) - { - IProperty prop = iterator.next(); - Object[] allowedValues = prop.getAllowedValues().toArray(); - - if (prop instanceof PropertyDirection && this.equal(allowedValues, EnumFacing.HORIZONTALS)) - { - world.setBlockState(pos2, containedstate.withProperty(prop, containedblock instanceof BlockStairs ? facing2 : facing2.getOpposite())); - set = true; - } - else if (prop instanceof PropertyDirection && this.equal(allowedValues, EnumFacing.VALUES)) - { - facing2 = EnumFacing.getFacingFromVector((float) vec.xCoord, (float) vec.yCoord, (float) vec.zCoord); - world.setBlockState(pos2, containedstate.withProperty(prop, facing2.getOpposite())); - set = true; - } - - } - - if (!set) - world.setBlockState(pos2, containedstate); - - TileEntity tile = world.getTileEntity(pos2); - if (tile != null) - { - tile.readFromNBT(getTileData(stack)); - tile.setPos(pos2); - } - clearTileData(stack); - player.playSound(containedblock.getSoundType().getPlaceSound(), 1.0f, 0.5f); - player.setHeldItem(hand, ItemStack.EMPTY); - player.getEntityData().removeTag("overrideKey"); - CarryOn.network.sendToAllAround(new CarrySlotPacket(9, player.getEntityId()), new TargetPoint(world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - return EnumActionResult.SUCCESS; - } - - } - } - } - catch (Exception e) - { - e.printStackTrace(); - - if (world != null && world.isRemote) - { - CarryOn.LOGGER.info("Block: " + ItemTile.getBlock(stack)); - CarryOn.LOGGER.info("BlockState: " + ItemTile.getBlockState(stack)); - CarryOn.LOGGER.info("Meta: " + ItemTile.getMeta(stack)); - CarryOn.LOGGER.info("ItemStack: " + ItemTile.getItemStack(stack)); - - if (ModelOverridesHandler.hasCustomOverrideModel(ItemTile.getBlockState(stack), ItemTile.getTileData(stack))) - CarryOn.LOGGER.info("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemTile.getBlockState(stack), ItemTile.getTileData(stack))); - - if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemTile.getBlockState(stack))) - CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemTile.getBlockState(stack))); - - player.sendMessage(new TextComponentString(TextFormatting.RED + "Error detected. Cannot place block. Execute \"/carryon clear\" to remove the item")); - TextComponentString s = new TextComponentString(TextFormatting.GOLD + "here"); - s.getStyle().setClickEvent(new ClickEvent(Action.OPEN_URL, "https://github.com/Tschipp/CarryOn/issues")); - player.sendMessage(new TextComponentString(TextFormatting.RED + "Please report this error ").appendSibling(s)); - - } - } - - } - - return EnumActionResult.FAIL; - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) - { - if (hasTileData(stack)) - { - if (entity instanceof EntityLivingBase) - { - if (entity instanceof EntityPlayer && CarryOnConfig.settings.slownessInCreative ? false : ((EntityPlayer) entity).isCreative()) - return; - - ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 1, potionLevel(stack), false, false)); - } - } - else - { - stack = ItemStack.EMPTY; - } - } - - public static boolean hasTileData(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - return tag.hasKey(TILE_DATA_KEY) && tag.hasKey("block") && tag.hasKey("meta") && tag.hasKey("stateid"); - } - return false; - } - - public static boolean storeTileData(@Nullable TileEntity tile, World world, BlockPos pos, IBlockState state, ItemStack stack) - { - if (stack.isEmpty()) - return false; - - NBTTagCompound chest = new NBTTagCompound(); - if (tile != null) - chest = tile.writeToNBT(chest); - - NBTTagCompound tag = stack.hasTagCompound() ? stack.getTagCompound() : new NBTTagCompound(); - if (tag.hasKey(TILE_DATA_KEY)) - return false; - - tag.setTag(TILE_DATA_KEY, chest); - - ItemStack drop = new ItemStack(state.getBlock().getItemDropped(state, itemRand, 0), 1, state.getBlock().damageDropped(state)); - - tag.setString("block", state.getBlock().getRegistryName().toString()); - Item item = Item.getItemFromBlock(state.getBlock()); - tag.setInteger("meta", drop.getItemDamage()); - tag.setInteger("stateid", Block.getStateId(state)); - stack.setTagCompound(tag); - return true; - } - - public static void clearTileData(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - tag.removeTag(TILE_DATA_KEY); - tag.removeTag("block"); - tag.removeTag("meta"); - tag.removeTag("stateid"); - } - } - - public static NBTTagCompound getTileData(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - return tag.getCompoundTag(TILE_DATA_KEY); - } - return null; - } - - public static Block getBlock(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - int id = tag.getInteger("stateid"); - return Block.getStateById(id).getBlock(); - } - return Blocks.AIR; - } - - public static int getMeta(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - int meta = tag.getInteger("meta"); - return meta; - } - return 0; - } - - public static ItemStack getItemStack(ItemStack stack) - { - return new ItemStack(getBlock(stack), 1, getMeta(stack)); - } - - public static IBlockState getBlockState(ItemStack stack) - { - if (stack.hasTagCompound()) - { - NBTTagCompound tag = stack.getTagCompound(); - int id = tag.getInteger("stateid"); - return Block.getStateById(id); - } - return Blocks.AIR.getDefaultState(); - } - - public static boolean isLocked(BlockPos pos, World world) - { - TileEntity te = world.getTileEntity(pos); - if (te != null) - { - NBTTagCompound tag = new NBTTagCompound(); - te.writeToNBT(tag); - return tag.hasKey("Lock") ? !tag.getString("Lock").equals("") : false; - } - - return false; - } - - private boolean equal(Object[] a, Object[] b) - { - if (a.length != b.length) - return false; - - List lA = Arrays.asList(a); - List lB = Arrays.asList(b); - - return lA.containsAll(lB); - } - - private int potionLevel(ItemStack stack) - { - String nbt = getTileData(stack).toString(); - int i = nbt.length() / 500; - - if (i > 4) - i = 4; - - if (!CarryOnConfig.settings.heavyTiles) - i = 1; - - return (int) (i * CarryOnConfig.settings.blockSlownessMultiplier); - } -} diff --git a/src/main/java/tschipp/carryon/interfaces/ICarryOnData.java b/src/main/java/tschipp/carryon/interfaces/ICarryOnData.java new file mode 100644 index 0000000..5e28dbb --- /dev/null +++ b/src/main/java/tschipp/carryon/interfaces/ICarryOnData.java @@ -0,0 +1,11 @@ +package tschipp.carryon.interfaces; + +import net.minecraft.nbt.CompoundTag; + +public interface ICarryOnData { + + public CompoundTag getCarryOnData(); + + public void setCarryOnData(CompoundTag tag); + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/items/ItemEntity.java b/src/main/java/tschipp/carryon/items/ItemEntity.java new file mode 100644 index 0000000..1c9177e --- /dev/null +++ b/src/main/java/tschipp/carryon/items/ItemEntity.java @@ -0,0 +1,213 @@ +package tschipp.carryon.items; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.text.StringTextComponent; +import net.minecraft.text.TextComponent; +import net.minecraft.text.TranslatableTextComponent; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class ItemEntity extends Item { + + public static final String ENTITY_DATA_KEY = "entityData"; + + public ItemEntity() { + super(new Item.Settings().stackSize(1)); + } + + @Override + public TextComponent getTranslatedNameTrimmed(ItemStack stack) { + if (hasEntityData(stack)) { + return new TranslatableTextComponent(getEntityType(stack).getTranslationKey()); + } + + return new StringTextComponent(""); + } + + public static boolean hasEntityData(ItemStack stack) { + if (stack.hasTag()) { + CompoundTag tag = stack.getTag(); + return tag.containsKey(ENTITY_DATA_KEY) && tag.containsKey("entity"); + } + return false; + } + + public static boolean storeEntityData(Entity entity, World world, ItemStack stack) { + if (entity == null) + return false; + + if (stack.isEmpty()) + return false; + + CompoundTag entityData = new CompoundTag(); + entityData = entity.toTag(entityData); + EntityType type = entity.getType(); + + String name = EntityType.getId(type).toString(); + + CompoundTag tag = stack.hasTag() ? stack.getTag() : new CompoundTag(); + if (tag.containsKey(ENTITY_DATA_KEY)) + return false; + + tag.put(ENTITY_DATA_KEY, entityData); + tag.putString("entity", name); + stack.setTag(tag); + return true; + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + + Direction Direction = context.getFacing(); + PlayerEntity player = context.getPlayer(); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + ItemStack stack = context.getItemStack(); + + // if(Loader.isModLoaded("betterplacement")) + // { + // if(CarryOnKeybinds.isKeyPressed(player)) + // return ActionResult.FAIL; + // } + + if (hasEntityData(stack)) { + BlockPos finalPos = pos; + + if (!world.getBlockState(finalPos).method_11587(new ItemPlacementContext(context))) + { + finalPos = pos.offset(Direction); + } + + Entity entity = getEntity(stack, world); + if (entity != null) { + if (!world.isClient) { + entity.setPositionAndAngles(finalPos.getX() + 0.5, finalPos.getY(), finalPos.getZ() + 0.5, + 180 + player.yaw, 0.0f); + world.spawnEntity(entity); + if (entity instanceof LivingEntity) { + // ((LivingEntity) entity).sound.playLivingSound(); + } + clearEntityData(stack); + player.setStackInHand(Hand.MAIN, ItemStack.EMPTY); + // ItemEvents.sendPacket(player, 9, 0); + + } + // player.getEntityData().remove("overrideKey"); + return ActionResult.SUCCESS; + } + } + + return ActionResult.FAILURE; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + if (hasEntityData(stack)) { + if (getEntity(stack, world) == null) + stack = ItemStack.EMPTY; + + if (entity instanceof LivingEntity) { + if (entity instanceof PlayerEntity + && /* CarryOnConfig.settings.slownessInCreative ? false : */ ((PlayerEntity) entity) + .isCreative()) + return; + + ((LivingEntity) entity).addPotionEffect( + new StatusEffectInstance(StatusEffects.SLOWNESS, 1, potionLevel(stack, world), false, false)); + } + + } else { + stack = ItemStack.EMPTY; + } + } + + public static void clearEntityData(ItemStack stack) { + if (stack.hasTag()) { + CompoundTag tag = stack.getTag(); + tag.remove(ENTITY_DATA_KEY); + tag.remove("entity"); + } + } + + public static CompoundTag getEntityData(ItemStack stack) { + if (stack.hasTag()) { + CompoundTag tag = stack.getTag(); + return tag.getCompound(ENTITY_DATA_KEY); + } + return null; + } + + public static Entity getEntity(ItemStack stack, World world) { + if (world == null) + return null; + + String name = getEntityName(stack); + + CompoundTag e = getEntityData(stack); + Entity entity = EntityType.createInstance(world, new Identifier(name)); + if (entity != null) + entity.fromTag(e); + + return entity; + } + + public static String getEntityName(ItemStack stack) { + if (stack.hasTag()) { + CompoundTag tag = stack.getTag(); + return tag.getString("entity"); + } + return null; + } + + public static EntityType getEntityType(ItemStack stack) { + if (stack.hasTag()) { + CompoundTag tag = stack.getTag(); + String name = tag.getString("entity"); + EntityType type = EntityType.get(name); + return type; + } + return null; + } + + public static String getCustomName(ItemStack stack) { + if (stack.hasTag()) { + CompoundTag tag = stack.getTag(); + if (tag.containsKey("CustomName") && !tag.getString("CustomName").isEmpty()) { + return tag.toString(); + } else { + return tag.toString(); + } + } + return null; + } + + private int potionLevel(ItemStack stack, World world) { + Entity e = getEntity(stack, world); + if (e == null) + return 1; + + int i = (int) (e.height * e.width); + if (i > 4) + i = 4; + + // if (!CarryOnConfig.settings.heavyEntities) + // i = 1; + + // return (int) (i * CarryOnConfig.settings.entitySlownessMultiplier); + return i * 1; + } +} diff --git a/src/main/java/tschipp/carryon/items/ItemTile.java b/src/main/java/tschipp/carryon/items/ItemTile.java new file mode 100644 index 0000000..cf70a8a --- /dev/null +++ b/src/main/java/tschipp/carryon/items/ItemTile.java @@ -0,0 +1,351 @@ +package tschipp.carryon.items; + +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.text.StringTextComponent; +import net.minecraft.text.TextComponent; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; + +public class ItemTile extends Item { + + public static final String TILE_DATA_KEY = "tileData"; + public static final String[] Direction_KEYS = new String[] { "rotation", "rot", "Direction", "face", "direction", "dir", + "front" }; + + public ItemTile() { + super(new Item.Settings().stackSize(1)); + } + + @Override + public TextComponent getTranslatedNameTrimmed(ItemStack stack) { + if (hasTileData(stack)) { + // BlockState state = getBlockState(stack); + // CompoundTag nbt = getTileData(stack); + + // if (ModelOverridesHandler.hasCustomOverrideModel(state, nbt)) + // { + // Object override = ModelOverridesHandler.getOverrideObject(state, nbt); + // if (override instanceof ItemStack) + // return ((ItemStack) override).getDisplayName(); + // else + // { + // BlockState ostate = (BlockState) override; + // List drops = ostate.getDroppedStacks(new LootContext.Builder()); + // ItemStack itemstack = new ItemStack(ostate.getBlock().getItemDropped(ostate, this.random, 0), 1, state.getBlock().damageDropped(ostate)); + // return itemstack.getDisplayName(); + // } + // } + + return getItemStack(stack).getItem().getTranslatedNameTrimmed(getItemStack(stack)); + } + + return new StringTextComponent(""); + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) + { + // if (Loader.isModLoaded("betterplacement")) + // { + // if (CarryOnKeybinds.isKeyPressed(player)) + // return EnumActionResult.FAIL; + // } + + Direction direction = context.getFacing(); + PlayerEntity player = context.getPlayer(); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + ItemStack stack = context.getItemStack(); + + + // Block block = world.getBlockState(pos).getBlock(); + if (hasTileData(stack)) + { + try + { + Vec3d vec = player.getRotationVecClient(); + Direction direction2 = Direction.getFacing((float) vec.x, 0f, (float) vec.z); + BlockPos pos2 = pos; + Block containedblock = getBlock(stack); + BlockState containedstate = getBlockState(stack); + if (!world.getBlockState(pos).method_11587(new ItemPlacementContext(context))) + { + pos2 = pos.offset(direction); + } + + if (world.getBlockState(pos2).getBlock().method_9579(world.getBlockState(pos2), world, pos2) && containedblock != null) + { + boolean canPlace = containedblock.canPlaceAt(world.getBlockState(pos2), world, pos2); + + if (canPlace) + { + if (player.canPlaceBlock(pos2, direction, stack) && world.canPlayerModifyAt(player, pos2)) + { + // Handles Blockstate rotation + // Iterator> iterator = containedblock.getDefaultState().getProperties().iterator(); + // while (iterator.hasNext()) + // { + // Property prop = iterator.next(); + // Object[] allowedValues = prop.getValues().toArray(); + + // if (prop instanceof DirectionProperty && this.equal(allowedValues, horizontals)) + // { + // world.setBlockState(pos2, containedstate.with(prop, containedblock instanceof StairsBlock ? Direction2 : Direction2.getOpposite())); + // set = true; + // } + // else if (prop instanceof DirectionProperty && this.equal(allowedValues, Direction.values())) + // { + // Direction2 = Direction.getDirection((float) vec.x, (float) vec.y, (float) vec.z); + // world.setBlockState(pos2, containedstate.with(prop, Direction2.getOpposite())); + // set = true; + // } + // } + + BlockState actualState = containedblock.getPlacementState(new ItemPlacementContext(context)); + world.setBlockState(pos2, actualState); + + // world.updateNeighborsAlways(pos2, containedblock); + // If the blockstate doesn't handle rotation, try to + // change rotation via NBT + if (!getTileData(stack).isEmpty()) + { + CompoundTag tag = getTileData(stack); + Set keys = tag.getKeys(); + keytester: + for (String key : keys) + { + for (String DirectionKey : Direction_KEYS) + { + if (key.toLowerCase().equals(DirectionKey)) + { + byte type = tag.getType(key); + switch (type) + { + case 8: + tag.putString(key, direction2.getOpposite().getName()); + break; + case 3: + tag.putInt(key, direction2.getOpposite().getId()); + break; + case 1: + tag.putByte(key, (byte) direction2.getOpposite().getId()); + break; + default: + break; + } + + break keytester; + } + } + } + } + + BlockEntity tile = world.getBlockEntity(pos2); + if (tile != null) + { + tile.fromTag(getTileData(stack)); + tile.setPos(pos2); + } + clearTileData(stack); + player.playSoundAtEntity(containedstate.getSoundGroup().getPlaceSound(), 1.0f, 0.5f); + player.setStackInHand(Hand.MAIN, ItemStack.EMPTY); + // player.nbt.remove("overrideKey"); + // ItemEvents.sendPacket(player, 9, 0); + return ActionResult.SUCCESS; + } + + } + } + } + catch (Exception e) + { + e.printStackTrace(); + + // if (world != null && world.isRemote) + // { + // CarryOn.LOGGER.info("Block: " + ItemTile.getBlock(stack)); + // CarryOn.LOGGER.info("BlockState: " + ItemTile.getBlockState(stack)); + // CarryOn.LOGGER.info("Meta: " + ItemTile.getMeta(stack)); + // CarryOn.LOGGER.info("ItemStack: " + ItemTile.getItemStack(stack)); + + // if (ModelOverridesHandler.hasCustomOverrideModel(ItemTile.getBlockState(stack), ItemTile.getTileData(stack))) + // CarryOn.LOGGER.info("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemTile.getBlockState(stack), ItemTile.getTileData(stack))); + + // if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemTile.getBlockState(stack))) + // CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemTile.getBlockState(stack))); + + // player.sendMessage(new TextComponentString(TextFormatting.RED + "Error detected. Cannot place block. Execute \"/carryon clear\" to remove the item")); + // TextComponentString s = new TextComponentString(TextFormatting.GOLD + "here"); + // s.getStyle().setClickEvent(new ClickEvent(Action.OPEN_URL, "https://github.com/Tschipp/CarryOn/issues")); + // player.sendMessage(new TextComponentString(TextFormatting.RED + "Please report this error ").appendSibling(s)); + + // } + } + + } + + return ActionResult.FAILURE; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) + { + if (hasTileData(stack)) + { + if (entity instanceof LivingEntity) + { + if (entity instanceof PlayerEntity && /*CarryOnConfig.settings.slownessInCreative ? false : */ ((PlayerEntity) entity).isCreative()) + return; + + ((LivingEntity) entity).addPotionEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 1, potionLevel(stack), false, false)); + } + } + else + { + stack = ItemStack.EMPTY; + } + } + + public static boolean hasTileData(ItemStack stack) + { + if (stack.hasTag()) + { + CompoundTag tag = stack.getTag(); + return tag.containsKey(TILE_DATA_KEY) && tag.containsKey("block") && tag.containsKey("stateid"); + } + return false; + } + + public static boolean storeTileData(BlockEntity tile, World world, BlockPos pos, BlockState state, ItemStack stack) + { + if (stack.isEmpty()) + return false; + + CompoundTag chest = new CompoundTag(); + if (tile != null) + chest = tile.toTag(chest); + + CompoundTag tag = stack.hasTag() ? stack.getTag() : new CompoundTag(); + if (tag.containsKey(TILE_DATA_KEY)) + return false; + + tag.put(TILE_DATA_KEY, chest); + + // ItemStack drop = new ItemStack(state.getBlock().getItemDropped(state, ItemTile.random, 0), 1, state.getBlock().damageDropped(state)); + + tag.putString("block", Registry.BLOCK.getId(getBlock(stack)).toString()); + // Item item = Item.getItemFromBlock(state.getBlock()); + tag.putInt("stateid", Block.getRawIdFromState(state)); + stack.setTag(tag); + return true; + } + + public static void clearTileData(ItemStack stack) + { + if (stack.hasTag()) + { + CompoundTag tag = stack.getTag(); + tag.remove(TILE_DATA_KEY); + tag.remove("block"); + tag.remove("stateid"); + } + } + + public static CompoundTag getTileData(ItemStack stack) + { + if (stack.hasTag()) + { + CompoundTag tag = stack.getTag(); + return (CompoundTag)tag.getTag(TILE_DATA_KEY); + } + return null; + } + + public static Block getBlock(ItemStack stack) + { + if (stack.hasTag()) + { + CompoundTag tag = stack.getTag(); + int id = tag.getInt("stateid"); + return Block.getStateFromRawId(id).getBlock(); + } + return Blocks.AIR; + } + + public static ItemStack getItemStack(ItemStack stack) + { + return new ItemStack(getBlock(stack), 1); + } + + public static BlockState getBlockState(ItemStack stack) + { + if (stack.hasTag()) + { + CompoundTag tag = stack.getTag(); + int id = tag.getInt("stateid"); + return Block.getStateFromRawId(id); + } + return Blocks.AIR.getDefaultState(); + } + + public static boolean isLocked(BlockPos pos, World world) + { + BlockEntity te = world.getBlockEntity(pos); + if (te != null) + { + CompoundTag tag = new CompoundTag(); + te.toTag(tag); + return tag.containsKey("Lock") ? !tag.getString("Lock").equals("") : false; + } + + return false; + } + + // private boolean equal(Object[] a, Object[] b) + // { + // if (a.length != b.length) + // return false; + + // List lA = Arrays.asList(a); + // List lB = Arrays.asList(b); + + // return lA.containsAll(lB); + // } + + private int potionLevel(ItemStack stack) + { + String nbt = getTileData(stack).toString(); + int i = nbt.length() / 500; + + if (i > 4) + i = 4; + + // if (!CarryOnConfig.settings.heavyTiles) + // i = 1; + + // return (int) (i * CarryOnConfig.settings.blockSlownessMultiplier); + + return i * 1; + // return 0; + } +} diff --git a/src/main/java/tschipp/carryon/keybinds/CarryOnKeybinds.java b/src/main/java/tschipp/carryon/keybinds/CarryOnKeybinds.java new file mode 100644 index 0000000..c8424f5 --- /dev/null +++ b/src/main/java/tschipp/carryon/keybinds/CarryOnKeybinds.java @@ -0,0 +1,45 @@ +package tschipp.carryon.keybinds; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.util.InputUtil; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundTag; +import tschipp.carryon.interfaces.ICarryOnData; + + +public class CarryOnKeybinds +{ + + public static final String KEYBIND_KEY = "carryOnKeyPressed"; + public static KeyBinding carryKey; + + @Environment(EnvType.CLIENT) + public static void init() + { + carryKey = new KeyBinding("key.carry.desc", InputUtil.Type.KEY_KEYBOARD, 340, "key.carry.category"); + } + + public static boolean isKeyPressed(PlayerEntity player) + { + ICarryOnData data = (ICarryOnData)player; + CompoundTag tag = data.getCarryOnData(); + if(tag != null && tag.containsKey(KEYBIND_KEY)) + { + return tag.getBoolean(KEYBIND_KEY); + } + return false; + } + + public static void setKeyPressed(PlayerEntity player, boolean pressed) + { + ICarryOnData data = (ICarryOnData)player; + CompoundTag tag = data.getCarryOnData(); + tag.putBoolean(KEYBIND_KEY, pressed); + data.setCarryOnData(tag); + } + + + +} diff --git a/src/main/java/tschipp/carryon/mixin/client/ArmorRendererMixin.java b/src/main/java/tschipp/carryon/mixin/client/ArmorRendererMixin.java new file mode 100644 index 0000000..e7092e4 --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/client/ArmorRendererMixin.java @@ -0,0 +1,48 @@ +package tschipp.carryon.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.class_3883; +import net.minecraft.client.model.Model; +import net.minecraft.client.render.entity.ArmorBipedEntityRenderer; +import net.minecraft.client.render.entity.ArmorEntityRenderer; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import tschipp.carryon.RegistryHandler; +import tschipp.carryon.render.ICarrying; + +@Mixin(ArmorBipedEntityRenderer.class) +public abstract class ArmorRendererMixin, A extends BipedEntityModel> extends ArmorEntityRenderer { + + protected ArmorRendererMixin(class_3883 var1, A var2, A var3) { + super(var1, var2, var3); + } + + //Used to be "render" + @Inject(method = "method_17157", at = @At("HEAD")) + private void onRenderArmor(LivingEntity living, float var2, float var3, float var4, float var5, float var6, float var7, float var8, CallbackInfo info) + { + ItemStack stack = living.getMainHandStack(); + ICarrying model = (ICarrying)this.modelBody; + + if (!stack.isEmpty() && stack.getItem() == RegistryHandler.TILE_ITEM) + model.setCarryingBlock(true); + else + model.setCarryingBlock(false); + + if (!stack.isEmpty() && stack.getItem() == RegistryHandler.ENTITY_ITEM) + model.setCarryingEntity(true); + else + model.setCarryingEntity(false); + } + + @Override + public void method_17157(T var1, float var2, float var3, float var4, float var5, float var6, float var7, float var8) { + super.method_17157(var1, var2, var3, var4, var5, var6, var7, var8); + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/mixin/client/BipedModelMixin.java b/src/main/java/tschipp/carryon/mixin/client/BipedModelMixin.java new file mode 100644 index 0000000..5aaa9b5 --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/client/BipedModelMixin.java @@ -0,0 +1,74 @@ +package tschipp.carryon.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.model.Cuboid; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; +import tschipp.carryon.render.ICarrying; + +@Mixin(BipedEntityModel.class) +public class BipedModelMixin implements ICarrying { + + private boolean isCarryingBlock; + private boolean isCarryingEntity; + + @Shadow + public Cuboid armRight; + @Shadow + public Cuboid armLeft; + + @Shadow + public boolean isSneaking; + + + public boolean isCarryingBlock() + { + return isCarryingBlock; + } + + public boolean isCarryingEntity() + { + return isCarryingEntity; + } + + public void setCarryingBlock(boolean isCarrying) + { + this.isCarryingBlock = isCarrying; + } + + public void setCarryingEntity(boolean isCarrying) + { + this.isCarryingEntity = isCarrying; + } + + //setRotationAngles + @Inject(method = "method_17087", at = @At("RETURN")) + public void onSetAngles(LivingEntity var1, float var2, float var3, float var4, float var5, float var6, float var7, CallbackInfo info) + { + if(this.isCarryingBlock()) + { + armRight.pitch = -1F + (this.isSneaking ? 0f : 0.2f); + armLeft.pitch = -1F + (this.isSneaking ? 0f : 0.2f); + armRight.roll = 0f; + armLeft.roll = 0f; + armRight.yaw = 0f; + armLeft.yaw = 0f; + } + else if (this.isCarryingEntity()) + { + armRight.pitch = -1.2F + (this.isSneaking ? 0f : 0.2f); + armLeft.pitch = -1.2F + (this.isSneaking ? 0f : 0.2f); + armRight.roll = -0.15f; + armLeft.roll = 0.15f; + armRight.yaw = 0f; + armLeft.yaw = 0f; + } + } + + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/mixin/client/FirstPersonMixin.java b/src/main/java/tschipp/carryon/mixin/client/FirstPersonMixin.java new file mode 100644 index 0000000..2021022 --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/client/FirstPersonMixin.java @@ -0,0 +1,31 @@ +package tschipp.carryon.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.FirstPersonRenderer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import tschipp.carryon.RegistryHandler; +import tschipp.carryon.render.BlockRendererLayer; +import tschipp.carryon.render.EntityRendererLayer; + +@Mixin(FirstPersonRenderer.class) +public class FirstPersonMixin { + + @Inject(method = "renderFirstPersonItem", at = @At("HEAD")) + public void onRenderItem(float partialTicks, CallbackInfo info) + { + PlayerEntity player = MinecraftClient.getInstance().player; + ItemStack stack = player.getMainHandStack(); + + if(!stack.isEmpty() && stack.getItem() == RegistryHandler.TILE_ITEM) + BlockRendererLayer.renderFirstPerson(player, stack, partialTicks); + else if(!stack.isEmpty() && stack.getItem() == RegistryHandler.ENTITY_ITEM) + EntityRendererLayer.renderFirstPerson(player, stack, partialTicks); + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/mixin/client/KeyboardMixin.java b/src/main/java/tschipp/carryon/mixin/client/KeyboardMixin.java new file mode 100644 index 0000000..ee8411f --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/client/KeyboardMixin.java @@ -0,0 +1,60 @@ +package tschipp.carryon.mixin.client; + + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.settings.GameOptions; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.util.Keyboard; +import net.minecraft.item.ItemStack; +import tschipp.carryon.CarryOn; +import tschipp.carryon.RegistryHandler; + +@Mixin(Keyboard.class) +public class KeyboardMixin { + + @Inject(method = "(JIIII)V", at = @At("HEAD"), cancellable = true) + public void onKeyPressed(long var1, int code1, int code2, int var5, int var6, CallbackInfo info) + { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + GameOptions options = MinecraftClient.getInstance().options; + if (player != null) { + ItemStack held = player.getMainHandStack(); + + CarryOn.LOGGER.info(player); + CarryOn.LOGGER.info(held); + + if (!held.isEmpty() && held.getItem() == RegistryHandler.TILE_ITEM || held.getItem() == RegistryHandler.ENTITY_ITEM) + { + boolean cancel = false; + if(options.keyInventory.matches(code1, code2)) + cancel = true; + else if(options.keySwapHands.matches(code1, code2)) + cancel = true; + else if(options.keyDrop.matches(code1, code2)) + cancel = true; + else if(options.keyLoadToolbarActivator.matches(code1, code2)) + cancel = true; + else if(options.keySaveToolbarActivator.matches(code1, code2)) + cancel = true; + else if(options.keyPickItem.matches(code1, code2)) + cancel = true; + else { + for(KeyBinding key : options.keysHotbar) + { + if(key.matches(code1, code2)) + cancel = true; + } + } + + if(cancel) + info.cancel(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/mixin/client/MouseMixin.java b/src/main/java/tschipp/carryon/mixin/client/MouseMixin.java new file mode 100644 index 0000000..ee3c1a9 --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/client/MouseMixin.java @@ -0,0 +1,46 @@ +package tschipp.carryon.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.util.Mouse; +import net.minecraft.item.ItemStack; +import tschipp.carryon.CarryOn; +import tschipp.carryon.RegistryHandler; + +@Mixin(Mouse.class) +public class MouseMixin { + + @Inject(method = "(JDD)V", at = @At("HEAD"), cancellable = true) + private void onMouseScrolling(long var1, double var3, double var5, CallbackInfo info) { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + ItemStack held = player.getMainHandStack(); + + CarryOn.LOGGER.info(player); + CarryOn.LOGGER.info(held); + + if (!held.isEmpty() && held.getItem() == RegistryHandler.TILE_ITEM + || held.getItem() == RegistryHandler.ENTITY_ITEM) + info.cancel(); + } + + @Inject(method = "(JIII)V", at = @At("HEAD"), cancellable = true) + private void onMouseButtonPress(long var1, int code, int var4, int var5, CallbackInfo info) { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player != null) { + ItemStack held = player.getMainHandStack(); + + CarryOn.LOGGER.info(player); + CarryOn.LOGGER.info(held); + + if (!held.isEmpty() && held.getItem() == RegistryHandler.TILE_ITEM + || held.getItem() == RegistryHandler.ENTITY_ITEM) + if (MinecraftClient.getInstance().options.keyPickItem.matches(code)) + info.cancel(); + } + } +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/mixin/client/PlayerRendererMixin.java b/src/main/java/tschipp/carryon/mixin/client/PlayerRendererMixin.java new file mode 100644 index 0000000..9cdeb55 --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/client/PlayerRendererMixin.java @@ -0,0 +1,49 @@ +package tschipp.carryon.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.PlayerEntityRenderer; +import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.item.ItemStack; +import tschipp.carryon.RegistryHandler; +import tschipp.carryon.render.BlockRendererLayer; +import tschipp.carryon.render.EntityRendererLayer; +import tschipp.carryon.render.ICarrying; + +@Mixin(PlayerEntityRenderer.class) +public abstract class PlayerRendererMixin extends LivingEntityRenderer>{ + + private PlayerRendererMixin(EntityRenderDispatcher var1, PlayerEntityModel var2, float var3) { + super(var1, var2, var3); + } + + @Inject(method = "*", at = @At("RETURN")) + public void onConstructed(EntityRenderDispatcher renderDispatcher, boolean slim, CallbackInfo info) + { + this.addLayer(new BlockRendererLayer(this)); + this.addLayer(new EntityRendererLayer(this)); + } + + @Inject(method = "method_4218", at = @At("RETURN")) + private void onPreRender(AbstractClientPlayerEntity player, CallbackInfo info) + { + ItemStack stack = player.getMainHandStack(); + ICarrying model = (ICarrying)this.method_4038(); + + if (!stack.isEmpty() && stack.getItem() == RegistryHandler.TILE_ITEM) + model.setCarryingBlock(true); + else + model.setCarryingBlock(false); + + if (!stack.isEmpty() && stack.getItem() == RegistryHandler.ENTITY_ITEM) + model.setCarryingEntity(true); + else + model.setCarryingEntity(false); + } +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/mixin/common/BlockStateMixin.java b/src/main/java/tschipp/carryon/mixin/common/BlockStateMixin.java new file mode 100644 index 0000000..16877e0 --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/common/BlockStateMixin.java @@ -0,0 +1,117 @@ +package tschipp.carryon.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +import tschipp.carryon.PickupHandler; +import tschipp.carryon.RegistryHandler; +import tschipp.carryon.items.ItemTile; + +@Mixin(BlockState.class) +public class BlockStateMixin { + + + //Detects right click detection + @Inject(method = "activate", at = @At("HEAD"), cancellable = true) + public void onBlockActivated(World world, BlockPos pos, PlayerEntity player, Hand hand, Direction Direction, float hitx, float hity, float hitz, CallbackInfoReturnable info) { + ItemStack main = player.getMainHandStack(); + ItemStack off = player.getOffHandStack(); + + if(main.isEmpty() && off.isEmpty() && player.isSneaking()) + { + info.cancel(); + info.setReturnValue(false); + + BlockState state = world.getBlockState(pos); + ItemStack stack = new ItemStack(RegistryHandler.TILE_ITEM); + + BlockEntity te = world.getBlockEntity(pos); + if (PickupHandler.canPlayerPickUpBlock(player, te, world, pos)) + { + // player.open.closeScreen(); + + if (ItemTile.storeTileData(te, world, pos, state, stack)) + { + + // BlockState statee = world.getBlockState(pos); + CompoundTag tag = new CompoundTag(); + tag = world.getBlockEntity(pos) != null ? world.getBlockEntity(pos).toTag(tag) : new CompoundTag(); + // CarryOnOverride override = ScriptChecker.inspectBlock(state, world, pos, tag); + // int overrideHash = 0; + // if (override != null) + // overrideHash = override.hashCode(); + + // positions.put(pos, 0); + + // boolean success = false; + + try + { + // sendPacket(player, player.inventory.currentItem, overrideHash); + + world.removeBlockEntity(pos); + world.setBlockState(pos, Blocks.AIR.getDefaultState(), 3); + player.setStackInHand(Hand.MAIN, stack); + // event.setUseBlock(Result.DENY); + // event.setUseItem(Result.DENY); + // event.setCanceled(true); + // success = true; + } + catch (Exception e) + { + // try + // { + // sendPacket(player, player.inventory.currentItem, overrideHash); + // emptyBlockEntity(te); + // world.setBlockToAir(pos); + // player.setHeldItem(EnumHand.MAIN_HAND, stack); + // event.setUseBlock(Result.DENY); + // event.setUseItem(Result.DENY); + // event.setCanceled(true); + // success = true; + // } + // catch (Exception ex) + // { + // sendPacket(player, 9, 0); + // world.setBlockState(pos, statee); + // if (!tag.hasNoTags()) + // BlockEntity.create(world, tag); + + // player.sendMessage(new TextComponentString(TextFormatting.RED + "Error detected. Cannot pick up block.")); + // TextComponentString s = new TextComponentString(TextFormatting.GOLD + "here"); + // s.getStyle().setClickEvent(new ClickEvent(Action.OPEN_URL, "https://github.com/Tschipp/CarryOn/issues")); + // player.sendMessage(new TextComponentString(TextFormatting.RED + "Please report this error ").appendSibling(s)); + // } + + } + + // if (success && override != null) + // { + // String command = override.getCommandInit(); + // if (command != null) + // player.getServer().getCommandManager().executeCommand(player.getServer(), "/execute " + player.getGameProfile().getName() + " ~ ~ ~ " + command); + // } + + } + } + } + else if(!main.isEmpty() && main.getItem() == RegistryHandler.TILE_ITEM || main.getItem() == RegistryHandler.ENTITY_ITEM) + { + info.cancel(); + } + } + + +} diff --git a/src/main/java/tschipp/carryon/mixin/common/EntityMixin.java b/src/main/java/tschipp/carryon/mixin/common/EntityMixin.java new file mode 100644 index 0000000..2b7bbfe --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/common/EntityMixin.java @@ -0,0 +1,72 @@ +package tschipp.carryon.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; +import net.minecraft.world.World; +import tschipp.carryon.PickupHandler; +import tschipp.carryon.RegistryHandler; +import tschipp.carryon.items.ItemEntity; + +@Mixin(Entity.class) +public abstract class EntityMixin { + + @Shadow + public boolean field_6037; + + @Inject(method = "interact", at = @At("HEAD"), cancellable = true) + public void onInteract(PlayerEntity player, Hand hand, CallbackInfoReturnable info) { + + ItemStack main = player.getMainHandStack(); + ItemStack off = player.getOffHandStack(); + World world = player.world; + Entity entity = ((Entity) (Object) this); + + if (main.isEmpty() && off.isEmpty() && player.isSneaking()) { + ItemStack stack = new ItemStack(RegistryHandler.ENTITY_ITEM); + + if (!this.field_6037) { + if (entity instanceof AnimalEntity) + ((AnimalEntity) entity).detachLeash(true, true); + + if (PickupHandler.canPlayerPickUpEntity(player, entity)) { + if (ItemEntity.storeEntityData(entity, world, stack)) { + // if (entity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)) { + // IItemHandler handler = entity + // .getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + // for (int i = 0; i < handler.getSlots(); i++) { + // handler.extractItem(i, 64, false); + // } + // } + + // CarryOnOverride override = ScriptChecker.inspectEntity(entity); + // int overrideHash = 0; + // if (override != null) + // overrideHash = override.hashCode(); + + // ItemEvents.sendPacket(player, player.inventory.currentItem, overrideHash); + + // if (entity instanceof LivingEntity) + // ((LivingEntity) entity).setHealth(0); + + entity.invalidate(); + player.setStackInHand(Hand.MAIN, stack); + info.cancel(); + info.setReturnValue(false); + } + } + } + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/mixin/common/PlayerMixin.java b/src/main/java/tschipp/carryon/mixin/common/PlayerMixin.java new file mode 100644 index 0000000..f6dcf9d --- /dev/null +++ b/src/main/java/tschipp/carryon/mixin/common/PlayerMixin.java @@ -0,0 +1,42 @@ +package tschipp.carryon.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.World; +import tschipp.carryon.interfaces.ICarryOnData; + +@Mixin(PlayerEntity.class) +public abstract class PlayerMixin extends LivingEntity implements ICarryOnData { + + private PlayerMixin(World var1) { + super(EntityType.PLAYER, var1); + } + + private static final TrackedData CARRYON_DATA = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.TAG_COMPOUND);; + + @Inject(method = "initDataTracker", at = @At("RETURN")) + public void onInitDataTracker(CallbackInfo info) { + this.dataTracker.startTracking(CARRYON_DATA, new CompoundTag()); + } + + @Override + public CompoundTag getCarryOnData() { + return (CompoundTag)this.dataTracker.get(CARRYON_DATA); + } + + @Override + public void setCarryOnData(CompoundTag tag) { + this.dataTracker.set(CARRYON_DATA, tag); + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java b/src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java deleted file mode 100644 index 597cb5c..0000000 --- a/src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java +++ /dev/null @@ -1,54 +0,0 @@ -package tschipp.carryon.network.client; - -import io.netty.buffer.ByteBuf; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; - -public class CarrySlotPacket implements IMessage -{ - public int slot; - public int carryOverride = 0; - public int entityid; - - public CarrySlotPacket() - { - this.slot = 9; - this.entityid = 0; - } - - public CarrySlotPacket(int slot, int entityid) - { - this.slot = slot; - this.entityid = entityid; - } - - public CarrySlotPacket(int slot, int entityid, int carryOverride) - { - this.slot = slot; - this.carryOverride = carryOverride; - this.entityid = entityid; - } - - @Override - public void fromBytes(ByteBuf buf) - { - NBTTagCompound tag = ByteBufUtils.readTag(buf); - - this.slot = tag.getInteger("slot"); - this.carryOverride = tag.getInteger("override"); - this.entityid = tag.getInteger("entityid"); - } - - @Override - public void toBytes(ByteBuf buf) - { - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("slot", slot); - tag.setInteger("override", carryOverride); - tag.setInteger("entityid", entityid); - ByteBufUtils.writeTag(buf, tag); - - } - -} diff --git a/src/main/java/tschipp/carryon/network/client/CarrySlotPacketHandler.java b/src/main/java/tschipp/carryon/network/client/CarrySlotPacketHandler.java deleted file mode 100644 index 4c131de..0000000 --- a/src/main/java/tschipp/carryon/network/client/CarrySlotPacketHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package tschipp.carryon.network.client; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.IThreadListener; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import tschipp.carryon.common.scripting.ScriptChecker; - -public class CarrySlotPacketHandler implements IMessageHandler -{ - - @Override - public IMessage onMessage(final CarrySlotPacket message, final MessageContext ctx) - { - IThreadListener mainThread = Minecraft.getMinecraft(); - - mainThread.addScheduledTask(new Runnable() - { - World world = Minecraft.getMinecraft().world; - - @Override - public void run() - { - if (world != null) - { - Entity e = world.getEntityByID(message.entityid); - - if (e != null && e instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) e; - - if (message.slot >= 9) - { - player.getEntityData().removeTag("carrySlot"); - player.getEntityData().removeTag("overrideKey"); - } - else - { - - player.getEntityData().setInteger("carrySlot", message.slot); - if (message.carryOverride != 0) - ScriptChecker.setCarryOnOverride(player, message.carryOverride); - } - } - } - - } - - }); - - return null; - } - -} diff --git a/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java b/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java deleted file mode 100644 index 3cde434..0000000 --- a/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java +++ /dev/null @@ -1,26 +0,0 @@ -package tschipp.carryon.network.client; - -import io.netty.buffer.ByteBuf; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; - -public class ScriptReloadPacket implements IMessage -{ - - public ScriptReloadPacket() - { - - } - - @Override - public void fromBytes(ByteBuf buf) - { - - } - - @Override - public void toBytes(ByteBuf buf) - { - - } - -} diff --git a/src/main/java/tschipp/carryon/network/client/ScriptReloadPacketHandler.java b/src/main/java/tschipp/carryon/network/client/ScriptReloadPacketHandler.java deleted file mode 100644 index 507e35e..0000000 --- a/src/main/java/tschipp/carryon/network/client/ScriptReloadPacketHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package tschipp.carryon.network.client; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.util.IThreadListener; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import tschipp.carryon.common.scripting.ScriptReader; - -public class ScriptReloadPacketHandler implements IMessageHandler -{ - - @Override - public IMessage onMessage(ScriptReloadPacket message, MessageContext ctx) - { - IThreadListener mainThread = Minecraft.getMinecraft(); - - mainThread.addScheduledTask(new Runnable() - { - EntityPlayerSP player = Minecraft.getMinecraft().player; - - @Override - public void run() - { - if(player != null) - ScriptReader.reloadScripts(); - } - - }); - - return null; - } - -} diff --git a/src/main/java/tschipp/carryon/network/server/SyncKeybindPacket.java b/src/main/java/tschipp/carryon/network/server/SyncKeybindPacket.java deleted file mode 100644 index 3dbca52..0000000 --- a/src/main/java/tschipp/carryon/network/server/SyncKeybindPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package tschipp.carryon.network.server; - -import io.netty.buffer.ByteBuf; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; - -public class SyncKeybindPacket implements IMessage -{ - - private int p; - public boolean pressed; - - public SyncKeybindPacket() - { - } - - public SyncKeybindPacket(boolean pressed) - { - this.p = pressed ? 1 : 0; - } - - @Override - public void fromBytes(ByteBuf buf) - { - this.p = ByteBufUtils.readVarInt(buf, 4); - this.pressed = p == 1 ? true : false; - } - - @Override - public void toBytes(ByteBuf buf) - { - ByteBufUtils.writeVarInt(buf, p, 4); - } - -} diff --git a/src/main/java/tschipp/carryon/network/server/SyncKeybindPacketHandler.java b/src/main/java/tschipp/carryon/network/server/SyncKeybindPacketHandler.java deleted file mode 100644 index 5379a6c..0000000 --- a/src/main/java/tschipp/carryon/network/server/SyncKeybindPacketHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package tschipp.carryon.network.server; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.IThreadListener; -import net.minecraft.world.WorldServer; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import tschipp.carryon.client.keybinds.CarryOnKeybinds; - -public class SyncKeybindPacketHandler implements IMessageHandler -{ - - @Override - public IMessage onMessage(final SyncKeybindPacket message, final MessageContext ctx) - { - IThreadListener mainThread = (WorldServer) ctx.getServerHandler().playerEntity.world; - - mainThread.addScheduledTask(new Runnable() - { - EntityPlayerMP player = ctx.getServerHandler().playerEntity; - - @Override - public void run() - { - CarryOnKeybinds.setKeyPressed(player, message.pressed); - } - - }); - - return null; - } - -} diff --git a/src/main/java/tschipp/carryon/render/BlockRendererLayer.java b/src/main/java/tschipp/carryon/render/BlockRendererLayer.java new file mode 100644 index 0000000..65c7acd --- /dev/null +++ b/src/main/java/tschipp/carryon/render/BlockRendererLayer.java @@ -0,0 +1,95 @@ +package tschipp.carryon.render; + +import com.mojang.blaze3d.platform.GLX; +import com.mojang.blaze3d.platform.GlStateManager; + +import net.minecraft.class_3883; +import net.minecraft.class_3887; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.client.render.model.json.ModelTransformations.Type; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import tschipp.carryon.RegistryHandler; +import tschipp.carryon.items.ItemTile; + +public class BlockRendererLayer extends class_3887> { + + private static MinecraftClient client = MinecraftClient.getInstance(); + + public BlockRendererLayer(class_3883> var1) { + super(var1); + } + + @Override + public void method_4199(AbstractClientPlayerEntity player, float var2, float var3, float partialTicks, float var5, + float var6, float var7, float var8) { + ItemStack stack = player.getMainHandStack(); + if (!stack.isEmpty() && stack.getItem() == RegistryHandler.TILE_ITEM) { + ItemStack renderStack = ItemTile.getItemStack(stack); + // BakedModel model = + // client.getItemRenderer().getModelMap().getModel(renderStack); + + GlStateManager.pushMatrix(); + GlStateManager.rotated(180, 1, 0, 0); + GlStateManager.rotated(180, 0, 1, 0); + GlStateManager.scaled(0.6, 0.6, 0.6); + GlStateManager.translated(0, -0.75, -0.65); + + if(player.isSneaking()) + { + GlStateManager.translated(0, -0.15, -0.15); + } + + if(isChest(ItemTile.getBlock(stack))) + { + GlStateManager.rotated(180, 0, 1, 0); + } + + client.getItemRenderer().renderItemWithTransformation(renderStack, Type.ORIGIN); + GlStateManager.popMatrix(); + } + } + + @Override + public boolean method_4200() { + return false; + } + + public static boolean isChest(Block block) + { + return block == Blocks.CHEST || block == Blocks.ENDER_CHEST || block == Blocks.TRAPPED_CHEST; + } + + public static void renderFirstPerson(LivingEntity entity, ItemStack stack, float partialTicks) + { + ItemStack renderStack = ItemTile.getItemStack(stack); + + GlStateManager.pushMatrix(); + GlStateManager.scaled(2.5, 2.5, 2.5); + GlStateManager.translated(0, -0.6, -1); + GlStateManager.enableBlend(); + + if(isChest(ItemTile.getBlock(stack))) + { + GlStateManager.rotated(180, 0, 1, 0); + } + + setLightCoords(); + client.getItemRenderer().renderItemWithTransformation(renderStack, Type.ORIGIN); + GlStateManager.popMatrix(); + } + + private static void setLightCoords() { + AbstractClientPlayerEntity player = client.player; + int var2 = client.world.getLightmapIndex(new BlockPos(player.x, player.y + (double)player.getEyeHeight(), player.z), 0); + float var3 = (float)(var2 & '\uffff'); + float var4 = (float)(var2 >> 16); + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, var3, var4); + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/render/EntityRendererLayer.java b/src/main/java/tschipp/carryon/render/EntityRendererLayer.java new file mode 100644 index 0000000..73627da --- /dev/null +++ b/src/main/java/tschipp/carryon/render/EntityRendererLayer.java @@ -0,0 +1,123 @@ +package tschipp.carryon.render; + +import com.mojang.blaze3d.platform.GLX; +import com.mojang.blaze3d.platform.GlStateManager; + +import net.minecraft.class_3883; +import net.minecraft.class_3887; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import tschipp.carryon.RegistryHandler; +import tschipp.carryon.items.ItemEntity; + +public class EntityRendererLayer extends class_3887> { + + private static MinecraftClient client = MinecraftClient.getInstance(); + + public EntityRendererLayer(class_3883> var1) { + super(var1); + } + + @Override + public void method_4199(AbstractClientPlayerEntity player, float var2, float var3, float partialTicks, float var5, + float var6, float var7, float var8) { + ItemStack stack = player.getMainHandStack(); + if (!stack.isEmpty() && stack.getItem() == RegistryHandler.ENTITY_ITEM) { + Entity renderEntity = ItemEntity.getEntity(stack, player.world); + + double c0 = player.prevX + (player.x - player.prevX) * partialTicks; + double c1 = player.prevY + (player.y - player.prevY) * partialTicks; + double c2 = player.prevZ + (player.z - player.prevZ) * partialTicks; + + renderEntity.setPosition(c0, c1, c2); + + EntityRenderDispatcher renderer = client.getEntityRenderManager(); + + renderEntity.yaw = 0f; + renderEntity.pitch = 0f; + float height = renderEntity.height; + float width = renderEntity.width; + float multiplier = height * width; + + GlStateManager.pushMatrix(); + GlStateManager.scaled(1, -1, 1); + GlStateManager.scaled((10 - multiplier) * 0.08, (10 - multiplier) * 0.08, (10 - multiplier) * 0.08); + GlStateManager.rotated(180, 0, 1, 0); + GlStateManager.translated(0.0, height / 2 + -(height / 2) - 1.2, width - 0.1 < 0.7 ? width - 0.1 + (0.7 - (width - 0.1)) : width - 0.1); + GlStateManager.color3f(1f, 1f, 1f); + GlStateManager.enableAlphaTest(); + + if (player.isSneaking()) { + GlStateManager.translated(0, -0.1, 0); + } + + renderer.method_3948(false); + renderer.method_3954(renderEntity, 0, 0, 0, partialTicks, 0, true); + renderer.method_3948(true); + + GlStateManager.scaled(1, 1, 1); + GlStateManager.popMatrix(); + } + } + + @Override + public boolean method_4200() { + return false; + } + + public static boolean isChest(Block block) { + return block == Blocks.CHEST || block == Blocks.ENDER_CHEST || block == Blocks.TRAPPED_CHEST; + } + + public static void renderFirstPerson(LivingEntity player, ItemStack stack, float partialTicks) + { + if (!stack.isEmpty() && stack.getItem() == RegistryHandler.ENTITY_ITEM) { + Entity renderEntity = ItemEntity.getEntity(stack, player.world); + + double c0 = player.prevX + (player.x - player.prevX) * partialTicks; + double c1 = player.prevY + (player.y - player.prevY) * partialTicks; + double c2 = player.prevZ + (player.z - player.prevZ) * partialTicks; + + renderEntity.setPosition(c0, c1, c2); + + EntityRenderDispatcher renderer = client.getEntityRenderManager(); + + renderEntity.yaw = 0f; + renderEntity.pitch = 0f; + float height = renderEntity.height; + float width = renderEntity.width; + + GlStateManager.pushMatrix(); + GlStateManager.scaled(.8, .8, .8); + GlStateManager.rotated(180, 0, 1, 0); + GlStateManager.translated(0.0, -height - .1, width + 0.1); + GlStateManager.enableAlphaTest(); + + setLightCoords(); + renderer.method_3948(false); + renderer.method_3954(renderEntity, 0, 0, 0, partialTicks, 0, true); + renderer.method_3948(true); + + GlStateManager.disableAlphaTest(); + GlStateManager.scaled(1, 1, 1); + GlStateManager.popMatrix(); + } + } + + private static void setLightCoords() { + AbstractClientPlayerEntity player = client.player; + int var2 = client.world.getLightmapIndex(new BlockPos(player.x, player.y + (double)player.getEyeHeight(), player.z), 0); + float var3 = (float)(var2 & '\uffff'); + float var4 = (float)(var2 >> 16); + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, var3, var4); + } + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/render/ICarrying.java b/src/main/java/tschipp/carryon/render/ICarrying.java new file mode 100644 index 0000000..2a267fb --- /dev/null +++ b/src/main/java/tschipp/carryon/render/ICarrying.java @@ -0,0 +1,11 @@ +package tschipp.carryon.render; + +public interface ICarrying { + + public boolean isCarryingBlock(); + public boolean isCarryingEntity(); + + public void setCarryingBlock(boolean isCarrying); + public void setCarryingEntity(boolean isCarrying); + +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java b/src/main/java/tschipp/carryon/scripting/CarryOnOverride.java similarity index 88% rename from src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java rename to src/main/java/tschipp/carryon/scripting/CarryOnOverride.java index c454e2c..26f5c4c 100644 --- a/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java +++ b/src/main/java/tschipp/carryon/scripting/CarryOnOverride.java @@ -41,6 +41,11 @@ public class CarryOnOverride private boolean renderLeftArm = true; private boolean renderRightArm = true; + //EFFECTS + private String commandInit; + private String commandLoop; + private String commandPlace; + private boolean isBlock; private boolean isEntity; private final String path; @@ -51,6 +56,28 @@ public class CarryOnOverride this.path = path; } + + + public String getCommandInit() + { + return commandInit; + } + + public void setCommandInit(String commandInit) + { + this.commandInit = commandInit; + } + + public String getCommandLoop() + { + return commandLoop; + } + + public void setCommandLoop(String commandLoop) + { + this.commandLoop = commandLoop; + } + public String getConditionEffects() { return conditionEffects; @@ -115,7 +142,7 @@ public class CarryOnOverride { return "Code: " + this.hashCode(); } - + @Override public boolean equals(Object obj) { @@ -126,6 +153,27 @@ public class CarryOnOverride if (getClass() != obj.getClass()) return false; CarryOnOverride other = (CarryOnOverride) obj; + if (commandInit == null) + { + if (other.commandInit != null) + return false; + } + else if (!commandInit.equals(other.commandInit)) + return false; + if (commandLoop == null) + { + if (other.commandLoop != null) + return false; + } + else if (!commandLoop.equals(other.commandLoop)) + return false; + if (commandPlace == null) + { + if (other.commandPlace != null) + return false; + } + else if (!commandPlace.equals(other.commandPlace)) + return false; if (conditionAchievement == null) { if (other.conditionAchievement != null) @@ -133,6 +181,13 @@ public class CarryOnOverride } else if (!conditionAchievement.equals(other.conditionAchievement)) return false; + if (conditionEffects == null) + { + if (other.conditionEffects != null) + return false; + } + else if (!conditionEffects.equals(other.conditionEffects)) + return false; if (conditionGamemode == null) { if (other.conditionGamemode != null) @@ -172,6 +227,15 @@ public class CarryOnOverride return false; if (isEntity != other.isEntity) return false; + if (path == null) + { + if (other.path != null) + return false; + } + else if (!path.equals(other.path)) + return false; + if (renderLeftArm != other.renderLeftArm) + return false; if (renderMeta != other.renderMeta) return false; if (renderNBT == null) @@ -195,6 +259,8 @@ public class CarryOnOverride } else if (!renderNameEntity.equals(other.renderNameEntity)) return false; + if (renderRightArm != other.renderRightArm) + return false; if (renderRotation == null) { if (other.renderRotation != null) @@ -310,6 +376,8 @@ public class CarryOnOverride return true; } + + public boolean isBlock() { return isBlock; @@ -570,4 +638,18 @@ public class CarryOnOverride this.renderScale = renderScale; } + + + public String getCommandPlace() + { + return commandPlace; + } + + public void setCommandPlace(String commandPlace) + { + this.commandPlace = commandPlace; + } + + + } diff --git a/src/main/java/tschipp/carryon/common/scripting/ScriptChecker.java b/src/main/java/tschipp/carryon/scripting/ScriptChecker.java similarity index 59% rename from src/main/java/tschipp/carryon/common/scripting/ScriptChecker.java rename to src/main/java/tschipp/carryon/scripting/ScriptChecker.java index e2be7a8..991fc01 100644 --- a/src/main/java/tschipp/carryon/common/scripting/ScriptChecker.java +++ b/src/main/java/tschipp/carryon/scripting/ScriptChecker.java @@ -1,8 +1,11 @@ package tschipp.carryon.common.scripting; +import java.lang.reflect.Method; + import javax.annotation.Nullable; -import net.darkhax.gamestages.capabilities.PlayerDataHandler; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementManager; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -12,10 +15,14 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.relauncher.ReflectionHelper; import tschipp.carryon.common.config.CarryOnConfig; +import tschipp.carryon.common.handler.ListHandler; import tschipp.carryon.common.helper.ScriptParseHelper; public class ScriptChecker @@ -33,12 +40,17 @@ public class ScriptChecker float resistance = block.getExplosionResistance(null); NBTTagCompound nbt = tag; - for (CarryOnOverride override : ScriptReader.OVERRIDES.values()) + boolean isAllowed = CarryOnConfig.settings.useWhitelistBlocks ? ListHandler.isAllowed(block) : !ListHandler.isForbidden(block); + + if (isAllowed) { - if (override.isBlock()) + for (CarryOnOverride override : ScriptReader.OVERRIDES.values()) { - if (matchesAll(override, block, meta, material, hardness, resistance, nbt)) - return override; + if (override.isBlock()) + { + if (matchesAll(override, block, meta, material, hardness, resistance, nbt)) + return override; + } } } @@ -58,12 +70,17 @@ public class ScriptChecker NBTTagCompound tag = new NBTTagCompound(); entity.writeToNBT(tag); - for (CarryOnOverride override : ScriptReader.OVERRIDES.values()) + boolean isAllowed = CarryOnConfig.settings.useWhitelistEntities ? ListHandler.isAllowed(entity) : !ListHandler.isForbidden(entity); + + if (isAllowed) { - if (override.isEntity()) + for (CarryOnOverride override : ScriptReader.OVERRIDES.values()) { - if (matchesAll(override, name, height, width, health, tag)) - return override; + if (override.isEntity()) + { + if (matchesAll(override, name, height, width, health, tag)) + return override; + } } } @@ -95,14 +112,56 @@ public class ScriptChecker public static boolean fulfillsConditions(CarryOnOverride override, EntityPlayer player) { - boolean achievement = ScriptParseHelper.getAchievementFromString(override.getConditionAchievement()) == null ? true : player.hasAchievement(ScriptParseHelper.getAchievementFromString(override.getConditionAchievement())); + AdvancementManager manager = ((WorldServer) ((EntityPlayerMP) player).world).getAdvancementManager(); + Advancement adv = manager.getAdvancement(new ResourceLocation((override.getConditionAchievement()) == null ? "" : override.getConditionAchievement())); + + boolean achievement = adv == null ? true : ((EntityPlayerMP) player).getAdvancements().getProgress(adv).isDone(); boolean gamemode = ScriptParseHelper.matches(((EntityPlayerMP) player).interactionManager.getGameType().getID(), override.getConditionGamemode()); - boolean gamestage = Loader.isModLoaded("gamestages") ? (override.getConditionGamestage() != null ? PlayerDataHandler.getStageData(player).hasUnlockedStage(override.getConditionGamestage()) : true) : true; + boolean gamestage = true; + if (Loader.isModLoaded("gamestages")) + { + if (override.getConditionGamestage() != null) + { + try + { + Class gameStageHelper = Class.forName("net.darkhax.gamestages.GameStageHelper"); + Class iStageData = Class.forName("net.darkhax.gamestages.data.IStageData"); + + Method getPlayerData = ReflectionHelper.findMethod(gameStageHelper, "getPlayerData", null, EntityPlayer.class); + Method hasStage = ReflectionHelper.findMethod(iStageData, "hasStage", null, String.class); + + Object stageData = getPlayerData.invoke(null, player); + String condition = override.getConditionGamestage(); + gamestage = (boolean) hasStage.invoke(stageData, condition); + } + catch (Exception e) + { + try + { + Class playerDataHandler = Class.forName("net.darkhax.gamestages.capabilities.PlayerDataHandler"); + Class iStageData = Class.forName("net.darkhax.gamestages.capabilities.PlayerDataHandler$IStageData"); + + Method getStageData = ReflectionHelper.findMethod(playerDataHandler, "getStageData", null, EntityPlayer.class); + Method hasUnlockedStage = ReflectionHelper.findMethod(iStageData, "hasUnlockedStage", null, String.class); + + Object stageData = getStageData.invoke(null, player); + String condition = override.getConditionGamestage(); + gamestage = (boolean) hasUnlockedStage.invoke(stageData, condition); + + } + catch (Exception ex) + { + } + } + + } + } + boolean position = ScriptParseHelper.matches(player.getPosition(), override.getConditionPosition()); boolean xp = ScriptParseHelper.matches(player.experienceLevel, override.getConditionXp()); boolean scoreboard = ScriptParseHelper.matchesScore(player, override.getConditionScoreboard()); boolean effects = ScriptParseHelper.hasEffects(player, override.getConditionEffects()); - + return (achievement && gamemode && gamestage && position && xp && scoreboard && effects); } @@ -114,13 +173,13 @@ public class ScriptChecker if (tag != null && tag.hasKey("overrideKey")) { int key = tag.getInteger("overrideKey"); - + return ScriptReader.OVERRIDES.get(key); } return null; } - + public static void setCarryOnOverride(EntityPlayer player, int i) { NBTTagCompound tag = player.getEntityData(); @@ -128,5 +187,5 @@ public class ScriptChecker if (tag != null) tag.setInteger("overrideKey", i); } - + } diff --git a/src/main/java/tschipp/carryon/common/scripting/ScriptReader.java b/src/main/java/tschipp/carryon/scripting/ScriptReader.java similarity index 89% rename from src/main/java/tschipp/carryon/common/scripting/ScriptReader.java rename to src/main/java/tschipp/carryon/scripting/ScriptReader.java index 29ca9c1..6c0d4fa 100644 --- a/src/main/java/tschipp/carryon/common/scripting/ScriptReader.java +++ b/src/main/java/tschipp/carryon/scripting/ScriptReader.java @@ -29,6 +29,7 @@ public class ScriptReader public static void preInit(FMLPreInitializationEvent event) { CarryOn.CONFIGURATION_FILE = new File(event.getModConfigurationDirectory(), "carryon-scripts/"); + if (!CarryOn.CONFIGURATION_FILE.exists()) CarryOn.CONFIGURATION_FILE.mkdir(); @@ -56,8 +57,9 @@ public class ScriptReader JsonObject object = (JsonObject) json.get("object"); JsonObject conditions = (JsonObject) json.get("conditions"); JsonObject render = (JsonObject) json.get("render"); + JsonObject effects = (JsonObject) json.get("effects"); - if ((object != null && conditions != null) || (object != null && render != null)) + if ((object != null && conditions != null) || (object != null && render != null) || (object != null && effects != null)) { JsonObject block = (JsonObject) object.get("block"); JsonObject entity = (JsonObject) object.get("entity"); @@ -116,12 +118,12 @@ public class ScriptReader if (conditions != null) { JsonElement gamestage = conditions.get("gamestage"); - JsonElement achievement = conditions.get("achievement"); + JsonElement achievement = conditions.get("advancement"); JsonElement xp = conditions.get("xp"); JsonElement gamemode = conditions.get("gamemode"); JsonElement scoreboard = conditions.get("scoreboard"); JsonElement position = conditions.get("position"); - JsonElement effects = conditions.get("effects"); + JsonElement potionEffects = conditions.get("effects"); if(gamestage != null) override.setConditionGamestage(gamestage.getAsString()); @@ -135,8 +137,8 @@ public class ScriptReader override.setConditionScoreboard(scoreboard.getAsString()); if(position != null) override.setConditionPosition(position.getAsString()); - if(effects != null) - override.setConditionEffects(effects.getAsString()); + if(potionEffects != null) + override.setConditionEffects(potionEffects.getAsString()); } if (render != null) @@ -177,8 +179,21 @@ public class ScriptReader override.setRenderRightArm(renderRightArm.getAsBoolean()); } - OVERRIDES.put(override.hashCode(), override); + if(effects != null) + { + JsonElement commandInit = effects.get("commandPickup"); + JsonElement commandLoop = effects.get("commandLoop"); + JsonElement commandPlace = effects.get("commandPlace"); + if(commandInit != null) + override.setCommandInit(commandInit.getAsString()); + if(commandLoop != null) + override.setCommandLoop(commandLoop.getAsString()); + if(commandPlace != null) + override.setCommandPlace(commandPlace.getAsString()); + } + + OVERRIDES.put(override.hashCode(), override); } } } diff --git a/src/main/resources/assets/carryon/lang/en_UD.lang b/src/main/resources/assets/carryon/lang/en_UD.lang deleted file mode 100644 index 9c3ef24..0000000 --- a/src/main/resources/assets/carryon/lang/en_UD.lang +++ /dev/null @@ -1,14 +0,0 @@ -carryon.category.settings=sᵷuᴉʇʇǝS -carryon.category.blacklist=ʇsᴉꞁʞɔɐꞁᗺ -carryon.category.modeloverrides=(pǝɔuɐʌpⱯ) sǝpᴉɹɹǝʌO ꞁǝpoW -carryon.category.custompickupconditions=(pǝɔuɐʌpⱯ) suoᴉʇᴉpuoƆ dnʞɔᴉԀ ɯoʇsnƆ -carryon.category.whitelist=ʇsᴉꞁǝʇᴉɥM - -carryon.general.modeloverrides.modeloverrides=sǝpᴉɹɹǝʌO ꞁǝpoW -carryon.general.blacklist.forbiddenentities=dn ʞɔᴉd ʇouuɐɔ ɹǝʎɐꞁԀ ǝɥʇ ʇɐɥʇ sǝᴉʇᴉʇuƎ -carryon.general.blacklist.forbiddentiles=dn ʞɔᴉd ʇouuɐɔ ɹǝʎɐꞁԀ ǝɥʇ ʇɐɥʇ sʞɔoꞁᗺ -carryon.category.custompickupconditions.custompickupconditionsblocks=suoᴉʇᴉpuoƆ dnʞɔᴉԀ ʞɔoꞁᗺ ɯoʇsnƆ -carryon.category.custompickupconditions.custompickupconditionsentities=suoᴉʇᴉpuoƆ dnʞɔᴉԀ ʎʇᴉʇuƎ ɯoʇsnƆ - -key.carry.desc=ʎɹɹɐƆ -key.carry.category=uO ʎɹɹɐƆ diff --git a/src/main/resources/assets/carryon/lang/en_US.lang b/src/main/resources/assets/carryon/lang/en_US.lang deleted file mode 100644 index e854bf1..0000000 --- a/src/main/resources/assets/carryon/lang/en_US.lang +++ /dev/null @@ -1,14 +0,0 @@ -carryon.category.settings=Settings -carryon.category.blacklist=Blacklist -carryon.category.modeloverrides=Model Overrides (Advanced) -carryon.category.custompickupconditions=Custom Pickup Conditions (Advanced) -carryon.category.whitelist=Whitelist - -carryon.general.modeloverrides.modeloverrides=Model Overrides -carryon.general.blacklist.forbiddenentities=Entities that the Player cannot pick up -carryon.general.blacklist.forbiddentiles=Blocks that the Player cannot pick up -carryon.category.custompickupconditions.custompickupconditionsblocks=Custom Block Pickup Conditions -carryon.category.custompickupconditions.custompickupconditionsentities=Custom Entity Pickup Conditions - -key.carry.desc=Carry -key.carry.category=Carry On \ No newline at end of file diff --git a/src/main/resources/assets/carryon/logo.png b/src/main/resources/assets/carryon/logo.png deleted file mode 100644 index 1b9a97859cd4353dd102e0580fbbf74e7773c4e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173666 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ğKb!TC27S>i*g)>Yg7#|<==FVUbiRx+2 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
P!H$NWhMJi{#g{Wiep(U{z- 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 H;wJWg{8KjN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/carryon/textures/items/tile.png b/src/main/resources/assets/carryon/textures/item/tile.png similarity index 100% rename from src/main/resources/assets/carryon/textures/items/tile.png rename to src/main/resources/assets/carryon/textures/item/tile.png diff --git a/src/main/resources/carryon.client.json b/src/main/resources/carryon.client.json new file mode 100644 index 0000000..f004681 --- /dev/null +++ b/src/main/resources/carryon.client.json @@ -0,0 +1,16 @@ +{ + "required": true, + "package": "tschipp.carryon.mixin.client", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "PlayerRendererMixin", + "BipedModelMixin", + "ArmorRendererMixin", + "FirstPersonMixin", + "MouseMixin", + "KeyboardMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/carryon.common.json b/src/main/resources/carryon.common.json new file mode 100644 index 0000000..08ca5c5 --- /dev/null +++ b/src/main/resources/carryon.common.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "tschipp.carryon.mixin.common", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "BlockStateMixin", + "EntityMixin", + "PlayerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..020b154 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,12 @@ +{ + "id": "carryon", + "name": "Carry On", + "version": "1.0.0", + "side": "universal", + "initializer": "tschipp.carryon.CarryOn", + "description": "Carry On for Fabric", + "mixins": { + "client": "carryon.client.json", + "common": "carryon.common.json" + } +} \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info deleted file mode 100644 index 17e2a17..0000000 --- a/src/main/resources/mcmod.info +++ /dev/null @@ -1,16 +0,0 @@ -[ -{ - "modid" : "carryon", - "name" : "Carry On", - "version" : "1.9.1", "mcversion" : "1.11.2", - "url" : "", - "credits" : "Tschipp, Purplicious_Cow, cy4n", - "authorList" : ["Tschipp, Purplicious_Cow, cy4n"], - "description": "Carry On is a simple mod that improves game interaction by allowing players to pick up, carry, and place single block Tile Entities using only their empty hands.", - "logoFile" : "assets/carryon/logo.png", - "updateUrl" : "https://gist.githubusercontent.com/Tschipp/dccadee7c90d7a34e6e76a35d9d6fa2e/raw/5115328bf7c35d5c5cea64bdb58becd2ca17fcac/update.json", - "parent" : "", - "dependencies": [], - "screenshots": [] -} -]