From 65d3f58eaab8f0ec7a04498f1341020c231b8dc2 Mon Sep 17 00:00:00 2001 From: Tschipp Date: Sat, 23 Mar 2019 22:59:49 +0100 Subject: [PATCH] Update to 1.13.2 --- .gitignore | 4 +- build.bat | 2 - build.gradle | 159 ++-- carryon-scripts | 0 gradle.properties | 4 + gradle/wrapper/gradle-wrapper.jar | Bin 52271 -> 54708 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 110 +-- gradlew.bat | 14 +- setup.bat | 2 - src/main/java/tschipp/carryon/CarryOn.java | 129 ++-- .../tschipp/carryon/client/ClientProxy.java | 32 - .../client/event/RenderEntityEvents.java | 231 ++---- .../carryon/client/event/RenderEvents.java | 376 +++++----- .../carryon/client/gui/GuiConfigCarryOn.java | 96 +-- .../carryon/client/gui/GuiFactoryCarryOn.java | 98 +-- .../client/keybinds/CarryOnKeybinds.java | 10 +- .../tschipp/carryon/common/CommonProxy.java | 63 -- .../common/capabilities/PositionProvider.java | 45 +- .../common/capabilities/PositionStorage.java | 20 +- .../common/capabilities/TEPosition.java | 2 - .../event/PositionClientEvents.java | 36 +- .../event/PositionCommonEvents.java | 7 +- .../common/command/CommandCarryOn.java | 276 ++++--- .../common/command/CommandCarryOnReload.java | 80 --- .../carryon/common/config/CarryOnConfig.java | 157 ++-- .../carryon/common/config/Configs.java | 680 +++++++++++------- .../carryon/common/event/IMCEvents.java | 61 ++ .../common/event/ItemEntityEvents.java | 50 +- .../carryon/common/event/ItemEvents.java | 179 +++-- .../handler/CustomPickupOverrideHandler.java | 57 +- .../carryon/common/handler/ListHandler.java | 162 +++-- .../common/handler/ModelOverridesHandler.java | 236 +++--- .../carryon/common/handler/PickupHandler.java | 64 +- .../common/handler/RegistrationHandler.java | 26 +- .../common/helper/InvalidConfigException.java | 2 + .../helper/KeyboardCallbackWrapper.java | 45 ++ .../common/helper/ReflectionHelper.java | 246 +++++++ .../carryon/common/helper/ReflectionUtil.java | 6 +- .../common/helper/ScriptParseHelper.java | 18 +- .../common/helper/ScrollCallbackWrapper.java | 38 + .../carryon/common/helper/StringParser.java | 120 ++-- .../carryon/common/item/ItemEntity.java | 106 +-- .../tschipp/carryon/common/item/ItemTile.java | 259 ++++--- .../common/scripting/CarryOnOverride.java | 46 +- .../common/scripting/ScriptChecker.java | 47 +- .../common/scripting/ScriptReader.java | 319 ++++---- .../compat/obfuscate/ObfuscateEvents.java | 171 ++--- .../network/client/CarrySlotPacket.java | 79 +- .../client/CarrySlotPacketHandler.java | 59 -- .../network/client/ScriptReloadPacket.java | 31 +- .../client/ScriptReloadPacketHandler.java | 35 - .../network/server/SyncKeybindPacket.java | 44 +- .../server/SyncKeybindPacketHandler.java | 34 - .../tschipp/carryon/proxy/ClientProxy.java | 37 + .../java/tschipp/carryon/proxy/IProxy.java | 15 + .../tschipp/carryon/proxy/ServerProxy.java | 28 + src/main/resources/META-INF/mods.toml | 33 + .../resources/assets/carryon/lang/en_UD.lang | 14 - .../resources/assets/carryon/lang/en_US.lang | 14 - .../resources/assets/carryon/lang/en_ud.json | 16 + .../resources/assets/carryon/lang/en_us.json | 16 + .../item/{tile.json => entity_item.json} | 2 +- .../assets/carryon/models/item/tile_item.json | 6 + .../carryon/textures/{items => item}/tile.png | Bin .../resources/{assets/carryon => }/logo.png | Bin src/main/resources/mcmod.info | 16 - src/main/resources/pack.mcmeta | 7 + 68 files changed, 2832 insertions(+), 2548 deletions(-) delete mode 100644 build.bat delete mode 100644 carryon-scripts create mode 100644 gradle.properties delete mode 100644 setup.bat delete mode 100644 src/main/java/tschipp/carryon/client/ClientProxy.java delete mode 100644 src/main/java/tschipp/carryon/common/CommonProxy.java delete mode 100644 src/main/java/tschipp/carryon/common/command/CommandCarryOnReload.java create mode 100644 src/main/java/tschipp/carryon/common/event/IMCEvents.java create mode 100644 src/main/java/tschipp/carryon/common/helper/KeyboardCallbackWrapper.java create mode 100644 src/main/java/tschipp/carryon/common/helper/ReflectionHelper.java create mode 100644 src/main/java/tschipp/carryon/common/helper/ScrollCallbackWrapper.java delete mode 100644 src/main/java/tschipp/carryon/network/client/CarrySlotPacketHandler.java delete mode 100644 src/main/java/tschipp/carryon/network/client/ScriptReloadPacketHandler.java delete mode 100644 src/main/java/tschipp/carryon/network/server/SyncKeybindPacketHandler.java create mode 100644 src/main/java/tschipp/carryon/proxy/ClientProxy.java create mode 100644 src/main/java/tschipp/carryon/proxy/IProxy.java create mode 100644 src/main/java/tschipp/carryon/proxy/ServerProxy.java create mode 100644 src/main/resources/META-INF/mods.toml delete mode 100644 src/main/resources/assets/carryon/lang/en_UD.lang delete mode 100644 src/main/resources/assets/carryon/lang/en_US.lang create mode 100644 src/main/resources/assets/carryon/lang/en_ud.json create mode 100644 src/main/resources/assets/carryon/lang/en_us.json rename src/main/resources/assets/carryon/models/item/{tile.json => entity_item.json} (60%) create mode 100644 src/main/resources/assets/carryon/models/item/tile_item.json rename src/main/resources/assets/carryon/textures/{items => item}/tile.png (100%) rename src/main/resources/{assets/carryon => }/logo.png (100%) delete mode 100644 src/main/resources/mcmod.info create mode 100644 src/main/resources/pack.mcmeta diff --git a/.gitignore b/.gitignore index 1d4f18f..12f8644 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ bin .metadata .classpath .project -.DS_Store # idea out @@ -22,4 +21,5 @@ build eclipse run -gradle\.properties +# Files from Forge MDK +forge*changelog.txt 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 c5679ad..279b755 100644 --- a/build.gradle +++ b/build.gradle @@ -1,88 +1,113 @@ buildscript { repositories { + maven { url = 'https://files.minecraftforge.net/maven' } jcenter() - maven { url = "http://files.minecraftforge.net/maven" } - + mavenCentral() } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true } } - - - -apply plugin: 'net.minecraftforge.gradle.forge' - -version = "1.0" -group = "tschipp.carryon" -archivesBaseName = "carryon" - -sourceCompatibility = targetCompatibility = '1.8' -compileJava { - sourceCompatibility = targetCompatibility = '1.8' -} - -minecraft { - version = "1.12.2-14.23.4.2765" - runDir = "run" - - mappings = "snapshot_20171003" - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. -} - repositories { - - maven { url 'http://maven.epoxide.org' } - maven { url = "https://mrcrayfish.com/maven" } + maven { url = "https://minecraft.curseforge.com/api/maven/" } } +apply plugin: 'net.minecraftforge.gradle' +// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. +apply plugin: 'eclipse' + +version = '1.0' +group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = 'modid' + +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. + +minecraft { + + mappings channel: 'snapshot', version: '20180921-1.13' + // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. + + // accessTransformer = file('build/resources/main/META-INF/accesstransformer.cfg') + + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. + runs { + client { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + mods { + examplemod { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + mods { + examplemod { + source sourceSets.main + } + } + } + } +} + dependencies { - // deobfCompile "net.darkhax.gamestages:GameStages-1.12.2:2.0.91" - - compile "com.mrcrayfish:obfuscate:0.2.6-1.12.2" + minecraft 'net.minecraftforge:forge:1.13.2-25.0.85' + + // You may put jars on which you depend on in ./libs or you may define them like so.. + // compile "some.group:artifact:version:classifier" + // compile "some.group:artifact:version" + + // Real examples + // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env + // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env + + // compile "obfuscate:Obfuscate:0.3.0" + + // The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. + // provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // These dependencies get remapped to your current MCP mappings + // deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // For more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html } -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 +// Example for how to get properties into the manifest for reading by the runtime.. +jar { + manifest { + attributes([ + "Specification-Title": "examplemod", + "Specification-Vendor": "examplemodsareus", + "Specification-Version": "1", // We are version 1 of ourselves + "Implementation-Title": project.name, + "Implementation-Version": "${version}", + "Implementation-Vendor" :"examplemodsareus", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) } - - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' - } -} - -task signJar(type: SignJar, dependsOn: reobfJar) { - - // Skips if the keyStore property is missing. - onlyIf { - project.hasProperty('keyStore') - } - - // findProperty allows us to reference the property without it existing. - // Using project.propName would cause the script to fail validation if - // the property did not exist. - keyStore = project.findProperty('keyStore') - alias = project.findProperty('keyStoreAlias') - storePass = project.findProperty('keyStorePass') - keyPass = project.findProperty('keyStoreKeyPass') - inputFile = jar.archivePath - outputFile = jar.archivePath -} - -// Runs this task automatically when build is ran. -build.dependsOn signJar - +} \ No newline at end of file diff --git a/carryon-scripts b/carryon-scripts deleted file mode 100644 index e69de29..0000000 diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..878bf1f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +# 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 +org.gradle.daemon=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 30d399d8d2bf522ff5de94bf434a7cc43a9a74b5..7a3265ee94c0ab25cf079ac8ccdf87f41d455d42 100644 GIT binary patch delta 29215 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e18cba7..949819d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Mon Sep 14 12:28:28 PDT 2015 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.9-bin.zip diff --git a/gradlew b/gradlew index 91a7e26..cccdd3d 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,47 +6,6 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=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" @@ -61,9 +20,49 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +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" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -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` @@ -154,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# 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" "$@" 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/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 83aade7..2f8b4a8 100644 --- a/src/main/java/tschipp/carryon/CarryOn.java +++ b/src/main/java/tschipp/carryon/CarryOn.java @@ -5,70 +5,101 @@ import java.io.File; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.ModLoadingContext; 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.FMLFingerprintViolationEvent; -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.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLFingerprintViolationEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLPaths; +import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.network.simple.SimpleChannel; +import tschipp.carryon.common.config.Configs; +import tschipp.carryon.common.handler.RegistrationHandler; +import tschipp.carryon.common.scripting.ScriptReader; +import tschipp.carryon.network.client.CarrySlotPacket; +import tschipp.carryon.network.client.ScriptReloadPacket; +import tschipp.carryon.network.server.SyncKeybindPacket; +import tschipp.carryon.proxy.ClientProxy; +import tschipp.carryon.proxy.IProxy; +import tschipp.carryon.proxy.ServerProxy; -@EventBusSubscriber -@Mod(modid = CarryOn.MODID, name = CarryOn.NAME, version = CarryOn.VERSION, guiFactory = "tschipp.carryon.client.gui.GuiFactoryCarryOn", dependencies = CarryOn.DEPENDENCIES, updateJSON = CarryOn.UPDATE_JSON, acceptedMinecraftVersions = CarryOn.ACCEPTED_VERSIONS, certificateFingerprint = CarryOn.CERTIFICATE_FINGERPRINT) -public class CarryOn { +@Mod(CarryOn.MODID) +@EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class CarryOn +{ - @SidedProxy(clientSide = "tschipp.carryon.client.ClientProxy", serverSide = "tschipp.carryon.common.CommonProxy") - public static CommonProxy proxy; - - // Instance - @Instance(CarryOn.MODID) - public static CarryOn instance; + public static IProxy proxy = DistExecutor.runForDist(() -> () -> new ClientProxy(), () -> () -> new ServerProxy()); public static final String MODID = "carryon"; - public static final String VERSION = "1.12"; - public static final String NAME = "Carry On"; - public static final String ACCEPTED_VERSIONS = "[1.12.2,1.13)"; - public static final String UPDATE_JSON = "https://gist.githubusercontent.com/Tschipp/dccadee7c90d7a34e6e76a35d9d6fa2e/raw/"; + public static final String VERSION = "1.12.2"; public static final Logger LOGGER = LogManager.getFormatterLogger("CarryOn"); public static final String DEPENDENCIES = "required-after:forge@[13.20.1.2386,);after:gamestages;"; public static final String CERTIFICATE_FINGERPRINT = "55e88f24d04398481ae6f1ce76f65fd776f14227"; public static File CONFIGURATION_FILE; - - public static SimpleNetworkWrapper network; - @EventHandler - public void preInit(FMLPreInitializationEvent event){ - CarryOn.proxy.preInit(event); - } + public static boolean FINGERPRINT_VIOLATED = false; - @EventHandler - public void init(FMLInitializationEvent event) { - CarryOn.proxy.init(event); - } + public static SimpleChannel network; - @EventHandler - public void postInit(FMLPostInitializationEvent event) { - CarryOn.proxy.postInit(event); - } - - @EventHandler - public void serverLoad(FMLServerStartingEvent event) + public CarryOn() { - event.registerServerCommand(new CommandCarryOn()); - event.registerServerCommand(new CommandCarryOnReload()); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); + + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, Configs.CLIENT_CONFIG); + ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, Configs.SERVER_CONFIG); + + Configs.loadConfig(Configs.CLIENT_CONFIG, FMLPaths.CONFIGDIR.get().resolve("carryon-client.toml")); + Configs.loadConfig(Configs.SERVER_CONFIG, FMLPaths.CONFIGDIR.get().resolve("carryon-server.toml")); + } - - @EventHandler - public void onFingerprintViolation(FMLFingerprintViolationEvent event) { - + + private void setup(final FMLCommonSetupEvent event) + { + // PreInitevent. + ScriptReader.preInit(); + CarryOn.network = NetworkRegistry.newSimpleChannel(new ResourceLocation(CarryOn.MODID, "carryonpackets"), () -> CarryOn.VERSION, s -> true, s -> true); + + // CLIENT PACKETS + CarryOn.network.registerMessage(0, CarrySlotPacket.class, CarrySlotPacket::toBytes, CarrySlotPacket::new, CarrySlotPacket::handle); + CarryOn.network.registerMessage(1, ScriptReloadPacket.class, ScriptReloadPacket::toBytes, ScriptReloadPacket::new, ScriptReloadPacket::handle); + + // SERVER PACKETS + CarryOn.network.registerMessage(2, SyncKeybindPacket.class, SyncKeybindPacket::toBytes, SyncKeybindPacket::new, SyncKeybindPacket::handle); + + + RegistrationHandler.regCommonEvents(); + + // Init + ScriptReader.parseScripts(); + RegistrationHandler.regOverrideList(); + RegistrationHandler.regCaps(); + + + proxy.setup(event); + } + + @SubscribeEvent + public static void onRegistry(RegistryEvent.Register event) + { + RegistrationHandler.regItems(); + + event.getRegistry().register(RegistrationHandler.itemEntity); + event.getRegistry().register(RegistrationHandler.itemTile); + } + + @SubscribeEvent + public void onFingerprintViolation(FMLFingerprintViolationEvent event) + { + LOGGER.error("WARNING! Invalid fingerprint detected! The file " + event.getSource().getName() + " may have been tampered with! If you didn't download the file from https://minecraft.curseforge.com/projects/carry-on or through any kind of mod launcher, immediately delete the file and re-download it from https://minecraft.curseforge.com/projects/carry-on"); - } + FINGERPRINT_VIOLATED = true; + } } \ 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 index 09e9fa6..b3ae7e7 100644 --- a/src/main/java/tschipp/carryon/client/event/RenderEntityEvents.java +++ b/src/main/java/tschipp/carryon/client/event/RenderEntityEvents.java @@ -1,150 +1,52 @@ 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.EntityLiving; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EntityType; 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.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; 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 net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; 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()[8]; - 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) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void renderHand(RenderHandEvent event) { - World world = Minecraft.getMinecraft().world; - EntityPlayer player = Minecraft.getMinecraft().player; + World world = Minecraft.getInstance().world; + EntityPlayer player = Minecraft.getInstance().player; ItemStack stack = player.getHeldItemMainhand(); - int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView; + int perspective = Minecraft.getInstance().gameSettings.thirdPersonView; float partialticks = event.getPartialTicks(); if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) { - if(Loader.isModLoaded("realrender") || Loader.isModLoaded("rfpr")) + if(ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr")) return; @@ -160,35 +62,35 @@ public class RenderEntityEvents 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(); + GlStateManager.scaled(.8, .8, .8); + GlStateManager.rotatef(180, 0, 1, 0); + GlStateManager.translated(0.0, -height - .1, width + 0.1); + GlStateManager.enableAlphaTest(); if (perspective == 0) { RenderHelper.enableStandardItemLighting(); - Minecraft.getMinecraft().getRenderManager().setRenderShadow(false); + Minecraft.getInstance().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()); + double[] scaled = ScriptParseHelper.getscaled(carryOverride.getRenderscaled()); String entityname = carryOverride.getRenderNameEntity(); if (entityname != null) { - Entity newEntity = EntityList.createEntityByIDFromName(new ResourceLocation(entityname), world); + Entity newEntity = EntityType.create(world, new ResourceLocation(entityname)); if (newEntity != null) { NBTTagCompound nbttag = carryOverride.getRenderNBT(); if (nbttag != null) - newEntity.readFromNBT(nbttag); + newEntity.deserializeNBT(nbttag); entity = newEntity; entity.setPosition(d0, d1, d2); entity.rotationYaw = 0.0f; @@ -197,27 +99,30 @@ public class RenderEntityEvents } } - 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]); + GlStateManager.translated(translation[0], translation[1], translation[2]); + GlStateManager.rotatef((float) rotation[0], 1, 0, 0); + GlStateManager.rotatef((float) rotation[1], 0, 1, 0); + GlStateManager.rotatef((float) rotation[2], 0, 0, 1); + GlStateManager.scaled(scaled[0], scaled[1], scaled[2]); } + if(entity instanceof EntityLiving) + ((EntityLiving) entity).hurtTime = 0; + this.renderEntityStatic(entity); - Minecraft.getMinecraft().getRenderManager().setRenderShadow(true); + Minecraft.getInstance().getRenderManager().setRenderShadow(true); } - GlStateManager.disableAlpha(); - GlStateManager.scale(1, 1, 1); + GlStateManager.disableAlphaTest(); + GlStateManager.scaled(1, 1, 1); GlStateManager.popMatrix(); RenderHelper.disableStandardItemLighting(); GlStateManager.disableRescaleNormal(); - GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GlStateManager.activeTexture(OpenGlHelper.GL_TEXTURE1); GlStateManager.disableTexture2D(); - GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); + GlStateManager.activeTexture(OpenGlHelper.GL_TEXTURE0); if (perspective == 0) { @@ -227,7 +132,7 @@ public class RenderEntityEvents } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) private void renderEntityStatic(Entity entity) { if (entity.ticksExisted == 0) @@ -238,7 +143,7 @@ public class RenderEntityEvents } float f = entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw); - int i = this.getBrightnessForRender(entity, Minecraft.getMinecraft().player); + int i = this.getBrightnessForRender(entity, Minecraft.getInstance().player); if (entity.isBurning()) { @@ -247,18 +152,19 @@ public class RenderEntityEvents int j = i % 65536; int k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, j, k); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + OpenGlHelper.glMultiTexCoord2f(OpenGlHelper.GL_TEXTURE1, j, k); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + this.setLightmapDisabled(false); - Minecraft.getMinecraft().getRenderManager().renderEntity(entity, 0.0D, 0.0D, 0.0D, f, 0.0F, true); + Minecraft.getInstance().getRenderManager().renderEntity(entity, 0.0D, 0.0D, 0.0D, f, 0.0F, true); this.setLightmapDisabled(true); } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) private int getBrightnessForRender(Entity entity, EntityPlayer player) { BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(MathHelper.floor(player.posX), 0, MathHelper.floor(player.posZ)); @@ -274,10 +180,10 @@ public class RenderEntityEvents } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) private void setLightmapDisabled(boolean disabled) { - GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GlStateManager.activeTexture(OpenGlHelper.GL_TEXTURE1); if (disabled) { @@ -288,20 +194,20 @@ public class RenderEntityEvents GlStateManager.enableTexture2D(); } - GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); + GlStateManager.activeTexture(OpenGlHelper.GL_TEXTURE0); } /* * Renders the Entity in Third Person */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void onPlayerRenderPost(RenderPlayerEvent.Post event) { - World world = Minecraft.getMinecraft().world; + World world = Minecraft.getInstance().world; EntityPlayer player = event.getEntityPlayer(); event.getRenderer().getMainModel(); - EntityPlayerSP clientPlayer = Minecraft.getMinecraft().player; + EntityPlayerSP clientPlayer = Minecraft.getInstance().player; ItemStack stack = player.getHeldItemMainhand(); float partialticks = event.getPartialRenderTick(); @@ -310,7 +216,7 @@ public class RenderEntityEvents Entity entity = ItemEntity.getEntity(stack, world); float rotation = 0; - if (player.isRiding() && player.getRidingEntity() instanceof EntityLivingBase) + if (player.getRidingEntity() != null && player.getRidingEntity() instanceof EntityLivingBase) rotation = -(player.prevRotationYawHead + (player.rotationYawHead - player.prevRotationYawHead) * partialticks); else rotation = -(player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialticks); @@ -339,36 +245,36 @@ public class RenderEntityEvents 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); + GlStateManager.translated(xOffset, yOffset, zOffset); + GlStateManager.scaled((10 - multiplier) * 0.08, (10 - multiplier) * 0.08, (10 - multiplier) * 0.08); + GlStateManager.rotatef(rotation, 0, 1f, 0); + GlStateManager.translated(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((ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr")) && Minecraft.getInstance().gameSettings.thirdPersonView == 0) + GlStateManager.translated(0, 0, -0.3); if (player.isSneaking()) { - GlStateManager.translate(0, -0.3, 0); + GlStateManager.translated(0, -0.3, 0); } - Minecraft.getMinecraft().getRenderManager().setRenderShadow(false); + Minecraft.getInstance().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()); + double[] scaled = ScriptParseHelper.getscaled(carryOverride.getRenderscaled()); String entityname = carryOverride.getRenderNameEntity(); if (entityname != null) { - Entity newEntity = EntityList.createEntityByIDFromName(new ResourceLocation(entityname), world); + Entity newEntity = EntityType.create(world, new ResourceLocation(entityname)); if (newEntity != null) { NBTTagCompound nbttag = carryOverride.getRenderNBT(); if (nbttag != null) - newEntity.readFromNBT(nbttag); + newEntity.deserializeNBT(nbttag); entity = newEntity; entity.setPosition(c0, c1, c2); entity.rotationYaw = 0.0f; @@ -377,18 +283,21 @@ public class RenderEntityEvents } } - 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]); + GlStateManager.translated(translation[0], translation[1], translation[2]); + GlStateManager.rotatef((float) rot[0], 1, 0, 0); + GlStateManager.rotatef((float) rot[1], 0, 1, 0); + GlStateManager.rotatef((float) rot[2], 0, 0, 1); + GlStateManager.scaled(scaled[0], scaled[1], scaled[2]); } - Minecraft.getMinecraft().getRenderManager().renderEntityStatic(entity, 0.0f, false); - Minecraft.getMinecraft().getRenderManager().setRenderShadow(true); + if(entity instanceof EntityLiving) + ((EntityLiving) entity).hurtTime = 0; + + Minecraft.getInstance().getRenderManager().renderEntityStatic(entity, 0.0f, false); + Minecraft.getInstance().getRenderManager().setRenderShadow(true); - GlStateManager.scale(1, 1, 1); + GlStateManager.scaled(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 index a8313a6..ebb0660 100644 --- a/src/main/java/tschipp/carryon/client/event/RenderEvents.java +++ b/src/main/java/tschipp/carryon/client/event/RenderEvents.java @@ -1,24 +1,22 @@ package tschipp.carryon.client.event; -import java.io.File; -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.GameSettings; 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.entity.model.ModelPlayer; +import net.minecraft.client.renderer.entity.model.ModelRenderer; +import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -29,26 +27,31 @@ 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.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.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; 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.common.config.Configuration; +import net.minecraftforge.client.event.RenderSpecificHandEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.fml.ModList; 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.config.Configs.Settings; import tschipp.carryon.common.handler.ModelOverridesHandler; import tschipp.carryon.common.handler.RegistrationHandler; +import tschipp.carryon.common.helper.KeyboardCallbackWrapper.KeyPressedEvent; import tschipp.carryon.common.helper.ScriptParseHelper; +import tschipp.carryon.common.helper.ScrollCallbackWrapper.MouseScrolledEvent; import tschipp.carryon.common.helper.StringParser; import tschipp.carryon.common.item.ItemEntity; import tschipp.carryon.common.item.ItemTile; @@ -58,36 +61,37 @@ import tschipp.carryon.network.server.SyncKeybindPacket; public class RenderEvents { - private static boolean initModels; - /* * Prevents the Player from scrolling */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent - public void onScroll(MouseEvent event) + public void onScroll(MouseScrolledEvent event) { - if (event.getDwheel() > 0 || event.getDwheel() < 0 || Minecraft.getMinecraft().gameSettings.keyBindPickBlock.isPressed()) - { - ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand(); + EntityPlayer player = Minecraft.getInstance().player; - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile) + if (player != null) + { + ItemStack stack = player.getHeldItemMainhand(); + + if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) { - if (ItemTile.hasTileData(stack)) + if (ItemTile.hasTileData(stack) || ItemEntity.hasEntityData(stack)) { event.setCanceled(true); } } } + } @SubscribeEvent - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public void onPlayerTick(PlayerTickEvent event) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { EntityPlayer player = event.player; - if (player != null && event.side == Side.CLIENT) + if (player != null && event.side == LogicalSide.CLIENT) { boolean keyPressed = CarryOnKeybinds.carryKey.isKeyDown(); boolean playerKeyPressed = CarryOnKeybinds.isKeyPressed(player); @@ -96,8 +100,7 @@ public class RenderEvents { CarryOnKeybinds.setKeyPressed(player, true); CarryOn.network.sendToServer(new SyncKeybindPacket(true)); - } - else if (!keyPressed && playerKeyPressed) + } else if (!keyPressed && playerKeyPressed) { CarryOnKeybinds.setKeyPressed(player, false); CarryOn.network.sendToServer(new SyncKeybindPacket(false)); @@ -106,7 +109,7 @@ public class RenderEvents } @SubscribeEvent - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public void onJoinWorld(EntityJoinWorldEvent event) { if (event.getEntity() instanceof EntityPlayer) @@ -116,31 +119,40 @@ public class RenderEvents { CarryOnKeybinds.setKeyPressed(player, false); CarryOn.network.sendToServer(new SyncKeybindPacket(false)); + + if (CarryOn.FINGERPRINT_VIOLATED) + { + TextComponentString cf = new TextComponentString(TextFormatting.AQUA + "Curseforge" + TextFormatting.RED); + cf.getStyle().setClickEvent(new ClickEvent(Action.OPEN_URL, "https://minecraft.curseforge.com/projects/carry-on")); + + player.sendMessage(new TextComponentString(TextFormatting.RED + "[CarryOn] WARNING! Invalid fingerprint detected! The Carry On mod file may have been tampered with! If you didn't download the file from ").appendSibling(cf).appendText(TextFormatting.RED + " or through any kind of mod launcher, immediately delete the file and re-download it from ").appendSibling(cf)); + } } + } } /* * Prevents the Player from opening Guis */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void onGuiInit(InitGuiEvent.Pre event) { if (event.getGui() != null) { boolean inventory = event.getGui() instanceof GuiContainer; - EntityPlayer player = Minecraft.getMinecraft().player; + EntityPlayer player = Minecraft.getInstance().player; if (player != null && inventory) { ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND); - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) + if (!stack.isEmpty() && ((stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) || (stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)))) { - Minecraft.getMinecraft().player.closeScreen(); - Minecraft.getMinecraft().currentScreen = null; - Minecraft.getMinecraft().setIngameFocus(); + Minecraft.getInstance().player.closeScreen(); + Minecraft.getInstance().currentScreen = null; + Minecraft.getInstance().mouseHelper.grabMouse(); } @@ -151,60 +163,67 @@ public class RenderEvents /* * Prevents the Player from switching Slots */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent - public void inputEvent(InputEvent event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException + public void inputEvent(KeyPressedEvent event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - GameSettings settings = Minecraft.getMinecraft().gameSettings; - Field field = KeyBinding.class.getDeclaredFields()[8]; - field.setAccessible(true); - ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand(); - EntityPlayer player = Minecraft.getMinecraft().player; + GameSettings settings = Minecraft.getInstance().gameSettings; + int key = event.key; + int scancode = event.scancode; + EntityPlayer player = Minecraft.getInstance().player; - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) + if (player != null) { - if (settings.keyBindDrop.isPressed()) + ItemStack stack = Minecraft.getInstance().player.getHeldItemMainhand(); + + if (!stack.isEmpty() && ((stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack)) || (stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)))) { - field.set(settings.keyBindDrop, false); - } - if (settings.keyBindSwapHands.isPressed()) - { - field.set(settings.keyBindSwapHands, false); - } - for (KeyBinding keyBind : settings.keyBindsHotbar) - { - if (keyBind.isPressed()) + if (settings.keyBindDrop.matchesKey(key, scancode)) { - field.set(keyBind, false); + event.setCanceled(true); + } + if (settings.keyBindSwapHands.matchesKey(key, scancode)) + { + event.setCanceled(true); + } + if (settings.keyBindPickBlock.matchesKey(key, scancode)) + { + event.setCanceled(true); + } + for (KeyBinding keyBind : settings.keyBindsHotbar) + { + if (keyBind.matchesKey(key, scancode)) + { + event.setCanceled(true); + } } } - } - int current = player.inventory.currentItem; + int current = player.inventory.currentItem; - if (player.getEntityData().hasKey("carrySlot") ? player.getEntityData().getInteger("carrySlot") != current : false) - { - player.inventory.currentItem = player.getEntityData().getInteger("carrySlot"); + if (player.getEntityData().hasKey("carrySlot") ? player.getEntityData().getInt("carrySlot") != current : false) + { + player.inventory.currentItem = player.getEntityData().getInt("carrySlot"); + } } } /* * Renders the Block in First Person */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void renderHand(RenderHandEvent event) { - World world = Minecraft.getMinecraft().world; - EntityPlayer player = Minecraft.getMinecraft().player; - AbstractClientPlayer aplayer = (AbstractClientPlayer) player; + World world = Minecraft.getInstance().world; + EntityPlayer player = Minecraft.getInstance().player; ItemStack stack = player.getHeldItemMainhand(); - int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView; - boolean f1 = Minecraft.getMinecraft().gameSettings.hideGUI; + int perspective = Minecraft.getInstance().gameSettings.thirdPersonView; + boolean f1 = Minecraft.getInstance().gameSettings.hideGUI; if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack) && perspective == 0 && !f1) { - if (Loader.isModLoaded("realrender") || Loader.isModLoaded("rfpr")) + if (ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr")) return; Block block = ItemTile.getBlock(stack); @@ -213,52 +232,51 @@ public class RenderEvents ItemStack tileStack = ItemTile.getItemStack(stack); GlStateManager.pushMatrix(); - GlStateManager.scale(2.5, 2.5, 2.5); - GlStateManager.translate(0, -0.6, -1); + GlStateManager.scaled(2.5, 2.5, 2.5); + GlStateManager.translated(0, -0.6, -1); GlStateManager.enableBlend(); - if (CarryOnConfig.settings.facePlayer ? !isChest(block) : isChest(block)) + if (Settings.facePlayer.get() ? !isChest(block) : isChest(block)) { - GlStateManager.rotate(180, 0, 1f, 0); - GlStateManager.rotate(-8, 1f, 0, 0); - } - else + GlStateManager.rotatef(180, 0, 1f, 0); + GlStateManager.rotatef(-8, 1f, 0, 0); + } else { - GlStateManager.rotate(8, 1f, 0, 0); + GlStateManager.rotatef(8, 1f, 0, 0); } - IBakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, world, player) : Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(tileStack, world, player); + IBakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, world, player) : (tileStack.isEmpty() ? Minecraft.getInstance().getBlockRendererDispatcher().getModelForState(state) : Minecraft.getInstance().getItemRenderer().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()); + double[] scaled = ScriptParseHelper.getscaled(carryOverride.getRenderscaled()); 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); + ItemStack s = new ItemStack(b, 1); + s.setTag(carryOverride.getRenderNBT()); + model = Minecraft.getInstance().getItemRenderer().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]); + GlStateManager.translated(translation[0], translation[1], translation[2]); + GlStateManager.rotatef((float) rotation[0], 1, 0, 0); + GlStateManager.rotatef((float) rotation[1], 0, 1, 0); + GlStateManager.rotatef((float) rotation[2], 0, 0, 1); + GlStateManager.scaled(scaled[0], scaled[1], scaled[2]); } - int i = this.getBrightnessForRender(Minecraft.getMinecraft().player); + int i = this.getBrightnessForRender(Minecraft.getInstance().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); + OpenGlHelper.glMultiTexCoord2f(OpenGlHelper.GL_TEXTURE1, j, k); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); this.setLightmapDisabled(false); - Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + Minecraft.getInstance().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); if (ModelOverridesHandler.hasCustomOverrideModel(state, tag)) { @@ -267,16 +285,14 @@ public class RenderEvents if (override instanceof ItemStack) { - Minecraft.getMinecraft().getRenderItem().renderItem((ItemStack) override, model); - } - else + Minecraft.getInstance().getItemRenderer().renderItem((ItemStack) override, model); + } else { - Minecraft.getMinecraft().getRenderItem().renderItem(tileStack.isEmpty() ? stack : tileStack, model); + Minecraft.getInstance().getItemRenderer().renderItem(tileStack.isEmpty() ? stack : tileStack, model); } - } - else + } else { - Minecraft.getMinecraft().getRenderItem().renderItem(tileStack.isEmpty() ? stack : tileStack, model); + Minecraft.getInstance().getItemRenderer().renderItem(tileStack.isEmpty() ? stack : tileStack, model); } this.setLightmapDisabled(true); @@ -287,13 +303,13 @@ public class RenderEvents } GlStateManager.disableBlend(); - GlStateManager.scale(1, 1, 1); + GlStateManager.scaled(1, 1, 1); GlStateManager.popMatrix(); } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) private int getBrightnessForRender(EntityPlayer player) { BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(MathHelper.floor(player.posX), 0, MathHelper.floor(player.posZ)); @@ -302,40 +318,38 @@ public class RenderEvents { blockpos$mutableblockpos.setY(MathHelper.floor(player.posY + player.getEyeHeight())); return player.world.getCombinedLight(blockpos$mutableblockpos, 0); - } - else + } else { return 0; } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) private void setLightmapDisabled(boolean disabled) { - GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GlStateManager.activeTexture(OpenGlHelper.GL_TEXTURE1); if (disabled) { GlStateManager.disableTexture2D(); - } - else + } else { GlStateManager.enableTexture2D(); } - GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); + GlStateManager.activeTexture(OpenGlHelper.GL_TEXTURE0); } /* * Renders the Block in Third Person */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void onPlayerRenderPost(RenderPlayerEvent.Post event) { - World world = Minecraft.getMinecraft().world; + World world = Minecraft.getInstance().world; EntityPlayer player = event.getEntityPlayer(); - EntityPlayerSP clientPlayer = Minecraft.getMinecraft().player; + EntityPlayerSP clientPlayer = Minecraft.getInstance().player; ItemStack stack = player.getHeldItemMainhand(); float partialticks = event.getPartialRenderTick(); @@ -348,7 +362,7 @@ public class RenderEvents float rotation = 0f; - if (player.isRiding() && player.getRidingEntity() instanceof EntityLivingBase) + if (player.getRidingEntity() != null && player.getRidingEntity() instanceof EntityLivingBase) rotation = -(player.prevRotationYawHead + (player.rotationYawHead - player.prevRotationYawHead) * partialticks); else rotation = -(player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialticks); @@ -366,55 +380,54 @@ public class RenderEvents double zOffset = d2 - c2; GlStateManager.pushMatrix(); - GlStateManager.translate(xOffset, yOffset, zOffset); - GlStateManager.scale(0.6, 0.6, 0.6); + GlStateManager.translated(xOffset, yOffset, zOffset); + GlStateManager.scaled(0.6, 0.6, 0.6); GlStateManager.enableBlend(); - if (CarryOnConfig.settings.facePlayer ? !isChest(block) : isChest(block)) + if (Settings.facePlayer.get() ? !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.rotatef(rotation, 0, 1.0f, 0); + GlStateManager.translated(0, 1.6, 0.65); + if ((ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr")) && Minecraft.getInstance().gameSettings.thirdPersonView == 0) + GlStateManager.translated(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); + GlStateManager.rotatef(rotation + 180, 0, 1.0f, 0); + GlStateManager.translated(0, 1.6, -0.65); + if ((ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr")) && Minecraft.getInstance().gameSettings.thirdPersonView == 0) + GlStateManager.translated(0, 0, 0.4); } if (player.isSneaking()) { - GlStateManager.translate(0, -0.3, 0); + GlStateManager.translated(0, -0.3, 0); } - IBakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, world, player) : Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(tileItem, world, player); + IBakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, world, player) : (tileItem.isEmpty() ? Minecraft.getInstance().getBlockRendererDispatcher().getModelForState(state) : Minecraft.getInstance().getItemRenderer().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()); + double[] scaled = ScriptParseHelper.getscaled(carryOverride.getRenderscaled()); 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); + ItemStack s = new ItemStack(b, 1); + s.setTag(carryOverride.getRenderNBT()); + model = Minecraft.getInstance().getItemRenderer().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]); + GlStateManager.translated(translation[0], translation[1], translation[2]); + GlStateManager.rotatef((float) rot[0], 1, 0, 0); + GlStateManager.rotatef((float) rot[1], 0, 1, 0); + GlStateManager.rotatef((float) rot[2], 0, 0, 1); + GlStateManager.scaled(scaled[0], scaled[1], scaled[2]); } - Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + Minecraft.getInstance().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); if (ModelOverridesHandler.hasCustomOverrideModel(state, tag)) { @@ -422,20 +435,18 @@ public class RenderEvents if (override instanceof ItemStack) { - Minecraft.getMinecraft().getRenderItem().renderItem((ItemStack) override, model); - } - else + Minecraft.getInstance().getItemRenderer().renderItem((ItemStack) override, model); + } else { - Minecraft.getMinecraft().getRenderItem().renderItem(tileItem.isEmpty() ? stack : tileItem, model); + Minecraft.getInstance().getItemRenderer().renderItem(tileItem.isEmpty() ? stack : tileItem, model); } - } - else + } else { - Minecraft.getMinecraft().getRenderItem().renderItem(tileItem.isEmpty() ? stack : tileItem, model); + Minecraft.getInstance().getItemRenderer().renderItem(tileItem.isEmpty() ? stack : tileItem, model); } GlStateManager.disableBlend(); - GlStateManager.scale(1, 1, 1); + GlStateManager.scaled(1, 1, 1); GlStateManager.popMatrix(); } } @@ -443,28 +454,26 @@ public class RenderEvents /* * Renders correct arm rotation */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent(priority = EventPriority.HIGH) public void onEvent(RenderPlayerEvent.Post event) { - if(!CarryOnConfig.settings.renderArms) + if (!Settings.renderArms.get()) return; - - if (handleMobends() && !Loader.isModLoaded("obfuscate")) + + if (handleMobends() && !ModList.get().isLoaded("obfuscate")) { EntityPlayer player = event.getEntityPlayer(); - EntityPlayerSP clientPlayer = Minecraft.getMinecraft().player; + EntityPlayerSP clientPlayer = Minecraft.getInstance().player; float partialticks = event.getPartialRenderTick(); - RenderPlayer render = event.getRenderer(); - ItemStack stack = player.getHeldItemMainhand(); if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) { ModelPlayer model = event.getRenderer().getMainModel(); float rotation = 0; - if (player.isRiding() && player.getRidingEntity() instanceof EntityLivingBase) + if (player.getRidingEntity() != null && player.getRidingEntity() instanceof EntityLivingBase) rotation = (player.prevRotationYawHead + (player.rotationYawHead - player.prevRotationYawHead) * partialticks); else rotation = (player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialticks); @@ -485,9 +494,9 @@ public class RenderEvents double zOffset = d2 - c2; GlStateManager.pushMatrix(); - GlStateManager.translate(xOffset, yOffset, zOffset); + GlStateManager.translated(xOffset, yOffset, zOffset); - Minecraft.getMinecraft().getTextureManager().bindTexture(skinLoc); + Minecraft.getInstance().getTextureManager().bindTexture(skinLoc); CarryOnOverride overrider = ScriptChecker.getOverride(player); if (overrider != null) @@ -506,8 +515,7 @@ public class RenderEvents { renderArmPost(model.bipedLeftArm, (float) rotLeft[0], (float) rotLeft[2], rotation, false, player.isSneaking()); renderArmPost(model.bipedLeftArmwear, (float) rotLeft[0], (float) rotLeft[2], rotation, false, player.isSneaking()); - } - else if (renderLeft) + } else if (renderLeft) { renderArmPost(model.bipedLeftArm, 2.0F + (player.isSneaking() ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity ? 0.3f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation, false, player.isSneaking()); renderArmPost(model.bipedLeftArmwear, 2.0F + (player.isSneaking() ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity ? 0.3f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation, false, player.isSneaking()); @@ -517,15 +525,13 @@ public class RenderEvents { renderArmPost(model.bipedRightArm, (float) rotRight[0], (float) rotRight[2], rotation, true, player.isSneaking()); renderArmPost(model.bipedRightArmwear, (float) rotRight[0], (float) rotRight[2], rotation, true, player.isSneaking()); - } - else if (renderRight) + } else if (renderRight) { renderArmPost(model.bipedRightArm, 2.0F + (player.isSneaking() ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity ? 0.3f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation, true, player.isSneaking()); renderArmPost(model.bipedRightArmwear, 2.0F + (player.isSneaking() ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity ? 0.3f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation, true, player.isSneaking()); } - } - else + } else { renderArmPost(model.bipedRightArm, 2.0F + (player.isSneaking() ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity ? 0.3f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation, true, player.isSneaking()); renderArmPost(model.bipedLeftArm, 2.0F + (player.isSneaking() ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity ? 0.3f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation, false, player.isSneaking()); @@ -540,21 +546,21 @@ public class RenderEvents /* * Hides the vanilla arm for rendering the rotation */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent(priority = EventPriority.NORMAL) public void onEvent(RenderPlayerEvent.Pre event) { - if(!CarryOnConfig.settings.renderArms) + if (!Settings.renderArms.get()) return; - - if (handleMobends() && !Loader.isModLoaded("obfuscate")) + + if (handleMobends() && !ModList.get().isLoaded("obfuscate")) { EntityPlayer player = event.getEntityPlayer(); ItemStack stack = player.getHeldItemMainhand(); if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) { ModelPlayer model = event.getRenderer().getMainModel(); - + CarryOnOverride overrider = ScriptChecker.getOverride(player); if (overrider != null) { @@ -565,8 +571,7 @@ public class RenderEvents { renderArmPre(model.bipedRightArm); renderArmPre(model.bipedRightArmwear); - - + } if (renderLeft) @@ -574,8 +579,7 @@ public class RenderEvents renderArmPre(model.bipedLeftArm); renderArmPre(model.bipedLeftArmwear); } - } - else + } else { renderArmPre(model.bipedRightArm); renderArmPre(model.bipedLeftArm); @@ -586,7 +590,7 @@ public class RenderEvents } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public void renderArmPost(ModelRenderer arm, float x, float z, float rotation, boolean right, boolean sneaking) { arm.isHidden = false; @@ -594,8 +598,7 @@ public class RenderEvents { arm.rotationPointZ = -MathHelper.sin((float) Math.toRadians(rotation)) * 4.75F; arm.rotationPointX = -MathHelper.cos((float) Math.toRadians(rotation)) * 4.75F; - } - else + } else { arm.rotationPointZ = MathHelper.sin((float) Math.toRadians(rotation)) * 4.75F; arm.rotationPointX = MathHelper.cos((float) Math.toRadians(rotation)) * 4.75F; @@ -613,7 +616,7 @@ public class RenderEvents arm.rotationPointY = 2; } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public void renderArmPre(ModelRenderer arm) { arm.isHidden = true; @@ -621,13 +624,17 @@ public class RenderEvents public boolean handleMobends() { - if (Loader.isModLoaded("mobends")) - { - Configuration config = new Configuration(new File(CarryOn.CONFIGURATION_FILE.getPath().substring(0, CarryOn.CONFIGURATION_FILE.getPath().length() - 16), "mobends.cfg")); - - boolean renderPlayer = config.get("animated", "player", true).getBoolean(); - return !renderPlayer; - } + // TODO MOBENDS + // if (ModList.get().isLoaded("mobends")) + // { + // Configuration config = new Configuration(new + // File(CarryOn.CONFIGURATION_FILE.getPath().substring(0, + // CarryOn.CONFIGURATION_FILE.getPath().length() - 16), "mobends.cfg")); + // + // boolean renderPlayer = config.get("animated", "player", + // true).getBoolean(); + // return !renderPlayer; + // } return true; } @@ -636,30 +643,29 @@ public class RenderEvents return block == Blocks.CHEST || block == Blocks.ENDER_CHEST || block == Blocks.TRAPPED_CHEST; } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) private static RenderPlayer getRenderPlayer(AbstractClientPlayer player) { - Minecraft mc = Minecraft.getMinecraft(); + Minecraft mc = Minecraft.getInstance(); RenderManager manager = mc.getRenderManager(); return manager.getSkinMap().get(player.getSkinType()); } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) private static ModelPlayer getPlayerModel(AbstractClientPlayer player) { return getRenderPlayer(player).getMainModel(); } @SubscribeEvent - @SideOnly(Side.CLIENT) - public void hideItems(RenderPlayerEvent.Specials.Pre event) + @OnlyIn(Dist.CLIENT) + public void hideItems(RenderSpecificHandEvent event) { - EntityPlayer player = event.getEntityPlayer(); - ItemStack stack = player.getHeldItemMainhand(); + ItemStack stack = event.getItemStack(); if (stack != null && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) { - event.setRenderItem(false); + event.setCanceled(true); } } } diff --git a/src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java b/src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java index d09828c..a537376 100644 --- a/src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java +++ b/src/main/java/tschipp/carryon/client/gui/GuiConfigCarryOn.java @@ -1,48 +1,48 @@ -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); - } -} +//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.get()(); +// +// 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 index 6c4521f..a222d1b 100644 --- a/src/main/java/tschipp/carryon/client/gui/GuiFactoryCarryOn.java +++ b/src/main/java/tschipp/carryon/client/gui/GuiFactoryCarryOn.java @@ -1,49 +1,49 @@ -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 +//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 index 25eaad2..e348c79 100644 --- a/src/main/java/tschipp/carryon/client/keybinds/CarryOnKeybinds.java +++ b/src/main/java/tschipp/carryon/client/keybinds/CarryOnKeybinds.java @@ -1,13 +1,11 @@ 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.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; public class CarryOnKeybinds { @@ -15,10 +13,10 @@ public class CarryOnKeybinds public static final String KEYBIND_KEY = "carryOnKeyPressed"; public static KeyBinding carryKey; - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public static void init() { - carryKey = new KeyBinding("key.carry.desc", Keyboard.KEY_LSHIFT, "key.carry.category"); + carryKey = new KeyBinding("key.carry.desc", 340, "key.carry.category"); ClientRegistry.registerKeyBinding(carryKey); } 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/PositionProvider.java b/src/main/java/tschipp/carryon/common/capabilities/PositionProvider.java index 6f46a79..15c9c13 100644 --- a/src/main/java/tschipp/carryon/common/capabilities/PositionProvider.java +++ b/src/main/java/tschipp/carryon/common/capabilities/PositionProvider.java @@ -1,37 +1,36 @@ package tschipp.carryon.common.capabilities; -import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.util.LazyOptional; -public class PositionProvider implements ICapabilitySerializable { +public class PositionProvider implements ICapabilitySerializable { @CapabilityInject(IPosition.class) public static final Capability POSITION_CAPABILITY = null; private IPosition instance = POSITION_CAPABILITY.getDefaultInstance(); + + @SuppressWarnings("unchecked") + @Override + public LazyOptional getCapability(Capability cap, EnumFacing side) + { + return (LazyOptional) LazyOptional.of(() -> {return new TEPosition();}); + } + + @Override + public NBTTagCompound serializeNBT() + { + return (NBTTagCompound) POSITION_CAPABILITY.getStorage().writeNBT(POSITION_CAPABILITY, instance, null); + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + POSITION_CAPABILITY.getStorage().readNBT(POSITION_CAPABILITY, instance, null, nbt); + } - - @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 index d3a4973..8a46f53 100644 --- a/src/main/java/tschipp/carryon/common/capabilities/PositionStorage.java +++ b/src/main/java/tschipp/carryon/common/capabilities/PositionStorage.java @@ -1,6 +1,6 @@ package tschipp.carryon.common.capabilities; -import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.INBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -10,27 +10,27 @@ import net.minecraftforge.common.capabilities.Capability.IStorage; public class PositionStorage implements IStorage { @Override - public NBTBase writeNBT(Capability capability, IPosition instance, EnumFacing side) { + public INBTBase 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()); + tag.setInt("x", instance.getPos().getX()); + tag.setInt("y", instance.getPos().getY()); + tag.setInt("z", instance.getPos().getZ()); return tag; } @Override - public void readNBT(Capability capability, IPosition instance, EnumFacing side, NBTBase nbt) { + public void readNBT(Capability capability, IPosition instance, EnumFacing side, INBTBase nbt) { NBTTagCompound tag = (NBTTagCompound) nbt; - int x = tag.getInteger("x"); - int y = tag.getInteger("y"); - int z = tag.getInteger("z"); + int x = tag.getInt("x"); + int y = tag.getInt("y"); + int z = tag.getInt("z"); BlockPos pos = new BlockPos(x,y,z); @@ -38,4 +38,6 @@ public class PositionStorage implements IStorage { 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 index 7398fc0..a15de2a 100644 --- a/src/main/java/tschipp/carryon/common/capabilities/TEPosition.java +++ b/src/main/java/tschipp/carryon/common/capabilities/TEPosition.java @@ -28,7 +28,5 @@ public class TEPosition implements IPosition { 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 index 1d6e3e8..0616d9f 100644 --- a/src/main/java/tschipp/carryon/common/capabilities/event/PositionClientEvents.java +++ b/src/main/java/tschipp/carryon/common/capabilities/event/PositionClientEvents.java @@ -6,32 +6,34 @@ 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.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.event.entity.player.PlayerContainerEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.LogicalSide; 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; +import tschipp.carryon.common.capabilities.TEPosition; public class PositionClientEvents { - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void onGui(GuiScreenEvent.DrawScreenEvent event) { if (event.getGui() != null) { - EntityPlayer player = Minecraft.getMinecraft().player; + EntityPlayer player = Minecraft.getInstance().player; boolean inventory = event.getGui() instanceof GuiContainer; if (player != null && inventory) { - if(player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) + if(player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent()) { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); + IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition()); if(cap.isBlockActivated()) { World world = player.world; @@ -42,8 +44,8 @@ public class PositionClientEvents if(te == null) { // player.openContainer = null; - Minecraft.getMinecraft().currentScreen = null; - Minecraft.getMinecraft().setIngameFocus(); + Minecraft.getInstance().currentScreen = null; +// Minecraft.getInstance().fo; cap.setBlockActivated(false); cap.setPos(new BlockPos(0,0,0)); } @@ -54,31 +56,31 @@ public class PositionClientEvents } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void onGuiClose(PlayerContainerEvent.Close event) { EntityPlayer player = event.getEntityPlayer(); - if(player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) + if(player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent()) { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); + IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition()); cap.setBlockActivated(false); cap.setPos(new BlockPos(0,0,0)); } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public void onPlayerTick(PlayerTickEvent event) { - if (event.side == Side.CLIENT) + if (event.side == LogicalSide.CLIENT) { EntityPlayer player = event.player; - if (player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) + if(player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent()) { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); - if (cap.isBlockActivated() && Minecraft.getMinecraft().currentScreen == null) + IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition()); + if (cap.isBlockActivated() && Minecraft.getInstance().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 index ae25abd..ae9f69e 100644 --- a/src/main/java/tschipp/carryon/common/capabilities/event/PositionCommonEvents.java +++ b/src/main/java/tschipp/carryon/common/capabilities/event/PositionCommonEvents.java @@ -9,10 +9,11 @@ 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 net.minecraftforge.eventbus.api.SubscribeEvent; import tschipp.carryon.CarryOn; import tschipp.carryon.common.capabilities.IPosition; import tschipp.carryon.common.capabilities.PositionProvider; +import tschipp.carryon.common.capabilities.TEPosition; public class PositionCommonEvents { @@ -46,9 +47,9 @@ public class PositionCommonEvents TileEntity te = world.getTileEntity(pos); if (te != null) { - if (player.hasCapability(PositionProvider.POSITION_CAPABILITY, null)) + if(player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent()) { - IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY, null); + IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition()); 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 index 571a8ff..bd841b2 100644 --- a/src/main/java/tschipp/carryon/common/command/CommandCarryOn.java +++ b/src/main/java/tschipp/carryon/common/command/CommandCarryOn.java @@ -1,22 +1,21 @@ package tschipp.carryon.common.command; -import java.util.ArrayList; +import java.util.Collection; 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 com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.arguments.EntityArgument; 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 net.minecraftforge.fml.network.PacketDistributor; import tschipp.carryon.CarryOn; +import tschipp.carryon.common.config.Configs.Settings; import tschipp.carryon.common.handler.CustomPickupOverrideHandler; import tschipp.carryon.common.handler.ModelOverridesHandler; import tschipp.carryon.common.handler.RegistrationHandler; @@ -24,171 +23,136 @@ import tschipp.carryon.common.item.ItemEntity; import tschipp.carryon.common.item.ItemTile; import tschipp.carryon.common.scripting.ScriptReader; import tschipp.carryon.network.client.CarrySlotPacket; +import tschipp.carryon.network.client.ScriptReloadPacket; -public class CommandCarryOn extends CommandBase implements ICommand +public class CommandCarryOn { - - private final List names; - - public CommandCarryOn() + public static void register(CommandDispatcher dispatcher) { - names = new ArrayList(); - names.add("carryon"); + LiteralArgumentBuilder builder = Commands.literal("carryon") + + .then(Commands.literal("debug").executes((cmd) -> { + return handleDebug(cmd.getSource()); + })) + + .then(Commands.literal("clear").executes((cmd) -> { + return handleClear(cmd.getSource(), Collections.singleton(cmd.getSource().asPlayer())); + })) + + .then(Commands.literal("clear").then(Commands.argument("target", EntityArgument.multiplePlayers()).requires(src -> src.hasPermissionLevel(2)).executes((cmd) -> { + return handleClear(cmd.getSource(), EntityArgument.getPlayers(cmd, "target")); + }))) + + .then(Commands.literal("reload").requires(src -> src.hasPermissionLevel(2)).executes((cmd) -> { + return handleReload(cmd.getSource()); + })); + + dispatcher.register(builder); + } - @Override - public int compareTo(ICommand o) + private static int handleDebug(CommandSource source) { - 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) + try { - // Handling clear - if (args[0].toLowerCase().equals("clear")) + if (source.assertIsEntity() != null) { - if (sender instanceof EntityPlayer) + EntityPlayerMP player = source.asPlayer(); + + ItemStack main = player.getHeldItemMainhand(); + if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemTile) { - EntityPlayer player = (EntityPlayer) sender; + source.sendFeedback(new TextComponentString("Block: " + ItemTile.getBlock(main)), true); + source.sendFeedback(new TextComponentString("BlockState: " + ItemTile.getBlockState(main)), true); + source.sendFeedback(new TextComponentString("ItemStack: " + ItemTile.getItemStack(main)), true); + if (ModelOverridesHandler.hasCustomOverrideModel(ItemTile.getBlockState(main), ItemTile.getTileData(main))) + source.sendFeedback(new TextComponentString("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemTile.getBlockState(main), ItemTile.getTileData(main))), true); + + if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemTile.getBlockState(main))) + source.sendFeedback(new TextComponentString("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemTile.getBlockState(main))), true); + + CarryOn.LOGGER.info("Block: " + ItemTile.getBlock(main)); + CarryOn.LOGGER.info("BlockState: " + ItemTile.getBlockState(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))); + + return 1; + } else if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity) + { + source.sendFeedback(new TextComponentString("Entity: " + ItemEntity.getEntity(main, player.world)), true); + source.sendFeedback(new TextComponentString("Entity Name: " + ItemEntity.getEntityName(main)), true); + + if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemEntity.getEntity(main, player.world))) + source.sendFeedback(new TextComponentString("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemEntity.getEntity(main, player.world))), true); + + CarryOn.LOGGER.info("Entity: " + ItemEntity.getEntity(main, player.world)); + CarryOn.LOGGER.info("Entity Name: " + ItemEntity.getEntityName(main)); + + if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemEntity.getEntity(main, player.world))) + CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemEntity.getEntity(main, player.world))); + + return 1; + } + } + + } catch (CommandSyntaxException e) + { + return 0; + } + + return 0; + } + + private static int handleClear(CommandSource source, Collection players) + { + for (EntityPlayerMP player : players) + { + try + { + if (source.assertIsEntity() != null) + { int cleared = 0; - cleared += player.inventory.clearMatchingItems(RegistrationHandler.itemTile, 0, 64, null); - cleared += player.inventory.clearMatchingItems(RegistrationHandler.itemEntity, 0, 64, null); + cleared += player.inventory.clearMatchingItems(stack -> !stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile, 64); + cleared += player.inventory.clearMatchingItems(stack -> !stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity, 64); - CarryOn.network.sendTo(new CarrySlotPacket(9, player.getEntityId()), (EntityPlayerMP) player); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) player), new CarrySlotPacket(9, player.getEntityId())); if (cleared != 1) - player.sendMessage(new TextComponentString("Cleared " + cleared + " Items!")); + source.sendFeedback(new TextComponentString("Cleared " + cleared + " Items!"), true); else - player.sendMessage(new TextComponentString("Cleared " + cleared + " Item!")); - } + source.sendFeedback(new TextComponentString("Cleared " + cleared + " Item!"), true); - } - // Handling debug - else if (args[0].toLowerCase().equals("debug")) + return 1; + } else + throw EntityArgument.ONLY_PLAYERS_ALLOWED.create(); + + } catch (CommandSyntaxException e) { - - 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()))); - - } - } + return 0; } - else - { - throw new WrongUsageException(this.getUsage(sender)); - } - } - else + + return 0; + } + + private static int handleReload(CommandSource source) + { + if (Settings.useScripts.get()) { - throw new WrongUsageException(this.getUsage(sender)); - } + ScriptReader.reloadScripts(); + CarryOn.network.send(PacketDistributor.ALL.noArg(), new ScriptReloadPacket()); + source.sendFeedback(new TextComponentString("Successfully reloaded scripts!"), true); + } else + source.sendErrorMessage(new TextComponentString("To use custom Carry On scripts, enable them in the config!")); + + return 1; } - - @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 index cbd3c88..39eb219 100644 --- a/src/main/java/tschipp/carryon/common/config/CarryOnConfig.java +++ b/src/main/java/tschipp/carryon/common/config/CarryOnConfig.java @@ -1,104 +1,87 @@ 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") +// @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") +// @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!)") +// @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!") +// @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!") +// @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); - - } - - } +// @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 index 53af5e5..0f16620 100644 --- a/src/main/java/tschipp/carryon/common/config/Configs.java +++ b/src/main/java/tschipp/carryon/common/config/Configs.java @@ -1,303 +1,485 @@ package tschipp.carryon.common.config; -import net.minecraftforge.common.config.Config; -import net.minecraftforge.common.config.Config.Comment; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import com.electronwill.nightconfig.core.file.CommentedFileConfig; +import com.electronwill.nightconfig.core.io.WritingMode; + +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.common.ForgeConfigSpec.BooleanValue; +import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; +import net.minecraftforge.common.ForgeConfigSpec.DoubleValue; +import net.minecraftforge.common.ForgeConfigSpec.IntValue; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; +import tschipp.carryon.CarryOn; +import tschipp.carryon.common.handler.ListHandler; + +@Mod.EventBusSubscriber public class Configs { + private static final ForgeConfigSpec.Builder SERVER_BUILDER = new ForgeConfigSpec.Builder(); + private static final ForgeConfigSpec.Builder CLIENT_BUILDER = new ForgeConfigSpec.Builder(); + + public static final ForgeConfigSpec SERVER_CONFIG; + public static final ForgeConfigSpec CLIENT_CONFIG; + + static { + + Settings.init(SERVER_BUILDER, CLIENT_BUILDER); + Blacklist.init(SERVER_BUILDER, CLIENT_BUILDER); + WhiteList.init(SERVER_BUILDER, CLIENT_BUILDER); + ModelOverrides.init(SERVER_BUILDER, CLIENT_BUILDER); + CustomPickupConditions.init(SERVER_BUILDER, CLIENT_BUILDER); + + SERVER_CONFIG = SERVER_BUILDER.build(); + CLIENT_CONFIG = CLIENT_BUILDER.build(); + } + + public static void loadConfig(ForgeConfigSpec spec, Path path) + { + final CommentedFileConfig configData = CommentedFileConfig.builder(path) + .sync() + .autosave() + .autoreload() + .writingMode(WritingMode.REPLACE) + .build(); + + CarryOn.LOGGER.debug("Loading CarryOn Config"); + configData.load(); + spec.setConfig(configData); + } + + + @SubscribeEvent + public static void onLoad(final ModConfig.Loading event) + { + } + + @SubscribeEvent + public static void onChange(final ModConfig.ConfigReloading event) + { + if(event.getConfig().getModId().equals(CarryOn.MODID)) + { + ListHandler.initLists(); + } + } + + public static class Settings { - @Comment("If the front of the Tile Entities should face the player or should face outward") - public boolean facePlayer = false; + public static BooleanValue facePlayer; - @Comment("More complex Tile Entities slow down the player more") - public boolean heavyTiles = true; + public static BooleanValue heavyTiles; - @Comment("Allow all blocks to be picked up, not just Tile Entites") - public boolean pickupAllBlocks = false; + public static BooleanValue pickupAllBlocks; - @Comment("Whether Blocks and Entities slow the creative player down when carried") - public boolean slownessInCreative = true; + public static BooleanValue slownessInCreative; - @Config.RangeDouble(min = 0) - @Comment("Maximum distance from where Blocks and Entities can be picked up") - public double maxDistance = 2.5; + public static DoubleValue maxDistance; - @Config.RangeDouble(min = 0, max = 10) - @Comment("Max width of entities that can be picked up in survival mode") - public float maxEntityWidth = 1.5f; + public static DoubleValue maxEntityWidth; - @Config.RangeDouble(min = 0, max = 10) - @Comment("Max height of entities that can be picked up in survival mode") - public float maxEntityHeight = 1.5f; + public static DoubleValue maxEntityHeight; - @Comment("Whether hostile mobs should be able to picked up in survival mode") - public boolean pickupHostileMobs = false; + public static BooleanValue pickupHostileMobs; - @Comment("Larger Entities slow down the player more") - public boolean heavyEntities = true; + public static BooleanValue heavyEntities; - @Comment("Slowness multiplier for blocks") - public double blockSlownessMultiplier = 1.0; + public static DoubleValue blockSlownessMultiplier; - @Comment("Slowness multiplier for entities") - public double entitySlownessMultiplier = 1.0; + public static DoubleValue entitySlownessMultiplier; - @Comment("Arms should render on sides when carrying") - public boolean renderArms = true; + public static BooleanValue renderArms; - @Comment("Allow babies to be carried even when adult mob is blacklisted (or not whitelisted)") - public boolean allowBabies = false; + public static BooleanValue allowBabies; - @Comment("Use Whitelist instead of Blacklist for Blocks") - public boolean useWhitelistBlocks=false; + public static BooleanValue useWhitelistBlocks; - @Comment("Use Whitelist instead of Blacklist for Entities") - public boolean useWhitelistEntities=false; + public static BooleanValue useWhitelistEntities; - @Comment("Use Whitelist instead of Blacklist for Stacking") - public boolean useWhitelistStacking=false; + public static BooleanValue useWhitelistStacking; - @Comment("Whether the player can hit blocks and entities while carrying or not") - public boolean hitWhileCarrying=false; + public static BooleanValue hitWhileCarrying; - @Comment("Whether the player drops the carried object when hit or not") - public boolean dropCarriedWhenHit=false; + public static BooleanValue dropCarriedWhenHit; - @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; + public static BooleanValue useScripts; - @Comment("Allows entities to be stacked using Carry On") - public boolean stackableEntities = true; + public static BooleanValue stackableEntities; - @Config.RangeInt(min = 1) - @Comment("Maximum stack limit for entities") - public int maxEntityStackLimit = 10; + public static IntValue maxEntityStackLimit; + + public static BooleanValue entitySizeMattersStacking; + + public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) + { + c.comment("Settings"); + s.comment("Settings"); + + + maxDistance = s + .comment("Maximum distance from where Blocks and Entities can be picked up") + .defineInRange("settings.maxDistance", 2.5, 0, Double.MAX_VALUE); + + maxEntityWidth = s + .comment("Max width of entities that can be picked up in survival mode") + .defineInRange("settings.maxEntityWidth", 1.5, 0, 10); + + maxEntityHeight = s + .comment("Max height of entities that can be picked up in survival mode") + .defineInRange("settings.maxEntityHeight", 1.5, 0, 10); + + maxEntityWidth = s + .comment("Max width of entities that can be picked up in survival mode") + .defineInRange("settings.maxEntityWidth", 1.5, 0, 10); + + blockSlownessMultiplier = s + .comment("Slowness multiplier for blocks") + .defineInRange("settings.blockSlownessMultiplier", 1, 0, Double.MAX_VALUE); + + entitySlownessMultiplier = s + .comment("Slowness multiplier for entities") + .defineInRange("settings.entitySlownessMultiplier", 1, 0, Double.MAX_VALUE); + + maxEntityStackLimit = s + .comment("Maximum stack limit for entities") + .defineInRange("settings.maxEntityStackLimit", 10, 1, Integer.MAX_VALUE); + + facePlayer = c + .comment("If the front of the Tile Entities should face the player or should face outward") + .define("settings.facePlayer", false); + + heavyTiles = s + .comment("More complex Tile Entities slow down the player more") + .define("settings.heavyTiles", true); + + pickupAllBlocks = s + .comment("Allow all blocks to be picked up, not just Tile Entites") + .define("settings.pickupAllBlocks", false); + + slownessInCreative = s + .comment("Whether Blocks and Entities slow the creative player down when carried") + .define("settings.slownessInCreative", true); + + pickupHostileMobs = s + .comment("Whether hostile mobs should be able to picked up in survival mode") + .define("settings.pickupHostileMobs", false); + + heavyEntities = s + .comment("Larger Entities slow down the player more") + .define("settings.heavyEntities", true); + + renderArms = c + .comment("Arms should render on sides when carrying") + .define("settings.renderArms", true); + + allowBabies = s + .comment("Allow babies to be carried even when adult mob is blacklisted (or not whitelisted)") + .define("settings.allowBabies", false); + + useWhitelistBlocks = s + .comment("Use Whitelist instead of Blacklist for Blocks") + .define("settings.useWhitelistBlocks", false); + + useWhitelistEntities = s + .comment("Use Whitelist instead of Blacklist for Entities") + .define("settings.useWhitelistEntities", false); + + useWhitelistStacking = s + .comment("Use Whitelist instead of Blacklist for Stacking") + .define("settings.useWhitelistStacking", false); + + hitWhileCarrying = s + .comment("Whether the player can hit blocks and entities while carrying or not") + .define("settings.hitWhileCarrying", false); + + dropCarriedWhenHit = s + .comment("Whether the player drops the carried object when hit or not") + .define("settings.dropCarriedWhenHit", false); + + useScripts = s + .comment("Use custom Pickup Scripts. Having this set to false, will not allow you to run scripts, but will increase your performance") + .worldRestart() + .define("settings.useScripts", false); + + stackableEntities = s + .comment("Allows entities to be stacked using Carry On") + .define("settings.stackableEntities", true); + + entitySizeMattersStacking = s + .comment("Whether entities' size matters when stacking or not") + .define("settings.stackableEntities", true); + + + + } - @Comment("Whether entities' size matters when stacking or not") - public boolean entitySizeMattersStacking = true; } public static class WhiteList { - @Comment("Entities that CAN be picked up") - public String[] allowedEntities=new String[] - { - }; + public static ConfigValue> allowedEntities; - @Comment("Blocks that CAN be picked up") - public String[] allowedBlocks=new String[] - { - }; + public static ConfigValue> allowedBlocks; - @Comment("Entities that CAN have other entities stacked on top of them") - public String[] allowedStacking = new String[] - { - }; + public static ConfigValue> allowedStacking; + + public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) + { + s.comment("Whitelist"); + + allowedEntities = s + .comment("Entities that CAN be picked up (useWhitelistEntities must be true)") + .defineList("whitelist.allowedEntities", Arrays.asList(new String[]{}), (obj) -> obj instanceof String ? true : false); + + allowedBlocks = s + .comment("Blocks that CAN be picked up (useWhitelistBlocks must be true)") + .defineList("whitelist.allowedBlocks", Arrays.asList(new String[]{}), (obj) -> obj instanceof String ? true : false); + + allowedStacking = s + .comment("Entities that CAN have other entities stacked on top of them (useWhitelistStacking must be true)") + .defineList("whitelist.allowedStacking", Arrays.asList(new String[]{}), (obj) -> obj instanceof String ? true : false); + } } public static class Blacklist { - @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:*", - "thaumcraft:pillar*", - "thaumcraft:infernal_furnace", - "thaumcraft:placeholder*", - "thaumcraft:infusion_matrix", - "thaumcraft:golem_builder", - "thaumcraft:thaumatorium*", - "magneticraft:oil_heater", - "magneticraft:solar_panel", - "magneticraft:steam_engine", - "magneticraft:shelving_unit", - "magneticraft:grinder", - "magneticraft:sieve", - "magneticraft:solar_tower", - "magneticraft:solar_mirror", - "magneticraft:container", - "magneticraft:pumpjack", - "magneticraft:solar_panel", - "magneticraft:refinery", - "magneticraft:oil_heater", - "magneticraft:hydraulic_press", - "magneticraft:multiblock_gap", - "refinedstorage:*", - "practicallogistics2:*", - "mcmultipart:*", - "enderstorage:*", - "betterstorage:*", - "practicallogistics2:*" + public static ConfigValue> forbiddenTiles; + + public static ConfigValue> forbiddenEntities; + + public static ConfigValue> forbiddenStacking; + + public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) + { + s.comment("Blacklist"); + + forbiddenTiles = s + .comment("Tile Entities that cannot be picked up") + .defineList("blacklist.forbiddenTiles", Arrays.asList(new String[] + { + "minecraft:end_portal", + "minecraft:end_gateway", + "minecraft:tall_grass", + "minecraft:large_fern", + "minecraft:peony", + "minecraft:rose_bush", + "minecraft:lilac", + "minecraft:sunflower", + "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", + "minecraft:portal", + "minecraft:tall_seagrass", + "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:*", + "thaumcraft:pillar*", + "thaumcraft:infernal_furnace", + "thaumcraft:placeholder*", + "thaumcraft:infusion_matrix", + "thaumcraft:golem_builder", + "thaumcraft:thaumatorium*", + "magneticraft:oil_heater", + "magneticraft:solar_panel", + "magneticraft:steam_engine", + "magneticraft:shelving_unit", + "magneticraft:grinder", + "magneticraft:sieve", + "magneticraft:solar_tower", + "magneticraft:solar_mirror", + "magneticraft:container", + "magneticraft:pumpjack", + "magneticraft:solar_panel", + "magneticraft:refinery", + "magneticraft:oil_heater", + "magneticraft:hydraulic_press", + "magneticraft:multiblock_gap", + "refinedstorage:*", + "mcmultipart:*", + "enderstorage:*", + "betterstorage:*", + "practicallogistics2:*", + "wearablebackpacks:*" - }; - - @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:*" - }; - - - @Comment("Entities that cannot have other entities stacked on top of them") - public String[] forbiddenStacking = new String[] - { - "minecraft:horse" - }; + }), (obj) -> obj instanceof String ? true : false); + + forbiddenEntities = s + .comment("Entities that cannot be picked up") + .defineList("blacklist.forbiddenEntities", Arrays.asList(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:hamster", + "animania:ferret*", + "animania:hedgehog*", + "animania:cart", + "animania:wagon", + "mynko:*" + }), (obj) -> obj instanceof String ? true : false); + + forbiddenStacking = s + .comment("Entities that cannot have other entities stacked on top of them") + .defineList("blacklist.forbiddenStacking", Arrays.asList(new String[] + { + "minecraft:horse" + }), (obj) -> obj instanceof String ? true : false); + } } public static class ModelOverrides { - @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", - "minecraft:standing_sign->(item)minecraft:sign", - "minecraft:wall_sign->(item)minecraft:sign", - "minecraft:redstone_wire->(item)minecraft:redstone", - "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 ConfigValue> modelOverrides; + + public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) + { + c.comment("Model Overrides"); + + + modelOverrides = c + .comment("Model Overrides based on NBT or on Meta. Advanced Users Only!") + .defineList("modeloverrides.overrides", Arrays.asList(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", + "minecraft:standing_sign->(item)minecraft:sign", + "minecraft:wall_sign->(item)minecraft:sign", + "minecraft:redstone_wire->(item)minecraft:redstone", + "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", + }), (obj) -> obj instanceof String ? true : false); + } } public static class CustomPickupConditions { - @Config.RequiresMcRestart() - @Comment("Custom Pickup Conditions for Blocks") - public String[] customPickupConditionsBlocks = new String[] - { - - }; + + public static ConfigValue> customPickupConditionsBlocks; - @Config.RequiresMcRestart() - @Comment("Custom Pickup Conditions for Entities") - public String[] customPickupConditionsEntities = new String[] - { - - }; + public static ConfigValue> customPickupConditionsEntities; + + public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) + { + s.comment("Custom Pickup Conditions"); + + + customPickupConditionsBlocks = s + .comment("Custom Pickup Conditions for Blocks") + .defineList("custom_pickup_conditions.customPickupConditionsBlocks", Arrays.asList(new String[]{}), (obj) -> obj instanceof String ? true : false); + + customPickupConditionsEntities = s + .comment("Custom Pickup Conditions for Entities") + .defineList("custom_pickup_conditions.customPickupConditionsEntities", Arrays.asList(new String[]{}), (obj) -> obj instanceof String ? true : false); + } } } diff --git a/src/main/java/tschipp/carryon/common/event/IMCEvents.java b/src/main/java/tschipp/carryon/common/event/IMCEvents.java new file mode 100644 index 0000000..f9770b8 --- /dev/null +++ b/src/main/java/tschipp/carryon/common/event/IMCEvents.java @@ -0,0 +1,61 @@ +package tschipp.carryon.common.event; + +import java.util.stream.Stream; + +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.InterModComms; +import net.minecraftforge.fml.InterModComms.IMCMessage; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import tschipp.carryon.CarryOn; +import tschipp.carryon.common.handler.ListHandler; +import tschipp.carryon.common.handler.ModelOverridesHandler; + +public class IMCEvents +{ + + @SubscribeEvent(priority = EventPriority.LOW) + public void serverLoad(FMLServerStartingEvent event) + { + Stream messages = InterModComms.getMessages(CarryOn.MODID); + + messages.forEach((msg) -> { + + String method = msg.getMethod(); + Object obj = msg.getMessageSupplier().get(); + + if(!(obj instanceof String)) + return; + + String str = (String)obj; + + switch (method) + { + case "blacklistBlock": + ListHandler.FORBIDDEN_TILES.add(str); + break; + case "blacklistEntity": + ListHandler.FORBIDDEN_ENTITIES.add(str); + break; + case "whitelistBlock": + ListHandler.ALLOWED_TILES.add(str); + break; + case "whitelistEntity": + ListHandler.ALLOWED_ENTITIES.add(str); + break; + case "blacklistStacking": + ListHandler.FORBIDDEN_STACKING.add(str); + break; + case "whitelistStacking": + ListHandler.ALLOWED_STACKING.add(str); + break; + case "addModelOverride": + ModelOverridesHandler.parseOverride(str, 0); + break; + } + + }); + + } + +} diff --git a/src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java b/src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java index 13beb53..7ee78fa 100644 --- a/src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java +++ b/src/main/java/tschipp/carryon/common/event/ItemEntityEvents.java @@ -20,16 +20,17 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; 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.eventbus.api.Event.Result; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import tschipp.carryon.client.keybinds.CarryOnKeybinds; -import tschipp.carryon.common.config.CarryOnConfig; +import tschipp.carryon.common.config.Configs.Settings; import tschipp.carryon.common.handler.ListHandler; import tschipp.carryon.common.handler.PickupHandler; import tschipp.carryon.common.handler.RegistrationHandler; @@ -56,8 +57,9 @@ public class ItemEntityEvents if (override != null) { String command = override.getCommandPlace(); + if (command != null) - player.getServer().getCommandManager().executeCommand(player.getServer(), "/execute " + player.getGameProfile().getName() + " ~ ~ ~ " + command); + player.getServer().getCommandManager().handleCommand(player.getServer().getCommandSource(), "/execute as " + player.getGameProfile().getName() + " run " + command); } } } @@ -113,14 +115,14 @@ public class ItemEntityEvents { 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++) + LazyOptional handler = entity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + + handler.ifPresent((hand) -> { + for (int i = 0; i < hand.getSlots(); i++) { - handler.extractItem(i, 64, false); + hand.extractItem(i, 64, false); } - } + }); CarryOnOverride override = ScriptChecker.inspectEntity(entity); int overrideHash = 0; @@ -132,7 +134,7 @@ public class ItemEntityEvents if (entity instanceof EntityLiving) ((EntityLiving) entity).setHealth(0); - entity.setDead(); + entity.remove(); player.setHeldItem(EnumHand.MAIN_HAND, stack); event.setCanceled(true); event.setCancellationResult(EnumActionResult.FAIL); @@ -140,29 +142,28 @@ public class ItemEntityEvents } } - } - else if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(main) && !CarryOnKeybinds.isKeyPressed(player) && CarryOnConfig.settings.stackableEntities) + } else if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(main) && !CarryOnKeybinds.isKeyPressed(player) && Settings.stackableEntities.get()) { Entity entityHeld = ItemEntity.getEntity(main, world); if (entity.hurtResistantTime == 0 && entityHeld instanceof EntityLivingBase) { - if (!world.isRemote && entityHeld.getUniqueID() != entity.getUniqueID() && !entityHeld.isDead && !entity.isDead) + if (!world.isRemote && entityHeld.getUniqueID() != entity.getUniqueID() && !entityHeld.removed && !entity.removed) { 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) + if (numPassengers < Settings.maxEntityStackLimit.get() - 1) { Entity topEntity = getTopPassenger(lowestEntity); - if (CarryOnConfig.settings.useWhitelistStacking ? ListHandler.isStackingAllowed(topEntity) : !ListHandler.isStackingForbidden(topEntity)) + if (Settings.useWhitelistStacking.get() ? ListHandler.isStackingAllowed(topEntity) : !ListHandler.isStackingForbidden(topEntity)) { double sizeEntity = topEntity.height * topEntity.width; - if ((CarryOnConfig.settings.entitySizeMattersStacking && sizeHeldEntity <= sizeEntity) || !CarryOnConfig.settings.entitySizeMattersStacking) + if ((Settings.entitySizeMattersStacking.get() && sizeHeldEntity <= sizeEntity) || !Settings.entitySizeMattersStacking.get()) { if (topEntity instanceof EntityHorse) { @@ -179,8 +180,7 @@ public class ItemEntityEvents world.spawnEntity(entityHeld); entityHeld.startRiding(topEntity, false); entityHeld.setPositionAndUpdate(tempX, tempY, tempZ); - } - else + } else { entityHeld.setPosition(entity.posX, entity.posY, entity.posZ); world.spawnEntity(entityHeld); @@ -193,17 +193,15 @@ public class ItemEntityEvents event.setCanceled(true); event.setCancellationResult(EnumActionResult.FAIL); world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_HORSE_SADDLE, SoundCategory.PLAYERS, 0.5F, 1.5F); - } - else + } else { - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_NOTE_BASS, SoundCategory.PLAYERS, 0.5F, 1.5F); + world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_NOTE_BLOCK_BASS, SoundCategory.PLAYERS, 0.5F, 1.5F); return; } } - } - else + } else { - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_NOTE_BASS, SoundCategory.PLAYERS, 0.5F, 1.5F); + world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_NOTE_BLOCK_BASS, SoundCategory.PLAYERS, 0.5F, 1.5F); return; } } diff --git a/src/main/java/tschipp/carryon/common/event/ItemEvents.java b/src/main/java/tschipp/carryon/common/event/ItemEvents.java index 2c5cc5f..20a7b2b 100644 --- a/src/main/java/tschipp/carryon/common/event/ItemEvents.java +++ b/src/main/java/tschipp/carryon/common/event/ItemEvents.java @@ -4,15 +4,14 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -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.init.Blocks; import net.minecraft.inventory.IInventory; +import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -26,8 +25,7 @@ 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.common.config.Config; -import net.minecraftforge.common.config.ConfigManager; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; @@ -38,18 +36,24 @@ 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.event.world.BlockEvent.HarvestDropsEvent; -import net.minecraftforge.fml.client.event.ConfigChangedEvent; -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.eventbus.api.Event.Result; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.loading.FMLPaths; +import net.minecraftforge.fml.network.PacketDistributor; +import net.minecraftforge.fml.network.PacketDistributor.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.command.CommandCarryOn; +import tschipp.carryon.common.config.Configs; +import tschipp.carryon.common.config.Configs.Settings; +import tschipp.carryon.common.handler.CustomPickupOverrideHandler; import tschipp.carryon.common.handler.ListHandler; import tschipp.carryon.common.handler.PickupHandler; import tschipp.carryon.common.handler.RegistrationHandler; @@ -57,6 +61,7 @@ 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.common.scripting.ScriptReader; import tschipp.carryon.network.client.CarrySlotPacket; public class ItemEvents @@ -83,8 +88,9 @@ public class ItemEvents if (override != null) { String command = override.getCommandPlace(); + if (command != null) - player.getServer().getCommandManager().executeCommand(player.getServer(), "/execute " + player.getGameProfile().getName() + " ~ ~ ~ " + command); + player.getServer().getCommandManager().handleCommand(player.getServer().getCommandSource(), "/execute as " + player.getGameProfile().getName() + " run " + command); } } } @@ -105,13 +111,15 @@ public class ItemEvents { BlockPos pos = eitem.getPosition(); BlockPos finalPos = pos; - Block block = ItemTile.getBlock(stack); - if (!world.getBlockState(pos).getBlock().isReplaceable(world, pos) || !block.canPlaceBlockAt(world, pos)) + BlockItemUseContext context = new BlockItemUseContext(world, null, stack, pos, EnumFacing.DOWN, 0f, 0f, 0f); + + if (!world.getBlockState(pos).isReplaceable(context) || !context.canPlace()) { - for (EnumFacing facing : EnumFacing.VALUES) + for (EnumFacing facing : EnumFacing.values()) { BlockPos offsetPos = pos.offset(facing); - if (world.getBlockState(offsetPos).getBlock().isReplaceable(world, offsetPos) && block.canPlaceBlockAt(world, offsetPos)) + BlockItemUseContext newContext = new BlockItemUseContext(world, null, stack, offsetPos, EnumFacing.DOWN, 0, 0, 0); + if (world.getBlockState(offsetPos).isReplaceable(newContext) && newContext.canPlace()) { finalPos = offsetPos; break; @@ -122,7 +130,7 @@ public class ItemEvents TileEntity tile = world.getTileEntity(finalPos); if (tile != null) { - tile.readFromNBT(ItemTile.getTileData(stack)); + tile.deserializeNBT(ItemTile.getTileData(stack)); tile.setPos(finalPos); } ItemTile.clearTileData(stack); @@ -141,9 +149,9 @@ public class ItemEvents @SubscribeEvent public void onPlayerLogin(PlayerLoggedInEvent event) { - if (event.player instanceof EntityPlayer) + if (event.getPlayer() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.player; + EntityPlayer player = (EntityPlayer) event.getPlayer(); World world = player.getEntityWorld(); ItemStack carried = player.getHeldItemMainhand(); @@ -151,25 +159,35 @@ public class ItemEvents { if (carried.getItem() == RegistrationHandler.itemTile) { - CarryOnOverride override = ScriptChecker.inspectBlock(((ItemTile) carried.getItem()).getBlockState(carried), world, player.getPosition(), ((ItemTile) carried.getItem()).getTileData(carried)); + CarryOnOverride override = ScriptChecker.inspectBlock(ItemTile.getBlockState(carried), world, player.getPosition(), ItemTile.getTileData(carried)); if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) player); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) player), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode())); else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) player); - } - else + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) player), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId())); + } else { - CarryOnOverride override = ScriptChecker.inspectEntity(((ItemEntity) carried.getItem()).getEntity(carried, world)); + CarryOnOverride override = ScriptChecker.inspectEntity(ItemEntity.getEntity(carried, world)); if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) player); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) player), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode())); else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) player); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) player), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId())); + } } } } + @SubscribeEvent + public void serverLoad(FMLServerStartingEvent event) + { + CommandCarryOn.register(event.getCommandDispatcher()); + ScriptReader.reloadScripts(); + CustomPickupOverrideHandler.initPickupOverrides(); + ListHandler.initLists(); + + } + @SubscribeEvent public void onEntityStartTracking(StartTracking event) { @@ -186,19 +204,18 @@ public class ItemEvents { if (carried.getItem() == RegistrationHandler.itemTile) { - CarryOnOverride override = ScriptChecker.inspectBlock(((ItemTile) carried.getItem()).getBlockState(carried), world, player.getPosition(), ((ItemTile) carried.getItem()).getTileData(carried)); + CarryOnOverride override = ScriptChecker.inspectBlock(ItemTile.getBlockState(carried), world, player.getPosition(), ItemTile.getTileData(carried)); if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) tracker); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) tracker), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode())); else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) tracker); - } - else + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) tracker), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId())); + } else { - CarryOnOverride override = ScriptChecker.inspectEntity(((ItemEntity) carried.getItem()).getEntity(carried, world)); + CarryOnOverride override = ScriptChecker.inspectEntity(ItemEntity.getEntity(carried, world)); if (override != null) - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode()), (EntityPlayerMP) tracker); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) tracker), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId(), override.hashCode())); else - CarryOn.network.sendTo(new CarrySlotPacket(player.inventory.currentItem, player.getEntityId()), (EntityPlayerMP) tracker); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) tracker), new CarrySlotPacket(player.inventory.currentItem, player.getEntityId())); } } @@ -209,7 +226,7 @@ public class ItemEvents public void harvestSpeed(BreakSpeed event) { EntityPlayer player = event.getEntityPlayer(); - if (player != null && !CarryOnConfig.settings.hitWhileCarrying) + if (player != null && !Settings.hitWhileCarrying.get()) { ItemStack stack = player.getHeldItemMainhand(); if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) @@ -222,7 +239,7 @@ public class ItemEvents { EntityPlayer player = event.getEntityPlayer(); ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && !CarryOnConfig.settings.hitWhileCarrying && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) + if (!stack.isEmpty() && !Settings.hitWhileCarrying.get() && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) { event.setCanceled(true); } @@ -232,7 +249,7 @@ public class ItemEvents public void harvestSpeed(BreakEvent event) { EntityPlayer player = event.getPlayer(); - if (player != null && !CarryOnConfig.settings.hitWhileCarrying) + if (player != null && !Settings.hitWhileCarrying.get()) { ItemStack stack = player.getHeldItemMainhand(); if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile || stack.getItem() == RegistrationHandler.itemEntity)) @@ -244,7 +261,7 @@ public class ItemEvents public void playerAttack(LivingAttackEvent event) { EntityLivingBase eliving = event.getEntityLiving(); - if (eliving instanceof EntityPlayer && CarryOnConfig.settings.dropCarriedWhenHit) + if (eliving instanceof EntityPlayer && Settings.dropCarriedWhenHit.get()) { EntityPlayer player = (EntityPlayer) eliving; ItemStack stack = player.getHeldItemMainhand(); @@ -295,7 +312,6 @@ public class ItemEvents 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)) @@ -308,12 +324,12 @@ public class ItemEvents { player.closeScreen(); - if (ItemTile.storeTileData(te, world, pos, state.getActualState(world, pos), stack)) + if (ItemTile.storeTileData(te, world, pos, state, stack)) { IBlockState statee = world.getBlockState(pos); NBTTagCompound tag = new NBTTagCompound(); - tag = world.getTileEntity(pos) != null ? world.getTileEntity(pos).writeToNBT(tag) : new NBTTagCompound(); + tag = world.getTileEntity(pos) != null ? world.getTileEntity(pos).write(tag) : new NBTTagCompound(); CarryOnOverride override = ScriptChecker.inspectBlock(state, world, pos, tag); int overrideHash = 0; if (override != null) @@ -328,32 +344,30 @@ public class ItemEvents sendPacket(player, player.inventory.currentItem, overrideHash); world.removeTileEntity(pos); - world.setBlockState(pos, Blocks.AIR.getDefaultState(), 3); + world.removeBlock(pos); player.setHeldItem(EnumHand.MAIN_HAND, stack); event.setUseBlock(Result.DENY); event.setUseItem(Result.DENY); event.setCanceled(true); success = true; - } - catch (Exception e) + } catch (Exception e) { try { sendPacket(player, player.inventory.currentItem, overrideHash); emptyTileEntity(te); - world.setBlockToAir(pos); + world.removeBlock(pos); player.setHeldItem(EnumHand.MAIN_HAND, stack); event.setUseBlock(Result.DENY); event.setUseItem(Result.DENY); event.setCanceled(true); success = true; - } - catch (Exception ex) + } catch (Exception ex) { sendPacket(player, 9, 0); world.setBlockState(pos, statee); - if (!tag.hasNoTags()) - TileEntity.create(world, tag); + if (!tag.isEmpty()) + TileEntity.create(tag); player.sendMessage(new TextComponentString(TextFormatting.RED + "Error detected. Cannot pick up block.")); TextComponentString s = new TextComponentString(TextFormatting.GOLD + "here"); @@ -366,8 +380,9 @@ public class ItemEvents if (success && override != null) { String command = override.getCommandInit(); + if (command != null) - player.getServer().getCommandManager().executeCommand(player.getServer(), "/execute " + player.getGameProfile().getName() + " ~ ~ ~ " + command); + player.getServer().getCommandManager().handleCommand(player.getServer().getCommandSource(), "/execute as " + player.getGameProfile().getName() + " run " + command); } } @@ -380,26 +395,31 @@ public class ItemEvents { if (te != null) { - for (EnumFacing facing : EnumFacing.VALUES) + 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++) + LazyOptional itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing); + + itemHandler.ifPresent((handler) -> { + + for (int i = 0; i < handler.getSlots(); i++) { - itemHandler.extractItem(i, 64, false); + handler.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++) + LazyOptional itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + + itemHandler.ifPresent((handler) -> { + + for (int i = 0; i < handler.getSlots(); i++) { - itemHandler.extractItem(i, 64, false); + handler.extractItem(i, 64, false); } - } + + }); if (te instanceof IInventory) { @@ -409,10 +429,10 @@ public class ItemEvents if (te instanceof IItemHandler) { - IItemHandler itemHandler = (IItemHandler) te; - for (int i = 0; i < itemHandler.getSlots(); i++) + IItemHandler itemHandler1 = (IItemHandler) te; + for (int i = 0; i < itemHandler1.getSlots(); i++) { - itemHandler.extractItem(i, 64, false); + itemHandler1.extractItem(i, 64, false); } } @@ -439,7 +459,7 @@ public class ItemEvents EntityItem item = new EntityItem(world); item.setItem(stack); - BlockPos pos = original.getBedLocation(); + BlockPos pos = original.getBedLocation(original.dimension); if (pos == null) pos = player.getPosition(); item.setPosition(pos.getX(), pos.getY(), pos.getZ()); @@ -463,11 +483,13 @@ public class ItemEvents if (hasCarried) { - if (inHand.getItem() != RegistrationHandler.itemTile && inHand.getItem() != RegistrationHandler.itemEntity) + if ((inHand.getItem() != RegistrationHandler.itemTile && inHand.getItem() != RegistrationHandler.itemEntity) && player.getPortalCooldown() == 0) { int slotBlock = getSlot(player, RegistrationHandler.itemTile); int slotEntity = getSlot(player, RegistrationHandler.itemEntity); + + EntityItem item = null; if (slotBlock != -1) { @@ -492,8 +514,9 @@ public class ItemEvents if (override != null) { String command = override.getCommandLoop(); + if (command != null) - player.getServer().getCommandManager().executeCommand(player.getServer(), "/execute " + player.getGameProfile().getName() + " ~ ~ ~ " + command); + player.getServer().getCommandManager().handleCommand(player.getServer().getCommandSource(), "/execute as " + player.getGameProfile().getName() + " run " + command); } } @@ -501,12 +524,14 @@ public class ItemEvents } @SubscribeEvent - public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) + public void onConfigChanged(ModConfig.ConfigReloading event) { - if (event.getModID().equals(CarryOn.MODID)) + if (event.getConfig().getModId().equals(CarryOn.MODID)) { ListHandler.initLists(); - ConfigManager.load(CarryOn.MODID, Config.Type.INSTANCE); + + Configs.loadConfig(Configs.CLIENT_CONFIG, FMLPaths.CONFIGDIR.get().resolve("carryon-client.toml")); + Configs.loadConfig(Configs.CLIENT_CONFIG, FMLPaths.CONFIGDIR.get().resolve("carryon-server.toml")); } } @@ -525,18 +550,16 @@ public class ItemEvents { if (player instanceof EntityPlayerMP) { - CarryOn.network.sendToAllAround(new CarrySlotPacket(currentItem, player.getEntityId(), hash), new TargetPoint(player.world.provider.getDimension(), player.posX, player.posY, player.posZ, 256)); - CarryOn.network.sendTo(new CarrySlotPacket(currentItem, player.getEntityId(), hash), (EntityPlayerMP) player); + CarryOn.network.send(PacketDistributor.NEAR.with(() -> new TargetPoint(player.posX, player.posY, player.posZ, 128, player.world.getDimension().getType())), new CarrySlotPacket(currentItem, player.getEntityId(), hash)); + CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (EntityPlayerMP) player), new CarrySlotPacket(currentItem, player.getEntityId(), hash)); if (currentItem >= 9) { player.getEntityData().removeTag("carrySlot"); player.getEntityData().removeTag("overrideKey"); - } - else + } else { - - player.getEntityData().setInteger("carrySlot", currentItem); + player.getEntityData().setInt("carrySlot", currentItem); if (hash != 0) ScriptChecker.setCarryOnOverride(player, hash); } diff --git a/src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java b/src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java index 38ce4ac..a1b3068 100644 --- a/src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java +++ b/src/main/java/tschipp/carryon/common/handler/CustomPickupOverrideHandler.java @@ -1,13 +1,13 @@ package tschipp.carryon.common.handler; import java.util.HashMap; +import java.util.List; -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 net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistries; +import tschipp.carryon.common.config.Configs.CustomPickupConditions; import tschipp.carryon.common.helper.InvalidConfigException; public class CustomPickupOverrideHandler @@ -16,16 +16,17 @@ public class CustomPickupOverrideHandler public static HashMap PICKUP_CONDITIONS = new HashMap(); public static HashMap PICKUP_CONDITIONS_ENTITIES = new HashMap(); + @SuppressWarnings("unchecked") public static void initPickupOverrides() { - if (Loader.isModLoaded("gamestages")) + if (ModList.get().isLoaded("gamestages")) { - String[] conditions = CarryOnConfig.customPickupConditions.customPickupConditionsBlocks; + List conditions = (List) CustomPickupConditions.customPickupConditionsBlocks.get(); - for (int i = 0; i < conditions.length; i++) + for (int i = 0; i < conditions.size(); i++) { - String line = conditions[i]; + String line = conditions.get(i); if (!line.contains("(") || !line.contains(")")) new InvalidConfigException("Invalid Condition at line " + i + ": " + line).printException(); @@ -38,28 +39,26 @@ public class CustomPickupOverrideHandler if (blockname.contains("*")) { String modid = blockname.replace("*", ""); - for (int k = 0; k < Block.REGISTRY.getKeys().size(); k++) + for (int k = 0; k < ForgeRegistries.BLOCKS.getKeys().size(); k++) { - if (Block.REGISTRY.getKeys().toArray()[k].toString().contains(modid)) + if (ForgeRegistries.BLOCKS.getKeys().toArray()[k].toString().contains(modid)) { - PICKUP_CONDITIONS.put(Block.REGISTRY.getKeys().toArray()[k].toString() + ";any", condition); + PICKUP_CONDITIONS.put(ForgeRegistries.BLOCKS.getKeys().toArray()[k].toString(), condition); } } } else { - if (!blockname.contains(";")) - blockname = blockname + ";any"; PICKUP_CONDITIONS.put(blockname, condition); } } - String[] entityConditions = CarryOnConfig.customPickupConditions.customPickupConditionsEntities; + List entityConditions = (List) CustomPickupConditions.customPickupConditionsEntities.get(); - for (int i = 0; i < entityConditions.length; i++) + for (int i = 0; i < entityConditions.size(); i++) { - String line = entityConditions[i]; + String line = entityConditions.get(i); if (!line.contains("(") || !line.contains(")")) new InvalidConfigException("Invalid Condition at line " + i + ": " + line).printException(); @@ -77,47 +76,43 @@ public class CustomPickupOverrideHandler public static boolean hasSpecialPickupConditions(IBlockState state) { - if (!Loader.isModLoaded("gamestages")) + if (!ModList.get().isLoaded("gamestages")) return false; String block = state.getBlock().getRegistryName().toString(); - String meta = "" + state.getBlock().getMetaFromState(state); + + boolean absolute = PICKUP_CONDITIONS.containsKey(block); - boolean absolute = PICKUP_CONDITIONS.containsKey(block + ";" + meta); - boolean any = PICKUP_CONDITIONS.containsKey(block + ";any"); - - return absolute || any; + return absolute; } 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"); + String absolute = PICKUP_CONDITIONS.get(block); if (absolute != null) return absolute; else - return any; + return null; } public static boolean hasSpecialPickupConditions(Entity entity) { - if (!Loader.isModLoaded("gamestages")) + if (!ModList.get().isLoaded("gamestages")) return false; - String entityname = EntityList.getKey(entity).toString(); - boolean condition = PICKUP_CONDITIONS_ENTITIES.containsKey(entityname); + String name = entity.getType().getRegistryName().toString(); + boolean condition = PICKUP_CONDITIONS_ENTITIES.containsKey(name); return condition; } public static String getPickupCondition(Entity entity) { - String entityname = EntityList.getKey(entity).toString(); - String condition = PICKUP_CONDITIONS_ENTITIES.get(entityname); + String name = entity.getType().getRegistryName().toString(); + String condition = PICKUP_CONDITIONS_ENTITIES.get(name); return condition; } diff --git a/src/main/java/tschipp/carryon/common/handler/ListHandler.java b/src/main/java/tschipp/carryon/common/handler/ListHandler.java index aab85c3..54f1c88 100644 --- a/src/main/java/tschipp/carryon/common/handler/ListHandler.java +++ b/src/main/java/tschipp/carryon/common/handler/ListHandler.java @@ -5,9 +5,10 @@ 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; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; +import tschipp.carryon.common.config.Configs.Blacklist; +import tschipp.carryon.common.config.Configs.WhiteList; public class ListHandler { @@ -17,7 +18,7 @@ public class ListHandler public static List ALLOWED_TILES; public static List FORBIDDEN_STACKING; public static List ALLOWED_STACKING; - + public static boolean isForbidden(Block block) { String name = block.getRegistryName().toString(); @@ -30,61 +31,44 @@ public class ListHandler { if (s.contains("*")) { - if(name.contains(s.replace("*", ""))) + String[] filter = s.replace("*", ",").split(","); + if (containsAll(name, filter)) 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; + String name = entity.getType().getRegistryName().toString(); + boolean contains = FORBIDDEN_ENTITIES.contains(name); + return contains; } 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; + String name = entity.getType().getRegistryName().toString(); + boolean contains = ALLOWED_ENTITIES.contains(name); + return contains; } public static boolean isStackingForbidden(Entity entity) { - if (EntityList.getKey(entity) != null) - { - String name = EntityList.getKey(entity).toString(); - boolean contains = FORBIDDEN_STACKING.contains(name); - return contains; - } - - return true; + String name = entity.getType().getRegistryName().toString(); + boolean contains = FORBIDDEN_STACKING.contains(name); + return contains; } public static boolean isStackingAllowed(Entity entity) { - if (EntityList.getKey(entity) != null) - { - String name = EntityList.getKey(entity).toString(); - boolean contains = ALLOWED_STACKING.contains(name); - return contains; - } - return true; + String name = entity.getType().getRegistryName().toString(); + boolean contains = ALLOWED_STACKING.contains(name); + return contains; } - + public static boolean isAllowed(Block block) { String name = block.getRegistryName().toString(); @@ -97,105 +81,129 @@ public class ListHandler { if (s.contains("*")) { - if(name.contains(s.replace("*", ""))) + String[] filter = s.replace("*", ",").split(","); + if (containsAll(name, filter)) contains = true; } } + return contains; } } + @SuppressWarnings("unchecked") public static void initLists() { - String[] forbidden = CarryOnConfig.blacklist.forbiddenTiles; + List forbidden = (List) Blacklist.forbiddenTiles.get(); FORBIDDEN_TILES = new ArrayList(); - for (int i = 0; i < forbidden.length; i++) + for (int i = 0; i < forbidden.size(); i++) { - FORBIDDEN_TILES.add(forbidden[i]); + FORBIDDEN_TILES.add(forbidden.get(i)); } - String[] forbiddenEntity = CarryOnConfig.blacklist.forbiddenEntities; + List forbiddenEntity = (List) Blacklist.forbiddenEntities.get(); FORBIDDEN_ENTITIES = new ArrayList(); - for (int i = 0; i < forbiddenEntity.length; i++) + for (int i = 0; i < forbiddenEntity.size(); i++) { - if (forbiddenEntity[i].contains("*")) + if (forbiddenEntity.get(i).contains("*")) { - String modid = forbiddenEntity[i].replace("*", ""); - for (int k = 0; k < ForgeRegistries.ENTITIES.getKeys().size(); k++) + String[] filter = forbiddenEntity.get(i).replace("*", ",").split(","); + + ResourceLocation[] keys = ForgeRegistries.ENTITIES.getKeys().toArray(new ResourceLocation[0]); + for (ResourceLocation key : keys) { - if (ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString().contains(modid)) + if (containsAll(key.toString(), filter)) { - FORBIDDEN_ENTITIES.add(ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString()); + FORBIDDEN_ENTITIES.add(key.toString()); } } } - FORBIDDEN_ENTITIES.add(forbiddenEntity[i]); + FORBIDDEN_ENTITIES.add(forbiddenEntity.get(i)); } - String[] allowedEntities = CarryOnConfig.whitelist.allowedEntities; + List allowedEntities = (List) WhiteList.allowedEntities.get(); ALLOWED_ENTITIES = new ArrayList(); - for (int i = 0; i < allowedEntities.length; i++) + for (int i = 0; i < allowedEntities.size(); i++) { - if (allowedEntities[i].contains("*")) + if (allowedEntities.get(i).contains("*")) { - String modid = allowedEntities[i].replace("*", ""); - for (int k = 0; k < ForgeRegistries.ENTITIES.getKeys().size(); k++) + String[] filter = allowedEntities.get(i).replace("*", ",").split(","); + + ResourceLocation[] keys = ForgeRegistries.ENTITIES.getKeys().toArray(new ResourceLocation[0]); + for (ResourceLocation key : keys) { - if (ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString().contains(modid)) + if (containsAll(key.toString(), filter)) { - ALLOWED_ENTITIES.add(ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString()); + ALLOWED_ENTITIES.add(key.toString()); } } } - ALLOWED_ENTITIES.add(allowedEntities[i]); + ALLOWED_ENTITIES.add(allowedEntities.get(i)); } - String[] allowedBlocks = CarryOnConfig.whitelist.allowedBlocks; + List allowedBlocks = (List) WhiteList.allowedBlocks.get(); ALLOWED_TILES = new ArrayList(); - for (int i = 0; i < allowedBlocks.length; i++) + for (int i = 0; i < allowedBlocks.size(); i++) { - ALLOWED_TILES.add(allowedBlocks[i]); + ALLOWED_TILES.add(allowedBlocks.get(i)); } - - String[] forbiddenStacking = CarryOnConfig.blacklist.forbiddenStacking; + + List forbiddenStacking = (List) Blacklist.forbiddenStacking.get(); FORBIDDEN_STACKING = new ArrayList(); - for (int i = 0; i < forbiddenStacking.length; i++) + for (int i = 0; i < forbiddenStacking.size(); i++) { - if (forbiddenStacking[i].contains("*")) + if (forbiddenStacking.get(i).contains("*")) { - String modid = forbiddenStacking[i].replace("*", ""); - for (int k = 0; k < ForgeRegistries.ENTITIES.getKeys().size(); k++) + String[] filter = forbiddenStacking.get(i).replace("*", ",").split(","); + + ResourceLocation[] keys = ForgeRegistries.ENTITIES.getKeys().toArray(new ResourceLocation[0]); + for (ResourceLocation key : keys) { - if (ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString().contains(modid)) + if (containsAll(key.toString(), filter)) { - FORBIDDEN_STACKING.add(ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString()); + FORBIDDEN_STACKING.add(key.toString()); } } } - FORBIDDEN_STACKING.add(forbiddenStacking[i]); + FORBIDDEN_STACKING.add(forbiddenStacking.get(i)); } - String[] allowedStacking = CarryOnConfig.whitelist.allowedStacking; + List allowedStacking = (List) WhiteList.allowedStacking.get(); ALLOWED_STACKING = new ArrayList(); - for (int i = 0; i < allowedStacking.length; i++) + for (int i = 0; i < allowedStacking.size(); i++) { - if (allowedStacking[i].contains("*")) + if (allowedStacking.get(i).contains("*")) { - String modid = allowedStacking[i].replace("*", ""); - for (int k = 0; k < ForgeRegistries.ENTITIES.getKeys().size(); k++) + String[] filter = allowedStacking.get(i).replace("*", ",").split(","); + + ResourceLocation[] keys = ForgeRegistries.ENTITIES.getKeys().toArray(new ResourceLocation[0]); + for (ResourceLocation key : keys) { - if (ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString().contains(modid)) + if (containsAll(key.toString(), filter)) { - ALLOWED_STACKING.add(ForgeRegistries.ENTITIES.getKeys().toArray()[k].toString()); + ALLOWED_STACKING.add(key.toString()); } } } - ALLOWED_STACKING.add(allowedStacking[i]); + ALLOWED_STACKING.add(allowedStacking.get(i)); } } + + public static boolean containsAll(String str, String... strings) + { + boolean containsAll = true; + + for(String s : strings) + { + if(!str.contains(s)) + containsAll = false; + } + + return containsAll; + } } diff --git a/src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java b/src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java index 2d8885c..4e965a5 100644 --- a/src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java +++ b/src/main/java/tschipp/carryon/common/handler/ModelOverridesHandler.java @@ -1,6 +1,7 @@ package tschipp.carryon.common.handler; import java.util.HashMap; +import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; @@ -8,18 +9,17 @@ 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.client.renderer.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 net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.ModList; +import tschipp.carryon.common.config.Configs.ModelOverrides; import tschipp.carryon.common.helper.InvalidConfigException; import tschipp.carryon.common.helper.StringParser; @@ -30,129 +30,131 @@ public class ModelOverridesHandler /* * This class is really ugly, will probably be replaced by something else - * Tschipp - */ - public static void initOverrides() + */ + public static void parseOverride(String overrideString, int i) { - String[] overrides = CarryOnConfig.modelOverrides.modelOverrides; + boolean errored = false; - for (int i = 0; i < overrides.length; i++) + Object toOverrideObject; + Object overrideObject; + NBTTagCompound tag = new NBTTagCompound(); + + String currentline = overrideString; + 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 { - boolean errored = false; + toOverride = sa[0]; + override = sa[1]; + } + catch (ArrayIndexOutOfBoundsException e) + { + errored = true; + new InvalidConfigException("Missing Override Model at line " + i + " : " + currentline).printException(); + } - Object toOverrideObject; - Object overrideObject; - NBTTagCompound tag = new NBTTagCompound(); + if (toOverride.contains("{")) + { + if (!toOverride.contains("}")) + { + errored = true; + new InvalidConfigException("Missing } at line " + i + " : " + currentline).printException(); + } - 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 = ""; + String nbt = toOverride.substring(toOverride.indexOf("{")); + toOverride = toOverride.replace(nbt, ""); try { - toOverride = sa[0]; - override = sa[1]; + tag = JsonToNBT.getTagFromJson(nbt); } - catch (ArrayIndexOutOfBoundsException e) + catch (Exception e) { errored = true; - new InvalidConfigException("Missing Override Model at line " + i + " : " + currentline).printException(); + new InvalidConfigException("Error while parsing NBT at line " + i + " : " + e.getMessage()).printException(); } - if (toOverride.contains("{")) - { - if (!toOverride.contains("}")) - { - errored = true; - new InvalidConfigException("Missing } at line " + i + " : " + currentline).printException(); - } + } + else 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("}")) + String overridetype = "item"; + if (override.contains("(")) + { + if (!override.contains(")")) { errored = true; - new InvalidConfigException("Missing { at line " + i + " : " + currentline).printException(); + new InvalidConfigException("Missing ) at line " + i + " : " + currentline).printException(); } - String overridetype = "item"; - if (override.contains("(")) + 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 ((ModList.get().isLoaded(modidOverride) || modidOverride.equals("minecraft")) && (ModList.get().isLoaded(modidToOverride) || modidToOverride.equals("minecraft")) && !errored) + { + toOverrideObject = StringParser.getBlockState(toOverride); + + if (toOverrideObject != null) { - 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); + if (overridetype.equals("block")) + overrideObject = StringParser.getBlockState(override); else - toOverrideObject = StringParser.getBlockState(toOverride); + overrideObject = StringParser.getItemStack(override); - if (toOverrideObject != null) + if (overrideObject != 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) { - 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); + keyComp.setString("block", ((Block) toOverrideObject).getRegistryName().toString()); } + else + { + keyComp.setInt("stateid", Block.getStateId((IBlockState) toOverrideObject)); + keyComp.setString("block", ((IBlockState) toOverrideObject).getBlock().getRegistryName().toString()); + } + OVERRIDE_OBJECTS.put(keyComp, overrideObject); } } } } + + + public static void initOverrides() + { + @SuppressWarnings("unchecked") + List overrides = (List) ModelOverrides.modelOverrides.get(); + + for (int i = 0; i < overrides.size(); i++) + { + parseOverride(overrides.get(i), i); + } + } public static boolean hasCustomOverrideModel(IBlockState state, NBTTagCompound tag) { @@ -164,13 +166,13 @@ public class ModelOverridesHandler OVERRIDE_OBJECTS.keySet().toArray(keys); for (NBTTagCompound key : keys) { - int id = key.getInteger("stateid"); + int id = key.getInt("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(); + NBTTagCompound toCheckForCompound = key.getCompound("nbttag"); + Set kSetToCheck = toCheckForCompound.keySet(); + Set kSetTile = tag.keySet(); boolean flag = true; if (kSetTile.containsAll(kSetToCheck)) @@ -189,7 +191,7 @@ public class ModelOverridesHandler return false; } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public static IBakedModel getCustomOverrideModel(IBlockState state, NBTTagCompound tag, World world, EntityPlayer player) { int stateid = Block.getStateId(state); @@ -197,13 +199,13 @@ public class ModelOverridesHandler OVERRIDE_OBJECTS.keySet().toArray(keys); for (NBTTagCompound key : keys) { - int id = key.getInteger("stateid"); + int id = key.getInt("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(); + NBTTagCompound toCheckForCompound = key.getCompound("nbttag"); + Set kSetToCheck = toCheckForCompound.keySet(); + Set kSetTile = tag.keySet(); boolean flag = true; if (kSetTile.containsAll(kSetToCheck)) @@ -221,9 +223,9 @@ public class ModelOverridesHandler return null; if (override instanceof IBlockState) - return Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState((IBlockState) override); + return Minecraft.getInstance().getBlockRendererDispatcher().getModelForState((IBlockState) override); else - return Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides((ItemStack) override, world, player); + return Minecraft.getInstance().getItemRenderer().getItemModelWithOverrides((ItemStack) override, world, player); } } } @@ -239,13 +241,13 @@ public class ModelOverridesHandler OVERRIDE_OBJECTS.keySet().toArray(keys); for (NBTTagCompound key : keys) { - int id = key.getInteger("stateid"); + int id = key.getInt("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(); + NBTTagCompound toCheckForCompound = key.getCompound("nbttag"); + Set kSetToCheck = toCheckForCompound.keySet(); + Set kSetTile = tag.keySet(); boolean flag = true; if (kSetTile.containsAll(kSetToCheck)) diff --git a/src/main/java/tschipp/carryon/common/handler/PickupHandler.java b/src/main/java/tschipp/carryon/common/handler/PickupHandler.java index 5115654..1e37f2f 100644 --- a/src/main/java/tschipp/carryon/common/handler/PickupHandler.java +++ b/src/main/java/tschipp/carryon/common/handler/PickupHandler.java @@ -5,9 +5,7 @@ import java.util.UUID; import javax.annotation.Nullable; -import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.EnumCreatureType; @@ -18,13 +16,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.fml.relauncher.ReflectionHelper; -import tschipp.carryon.CarryOn; -import tschipp.carryon.common.config.CarryOnConfig; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import tschipp.carryon.common.config.Configs.Settings; import tschipp.carryon.common.item.ItemTile; import tschipp.carryon.common.scripting.CarryOnOverride; import tschipp.carryon.common.scripting.ScriptChecker; @@ -36,12 +32,10 @@ public class PickupHandler { IBlockState state = world.getBlockState(pos); - Block block = state.getBlock(); - NBTTagCompound tag = new NBTTagCompound(); if (tile != null) - tile.writeToNBT(tag); - + tile.write(tag); + CarryOnOverride override = ScriptChecker.inspectBlock(world.getBlockState(pos), world, pos, tag); if (override != null) { @@ -49,7 +43,7 @@ public class PickupHandler } else { - if (CarryOnConfig.settings.useWhitelistBlocks) + if (Settings.useWhitelistBlocks.get()) { if (!ListHandler.isAllowed(world.getBlockState(pos).getBlock())) { @@ -64,11 +58,11 @@ public class PickupHandler } } - if ((block.getBlockHardness(state, world, pos) != -1 || player.isCreative())) + if ((state.getBlockHardness(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 (distance < Math.pow(Settings.maxDistance.get(), 2)) { if (!ItemTile.isLocked(pos, world)) @@ -81,8 +75,8 @@ public class PickupHandler 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); + Method getPlayerData = ObfuscationReflectionHelper.findMethod(gameStageHelper, "getPlayerData", EntityPlayer.class); + Method hasStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasStage", String.class); Object stageData = getPlayerData.invoke(null, player); String condition = CustomPickupOverrideHandler.getPickupCondition(state); @@ -98,8 +92,8 @@ public class PickupHandler 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); + Method getStageData = ObfuscationReflectionHelper.findMethod(playerDataHandler, "getStageData", EntityPlayer.class); + Method hasUnlockedStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasUnlockedStage", String.class); Object stageData = getStageData.invoke(null, player); String condition = CustomPickupOverrideHandler.getPickupCondition(state); @@ -115,7 +109,7 @@ public class PickupHandler } } - else if (CarryOnConfig.settings.pickupAllBlocks ? true : tile != null) + else if (Settings.pickupAllBlocks.get() ? true : tile != null) { return handleProtections((EntityPlayerMP) player, world, pos, state); } @@ -142,19 +136,19 @@ public class PickupHandler } else { - if (toPickUp instanceof EntityAgeable && CarryOnConfig.settings.allowBabies) + if (toPickUp instanceof EntityAgeable && Settings.allowBabies.get()) { 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 (distance < Math.pow(Settings.maxDistance.get(), 2)) { if (toPickUp instanceof EntityTameable) { EntityTameable tame = (EntityTameable) toPickUp; - if (tame.getOwnerId() != null && tame.getOwnerId() != player.getUUID(player.getGameProfile())) + if (tame.getOwnerId() != null && tame.getOwnerId() != EntityPlayer.getUUID(player.getGameProfile())) return false; } } @@ -166,8 +160,8 @@ public class PickupHandler 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); + Method getPlayerData = ObfuscationReflectionHelper.findMethod(gameStageHelper, "getPlayerData", EntityPlayer.class); + Method hasStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasStage", String.class); Object stageData = getPlayerData.invoke(null, player); String condition = CustomPickupOverrideHandler.getPickupCondition(toPickUp); @@ -183,8 +177,8 @@ public class PickupHandler 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); + Method getStageData = ObfuscationReflectionHelper.findMethod(playerDataHandler, "getStageData", EntityPlayer.class); + Method hasUnlockedStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasUnlockedStage", String.class); Object stageData = getStageData.invoke(null, player); String condition = CustomPickupOverrideHandler.getPickupCondition(toPickUp); @@ -204,7 +198,7 @@ public class PickupHandler } } - if (CarryOnConfig.settings.useWhitelistEntities) + if (Settings.useWhitelistEntities.get()) { if (!ListHandler.isAllowed(toPickUp)) { @@ -219,20 +213,20 @@ public class PickupHandler } } - if ((CarryOnConfig.settings.pickupHostileMobs ? true : !toPickUp.isCreatureType(EnumCreatureType.MONSTER, false) || player.isCreative())) + if ((Settings.pickupHostileMobs.get() ? true : !toPickUp.isCreatureType(EnumCreatureType.MONSTER, false) || player.isCreative())) { - if ((CarryOnConfig.settings.pickupHostileMobs ? true : !toPickUp.isCreatureType(EnumCreatureType.MONSTER, false) || player.isCreative())) + if ((Settings.pickupHostileMobs.get() ? true : !toPickUp.isCreatureType(EnumCreatureType.MONSTER, false) || player.isCreative())) { - if ((toPickUp.height <= CarryOnConfig.settings.maxEntityHeight && toPickUp.width <= CarryOnConfig.settings.maxEntityWidth || player.isCreative())) + if ((toPickUp.height <= Settings.maxEntityHeight.get() && toPickUp.width <= Settings.maxEntityWidth.get() || player.isCreative())) { double distance = pos.distanceSqToCenter(player.posX, player.posY + 0.5, player.posZ); - if (distance < Math.pow(CarryOnConfig.settings.maxDistance, 2)) + if (distance < Math.pow(Settings.maxDistance.get(), 2)) { if (toPickUp instanceof EntityTameable) { EntityTameable tame = (EntityTameable) toPickUp; UUID owner = tame.getOwnerId(); - UUID playerID = player.getUUID(player.getGameProfile()); + UUID playerID = EntityPlayer.getUUID(player.getGameProfile()); if (owner != null && !owner.equals(playerID)) return false; } @@ -244,8 +238,8 @@ public class PickupHandler 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); + Method getPlayerData = ObfuscationReflectionHelper.findMethod(gameStageHelper, "getPlayerData", EntityPlayer.class); + Method hasStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasStage", String.class); Object stageData = getPlayerData.invoke(null, player); String condition = CustomPickupOverrideHandler.getPickupCondition(toPickUp); @@ -261,8 +255,8 @@ public class PickupHandler 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); + Method getStageData = ObfuscationReflectionHelper.findMethod(playerDataHandler, "getStageData", EntityPlayer.class); + Method hasUnlockedStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasUnlockedStage", String.class); Object stageData = getStageData.invoke(null, player); String condition = CustomPickupOverrideHandler.getPickupCondition(toPickUp); diff --git a/src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java b/src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java index d92b69d..9f190f5 100644 --- a/src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java +++ b/src/main/java/tschipp/carryon/common/handler/RegistrationHandler.java @@ -1,11 +1,11 @@ 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 net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.registries.ObjectHolder; import tschipp.carryon.CarryOn; import tschipp.carryon.client.event.RenderEntityEvents; import tschipp.carryon.client.event.RenderEvents; @@ -14,15 +14,20 @@ 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.IMCEvents; import tschipp.carryon.common.event.ItemEntityEvents; import tschipp.carryon.common.event.ItemEvents; import tschipp.carryon.common.item.ItemEntity; import tschipp.carryon.common.item.ItemTile; import tschipp.carryon.compat.obfuscate.ObfuscateEvents; +@EventBusSubscriber(modid = CarryOn.MODID) public class RegistrationHandler -{ +{ + @ObjectHolder("carryon:tile_item") public static Item itemTile; + + @ObjectHolder("carryon:entity_item") public static Item itemEntity; public static void regItems() @@ -31,17 +36,12 @@ public class RegistrationHandler 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()); + MinecraftForge.EVENT_BUS.register(new IMCEvents()); } public static void regClientEvents() @@ -50,7 +50,8 @@ public class RegistrationHandler MinecraftForge.EVENT_BUS.register(new RenderEntityEvents()); MinecraftForge.EVENT_BUS.register(new PositionClientEvents()); - if(Loader.isModLoaded("obfuscate")) + + if(ModList.get().isLoaded("obfuscate")) MinecraftForge.EVENT_BUS.register(new ObfuscateEvents()); } @@ -66,5 +67,8 @@ public class RegistrationHandler { 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 index fdabc9c..ebd4438 100644 --- a/src/main/java/tschipp/carryon/common/helper/InvalidConfigException.java +++ b/src/main/java/tschipp/carryon/common/helper/InvalidConfigException.java @@ -5,6 +5,8 @@ import tschipp.carryon.CarryOn; public class InvalidConfigException extends Exception { + private static final long serialVersionUID = -7161004674405185407L; + public InvalidConfigException(String cause) { super(cause); diff --git a/src/main/java/tschipp/carryon/common/helper/KeyboardCallbackWrapper.java b/src/main/java/tschipp/carryon/common/helper/KeyboardCallbackWrapper.java new file mode 100644 index 0000000..00b6412 --- /dev/null +++ b/src/main/java/tschipp/carryon/common/helper/KeyboardCallbackWrapper.java @@ -0,0 +1,45 @@ +package tschipp.carryon.common.helper; + +import org.lwjgl.glfw.GLFW; +import org.lwjgl.glfw.GLFWKeyCallback; + +import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; + +public class KeyboardCallbackWrapper +{ + GLFWKeyCallback oldCallback; + + public void setup(Minecraft mc) + { + oldCallback = GLFW.glfwSetKeyCallback(mc.mainWindow.getHandle(), this::keyCallback); + } + + private void keyCallback(long window, int key, int scancode, int action, int mods) + { + KeyPressedEvent event = new KeyPressedEvent(key, scancode); + MinecraftForge.EVENT_BUS.post(event); + + if (event.isCanceled()) + return; + + if (oldCallback != null) + oldCallback.invoke(window, key, scancode, action, mods); + } + + @Cancelable + public static class KeyPressedEvent extends Event + { + public int key; + public int scancode; + + public KeyPressedEvent(int key, int scancode) + { + this.key = key; + this.scancode = scancode; + } + + } +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/common/helper/ReflectionHelper.java b/src/main/java/tschipp/carryon/common/helper/ReflectionHelper.java new file mode 100644 index 0000000..35131a3 --- /dev/null +++ b/src/main/java/tschipp/carryon/common/helper/ReflectionHelper.java @@ -0,0 +1,246 @@ +/* + * Minecraft Forge + * Copyright (c) 2016. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package tschipp.carryon.common.helper; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.google.common.base.Preconditions; +/** + * Some reflection helper code. + * + * @author cpw + * + */ +public class ReflectionHelper +{ + public static class UnableToFindMethodException extends RuntimeException + { + private static final long serialVersionUID = 1L; + //private String[] methodNames; + + public UnableToFindMethodException(String[] methodNames, Exception failed) + { + super(failed); + //this.methodNames = methodNames; + } + + public UnableToFindMethodException(Throwable failed) + { + super(failed); + } + + } + + public static class UnableToFindClassException extends RuntimeException + { + private static final long serialVersionUID = 1L; + //private String[] classNames; + + public UnableToFindClassException(String[] classNames, @Nullable Exception err) + { + super(err); + //this.classNames = classNames; + } + + } + + public static class UnableToAccessFieldException extends RuntimeException + { + private static final long serialVersionUID = 1L; + //private String[] fieldNameList; + + public UnableToAccessFieldException(String[] fieldNames, Exception e) + { + super(e); + //this.fieldNameList = fieldNames; + } + } + + public static class UnableToFindFieldException extends RuntimeException + { + private static final long serialVersionUID = 1L; + //private String[] fieldNameList; + public UnableToFindFieldException(String[] fieldNameList, Exception e) + { + super(e); + //this.fieldNameList = fieldNameList; + } + } + + @SuppressWarnings("serial") + public static class UnknownConstructorException extends RuntimeException + { + public UnknownConstructorException(final String message) + { + super(message); + } + } + + public static Field findField(Class clazz, String... fieldNames) + { + Exception failed = null; + for (String fieldName : fieldNames) + { + try + { + Field f = clazz.getDeclaredField(fieldName); + f.setAccessible(true); + return f; + } + catch (Exception e) + { + failed = e; + } + } + throw new UnableToFindFieldException(fieldNames, failed); + } + + @SuppressWarnings("unchecked") + public static T getPrivateValue(Class classToAccess, @Nullable E instance, int fieldIndex) + { + try + { + Field f = classToAccess.getDeclaredFields()[fieldIndex]; + f.setAccessible(true); + return (T) f.get(instance); + } + catch (Exception e) + { + throw new UnableToAccessFieldException(new String[0], e); + } + } + + @SuppressWarnings("unchecked") + public static T getPrivateValue(Class classToAccess, E instance, String... fieldNames) + { + try + { + return (T) findField(classToAccess, fieldNames).get(instance); + } + catch (Exception e) + { + throw new UnableToAccessFieldException(fieldNames, e); + } + } + + public static void setPrivateValue(Class classToAccess, T instance, E value, int fieldIndex) + { + try + { + Field f = classToAccess.getDeclaredFields()[fieldIndex]; + f.setAccessible(true); + f.set(instance, value); + } + catch (Exception e) + { + throw new UnableToAccessFieldException(new String[0] , e); + } + } + + public static void setPrivateValue(Class classToAccess, T instance, E value, String... fieldNames) + { + try + { + findField(classToAccess, fieldNames).set(instance, value); + } + catch (Exception e) + { + throw new UnableToAccessFieldException(fieldNames, e); + } + } + + @SuppressWarnings("unchecked") + public static Class getClass(ClassLoader loader, String... classNames) + { + Exception err = null; + for (String className : classNames) + { + try + { + return (Class) Class.forName(className, false, loader); + } + catch (Exception e) + { + err = e; + } + } + + throw new UnableToFindClassException(classNames, err); + } + + /** + * Finds a method with the specified name and parameters in the given class and makes it accessible. + * Note: for performance, store the returned value and avoid calling this repeatedly. + *

+ * Throws an exception if the method is not found. + * + * @param clazz The class to find the method on. + * @param methodName The name of the method to find (used in developer environments, i.e. "getWorldTime"). + * @param methodObfName The obfuscated name of the method to find (used in obfuscated environments, i.e. "getWorldTime"). + * If the name you are looking for is on a class that is never obfuscated, this should be null. + * @param parameterTypes The parameter types of the method to find. + * @return The method with the specified name and parameters in the given class. + */ + + + /** + * Finds a constructor in the specified class that has matching parameter types. + * + * @param klass The class to find the constructor in + * @param parameterTypes The parameter types of the constructor. + * @param The type + * @return The constructor + * @throws NullPointerException if {@code klass} is null + * @throws NullPointerException if {@code parameterTypes} is null + * @throws UnknownConstructorException if the constructor could not be found + */ + @Nonnull + public static Constructor findConstructor(@Nonnull final Class klass, @Nonnull final Class... parameterTypes) + { + Preconditions.checkNotNull(klass, "class"); + Preconditions.checkNotNull(parameterTypes, "parameter types"); + + final Constructor constructor; + try + { + constructor = klass.getDeclaredConstructor(parameterTypes); + constructor.setAccessible(true); + } + catch (final NoSuchMethodException e) + { + final StringBuilder desc = new StringBuilder(); + desc.append(klass.getSimpleName()).append('('); + for (int i = 0, length = parameterTypes.length; i < length; i++) + { + desc.append(parameterTypes[i].getName()); + if (i > length) + { + desc.append(',').append(' '); + } + } + desc.append(')'); + throw new UnknownConstructorException("Could not find constructor '" + desc.toString() + "' in " + klass); + } + return constructor; + } +} \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java b/src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java index 4a8d037..3998ffe 100644 --- a/src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java +++ b/src/main/java/tschipp/carryon/common/helper/ReflectionUtil.java @@ -7,7 +7,7 @@ import java.lang.reflect.Method; import javax.annotation.Nullable; -import net.minecraftforge.fml.relauncher.ReflectionHelper; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; /** * Utility methods for reflection. @@ -31,14 +31,14 @@ public class ReflectionUtil */ public static MethodHandle findMethod(final Class clazz, final String methodName, @Nullable final String methodObfName, final Class... parameterTypes) { - final Method method = ReflectionHelper.findMethod(clazz, methodName, methodObfName, parameterTypes); + final Method method = ObfuscationReflectionHelper.findMethod(clazz, methodName, parameterTypes); try { return MethodHandles.lookup().unreflect(method); } catch (IllegalAccessException e) { - throw new ReflectionHelper.UnableToFindMethodException(e); + throw new ObfuscationReflectionHelper.UnableToFindMethodException(e); } } diff --git a/src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java b/src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java index e58ab10..7d9215c 100644 --- a/src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java +++ b/src/main/java/tschipp/carryon/common/helper/ScriptParseHelper.java @@ -8,7 +8,7 @@ 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.INBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.scoreboard.Score; @@ -76,11 +76,11 @@ public class ScriptParseHelper return true; boolean matching = true; - for (String key : toMatch.getKeySet()) + for (String key : toMatch.keySet()) { - NBTBase tag = toMatch.getTag(key); + INBTBase tag = toMatch.getTag(key); key = key.replace("\"", ""); - NBTBase tagToCheck = toCheck.getTag(key); + INBTBase tagToCheck = toCheck.getTag(key); if (!tag.equals(tagToCheck)) matching = false; } @@ -99,17 +99,17 @@ public class ScriptParseHelper } - public static double[] getScale(String s) + public static double[] getscaled(String s) { double[] d = new double[3]; - d[0] = getScaleValueFromString(s, "x"); - d[1] = getScaleValueFromString(s, "y"); - d[2] = getScaleValueFromString(s, "z"); + d[0] = getscaledValueFromString(s, "x"); + d[1] = getscaledValueFromString(s, "y"); + d[2] = getscaledValueFromString(s, "z"); return d; } - public static double getScaleValueFromString(String toGetFrom, String key) + public static double getscaledValueFromString(String toGetFrom, String key) { if(toGetFrom == null) return 1; diff --git a/src/main/java/tschipp/carryon/common/helper/ScrollCallbackWrapper.java b/src/main/java/tschipp/carryon/common/helper/ScrollCallbackWrapper.java new file mode 100644 index 0000000..9dd6bbb --- /dev/null +++ b/src/main/java/tschipp/carryon/common/helper/ScrollCallbackWrapper.java @@ -0,0 +1,38 @@ +package tschipp.carryon.common.helper; + +import org.lwjgl.glfw.GLFW; +import org.lwjgl.glfw.GLFWScrollCallback; + +import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; + +//Thanks to gigaherz for the help! +public class ScrollCallbackWrapper +{ + GLFWScrollCallback oldCallback; + + public void setup(Minecraft mc) + { + oldCallback = GLFW.glfwSetScrollCallback(mc.mainWindow.getHandle(), this::scrollCallback); + } + + private void scrollCallback(long window, double xoffset, double yoffset) + { + MouseScrolledEvent event = new MouseScrolledEvent(); + MinecraftForge.EVENT_BUS.post(event); + + if (event.isCanceled()) + return; + + if (oldCallback != null) + oldCallback.invoke(window, xoffset, yoffset); + } + + @Cancelable + public static class MouseScrolledEvent extends Event + { + + } +} diff --git a/src/main/java/tschipp/carryon/common/helper/StringParser.java b/src/main/java/tschipp/carryon/common/helper/StringParser.java index edd9184..447a9d5 100644 --- a/src/main/java/tschipp/carryon/common/helper/StringParser.java +++ b/src/main/java/tschipp/carryon/common/helper/StringParser.java @@ -2,16 +2,16 @@ package tschipp.carryon.common.helper; import javax.annotation.Nullable; -import org.apache.logging.log4j.Level; +import com.mojang.brigadier.StringReader; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.command.arguments.BlockStateParser; +import net.minecraft.command.arguments.ItemParser; 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 { @@ -19,69 +19,26 @@ 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; + IBlockState state = getBlockState(string); + if(state != null) + return state.getBlock(); + + return null; } - 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(), ""); + + BlockStateParser parser = new BlockStateParser(new StringReader(string), false); - int meta = getMeta(string); - if (meta == 0) - { - Block block = getBlock(string); - if(block != null) - return block.getDefaultState(); - } try { - return getBlock(string).getStateFromMeta(meta); + parser.parse(false); + return parser.getState(); } catch (Exception e) { @@ -95,15 +52,19 @@ public class StringParser { 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); + + ItemParser parser = new ItemParser(new StringReader(string), false); + + try + { + parser.parse(); + return parser.getItem(); + } + catch (Exception e) + { + new InvalidConfigException("Item parsing Exception at: " + string + " : " + e.getMessage()).printException(); + return null; + } } public static ItemStack getItemStack(String string) @@ -111,17 +72,30 @@ public class StringParser if(string == null) return null; - Item item = getItem(string); + ItemParser parser = new ItemParser(new StringReader(string), false); - if(item == null) + try + { + parser.parse(); + Item item = parser.getItem(); + NBTTagCompound nbt = parser.getNbt(); + + ItemStack stack = new ItemStack(item, 1); + + if(nbt != null) + { + stack.setTag(nbt); + } + + return stack; + } + catch (Exception e) + { + new InvalidConfigException("Item parsing Exception at: " + string + " : " + e.getMessage()).printException(); return ItemStack.EMPTY; - - ItemStack stack = new ItemStack(item, 1, getMeta(string)); - NBTTagCompound tag = getTagCompound(string); - if (tag != null) - stack.setTagCompound(tag); + + } - return stack; } @Nullable @@ -142,7 +116,7 @@ public class StringParser { tag = JsonToNBT.getTagFromJson(nbt); } - catch (NBTException e) + catch (Exception e) { new InvalidConfigException("Error while parsing NBT: " + e.getMessage()).printException(); return null; diff --git a/src/main/java/tschipp/carryon/common/item/ItemEntity.java b/src/main/java/tschipp/carryon/common/item/ItemEntity.java index 4c755ac..acbe828 100644 --- a/src/main/java/tschipp/carryon/common/item/ItemEntity.java +++ b/src/main/java/tschipp/carryon/common/item/ItemEntity.java @@ -2,15 +2,17 @@ package tschipp.carryon.common.item; import javax.annotation.Nonnull; -import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EntityType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; +import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.util.EnumActionResult; @@ -18,17 +20,15 @@ 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.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.ModList; import tschipp.carryon.CarryOn; import tschipp.carryon.client.keybinds.CarryOnKeybinds; -import tschipp.carryon.common.config.CarryOnConfig; +import tschipp.carryon.common.config.Configs.Settings; import tschipp.carryon.common.event.ItemEvents; -import tschipp.carryon.network.client.CarrySlotPacket; public class ItemEntity extends Item { @@ -37,28 +37,26 @@ public class ItemEntity extends Item public ItemEntity() { - this.setUnlocalizedName("entity_item"); + super(new Item.Properties().maxStackSize(1)); this.setRegistryName(CarryOn.MODID, "entity_item"); - ForgeRegistries.ITEMS.register(this); - this.setMaxStackSize(1); } @Override - public String getItemStackDisplayName(ItemStack stack) + public ITextComponent getDisplayName(ItemStack stack) { - if (hasEntityData(stack)) - { - return I18n.translateToLocal("entity."+EntityList.getTranslationName(new ResourceLocation(getEntityName(stack))) + ".name"); + if (hasEntityData(stack)) { + + return new TextComponentTranslation(getEntityType(stack).getTranslationKey()); } - return ""; + return new TextComponentString(""); } public static boolean hasEntityData(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); + NBTTagCompound tag = stack.getTag(); return tag.hasKey(ENTITY_DATA_KEY) && tag.hasKey("entity"); } return false; @@ -73,27 +71,33 @@ public class ItemEntity extends Item return false; NBTTagCompound entityData = new NBTTagCompound(); - entityData = entity.writeToNBT(entityData); + entityData = entity.serializeNBT(); - String name = EntityList.getKey(entity).toString(); + String name = EntityType.getId(entity.getType()).toString(); - NBTTagCompound tag = stack.hasTagCompound() ? stack.getTagCompound() : new NBTTagCompound(); + NBTTagCompound tag = stack.hasTag() ? stack.getTag() : new NBTTagCompound(); if (tag.hasKey(ENTITY_DATA_KEY)) return false; tag.setTag(ENTITY_DATA_KEY, entityData); tag.setString("entity", name); - stack.setTagCompound(tag); + stack.setTag(tag); return true; } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(ItemUseContext context) { - ItemStack stack = player.getHeldItem(hand); - Block block = world.getBlockState(pos).getBlock(); + EntityPlayer player = context.getPlayer(); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + EnumFacing facing = context.getFace(); + + ItemStack stack = context.getItem(); + + IBlockState state = world.getBlockState(pos); - if(Loader.isModLoaded("betterplacement")) + if(ModList.get().isLoaded("betterplacement")) { if(CarryOnKeybinds.isKeyPressed(player)) return EnumActionResult.FAIL; @@ -103,7 +107,7 @@ public class ItemEntity extends Item { BlockPos finalPos = pos; - if (!block.isReplaceable(world, pos)) + if (!state.isReplaceable(new BlockItemUseContext(context))) { finalPos = pos.offset(facing); } @@ -117,10 +121,10 @@ public class ItemEntity extends Item world.spawnEntity(entity); if (entity instanceof EntityLiving) { - ((EntityLiving) entity).playLivingSound(); + ((EntityLiving) entity).playAmbientSound(); } clearEntityData(stack); - player.setHeldItem(hand, ItemStack.EMPTY); + player.setHeldItem(EnumHand.MAIN_HAND, ItemStack.EMPTY); ItemEvents.sendPacket(player, 9, 0); } @@ -133,7 +137,7 @@ public class ItemEntity extends Item } @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) + public void inventoryTick(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { if (hasEntityData(stack)) { @@ -142,7 +146,7 @@ public class ItemEntity extends Item if (entity instanceof EntityLivingBase) { - if(entity instanceof EntityPlayer && CarryOnConfig.settings.slownessInCreative ? false : ((EntityPlayer)entity).isCreative()) + if(entity instanceof EntityPlayer && Settings.slownessInCreative.get() ? false : ((EntityPlayer)entity).isCreative()) return; ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 1, potionLevel(stack, world), false, false)); @@ -157,9 +161,9 @@ public class ItemEntity extends Item public static void clearEntityData(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); + NBTTagCompound tag = stack.getTag(); tag.removeTag(ENTITY_DATA_KEY); tag.removeTag("entity"); } @@ -167,10 +171,10 @@ public class ItemEntity extends Item public static NBTTagCompound getEntityData(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); - return tag.getCompoundTag(ENTITY_DATA_KEY); + NBTTagCompound tag = stack.getTag(); + return tag.getCompound(ENTITY_DATA_KEY); } return null; } @@ -183,18 +187,18 @@ public class ItemEntity extends Item String name = getEntityName(stack); NBTTagCompound e = getEntityData(stack); - Entity entity = EntityList.createEntityByIDFromName(new ResourceLocation(name), world); + Entity entity = EntityType.create(world, new ResourceLocation(name)); if (entity != null) - entity.readFromNBT(e); + entity.deserializeNBT(e); return entity; } public static String getEntityName(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); + NBTTagCompound tag = stack.getTag(); return tag.getString("entity"); } return null; @@ -202,9 +206,9 @@ public class ItemEntity extends Item public static String getCustomName(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); + NBTTagCompound tag = stack.getTag(); if (tag.hasKey("CustomName") && !tag.getString("CustomName").isEmpty()) { return tag.toString(); } else { @@ -214,6 +218,16 @@ public class ItemEntity extends Item return null; } + public static EntityType getEntityType(ItemStack stack) { + if (stack.hasTag()) { + NBTTagCompound tag = stack.getTag(); + String name = tag.getString("entity"); + EntityType type = EntityType.getById(name); + return type; + } + return null; + } + private int potionLevel(ItemStack stack, World world) { Entity e = getEntity(stack, world); @@ -224,9 +238,11 @@ public class ItemEntity extends Item if (i > 4) i = 4; - if (!CarryOnConfig.settings.heavyEntities) + if (!Settings.heavyEntities.get()) i = 1; - return (int) (i * CarryOnConfig.settings.entitySlownessMultiplier); + double multiplier = Settings.entitySlownessMultiplier.get(); + + return (int) (multiplier * i); } } diff --git a/src/main/java/tschipp/carryon/common/item/ItemTile.java b/src/main/java/tschipp/carryon/common/item/ItemTile.java index 49b0de2..6a1e55e 100644 --- a/src/main/java/tschipp/carryon/common/item/ItemTile.java +++ b/src/main/java/tschipp/carryon/common/item/ItemTile.java @@ -1,24 +1,22 @@ package tschipp.carryon.common.item; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; import java.util.Set; import javax.annotation.Nullable; +import com.google.common.base.CharMatcher; + 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.BlockItemUseContext; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; @@ -27,16 +25,19 @@ 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.ITextComponent; 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.Loader; -import net.minecraftforge.fml.common.registry.ForgeRegistries; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.world.BlockEvent.PlaceEvent; +import net.minecraftforge.fml.ModList; import tschipp.carryon.CarryOn; import tschipp.carryon.client.keybinds.CarryOnKeybinds; -import tschipp.carryon.common.config.CarryOnConfig; +import tschipp.carryon.common.config.Configs.Settings; import tschipp.carryon.common.event.ItemEvents; import tschipp.carryon.common.handler.CustomPickupOverrideHandler; import tschipp.carryon.common.handler.ModelOverridesHandler; @@ -45,18 +46,16 @@ public class ItemTile extends Item { public static final String TILE_DATA_KEY = "tileData"; - public static final String[] FACING_KEYS = new String[] { "rotation", "rot", "facing", "face", "direction", "dir", "front" }; + public static final String[] FACING_KEYS = new String[] { "rotation", "rot", "facing", "face", "direction", "dir", "front", "forward" }; public ItemTile() { - this.setUnlocalizedName("tile_item"); + super(new Item.Properties().maxStackSize(1)); this.setRegistryName(CarryOn.MODID, "tile_item"); - ForgeRegistries.ITEMS.register(this); - this.setMaxStackSize(1); } @Override - public String getItemStackDisplayName(ItemStack stack) + public ITextComponent getDisplayName(ItemStack stack) { if (hasTileData(stack)) { @@ -71,28 +70,31 @@ public class ItemTile extends Item 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 ostate.getBlock().getNameTextComponent(); } } return getItemStack(stack).getDisplayName(); } - return ""; + return new TextComponentString(""); } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(ItemUseContext context) { - if (Loader.isModLoaded("betterplacement")) + EnumFacing facing = context.getFace(); + EntityPlayer player = context.getPlayer(); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + ItemStack stack = context.getItem(); + + if (ModList.get().isLoaded("betterplacement")) { if (CarryOnKeybinds.isKeyPressed(player)) return EnumActionResult.FAIL; } - Block block = world.getBlockState(pos).getBlock(); - ItemStack stack = player.getHeldItem(hand); if (hasTileData(stack)) { try @@ -101,99 +103,84 @@ public class ItemTile extends Item EnumFacing facing2 = EnumFacing.getFacingFromVector((float) vec.x, 0f, (float) vec.z); BlockPos pos2 = pos; Block containedblock = getBlock(stack); - int meta = getMeta(stack); IBlockState containedstate = getBlockState(stack); - if (!world.getBlockState(pos2).getBlock().isReplaceable(world, pos2)) + if (!world.getBlockState(pos2).isReplaceable(new BlockItemUseContext(context))) { pos2 = pos.offset(facing); } - if (world.getBlockState(pos2).getBlock().isReplaceable(world, pos2) && containedblock != null) + if (world.getBlockState(pos2).isReplaceable(new BlockItemUseContext(context)) && containedblock != null) { - boolean canPlace = containedblock.canPlaceBlockAt(world, pos2); + boolean canPlace = containedstate.isValidPosition(world, pos2); if (canPlace) { - if (player.canPlayerEdit(pos, facing, stack) && world.mayPlace(containedblock, pos2, false, facing, (Entity) null)) + if (player.canPlayerEdit(pos, facing, stack) && world.isBlockModifiable(player, pos2)) { - boolean set = false; + + IBlockState actualState = containedblock.getStateForPlacement(new BlockItemUseContext(context)); + BlockSnapshot snapshot = new BlockSnapshot(world, pos2, containedstate); + PlaceEvent event = new PlaceEvent(snapshot, world.getBlockState(pos), player, EnumHand.MAIN_HAND); + MinecraftForge.EVENT_BUS.post(event); - // Handles Blockstate rotation - Iterator> iterator = containedblock.getDefaultState().getPropertyKeys().iterator(); - while (iterator.hasNext()) + if (!event.isCanceled()) { - IProperty prop = iterator.next(); - Object[] allowedValues = prop.getAllowedValues().toArray(); + world.setBlockState(pos2, actualState); - if (prop instanceof PropertyDirection && this.equal(allowedValues, EnumFacing.HORIZONTALS)) + // If the blockstate doesn't handle rotation, + // try to + // change rotation via NBT + if (!getTileData(stack).isEmpty()) { - 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.x, (float) vec.y, (float) vec.z); - world.setBlockState(pos2, containedstate.withProperty(prop, facing2.getOpposite())); - set = true; - } - } - - // If the blockstate doesn't handle rotation, try to - // change rotation via NBT - if (!set && !getTileData(stack).hasNoTags()) - { - NBTTagCompound tag = getTileData(stack); - Set keys = tag.getKeySet(); - keytester: - for (String key : keys) - { - for (String facingKey : FACING_KEYS) + NBTTagCompound tag = getTileData(stack); + Set keys = tag.keySet(); + keytester: for (String key : keys) { - if (key.toLowerCase().equals(facingKey)) + for (String facingKey : FACING_KEYS) { - String type = tag.getTagTypeName(tag.getTagId(key)); - switch (type) + if (key.toLowerCase().equals(facingKey)) { - case "TAG_String": - tag.setString(key, facing2.getOpposite().getName()); - break; - case "TAG_Int": - tag.setInteger(key, facing2.getOpposite().getIndex()); - break; - case "TAG_Byte": - tag.setByte(key, (byte) facing2.getOpposite().getIndex()); - break; - default: - break; + byte type = tag.getTagId(key); + switch (type) + { + case 8: + tag.setString(key, CharMatcher.javaUpperCase().matchesAllOf(tag.getString(key)) ? facing2.getOpposite().getName().toUpperCase() : facing2.getOpposite().getName()); + break; + case 3: + tag.setInt(key, facing2.getOpposite().getIndex()); + break; + case 1: + tag.setByte(key, (byte) facing2.getOpposite().getIndex()); + break; + default: + break; + } + + break keytester; } - - break keytester; } } } - } - if (!set) - world.setBlockState(pos2, containedstate); + TileEntity tile = world.getTileEntity(pos2); + if (tile != null) + { + tile.deserializeNBT(getTileData(stack)); + tile.setPos(pos2); + } + clearTileData(stack); + player.playSound(actualState.getSoundType(world, pos2, player).getPlaceSound(), 1.0f, 0.5f); + player.setHeldItem(EnumHand.MAIN_HAND, ItemStack.EMPTY); + player.getEntityData().removeTag("overrideKey"); + ItemEvents.sendPacket(player, 9, 0); + return EnumActionResult.SUCCESS; - 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"); - ItemEvents.sendPacket(player, 9, 0); - return EnumActionResult.SUCCESS; } } } - } - catch (Exception e) + } catch (Exception e) { e.printStackTrace(); @@ -201,7 +188,7 @@ public class ItemTile extends Item { CarryOn.LOGGER.info("Block: " + ItemTile.getBlock(stack)); CarryOn.LOGGER.info("BlockState: " + ItemTile.getBlockState(stack)); - CarryOn.LOGGER.info("Meta: " + ItemTile.getMeta(stack)); +// CarryOn.LOGGER.info("Meta: " + ItemTile.getMeta(stack)); CarryOn.LOGGER.info("ItemStack: " + ItemTile.getItemStack(stack)); if (ModelOverridesHandler.hasCustomOverrideModel(ItemTile.getBlockState(stack), ItemTile.getTileData(stack))) @@ -224,19 +211,18 @@ public class ItemTile extends Item } @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) + public void inventoryTick(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()) + if (entity instanceof EntityPlayer && Settings.slownessInCreative.get() ? false : ((EntityPlayer) entity).isCreative()) return; ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 1, potionLevel(stack), false, false)); } - } - else + } else { stack = ItemStack.EMPTY; } @@ -244,10 +230,10 @@ public class ItemTile extends Item public static boolean hasTileData(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); - return tag.hasKey(TILE_DATA_KEY) && tag.hasKey("block") && tag.hasKey("meta") && tag.hasKey("stateid"); + NBTTagCompound tag = stack.getTag(); + return tag.hasKey(TILE_DATA_KEY) && tag.hasKey("block") && tag.hasKey("stateid"); } return false; } @@ -259,79 +245,78 @@ public class ItemTile extends Item NBTTagCompound chest = new NBTTagCompound(); if (tile != null) - chest = tile.writeToNBT(chest); + chest = tile.write(chest); - NBTTagCompound tag = stack.hasTagCompound() ? stack.getTagCompound() : new NBTTagCompound(); + NBTTagCompound tag = stack.hasTag() ? stack.getTag() : 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)); +// 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); +// Item item = Item.getItemFromBlock(state.getBlock()); +// tag.setInt("meta", drop.getItemDamage()); + tag.setInt("stateid", Block.getStateId(state)); + stack.setTag(tag); return true; } public static void clearTileData(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); + NBTTagCompound tag = stack.getTag(); tag.removeTag(TILE_DATA_KEY); tag.removeTag("block"); - tag.removeTag("meta"); tag.removeTag("stateid"); } } public static NBTTagCompound getTileData(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); - return tag.getCompoundTag(TILE_DATA_KEY); + NBTTagCompound tag = stack.getTag(); + return tag.getCompound(TILE_DATA_KEY); } return null; } public static Block getBlock(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); - int id = tag.getInteger("stateid"); + NBTTagCompound tag = stack.getTag(); + int id = tag.getInt("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 int getMeta(ItemStack stack) +// { +// if (stack.hasTag()) +// { +// NBTTagCompound tag = stack.getTag(); +// int meta = tag.getInt("meta"); +// return meta; +// } +// return 0; +// } public static ItemStack getItemStack(ItemStack stack) { - return new ItemStack(getBlock(stack), 1, getMeta(stack)); + return new ItemStack(getBlock(stack), 1); } public static IBlockState getBlockState(ItemStack stack) { - if (stack.hasTagCompound()) + if (stack.hasTag()) { - NBTTagCompound tag = stack.getTagCompound(); - int id = tag.getInteger("stateid"); + NBTTagCompound tag = stack.getTag(); + int id = tag.getInt("stateid"); return Block.getStateById(id); } return Blocks.AIR.getDefaultState(); @@ -343,23 +328,23 @@ public class ItemTile extends Item if (te != null) { NBTTagCompound tag = new NBTTagCompound(); - te.writeToNBT(tag); + te.write(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 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) { @@ -369,9 +354,9 @@ public class ItemTile extends Item if (i > 4) i = 4; - if (!CarryOnConfig.settings.heavyTiles) + if (!Settings.heavyTiles.get()) i = 1; - return (int) (i * CarryOnConfig.settings.blockSlownessMultiplier); + return (int) (i * Settings.blockSlownessMultiplier.get()); } } diff --git a/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java b/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java index 26f5c4c..65f5737 100644 --- a/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java +++ b/src/main/java/tschipp/carryon/common/scripting/CarryOnOverride.java @@ -6,7 +6,6 @@ public class CarryOnOverride { // BLOCKS private NBTTagCompound typeBlockTag; - private String typeMeta; private String typeNameBlock; private String typeMaterial; private String typeHardness; @@ -31,11 +30,10 @@ public class CarryOnOverride // RENDER private String renderNameBlock; private String renderNameEntity; - private int renderMeta; private NBTTagCompound renderNBT; private String renderTranslation; private String renderRotation; - private String renderScale; + private String renderscaled; private String renderRotationLeftArm; private String renderRotationRightArm; private boolean renderLeftArm = true; @@ -236,8 +234,6 @@ public class CarryOnOverride return false; if (renderLeftArm != other.renderLeftArm) return false; - if (renderMeta != other.renderMeta) - return false; if (renderNBT == null) { if (other.renderNBT != null) @@ -282,12 +278,12 @@ public class CarryOnOverride } else if (!renderRotationRightArm.equals(other.renderRotationRightArm)) return false; - if (renderScale == null) + if (renderscaled == null) { - if (other.renderScale != null) + if (other.renderscaled != null) return false; } - else if (!renderScale.equals(other.renderScale)) + else if (!renderscaled.equals(other.renderscaled)) return false; if (renderTranslation == null) { @@ -338,13 +334,6 @@ public class CarryOnOverride } else if (!typeMaterial.equals(other.typeMaterial)) return false; - if (typeMeta == null) - { - if (other.typeMeta != null) - return false; - } - else if (!typeMeta.equals(other.typeMeta)) - return false; if (typeNameBlock == null) { if (other.typeNameBlock != null) @@ -403,11 +392,6 @@ public class CarryOnOverride return typeBlockTag; } - public String getTypeMeta() - { - return typeMeta; - } - public String getTypeNameBlock() { return typeNameBlock; @@ -493,11 +477,6 @@ public class CarryOnOverride return renderNameEntity; } - public int getRenderMeta() - { - return renderMeta; - } - public NBTTagCompound getRenderNBT() { return renderNBT; @@ -513,9 +492,9 @@ public class CarryOnOverride return renderRotation; } - public String getRenderScale() + public String getRenderscaled() { - return renderScale; + return renderscaled; } public void setTypeBlockTag(NBTTagCompound typeBlockTag) @@ -523,10 +502,6 @@ public class CarryOnOverride this.typeBlockTag = typeBlockTag; } - public void setTypeMeta(String typeMeta) - { - this.typeMeta = typeMeta; - } public void setTypeNameBlock(String typeNameBlock) { @@ -613,11 +588,6 @@ public class CarryOnOverride this.renderNameEntity = renderNameEntity; } - public void setRenderMeta(int renderMeta) - { - this.renderMeta = renderMeta; - } - public void setRenderNBT(NBTTagCompound renderNBT) { this.renderNBT = renderNBT; @@ -633,9 +603,9 @@ public class CarryOnOverride this.renderRotation = renderRotation; } - public void setRenderScale(String renderScale) + public void setRenderscaled(String renderscaled) { - this.renderScale = renderScale; + this.renderscaled = renderscaled; } diff --git a/src/main/java/tschipp/carryon/common/scripting/ScriptChecker.java b/src/main/java/tschipp/carryon/common/scripting/ScriptChecker.java index 991fc01..0739892 100644 --- a/src/main/java/tschipp/carryon/common/scripting/ScriptChecker.java +++ b/src/main/java/tschipp/carryon/common/scripting/ScriptChecker.java @@ -10,7 +10,6 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -18,10 +17,9 @@ 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 net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import tschipp.carryon.common.config.Configs.Settings; import tschipp.carryon.common.handler.ListHandler; import tschipp.carryon.common.helper.ScriptParseHelper; @@ -30,17 +28,17 @@ public class ScriptChecker @Nullable public static CarryOnOverride inspectBlock(IBlockState state, World world, BlockPos pos, @Nullable NBTTagCompound tag) { - if (!CarryOnConfig.settings.useScripts) + if (!Settings.useScripts.get()) return null; Block block = state.getBlock(); - int meta = block.getMetaFromState(state); Material material = state.getMaterial(); float hardness = state.getBlockHardness(world, pos); - float resistance = block.getExplosionResistance(null); + @SuppressWarnings("deprecation") + float resistance = block.getExplosionResistance(); NBTTagCompound nbt = tag; - boolean isAllowed = CarryOnConfig.settings.useWhitelistBlocks ? ListHandler.isAllowed(block) : !ListHandler.isForbidden(block); + boolean isAllowed = Settings.useWhitelistBlocks.get() ? ListHandler.isAllowed(block) : !ListHandler.isForbidden(block); if (isAllowed) { @@ -48,7 +46,7 @@ public class ScriptChecker { if (override.isBlock()) { - if (matchesAll(override, block, meta, material, hardness, resistance, nbt)) + if (matchesAll(override, block, material, hardness, resistance, nbt)) return override; } } @@ -60,17 +58,17 @@ public class ScriptChecker @Nullable public static CarryOnOverride inspectEntity(Entity entity) { - if (!CarryOnConfig.settings.useScripts) + if (!Settings.useScripts.get()) return null; - String name = EntityList.getKey(entity).toString(); + String name = entity.getType().getRegistryName().toString(); float height = entity.height; float width = entity.width; float health = entity instanceof EntityLivingBase ? ((EntityLivingBase) entity).getHealth() : 0.0f; NBTTagCompound tag = new NBTTagCompound(); - entity.writeToNBT(tag); + entity.deserializeNBT(tag); - boolean isAllowed = CarryOnConfig.settings.useWhitelistEntities ? ListHandler.isAllowed(entity) : !ListHandler.isForbidden(entity); + boolean isAllowed = Settings.useWhitelistEntities.get() ? ListHandler.isAllowed(entity) : !ListHandler.isForbidden(entity); if (isAllowed) { @@ -98,27 +96,26 @@ public class ScriptChecker return (matchname && matchheight && matchwidth && matchhealth && matchnbt); } - public static boolean matchesAll(CarryOnOverride override, Block block, int meta, Material material, float hardness, float resistance, NBTTagCompound nbt) + public static boolean matchesAll(CarryOnOverride override, Block block, Material material, float hardness, float resistance, NBTTagCompound nbt) { boolean matchnbt = ScriptParseHelper.matches(nbt, override.getTypeBlockTag()); boolean matchblock = ScriptParseHelper.matches(block, override.getTypeNameBlock()); - boolean matchmeta = ScriptParseHelper.matches(meta, override.getTypeMeta()); boolean matchmaterial = ScriptParseHelper.matches(material, override.getTypeMaterial()); boolean matchhardness = ScriptParseHelper.matches(hardness, override.getTypeHardness()); boolean matchresistance = ScriptParseHelper.matches(resistance, override.getTypeResistance()); - return (matchnbt && matchblock && matchmeta && matchmaterial && matchhardness && matchresistance); + return (matchnbt && matchblock && matchmaterial && matchhardness && matchresistance); } public static boolean fulfillsConditions(CarryOnOverride override, EntityPlayer player) { - AdvancementManager manager = ((WorldServer) ((EntityPlayerMP) player).world).getAdvancementManager(); + AdvancementManager manager = ((EntityPlayerMP) player).server.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 = true; - if (Loader.isModLoaded("gamestages")) + if (ModList.get().isLoaded("gamestages")) { if (override.getConditionGamestage() != null) { @@ -127,8 +124,8 @@ public class ScriptChecker 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); + Method getPlayerData = ObfuscationReflectionHelper.findMethod(gameStageHelper, "getPlayerData", EntityPlayer.class); + Method hasStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasStage", String.class); Object stageData = getPlayerData.invoke(null, player); String condition = override.getConditionGamestage(); @@ -141,8 +138,8 @@ public class ScriptChecker 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); + Method getStageData = ObfuscationReflectionHelper.findMethod(playerDataHandler, "getStageData", EntityPlayer.class); + Method hasUnlockedStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasUnlockedStage", String.class); Object stageData = getStageData.invoke(null, player); String condition = override.getConditionGamestage(); @@ -172,7 +169,7 @@ public class ScriptChecker if (tag != null && tag.hasKey("overrideKey")) { - int key = tag.getInteger("overrideKey"); + int key = tag.getInt("overrideKey"); return ScriptReader.OVERRIDES.get(key); } @@ -185,7 +182,7 @@ public class ScriptChecker NBTTagCompound tag = player.getEntityData(); if (tag != null) - tag.setInteger("overrideKey", i); + tag.setInt("overrideKey", i); } } diff --git a/src/main/java/tschipp/carryon/common/scripting/ScriptReader.java b/src/main/java/tschipp/carryon/common/scripting/ScriptReader.java index 6c0d4fa..df52e0b 100644 --- a/src/main/java/tschipp/carryon/common/scripting/ScriptReader.java +++ b/src/main/java/tschipp/carryon/common/scripting/ScriptReader.java @@ -1,35 +1,33 @@ package tschipp.carryon.common.scripting; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import com.google.gson.JsonElement; -import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; import net.minecraft.nbt.JsonToNBT; -import net.minecraft.nbt.NBTException; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.loading.FMLPaths; import tschipp.carryon.CarryOn; -import tschipp.carryon.common.config.CarryOnConfig; +import tschipp.carryon.common.config.Configs.Settings; public class ScriptReader { private static ArrayList scripts = new ArrayList(); public static HashMap OVERRIDES = new HashMap(); - - //public static HashSet OVERRIDES = new HashSet(); - public static void preInit(FMLPreInitializationEvent event) + // public static HashSet OVERRIDES = new + // HashSet(); + + public static void preInit() { - CarryOn.CONFIGURATION_FILE = new File(event.getModConfigurationDirectory(), "carryon-scripts/"); + scripts.clear(); + CarryOn.CONFIGURATION_FILE = new File(FMLPaths.CONFIGDIR.get().toString(), "/carryon-scripts/"); + if (!CarryOn.CONFIGURATION_FILE.exists()) CarryOn.CONFIGURATION_FILE.mkdir(); @@ -41,183 +39,180 @@ public class ScriptReader } - public static void parseScripts() throws JsonIOException, JsonSyntaxException, FileNotFoundException, NBTException + public static void parseScripts() { - if(!CarryOnConfig.settings.useScripts) - return; - - for (File file : scripts) + OVERRIDES.clear(); + + try { - boolean errored = false; - int hash = file.getAbsolutePath().hashCode(); + if (!Settings.useScripts.get()) + return; - JsonParser parser = new JsonParser(); - JsonObject json = (JsonObject) parser.parse(new FileReader(file.getAbsolutePath())); - - 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) || (object != null && effects != null)) + for (File file : scripts) { - JsonObject block = (JsonObject) object.get("block"); - JsonObject entity = (JsonObject) object.get("entity"); + boolean errored = false; + JsonParser parser = new JsonParser(); + JsonObject json = (JsonObject) parser.parse(new FileReader(file.getAbsolutePath())); - if ((block == null && entity == null) || (block != null && entity != null)) - errored = true; - - if (!errored) + 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) || (object != null && effects != null)) { - CarryOnOverride override = new CarryOnOverride(file.getAbsolutePath()); - - if (block != null) + JsonObject block = (JsonObject) object.get("block"); + JsonObject entity = (JsonObject) object.get("entity"); + + if ((block == null && entity == null) || (block != null && entity != null)) + errored = true; + + if (!errored) { - override.setBlock(true); - JsonElement name = block.get("name"); - JsonElement meta = block.get("meta"); - JsonElement material = block.get("material"); - JsonElement hardness = block.get("hardness"); - JsonElement resistance = block.get("resistance"); - JsonObject nbt = (JsonObject) block.get("nbt"); + CarryOnOverride override = new CarryOnOverride(file.getAbsolutePath()); - if (name != null) - override.setTypeNameBlock(name.getAsString()); - if (meta != null) - override.setTypeMeta(meta.getAsString()); - if (material != null) - override.setTypeMaterial(material.getAsString()); - if (hardness != null) - override.setTypeHardness(hardness.getAsString()); - if (resistance != null) - override.setTypeResistance(resistance.getAsString()); - if (nbt != null) - override.setTypeBlockTag(JsonToNBT.getTagFromJson(nbt.toString())); + if (block != null) + { + override.setBlock(true); + JsonElement name = block.get("name"); + JsonElement material = block.get("material"); + JsonElement hardness = block.get("hardness"); + JsonElement resistance = block.get("resistance"); + JsonObject nbt = (JsonObject) block.get("nbt"); + + if (name != null) + override.setTypeNameBlock(name.getAsString()); + if (material != null) + override.setTypeMaterial(material.getAsString()); + if (hardness != null) + override.setTypeHardness(hardness.getAsString()); + if (resistance != null) + override.setTypeResistance(resistance.getAsString()); + if (nbt != null) + override.setTypeBlockTag(JsonToNBT.getTagFromJson(nbt.toString())); + } else + { + override.setEntity(true); + JsonElement name = entity.get("name"); + JsonElement health = entity.get("health"); + JsonElement height = entity.get("height"); + JsonElement width = entity.get("width"); + JsonObject nbt = (JsonObject) entity.get("nbt"); + + if (name != null) + override.setTypeNameEntity(name.getAsString()); + if (health != null) + override.setTypeHealth(health.getAsString()); + if (height != null) + override.setTypeHeight(height.getAsString()); + if (width != null) + override.setTypeWidth(width.getAsString()); + if (nbt != null) + override.setTypeEntityTag(JsonToNBT.getTagFromJson(nbt.toString())); + } + + if (conditions != null) + { + JsonElement gamestage = conditions.get("gamestage"); + 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 potionEffects = conditions.get("effects"); + + if (gamestage != null) + override.setConditionGamestage(gamestage.getAsString()); + if (achievement != null) + override.setConditionAchievement(achievement.getAsString()); + if (xp != null) + override.setConditionXp(xp.getAsString()); + if (gamemode != null) + override.setConditionGamemode(gamemode.getAsString()); + if (scoreboard != null) + override.setConditionScoreboard(scoreboard.getAsString()); + if (position != null) + override.setConditionPosition(position.getAsString()); + if (potionEffects != null) + override.setConditionEffects(potionEffects.getAsString()); + } + + if (render != null) + { + JsonElement name_block = render.get("name_block"); + JsonElement name_entity = render.get("name_entity"); + JsonObject nbt = (JsonObject) render.get("nbt"); + JsonElement translation = render.get("translation"); + JsonElement rotation = render.get("rotation"); + JsonElement scaled = render.get("scaled"); + JsonElement rotationLeftArm = render.get("rotation_left_arm"); + JsonElement rotationRightArm = render.get("rotation_right_arm"); + JsonElement renderLeftArm = render.get("render_left_arm"); + JsonElement renderRightArm = render.get("render_right_arm"); + + if (name_block != null) + override.setRenderNameBlock(name_block.getAsString()); + if (name_entity != null) + override.setRenderNameEntity(name_entity.getAsString()); + if (translation != null) + override.setRenderTranslation(translation.getAsString()); + if (rotation != null) + override.setRenderRotation(rotation.getAsString()); + if (scaled != null) + override.setRenderscaled(scaled.getAsString()); + if (nbt != null) + override.setRenderNBT(JsonToNBT.getTagFromJson(nbt.toString())); + if (rotationLeftArm != null) + override.setRenderRotationLeftArm(rotationLeftArm.getAsString()); + if (rotationRightArm != null) + override.setRenderRotationRightArm(rotationRightArm.getAsString()); + if (renderLeftArm != null) + override.setRenderLeftArm(renderLeftArm.getAsBoolean()); + if (renderRightArm != null) + override.setRenderRightArm(renderRightArm.getAsBoolean()); + } + + 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); } - else - { - override.setEntity(true); - JsonElement name = entity.get("name"); - JsonElement health = entity.get("health"); - JsonElement height = entity.get("height"); - JsonElement width = entity.get("width"); - JsonObject nbt = (JsonObject) entity.get("nbt"); - - if (name != null) - override.setTypeNameEntity(name.getAsString()); - if (health != null) - override.setTypeHealth(health.getAsString()); - if (height != null) - override.setTypeHeight(height.getAsString()); - if (width != null) - override.setTypeWidth(width.getAsString()); - if (nbt != null) - override.setTypeEntityTag(JsonToNBT.getTagFromJson(nbt.toString())); - } - - if (conditions != null) - { - JsonElement gamestage = conditions.get("gamestage"); - 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 potionEffects = conditions.get("effects"); - - if(gamestage != null) - override.setConditionGamestage(gamestage.getAsString()); - if(achievement != null) - override.setConditionAchievement(achievement.getAsString()); - if(xp != null) - override.setConditionXp(xp.getAsString()); - if(gamemode != null) - override.setConditionGamemode(gamemode.getAsString()); - if(scoreboard != null) - override.setConditionScoreboard(scoreboard.getAsString()); - if(position != null) - override.setConditionPosition(position.getAsString()); - if(potionEffects != null) - override.setConditionEffects(potionEffects.getAsString()); - } - - if (render != null) - { - JsonElement name_block = render.get("name_block"); - JsonElement name_entity = render.get("name_entity"); - JsonElement meta = render.get("meta"); - JsonObject nbt = (JsonObject) render.get("nbt"); - JsonElement translation = render.get("translation"); - JsonElement rotation = render.get("rotation"); - JsonElement scale = render.get("scale"); - JsonElement rotationLeftArm = render.get("rotation_left_arm"); - JsonElement rotationRightArm = render.get("rotation_right_arm"); - JsonElement renderLeftArm = render.get("render_left_arm"); - JsonElement renderRightArm = render.get("render_right_arm"); - - if(name_block != null) - override.setRenderNameBlock(name_block.getAsString()); - if(name_entity != null) - override.setRenderNameEntity(name_entity.getAsString()); - if(meta != null) - override.setRenderMeta(meta.getAsInt()); - if(translation != null) - override.setRenderTranslation(translation.getAsString()); - if(rotation != null) - override.setRenderRotation(rotation.getAsString()); - if(scale != null) - override.setRenderScale(scale.getAsString()); - if (nbt != null) - override.setRenderNBT(JsonToNBT.getTagFromJson(nbt.toString())); - if(rotationLeftArm != null) - override.setRenderRotationLeftArm(rotationLeftArm.getAsString()); - if(rotationRightArm != null) - override.setRenderRotationRightArm(rotationRightArm.getAsString()); - if(renderLeftArm != null) - override.setRenderLeftArm(renderLeftArm.getAsBoolean()); - if(renderRightArm != null) - override.setRenderRightArm(renderRightArm.getAsBoolean()); - } - - 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); } } + + System.out.println("Successfully parsed scripts!"); + } catch (Exception e) + { + CarryOn.LOGGER.error(e); } - - System.out.println("Successfully parsed scripts!"); } - public static void reloadScripts() { scripts.clear(); OVERRIDES.clear(); - + for (File file : CarryOn.CONFIGURATION_FILE.listFiles()) { if (file.getName().endsWith(".json")) scripts.add(file); } - + try { parseScripts(); - } - catch (JsonIOException | JsonSyntaxException | FileNotFoundException | NBTException e) + } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/tschipp/carryon/compat/obfuscate/ObfuscateEvents.java b/src/main/java/tschipp/carryon/compat/obfuscate/ObfuscateEvents.java index 2735e0c..d7bbd08 100644 --- a/src/main/java/tschipp/carryon/compat/obfuscate/ObfuscateEvents.java +++ b/src/main/java/tschipp/carryon/compat/obfuscate/ObfuscateEvents.java @@ -1,104 +1,79 @@ package tschipp.carryon.compat.obfuscate; -import com.mrcrayfish.obfuscate.client.event.ModelPlayerEvent; - -import net.minecraft.client.model.ModelPlayer; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import tschipp.carryon.common.config.CarryOnConfig; -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 ObfuscateEvents { - - @SubscribeEvent - public void preModelPlayerEvent(ModelPlayerEvent.SetupAngles.Post event) - { - if(!CarryOnConfig.settings.renderArms) - return; - - EntityPlayer player = event.getEntityPlayer(); - float partialticks = event.getPartialTicks(); - - ModelPlayer model = event.getModelPlayer(); - ItemStack stack = player.getHeldItemMainhand(); - if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) - { - - float rotation = 0; - - if (player.isRiding() && player.getRidingEntity() instanceof EntityLivingBase) - rotation = 0; - else - rotation = 0; - - - CarryOnOverride overrider = ScriptChecker.getOverride(player); - if (overrider != null) - { - double[] rotLeft = null; - double[] rotRight = null; - if (overrider.getRenderRotationLeftArm() != null) - rotLeft = ScriptParseHelper.getXYZArray(overrider.getRenderRotationLeftArm()); - if (overrider.getRenderRotationRightArm() != null) - rotRight = ScriptParseHelper.getXYZArray(overrider.getRenderRotationRightArm()); - - boolean renderRight = overrider.isRenderRightArm(); - boolean renderLeft = overrider.isRenderLeftArm(); - - if (renderLeft && rotLeft != null) - { - renderArmPre(model.bipedLeftArm, (float) rotLeft[0], (float) rotLeft[2], rotation); - renderArmPre(model.bipedLeftArmwear, (float) rotLeft[0], (float) rotLeft[2], rotation); - } - else if (renderLeft) - { - renderArmPre(model.bipedLeftArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); - renderArmPre(model.bipedLeftArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); - } - - if (renderRight && rotRight != null) - { - renderArmPre(model.bipedRightArm, (float) rotRight[0], (float) rotRight[2], rotation); - renderArmPre(model.bipedRightArmwear, (float) rotRight[0], (float) rotRight[2], rotation); - } - else if (renderRight) - { - renderArmPre(model.bipedRightArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); - renderArmPre(model.bipedRightArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); - } - - } - else - { - renderArmPre(model.bipedRightArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); - renderArmPre(model.bipedRightArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); - renderArmPre(model.bipedLeftArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); - renderArmPre(model.bipedLeftArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); - } - - } - - } - - - @SideOnly(Side.CLIENT) - private void renderArmPre(ModelRenderer arm, float x, float z, float rotation) - { - arm.rotateAngleX = (float) -x; - arm.rotateAngleY = (float) -Math.toRadians(rotation); - arm.rotateAngleZ = (float) z; - } - +// +// @SubscribeEvent +// public void preModelPlayerEvent(ModelPlayerEvent.SetupAngles.Post event) +// { +// if(!CarryOnConfig.settings.renderArms.get()) +// return; +// +// EntityPlayer player = event.getEntityPlayer(); +// +// ModelPlayer model = event.getModelPlayer(); +// ItemStack stack = player.getHeldItemMainhand(); +// if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack)) +// { +// +// float rotation = 0; +// +// CarryOnOverride overrider = ScriptChecker.getOverride(player); +// if (overrider != null) +// { +// double[] rotLeft = null; +// double[] rotRight = null; +// if (overrider.getRenderRotationLeftArm() != null) +// rotLeft = ScriptParseHelper.getXYZArray(overrider.getRenderRotationLeftArm()); +// if (overrider.getRenderRotationRightArm() != null) +// rotRight = ScriptParseHelper.getXYZArray(overrider.getRenderRotationRightArm()); +// +// boolean renderRight = overrider.isRenderRightArm(); +// boolean renderLeft = overrider.isRenderLeftArm(); +// +// if (renderLeft && rotLeft != null) +// { +// renderArmPre(model.bipedLeftArm, (float) rotLeft[0], (float) rotLeft[2], rotation); +// renderArmPre(model.bipedLeftArmwear, (float) rotLeft[0], (float) rotLeft[2], rotation); +// } +// else if (renderLeft) +// { +// renderArmPre(model.bipedLeftArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); +// renderArmPre(model.bipedLeftArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); +// } +// +// if (renderRight && rotRight != null) +// { +// renderArmPre(model.bipedRightArm, (float) rotRight[0], (float) rotRight[2], rotation); +// renderArmPre(model.bipedRightArmwear, (float) rotRight[0], (float) rotRight[2], rotation); +// } +// else if (renderRight) +// { +// renderArmPre(model.bipedRightArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); +// renderArmPre(model.bipedRightArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); +// } +// +// } +// else +// { +// renderArmPre(model.bipedRightArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); +// renderArmPre(model.bipedRightArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? -0.15f : 0), rotation); +// renderArmPre(model.bipedLeftArm, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); +// renderArmPre(model.bipedLeftArmwear, 0.8F + (player.isSneaking() ? 0.2f : 0f) - (stack.getItem() == RegistrationHandler.itemEntity ? -0.2f : 0), (stack.getItem() == RegistrationHandler.itemEntity ? 0.15f : 0), rotation); +// } +// +// } +// +// } +// +// +// @OnlyIn(Dist.CLIENT) +// private void renderArmPre(ModelRenderer arm, float x, float z, float rotation) +// { +// arm.rotateAngleX = (float) -x; +// arm.rotateAngleY = (float) -Math.toRadians(rotation); +// arm.rotateAngleZ = (float) z; +// } +// } diff --git a/src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java b/src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java index 597cb5c..db06988 100644 --- a/src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java +++ b/src/main/java/tschipp/carryon/network/client/CarrySlotPacket.java @@ -1,28 +1,34 @@ 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; +import java.util.function.Supplier; -public class CarrySlotPacket implements IMessage +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.fml.network.NetworkEvent; +import tschipp.carryon.CarryOn; +import tschipp.carryon.common.scripting.ScriptChecker; + +public class CarrySlotPacket { public int slot; public int carryOverride = 0; public int entityid; - - public CarrySlotPacket() + + public CarrySlotPacket(ByteBuf buf) { - this.slot = 9; - this.entityid = 0; + this.slot = buf.readInt(); + this.carryOverride = buf.readInt(); + this.entityid = buf.readInt(); } - + public CarrySlotPacket(int slot, int entityid) { this.slot = slot; this.entityid = entityid; } - + public CarrySlotPacket(int slot, int entityid, int carryOverride) { this.slot = slot; @@ -30,25 +36,44 @@ public class CarrySlotPacket implements IMessage 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); + buf.writeInt(slot); + buf.writeInt(carryOverride); + buf.writeInt(entityid); + } + public void handle(Supplier ctx) + { + ctx.get().enqueueWork(() -> { + + World world = CarryOn.proxy.getWorld(); + + if (world != null) + { + Entity e = world.getEntityByID(entityid); + + if (e != null && e instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) e; + + ctx.get().setPacketHandled(true); + + if (slot >= 9) + { + player.getEntityData().removeTag("carrySlot"); + player.getEntityData().removeTag("overrideKey"); + } else + { + + player.getEntityData().setInt("carrySlot", slot); + if (carryOverride != 0) + ScriptChecker.setCarryOnOverride(player, carryOverride); + } + } + + } + }); } } 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 index 3cde434..31a8592 100644 --- a/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java +++ b/src/main/java/tschipp/carryon/network/client/ScriptReloadPacket.java @@ -1,26 +1,39 @@ package tschipp.carryon.network.client; -import io.netty.buffer.ByteBuf; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import java.util.function.Supplier; -public class ScriptReloadPacket implements IMessage +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.fml.network.NetworkEvent; +import tschipp.carryon.CarryOn; +import tschipp.carryon.common.scripting.ScriptReader; + +public class ScriptReloadPacket { public ScriptReloadPacket() { - } - @Override - public void fromBytes(ByteBuf buf) + public ScriptReloadPacket(ByteBuf buf) { - } - @Override public void toBytes(ByteBuf buf) { - } + public void handle(Supplier ctx) + { + ctx.get().enqueueWork(() -> { + + EntityPlayer player = CarryOn.proxy.getPlayer(); + + if (player != null) + ScriptReader.reloadScripts(); + + ctx.get().setPacketHandled(true); + }); + + } } 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 index 3dbca52..1d99404 100644 --- a/src/main/java/tschipp/carryon/network/server/SyncKeybindPacket.java +++ b/src/main/java/tschipp/carryon/network/server/SyncKeybindPacket.java @@ -1,35 +1,41 @@ 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; +import java.util.function.Supplier; -public class SyncKeybindPacket implements IMessage +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraftforge.fml.network.NetworkEvent; +import tschipp.carryon.client.keybinds.CarryOnKeybinds; + +public class SyncKeybindPacket { - - private int p; public boolean pressed; - - public SyncKeybindPacket() + + public SyncKeybindPacket(ByteBuf buf) { + this.pressed = buf.readBoolean(); } - + public SyncKeybindPacket(boolean pressed) { - this.p = pressed ? 1 : 0; + this.pressed = pressed; } - @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); + buf.writeBoolean(pressed); + } + + public void handle(Supplier ctx) + { + ctx.get().enqueueWork(() -> { + + EntityPlayerMP player = ctx.get().getSender(); + + CarryOnKeybinds.setKeyPressed(player, pressed); + + ctx.get().setPacketHandled(true); + }); } } 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 776cd6e..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().player.world; - - mainThread.addScheduledTask(new Runnable() - { - EntityPlayerMP player = ctx.getServerHandler().player; - - @Override - public void run() - { - CarryOnKeybinds.setKeyPressed(player, message.pressed); - } - - }); - - return null; - } - -} diff --git a/src/main/java/tschipp/carryon/proxy/ClientProxy.java b/src/main/java/tschipp/carryon/proxy/ClientProxy.java new file mode 100644 index 0000000..0e61fed --- /dev/null +++ b/src/main/java/tschipp/carryon/proxy/ClientProxy.java @@ -0,0 +1,37 @@ +package tschipp.carryon.proxy; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import tschipp.carryon.client.keybinds.CarryOnKeybinds; +import tschipp.carryon.common.handler.RegistrationHandler; +import tschipp.carryon.common.helper.KeyboardCallbackWrapper; +import tschipp.carryon.common.helper.ScrollCallbackWrapper; + +public class ClientProxy implements IProxy { + + + @Override + public void setup(FMLCommonSetupEvent event) + { + RegistrationHandler.regClientEvents(); + + CarryOnKeybinds.init(); + + new ScrollCallbackWrapper().setup(Minecraft.getInstance());; + new KeyboardCallbackWrapper().setup(Minecraft.getInstance()); + } + + @Override + public EntityPlayer getPlayer() + { + return Minecraft.getInstance().player; + } + + @Override + public World getWorld() + { + return Minecraft.getInstance().world; + } +} diff --git a/src/main/java/tschipp/carryon/proxy/IProxy.java b/src/main/java/tschipp/carryon/proxy/IProxy.java new file mode 100644 index 0000000..9087a86 --- /dev/null +++ b/src/main/java/tschipp/carryon/proxy/IProxy.java @@ -0,0 +1,15 @@ +package tschipp.carryon.proxy; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; + +public interface IProxy +{ + + public void setup(final FMLCommonSetupEvent event); + + public EntityPlayer getPlayer(); + + public World getWorld(); +} diff --git a/src/main/java/tschipp/carryon/proxy/ServerProxy.java b/src/main/java/tschipp/carryon/proxy/ServerProxy.java new file mode 100644 index 0000000..36368e1 --- /dev/null +++ b/src/main/java/tschipp/carryon/proxy/ServerProxy.java @@ -0,0 +1,28 @@ +package tschipp.carryon.proxy; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; + +public class ServerProxy implements IProxy +{ + + @Override + public void setup(FMLCommonSetupEvent event) + { + + } + + @Override + public EntityPlayer getPlayer() + { + return null; + } + + @Override + public World getWorld() + { + return null; + } + +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..0b88f80 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,33 @@ +modLoader="javafml" +loaderVersion="[13,)" +issueTrackerURL="https://github.com/Tschipp/CarryOn/issues" +logoFile="logo.png" + + +[[mods]] + modId="carryon" + version="1.12.2" + displayName="Carry On" + 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.''' + authors="Tschipp, Purplicious_Cow, cy4n" #mandatory + displayURL="https://minecraft.curseforge.com/projects/carry-on" #mandatory + updateJSONURL="https://gist.githubusercontent.com/Tschipp/dccadee7c90d7a34e6e76a35d9d6fa2e/raw/" #mandatory + +[[dependencies.carryon]] #optional + # the modid of the dependency + modId="forge" #mandatory + # Does this dependency have to exist - if not, ordering below must be specified + mandatory=true #mandatory + # The version range of the dependency + versionRange="[14.23.2.0,)" #mandatory + # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT or SERVER + side="BOTH" + +[[dependencies.carryon]] + modId="minecraft" + mandatory=true + versionRange="[1.13.2,1.14)" + ordering="NONE" + side="BOTH" \ No newline at end of file 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/lang/en_ud.json b/src/main/resources/assets/carryon/lang/en_ud.json new file mode 100644 index 0000000..77a6461 --- /dev/null +++ b/src/main/resources/assets/carryon/lang/en_ud.json @@ -0,0 +1,16 @@ +{ + "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 ʎɹɹɐƆ" +} \ No newline at end of file diff --git a/src/main/resources/assets/carryon/lang/en_us.json b/src/main/resources/assets/carryon/lang/en_us.json new file mode 100644 index 0000000..8cea73d --- /dev/null +++ b/src/main/resources/assets/carryon/lang/en_us.json @@ -0,0 +1,16 @@ +{ + "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/models/item/tile.json b/src/main/resources/assets/carryon/models/item/entity_item.json similarity index 60% rename from src/main/resources/assets/carryon/models/item/tile.json rename to src/main/resources/assets/carryon/models/item/entity_item.json index 14daf4d..3480261 100644 --- a/src/main/resources/assets/carryon/models/item/tile.json +++ b/src/main/resources/assets/carryon/models/item/entity_item.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "carryon:items/tile" + "layer0": "carryon:item/tile" } } diff --git a/src/main/resources/assets/carryon/models/item/tile_item.json b/src/main/resources/assets/carryon/models/item/tile_item.json new file mode 100644 index 0000000..3480261 --- /dev/null +++ b/src/main/resources/assets/carryon/models/item/tile_item.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "carryon:item/tile" + } +} 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/assets/carryon/logo.png b/src/main/resources/logo.png similarity index 100% rename from src/main/resources/assets/carryon/logo.png rename to src/main/resources/logo.png diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info deleted file mode 100644 index d67f1fe..0000000 --- a/src/main/resources/mcmod.info +++ /dev/null @@ -1,16 +0,0 @@ -[ -{ - "modid" : "carryon", - "name" : "Carry On", - "version" : "1.12", "mcversion" : "1.12.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": [] -} -] diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..bbeb887 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "Mod Resources", + "pack_format": 4, + "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods." + } +}