From b40f1d6bccbeb60138aceb399c17ba022109d16d Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sat, 12 Apr 2014 12:55:14 -0600 Subject: [PATCH 01/21] Mostly Greadlized. Just some really strange bugs to figure out :/ --- build.gradle | 55 ++++++ build.properties | 6 + build.xml | 169 ------------------ getversion.py | 63 ------- gradle/artifact.gradle | 39 ++++ gradle/forge.gradle | 14 ++ gradle/release.gradle | 17 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 50508 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++++++++++++++++ gradlew.bat | 90 ++++++++++ make_at.py | 24 --- mlcore_at.man | 2 - .../java}/ml/core/ChatUtils.java | 0 .../java}/ml/core/MLCore.java | 5 - .../java}/ml/core/PlayerUtils.java | 0 .../ml/core/asm/MLCAccesTransformer.java | 0 .../java}/ml/core/block/BlockUtils.java | 0 .../java}/ml/core/data/Config.java | 0 .../java}/ml/core/data/NBTUtils.java | 0 .../java}/ml/core/enums/MouseButton.java | 0 .../java}/ml/core/enums/NaturalSide.java | 0 .../java}/ml/core/gui/GuiRenderUtils.java | 0 .../java}/ml/core/gui/MLGuiHandler.java | 0 .../java}/ml/core/gui/MLSlot.java | 0 .../core/gui/controls/ControlTextInput.java | 0 .../ml/core/gui/controls/GuiControl.java | 0 .../gui/controls/button/ControlButton.java | 0 .../inventory/ControlMultiSlotBase.java | 0 .../inventory/ControlPlayerInventory.java | 0 .../gui/controls/inventory/ControlSlot.java | 0 .../controls/inventory/ControlSlotGrid.java | 0 .../gui/controls/tabs/ControlTabManager.java | 0 .../ml/core/gui/controls/tabs/TabLedger.java | 0 .../java}/ml/core/gui/core/GuiElement.java | 0 .../java}/ml/core/gui/core/MLContainer.java | 0 .../java}/ml/core/gui/core/MLGuiClient.java | 0 .../java}/ml/core/gui/core/SlotCycler.java | 4 +- .../ml/core/gui/core/TopParentGuiElement.java | 0 .../java}/ml/core/gui/core/Window.java | 0 .../ml/core/gui/core/style/GuiStyle.java | 0 .../ml/core/gui/core/style/GuiStyleManip.java | 0 .../ml/core/gui/event/EventButtonPressed.java | 0 .../java}/ml/core/gui/event/EventChanged.java | 0 .../gui/event/EventDataPacketReceived.java | 0 .../ml/core/gui/event/EventFocusLost.java | 0 .../ml/core/gui/event/EventGuiClosing.java | 0 .../ml/core/gui/event/EventKeyPressed.java | 0 .../java}/ml/core/gui/event/GuiEvent.java | 0 .../gui/event/mouse/EventMouseClicked.java | 0 .../core/gui/event/mouse/EventMouseDown.java | 0 .../gui/event/mouse/EventMouseEntered.java | 0 .../core/gui/event/mouse/EventMouseLeave.java | 0 .../core/gui/event/mouse/EventMouseMove.java | 0 .../gui/event/mouse/EventMousePositioned.java | 0 .../gui/event/mouse/EventMouseScroll.java | 0 .../ml/core/gui/event/mouse/EventMouseUp.java | 0 .../java}/ml/core/internal/ClientProxy.java | 0 .../java}/ml/core/internal/CommonProxy.java | 0 .../java}/ml/core/internal/CoreLogger.java | 0 .../ml/core/internal/PacketContainerData.java | 0 .../java}/ml/core/internal/PacketHandler.java | 0 .../ml/core/inventory/CustomSlotClick.java | 0 .../ml/core/inventory/InventoryUtils.java | 0 .../java}/ml/core/item/StackUtils.java | 0 .../core/item/recipe/CRecipeShapedBase.java | 0 .../ml/core/item/recipe/RecipeMixed.java | 0 .../item/recipe/RecipeShapedVariable.java | 0 .../java}/ml/core/math/MathUtils.java | 0 .../java}/ml/core/nei/NEI_MLCore_Config.java | 0 .../ml/core/network/IDataSerializer.java | 0 .../java}/ml/core/network/MLPacket.java | 0 .../java}/ml/core/network/PacketHandler.java | 0 .../network/serializers/SForgeDirection.java | 0 .../core/network/serializers/SItemsStack.java | 0 .../network/serializers/SNBTTagCompound.java | 0 .../ml/core/network/serializers/SString.java | 0 .../core/network/serializers/STileEntity.java | 0 .../ml/core/texture/ConnectedTexture.java | 0 .../ml/core/texture/CustomTextureMap.java | 0 .../core/texture/CustomTextureMapManager.java | 0 .../java}/ml/core/texture/IIconProvider.java | 0 .../java}/ml/core/texture/TextureSheet.java | 0 .../java}/ml/core/texture/TextureUtils.java | 0 .../texture/maps/BasicCustomTextureMap.java | 0 .../java}/ml/core/tile/IRotatableTE.java | 0 .../ml/core/tile/TileEntityConnectable.java | 0 .../java}/ml/core/util/RandomUtils.java | 0 .../java}/ml/core/util/ReflectionUtils.java | 0 .../java}/ml/core/util/StringUtils.java | 0 .../java}/ml/core/vec/BlockCoord.java | 0 .../java}/ml/core/vec/Cuboid6.java | 0 .../java}/ml/core/vec/GeoMath.java | 0 .../java}/ml/core/vec/ITransformable.java | 0 .../java}/ml/core/vec/Matrix.java | 0 .../java}/ml/core/vec/RayTrace.java | 0 .../java}/ml/core/vec/Rectangle.java | 0 .../java}/ml/core/vec/Vector2i.java | 0 .../java}/ml/core/vec/Vector3d.java | 0 .../transform/LocalizedTransformation.java | 0 .../java}/ml/core/vec/transform/Matrix4d.java | 0 .../vec/transform/MultiTransformation.java | 0 .../java}/ml/core/vec/transform/Rotation.java | 0 .../java}/ml/core/vec/transform/Scale.java | 0 .../ml/core/vec/transform/Transformation.java | 0 .../ml/core/vec/transform/Translation.java | 0 .../java}/ml/core/world/WorldGenHandler.java | 0 .../java}/ml/core/world/WorldRenderUtils.java | 0 .../core/world/feature/IFeatureGenerator.java | 0 .../assets/mlcontrols/default/button.png | Bin .../assets/mlcontrols/default/ledger.png | Bin .../assets/mlcontrols/default/properties.txt | 0 .../assets/mlcontrols/default/slot.png | Bin .../assets/mlcontrols/default/swatch.png | Bin .../assets/mlcontrols/default/window.png | Bin mcmod.info => src/main/resources/mcmod.info | 0 src/main/resources/mlcore_at.cfg | 1 + 117 files changed, 394 insertions(+), 265 deletions(-) create mode 100644 build.gradle create mode 100644 build.properties delete mode 100644 build.xml delete mode 100644 getversion.py create mode 100644 gradle/artifact.gradle create mode 100644 gradle/forge.gradle create mode 100644 gradle/release.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat delete mode 100644 make_at.py delete mode 100644 mlcore_at.man rename src/{minecraft => main/java}/ml/core/ChatUtils.java (100%) rename src/{minecraft => main/java}/ml/core/MLCore.java (96%) rename src/{minecraft => main/java}/ml/core/PlayerUtils.java (100%) rename src/{minecraft => main/java}/ml/core/asm/MLCAccesTransformer.java (100%) rename src/{minecraft => main/java}/ml/core/block/BlockUtils.java (100%) rename src/{minecraft => main/java}/ml/core/data/Config.java (100%) rename src/{minecraft => main/java}/ml/core/data/NBTUtils.java (100%) rename src/{minecraft => main/java}/ml/core/enums/MouseButton.java (100%) rename src/{minecraft => main/java}/ml/core/enums/NaturalSide.java (100%) rename src/{minecraft => main/java}/ml/core/gui/GuiRenderUtils.java (100%) rename src/{minecraft => main/java}/ml/core/gui/MLGuiHandler.java (100%) rename src/{minecraft => main/java}/ml/core/gui/MLSlot.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/ControlTextInput.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/GuiControl.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/button/ControlButton.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/inventory/ControlMultiSlotBase.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/inventory/ControlPlayerInventory.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/inventory/ControlSlot.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/inventory/ControlSlotGrid.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/tabs/ControlTabManager.java (100%) rename src/{minecraft => main/java}/ml/core/gui/controls/tabs/TabLedger.java (100%) rename src/{minecraft => main/java}/ml/core/gui/core/GuiElement.java (100%) rename src/{minecraft => main/java}/ml/core/gui/core/MLContainer.java (100%) rename src/{minecraft => main/java}/ml/core/gui/core/MLGuiClient.java (100%) rename src/{minecraft => main/java}/ml/core/gui/core/SlotCycler.java (96%) rename src/{minecraft => main/java}/ml/core/gui/core/TopParentGuiElement.java (100%) rename src/{minecraft => main/java}/ml/core/gui/core/Window.java (100%) rename src/{minecraft => main/java}/ml/core/gui/core/style/GuiStyle.java (100%) rename src/{minecraft => main/java}/ml/core/gui/core/style/GuiStyleManip.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/EventButtonPressed.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/EventChanged.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/EventDataPacketReceived.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/EventFocusLost.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/EventGuiClosing.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/EventKeyPressed.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/GuiEvent.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMouseClicked.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMouseDown.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMouseEntered.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMouseLeave.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMouseMove.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMousePositioned.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMouseScroll.java (100%) rename src/{minecraft => main/java}/ml/core/gui/event/mouse/EventMouseUp.java (100%) rename src/{minecraft => main/java}/ml/core/internal/ClientProxy.java (100%) rename src/{minecraft => main/java}/ml/core/internal/CommonProxy.java (100%) rename src/{minecraft => main/java}/ml/core/internal/CoreLogger.java (100%) rename src/{minecraft => main/java}/ml/core/internal/PacketContainerData.java (100%) rename src/{minecraft => main/java}/ml/core/internal/PacketHandler.java (100%) rename src/{minecraft => main/java}/ml/core/inventory/CustomSlotClick.java (100%) rename src/{minecraft => main/java}/ml/core/inventory/InventoryUtils.java (100%) rename src/{minecraft => main/java}/ml/core/item/StackUtils.java (100%) rename src/{minecraft => main/java}/ml/core/item/recipe/CRecipeShapedBase.java (100%) rename src/{minecraft => main/java}/ml/core/item/recipe/RecipeMixed.java (100%) rename src/{minecraft => main/java}/ml/core/item/recipe/RecipeShapedVariable.java (100%) rename src/{minecraft => main/java}/ml/core/math/MathUtils.java (100%) rename src/{minecraft => main/java}/ml/core/nei/NEI_MLCore_Config.java (100%) rename src/{minecraft => main/java}/ml/core/network/IDataSerializer.java (100%) rename src/{minecraft => main/java}/ml/core/network/MLPacket.java (100%) rename src/{minecraft => main/java}/ml/core/network/PacketHandler.java (100%) rename src/{minecraft => main/java}/ml/core/network/serializers/SForgeDirection.java (100%) rename src/{minecraft => main/java}/ml/core/network/serializers/SItemsStack.java (100%) rename src/{minecraft => main/java}/ml/core/network/serializers/SNBTTagCompound.java (100%) rename src/{minecraft => main/java}/ml/core/network/serializers/SString.java (100%) rename src/{minecraft => main/java}/ml/core/network/serializers/STileEntity.java (100%) rename src/{minecraft => main/java}/ml/core/texture/ConnectedTexture.java (100%) rename src/{minecraft => main/java}/ml/core/texture/CustomTextureMap.java (100%) rename src/{minecraft => main/java}/ml/core/texture/CustomTextureMapManager.java (100%) rename src/{minecraft => main/java}/ml/core/texture/IIconProvider.java (100%) rename src/{minecraft => main/java}/ml/core/texture/TextureSheet.java (100%) rename src/{minecraft => main/java}/ml/core/texture/TextureUtils.java (100%) rename src/{minecraft => main/java}/ml/core/texture/maps/BasicCustomTextureMap.java (100%) rename src/{minecraft => main/java}/ml/core/tile/IRotatableTE.java (100%) rename src/{minecraft => main/java}/ml/core/tile/TileEntityConnectable.java (100%) rename src/{minecraft => main/java}/ml/core/util/RandomUtils.java (100%) rename src/{minecraft => main/java}/ml/core/util/ReflectionUtils.java (100%) rename src/{minecraft => main/java}/ml/core/util/StringUtils.java (100%) rename src/{minecraft => main/java}/ml/core/vec/BlockCoord.java (100%) rename src/{minecraft => main/java}/ml/core/vec/Cuboid6.java (100%) rename src/{minecraft => main/java}/ml/core/vec/GeoMath.java (100%) rename src/{minecraft => main/java}/ml/core/vec/ITransformable.java (100%) rename src/{minecraft => main/java}/ml/core/vec/Matrix.java (100%) rename src/{minecraft => main/java}/ml/core/vec/RayTrace.java (100%) rename src/{minecraft => main/java}/ml/core/vec/Rectangle.java (100%) rename src/{minecraft => main/java}/ml/core/vec/Vector2i.java (100%) rename src/{minecraft => main/java}/ml/core/vec/Vector3d.java (100%) rename src/{minecraft => main/java}/ml/core/vec/transform/LocalizedTransformation.java (100%) rename src/{minecraft => main/java}/ml/core/vec/transform/Matrix4d.java (100%) rename src/{minecraft => main/java}/ml/core/vec/transform/MultiTransformation.java (100%) rename src/{minecraft => main/java}/ml/core/vec/transform/Rotation.java (100%) rename src/{minecraft => main/java}/ml/core/vec/transform/Scale.java (100%) rename src/{minecraft => main/java}/ml/core/vec/transform/Transformation.java (100%) rename src/{minecraft => main/java}/ml/core/vec/transform/Translation.java (100%) rename src/{minecraft => main/java}/ml/core/world/WorldGenHandler.java (100%) rename src/{minecraft => main/java}/ml/core/world/WorldRenderUtils.java (100%) rename src/{minecraft => main/java}/ml/core/world/feature/IFeatureGenerator.java (100%) rename {res => src/main/resources}/assets/mlcontrols/default/button.png (100%) rename {res => src/main/resources}/assets/mlcontrols/default/ledger.png (100%) rename {res => src/main/resources}/assets/mlcontrols/default/properties.txt (100%) rename {res => src/main/resources}/assets/mlcontrols/default/slot.png (100%) rename {res => src/main/resources}/assets/mlcontrols/default/swatch.png (100%) rename {res => src/main/resources}/assets/mlcontrols/default/window.png (100%) rename mcmod.info => src/main/resources/mcmod.info (100%) create mode 100644 src/main/resources/mlcore_at.cfg diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7b28ae4 --- /dev/null +++ b/build.gradle @@ -0,0 +1,55 @@ +buildscript { + repositories { + mavenCentral() + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT' + } +} + + +repositories { + ivy { + name 'Forge FS legacy' + artifactPattern "http://files.minecraftforge.net/[module]/[module]-dev-[revision].[ext]" + } + ivy { + name 'CB FS' + artifactPattern "http://www.chickenbones.craftsaddle.org/Files/New_Versions/1.6.4/[module]-dev%20[revision].[ext]" + } + maven { + name 'ForgeFS' + url 'http://files.minecraftforge.net/maven' + } +} + +apply plugin: 'forge' + +file "build.properties" withReader { + def prop = new Properties() + prop.load(it) + ext.config = new ConfigSlurper().parse prop +} + +version = "${config.mlcore.version}" +group = "ml.core" +archivesBaseName = "MLCore" + +if (System.getenv("BUILD_NUMBER") != null) + version += ".${System.getenv("BUILD_NUMBER")}" + +ext.simpleVersion = version +version = "MC${config.minecraft.version}-${project.version}" + +dependencies { + compile name: 'CodeChickenLib', version: "${config.minecraft.version}-${config.CCLIB.version}", ext: 'jar' + compile name: 'NotEnoughItems', version: "${config.NEI.version}", type: 'jar' +} + +apply from: 'gradle/forge.gradle' +apply from: 'gradle/artifact.gradle' +apply from: 'gradle/release.gradle' diff --git a/build.properties b/build.properties new file mode 100644 index 0000000..e613629 --- /dev/null +++ b/build.properties @@ -0,0 +1,6 @@ +minecraft.version=1.6.4 +forge.version=9.11.1.964 +CCLIB.version=1.0.0.44 +NEI.version=1.6.1.9 +mlcore.version=1.2.7 +maven.url=file:///media/storage/Minecraft/web/maven \ No newline at end of file diff --git a/build.xml b/build.xml deleted file mode 100644 index d892ed7..0000000 --- a/build.xml +++ /dev/null @@ -1,169 +0,0 @@ - - - - MLCore - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/getversion.py b/getversion.py deleted file mode 100644 index 4fec84a..0000000 --- a/getversion.py +++ /dev/null @@ -1,63 +0,0 @@ -import sys -import os -import commands -import fnmatch -import re -import subprocess, shlex - -mcp_home = sys.argv[1] -mcp_dir = os.path.abspath(mcp_home) - -print(mcp_dir) -sys.path.append(mcp_dir) - -from runtime.commands import Commands -Commands._version_config = os.path.join(mcp_dir,Commands._version_config) - -def cmdsplit(args): - if os.sep == '\\': - args = args.replace('\\', '\\\\') - return shlex.split(args) - -def cleanDirs(path): - if not os.path.isdir(path): - return - - files = os.listdir(path) - if len(files): - for f in files: - fullpath = os.path.join(path, f) - if os.path.isdir(fullpath): - cleanDirs(fullpath) - - files = os.listdir(path) - if len(files) == 0: - os.rmdir(path) - -def main(): - print("Obtaining version information from git") - cmd = "git describe --long --match='[^(jenkins)]*'" - try: - process = subprocess.Popen(cmdsplit(cmd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) - vers, _ = process.communicate() - except OSError: - print("Git not found") - vers="v1.0-0-deadbeef" - (major,minor,info,rev,githash)=re.match("v(\d+).(\d+)(-.*)?-(\d+)-(.*)",vers).groups() - if not info: info="" - - (mcpversion,mcversion,mcserverversion) = re.match("[.\w]+ \(data: ([.\w]+), client: ([.\w.]+), server: ([.\w.]+)\)",Commands.fullversion()).groups() - - with open("version.properties","w") as f: - f.write("%s=%s\n" %("MLCore.build.major.number",major)) - f.write("%s=%s\n" %("MLCore.build.minor.number",minor)) - f.write("%s=%s\n" %("MLCore.build.info",info)) - f.write("%s=%s\n" %("MLCore.build.revision.number",rev)) - f.write("%s=%s\n" %("MLCore.build.githash",githash)) - f.write("%s=%s\n" %("MLCore.build.mcpversion",mcpversion)) - f.write("%s=%s\n" %("MLCore.build.mcversion",mcversion)) - - print("Version information: MLCore %s.%s.%s%s using MCP %s for %s" % (major, minor, rev, info, mcpversion, mcversion)) - -if __name__ == '__main__': - main() diff --git a/gradle/artifact.gradle b/gradle/artifact.gradle new file mode 100644 index 0000000..eff4a21 --- /dev/null +++ b/gradle/artifact.gradle @@ -0,0 +1,39 @@ +jar { + classifier = 'universal' + manifest { + attributes FMLCorePlugin: "ml.core.MLCore" + attributes FMLCorePluginContainsFMLMod: "true" + } +} + +javadoc { + include 'ml/core/api/**' +} + +// because the normal default jar task has been modified to be obfuscated +task deobfJar(type: Jar) { + from sourceSets.main.output + classifier = 'deobf' + manifest { + attributes FMLCorePlugin: "ml.core.MLCore" + attributes FMLCorePluginContainsFMLMod: "true" + } +} + +task apiJar(type: Jar) { + from sourceSets.main.output + from sourceSets.main.java + classifier = 'api' + include 'li/cil/oc/api/**' +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + from 'build/docs/javadoc' + classifier 'javadoc' +} + +artifacts { + archives deobfJar + //archives apiJar + //archives javadocJar +} diff --git a/gradle/forge.gradle b/gradle/forge.gradle new file mode 100644 index 0000000..5a34bed --- /dev/null +++ b/gradle/forge.gradle @@ -0,0 +1,14 @@ + +minecraft { + version = "${config.minecraft.version}-${config.forge.version}" +} + +processResources { + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + expand 'version': project.simpleVersion, 'mcversion': config.minecraft.version + } + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/gradle/release.gradle b/gradle/release.gradle new file mode 100644 index 0000000..ebf1741 --- /dev/null +++ b/gradle/release.gradle @@ -0,0 +1,17 @@ +apply plugin: 'maven-publish' + +publishing { + publications { + mavenJava(MavenPublication) { + artifact jar + //artifact apiJar + //artifact javadocJar + artifact deobfJar { classifier '' } + } + } + repositories { + maven { + url "${config.maven.url}" + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d5c591c9c532da774b062aa6d7ab16405ff8700a GIT binary patch literal 50508 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%0DD3;W?!&t=FUIvF}Y7;NYDq6$vu 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 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=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@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 Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz 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. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +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 + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/make_at.py b/make_at.py deleted file mode 100644 index b5ae5a7..0000000 --- a/make_at.py +++ /dev/null @@ -1,24 +0,0 @@ -import re -import os, os.path -import sys - -mcp_home = sys.argv[1] -mcp_dir = os.path.abspath(mcp_home) -cfg_dir = os.path.join(mcp_dir, 'conf') - -joined_srg = os.path.join(cfg_dir, 'joined.srg') - -for f in os.listdir('./'): - n = re.match(r'(.*_at)\.man', f) - if n: - with open(n.group(1)+'.cfg', 'w+') as oat: - for instr in open(f, 'r+'): - instr = re.sub(r'\s*#.*', '', instr) - instr=instr.strip() - nat = re.match(r'(.*) (.*)$', instr) - if nat: - with open(joined_srg, 'r+') as jnd: - for ln in jnd: - if ln.find(nat.group(2))>-1: - at = re.match(r'(..): (\w+/\w+) ?(.*) net/.*', ln) - oat.write('%s %s%s'%(nat.group(1), at.group(2).replace('/', '.'), at.group(3))) \ No newline at end of file diff --git a/mlcore_at.man b/mlcore_at.man deleted file mode 100644 index e7d8928..0000000 --- a/mlcore_at.man +++ /dev/null @@ -1,2 +0,0 @@ - -public func_74187_b #GuiContainer.getSlotAtPosition(int, int) \ No newline at end of file diff --git a/src/minecraft/ml/core/ChatUtils.java b/src/main/java/ml/core/ChatUtils.java similarity index 100% rename from src/minecraft/ml/core/ChatUtils.java rename to src/main/java/ml/core/ChatUtils.java diff --git a/src/minecraft/ml/core/MLCore.java b/src/main/java/ml/core/MLCore.java similarity index 96% rename from src/minecraft/ml/core/MLCore.java rename to src/main/java/ml/core/MLCore.java index a3c8bdd..e694775 100644 --- a/src/minecraft/ml/core/MLCore.java +++ b/src/main/java/ml/core/MLCore.java @@ -45,11 +45,6 @@ public void preInit(FMLPreInitializationEvent evt) { public void init(FMLInitializationEvent evt) { proxy.load(); } - - @Override - public String[] getLibraryRequestClass() { - return null; - } @Override public String[] getASMTransformerClass() { diff --git a/src/minecraft/ml/core/PlayerUtils.java b/src/main/java/ml/core/PlayerUtils.java similarity index 100% rename from src/minecraft/ml/core/PlayerUtils.java rename to src/main/java/ml/core/PlayerUtils.java diff --git a/src/minecraft/ml/core/asm/MLCAccesTransformer.java b/src/main/java/ml/core/asm/MLCAccesTransformer.java similarity index 100% rename from src/minecraft/ml/core/asm/MLCAccesTransformer.java rename to src/main/java/ml/core/asm/MLCAccesTransformer.java diff --git a/src/minecraft/ml/core/block/BlockUtils.java b/src/main/java/ml/core/block/BlockUtils.java similarity index 100% rename from src/minecraft/ml/core/block/BlockUtils.java rename to src/main/java/ml/core/block/BlockUtils.java diff --git a/src/minecraft/ml/core/data/Config.java b/src/main/java/ml/core/data/Config.java similarity index 100% rename from src/minecraft/ml/core/data/Config.java rename to src/main/java/ml/core/data/Config.java diff --git a/src/minecraft/ml/core/data/NBTUtils.java b/src/main/java/ml/core/data/NBTUtils.java similarity index 100% rename from src/minecraft/ml/core/data/NBTUtils.java rename to src/main/java/ml/core/data/NBTUtils.java diff --git a/src/minecraft/ml/core/enums/MouseButton.java b/src/main/java/ml/core/enums/MouseButton.java similarity index 100% rename from src/minecraft/ml/core/enums/MouseButton.java rename to src/main/java/ml/core/enums/MouseButton.java diff --git a/src/minecraft/ml/core/enums/NaturalSide.java b/src/main/java/ml/core/enums/NaturalSide.java similarity index 100% rename from src/minecraft/ml/core/enums/NaturalSide.java rename to src/main/java/ml/core/enums/NaturalSide.java diff --git a/src/minecraft/ml/core/gui/GuiRenderUtils.java b/src/main/java/ml/core/gui/GuiRenderUtils.java similarity index 100% rename from src/minecraft/ml/core/gui/GuiRenderUtils.java rename to src/main/java/ml/core/gui/GuiRenderUtils.java diff --git a/src/minecraft/ml/core/gui/MLGuiHandler.java b/src/main/java/ml/core/gui/MLGuiHandler.java similarity index 100% rename from src/minecraft/ml/core/gui/MLGuiHandler.java rename to src/main/java/ml/core/gui/MLGuiHandler.java diff --git a/src/minecraft/ml/core/gui/MLSlot.java b/src/main/java/ml/core/gui/MLSlot.java similarity index 100% rename from src/minecraft/ml/core/gui/MLSlot.java rename to src/main/java/ml/core/gui/MLSlot.java diff --git a/src/minecraft/ml/core/gui/controls/ControlTextInput.java b/src/main/java/ml/core/gui/controls/ControlTextInput.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/ControlTextInput.java rename to src/main/java/ml/core/gui/controls/ControlTextInput.java diff --git a/src/minecraft/ml/core/gui/controls/GuiControl.java b/src/main/java/ml/core/gui/controls/GuiControl.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/GuiControl.java rename to src/main/java/ml/core/gui/controls/GuiControl.java diff --git a/src/minecraft/ml/core/gui/controls/button/ControlButton.java b/src/main/java/ml/core/gui/controls/button/ControlButton.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/button/ControlButton.java rename to src/main/java/ml/core/gui/controls/button/ControlButton.java diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlMultiSlotBase.java b/src/main/java/ml/core/gui/controls/inventory/ControlMultiSlotBase.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/inventory/ControlMultiSlotBase.java rename to src/main/java/ml/core/gui/controls/inventory/ControlMultiSlotBase.java diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlPlayerInventory.java b/src/main/java/ml/core/gui/controls/inventory/ControlPlayerInventory.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/inventory/ControlPlayerInventory.java rename to src/main/java/ml/core/gui/controls/inventory/ControlPlayerInventory.java diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java b/src/main/java/ml/core/gui/controls/inventory/ControlSlot.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java rename to src/main/java/ml/core/gui/controls/inventory/ControlSlot.java diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlSlotGrid.java b/src/main/java/ml/core/gui/controls/inventory/ControlSlotGrid.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/inventory/ControlSlotGrid.java rename to src/main/java/ml/core/gui/controls/inventory/ControlSlotGrid.java diff --git a/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java b/src/main/java/ml/core/gui/controls/tabs/ControlTabManager.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java rename to src/main/java/ml/core/gui/controls/tabs/ControlTabManager.java diff --git a/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java b/src/main/java/ml/core/gui/controls/tabs/TabLedger.java similarity index 100% rename from src/minecraft/ml/core/gui/controls/tabs/TabLedger.java rename to src/main/java/ml/core/gui/controls/tabs/TabLedger.java diff --git a/src/minecraft/ml/core/gui/core/GuiElement.java b/src/main/java/ml/core/gui/core/GuiElement.java similarity index 100% rename from src/minecraft/ml/core/gui/core/GuiElement.java rename to src/main/java/ml/core/gui/core/GuiElement.java diff --git a/src/minecraft/ml/core/gui/core/MLContainer.java b/src/main/java/ml/core/gui/core/MLContainer.java similarity index 100% rename from src/minecraft/ml/core/gui/core/MLContainer.java rename to src/main/java/ml/core/gui/core/MLContainer.java diff --git a/src/minecraft/ml/core/gui/core/MLGuiClient.java b/src/main/java/ml/core/gui/core/MLGuiClient.java similarity index 100% rename from src/minecraft/ml/core/gui/core/MLGuiClient.java rename to src/main/java/ml/core/gui/core/MLGuiClient.java diff --git a/src/minecraft/ml/core/gui/core/SlotCycler.java b/src/main/java/ml/core/gui/core/SlotCycler.java similarity index 96% rename from src/minecraft/ml/core/gui/core/SlotCycler.java rename to src/main/java/ml/core/gui/core/SlotCycler.java index 3ffdc00..9c71ad2 100644 --- a/src/minecraft/ml/core/gui/core/SlotCycler.java +++ b/src/main/java/ml/core/gui/core/SlotCycler.java @@ -1,13 +1,13 @@ package ml.core.gui.core; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import ml.core.gui.MLSlot; import ml.core.gui.controls.inventory.ControlSlot; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import scala.actors.threadpool.Arrays; /** * A simple class for handling Shift+Clicking in MLGuis. You can use it to setup predefined cycles between Slots and SlotGroups @@ -56,7 +56,7 @@ public boolean cycleSlot(ControlSlot cslot) { return cycleSlot(cslot.getSlot(), cslot); } - public boolean tryCycleSlot(Slot slot) { + public boolean cycleSlot(Slot slot) { if (slot instanceof MLSlot && ((MLSlot)slot).controlSlot != null) { ControlSlot cslot = ((MLSlot)slot).controlSlot; return cycleSlot(slot, cslot); diff --git a/src/minecraft/ml/core/gui/core/TopParentGuiElement.java b/src/main/java/ml/core/gui/core/TopParentGuiElement.java similarity index 100% rename from src/minecraft/ml/core/gui/core/TopParentGuiElement.java rename to src/main/java/ml/core/gui/core/TopParentGuiElement.java diff --git a/src/minecraft/ml/core/gui/core/Window.java b/src/main/java/ml/core/gui/core/Window.java similarity index 100% rename from src/minecraft/ml/core/gui/core/Window.java rename to src/main/java/ml/core/gui/core/Window.java diff --git a/src/minecraft/ml/core/gui/core/style/GuiStyle.java b/src/main/java/ml/core/gui/core/style/GuiStyle.java similarity index 100% rename from src/minecraft/ml/core/gui/core/style/GuiStyle.java rename to src/main/java/ml/core/gui/core/style/GuiStyle.java diff --git a/src/minecraft/ml/core/gui/core/style/GuiStyleManip.java b/src/main/java/ml/core/gui/core/style/GuiStyleManip.java similarity index 100% rename from src/minecraft/ml/core/gui/core/style/GuiStyleManip.java rename to src/main/java/ml/core/gui/core/style/GuiStyleManip.java diff --git a/src/minecraft/ml/core/gui/event/EventButtonPressed.java b/src/main/java/ml/core/gui/event/EventButtonPressed.java similarity index 100% rename from src/minecraft/ml/core/gui/event/EventButtonPressed.java rename to src/main/java/ml/core/gui/event/EventButtonPressed.java diff --git a/src/minecraft/ml/core/gui/event/EventChanged.java b/src/main/java/ml/core/gui/event/EventChanged.java similarity index 100% rename from src/minecraft/ml/core/gui/event/EventChanged.java rename to src/main/java/ml/core/gui/event/EventChanged.java diff --git a/src/minecraft/ml/core/gui/event/EventDataPacketReceived.java b/src/main/java/ml/core/gui/event/EventDataPacketReceived.java similarity index 100% rename from src/minecraft/ml/core/gui/event/EventDataPacketReceived.java rename to src/main/java/ml/core/gui/event/EventDataPacketReceived.java diff --git a/src/minecraft/ml/core/gui/event/EventFocusLost.java b/src/main/java/ml/core/gui/event/EventFocusLost.java similarity index 100% rename from src/minecraft/ml/core/gui/event/EventFocusLost.java rename to src/main/java/ml/core/gui/event/EventFocusLost.java diff --git a/src/minecraft/ml/core/gui/event/EventGuiClosing.java b/src/main/java/ml/core/gui/event/EventGuiClosing.java similarity index 100% rename from src/minecraft/ml/core/gui/event/EventGuiClosing.java rename to src/main/java/ml/core/gui/event/EventGuiClosing.java diff --git a/src/minecraft/ml/core/gui/event/EventKeyPressed.java b/src/main/java/ml/core/gui/event/EventKeyPressed.java similarity index 100% rename from src/minecraft/ml/core/gui/event/EventKeyPressed.java rename to src/main/java/ml/core/gui/event/EventKeyPressed.java diff --git a/src/minecraft/ml/core/gui/event/GuiEvent.java b/src/main/java/ml/core/gui/event/GuiEvent.java similarity index 100% rename from src/minecraft/ml/core/gui/event/GuiEvent.java rename to src/main/java/ml/core/gui/event/GuiEvent.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMouseClicked.java b/src/main/java/ml/core/gui/event/mouse/EventMouseClicked.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMouseClicked.java rename to src/main/java/ml/core/gui/event/mouse/EventMouseClicked.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMouseDown.java b/src/main/java/ml/core/gui/event/mouse/EventMouseDown.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMouseDown.java rename to src/main/java/ml/core/gui/event/mouse/EventMouseDown.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMouseEntered.java b/src/main/java/ml/core/gui/event/mouse/EventMouseEntered.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMouseEntered.java rename to src/main/java/ml/core/gui/event/mouse/EventMouseEntered.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMouseLeave.java b/src/main/java/ml/core/gui/event/mouse/EventMouseLeave.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMouseLeave.java rename to src/main/java/ml/core/gui/event/mouse/EventMouseLeave.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMouseMove.java b/src/main/java/ml/core/gui/event/mouse/EventMouseMove.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMouseMove.java rename to src/main/java/ml/core/gui/event/mouse/EventMouseMove.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMousePositioned.java b/src/main/java/ml/core/gui/event/mouse/EventMousePositioned.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMousePositioned.java rename to src/main/java/ml/core/gui/event/mouse/EventMousePositioned.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMouseScroll.java b/src/main/java/ml/core/gui/event/mouse/EventMouseScroll.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMouseScroll.java rename to src/main/java/ml/core/gui/event/mouse/EventMouseScroll.java diff --git a/src/minecraft/ml/core/gui/event/mouse/EventMouseUp.java b/src/main/java/ml/core/gui/event/mouse/EventMouseUp.java similarity index 100% rename from src/minecraft/ml/core/gui/event/mouse/EventMouseUp.java rename to src/main/java/ml/core/gui/event/mouse/EventMouseUp.java diff --git a/src/minecraft/ml/core/internal/ClientProxy.java b/src/main/java/ml/core/internal/ClientProxy.java similarity index 100% rename from src/minecraft/ml/core/internal/ClientProxy.java rename to src/main/java/ml/core/internal/ClientProxy.java diff --git a/src/minecraft/ml/core/internal/CommonProxy.java b/src/main/java/ml/core/internal/CommonProxy.java similarity index 100% rename from src/minecraft/ml/core/internal/CommonProxy.java rename to src/main/java/ml/core/internal/CommonProxy.java diff --git a/src/minecraft/ml/core/internal/CoreLogger.java b/src/main/java/ml/core/internal/CoreLogger.java similarity index 100% rename from src/minecraft/ml/core/internal/CoreLogger.java rename to src/main/java/ml/core/internal/CoreLogger.java diff --git a/src/minecraft/ml/core/internal/PacketContainerData.java b/src/main/java/ml/core/internal/PacketContainerData.java similarity index 100% rename from src/minecraft/ml/core/internal/PacketContainerData.java rename to src/main/java/ml/core/internal/PacketContainerData.java diff --git a/src/minecraft/ml/core/internal/PacketHandler.java b/src/main/java/ml/core/internal/PacketHandler.java similarity index 100% rename from src/minecraft/ml/core/internal/PacketHandler.java rename to src/main/java/ml/core/internal/PacketHandler.java diff --git a/src/minecraft/ml/core/inventory/CustomSlotClick.java b/src/main/java/ml/core/inventory/CustomSlotClick.java similarity index 100% rename from src/minecraft/ml/core/inventory/CustomSlotClick.java rename to src/main/java/ml/core/inventory/CustomSlotClick.java diff --git a/src/minecraft/ml/core/inventory/InventoryUtils.java b/src/main/java/ml/core/inventory/InventoryUtils.java similarity index 100% rename from src/minecraft/ml/core/inventory/InventoryUtils.java rename to src/main/java/ml/core/inventory/InventoryUtils.java diff --git a/src/minecraft/ml/core/item/StackUtils.java b/src/main/java/ml/core/item/StackUtils.java similarity index 100% rename from src/minecraft/ml/core/item/StackUtils.java rename to src/main/java/ml/core/item/StackUtils.java diff --git a/src/minecraft/ml/core/item/recipe/CRecipeShapedBase.java b/src/main/java/ml/core/item/recipe/CRecipeShapedBase.java similarity index 100% rename from src/minecraft/ml/core/item/recipe/CRecipeShapedBase.java rename to src/main/java/ml/core/item/recipe/CRecipeShapedBase.java diff --git a/src/minecraft/ml/core/item/recipe/RecipeMixed.java b/src/main/java/ml/core/item/recipe/RecipeMixed.java similarity index 100% rename from src/minecraft/ml/core/item/recipe/RecipeMixed.java rename to src/main/java/ml/core/item/recipe/RecipeMixed.java diff --git a/src/minecraft/ml/core/item/recipe/RecipeShapedVariable.java b/src/main/java/ml/core/item/recipe/RecipeShapedVariable.java similarity index 100% rename from src/minecraft/ml/core/item/recipe/RecipeShapedVariable.java rename to src/main/java/ml/core/item/recipe/RecipeShapedVariable.java diff --git a/src/minecraft/ml/core/math/MathUtils.java b/src/main/java/ml/core/math/MathUtils.java similarity index 100% rename from src/minecraft/ml/core/math/MathUtils.java rename to src/main/java/ml/core/math/MathUtils.java diff --git a/src/minecraft/ml/core/nei/NEI_MLCore_Config.java b/src/main/java/ml/core/nei/NEI_MLCore_Config.java similarity index 100% rename from src/minecraft/ml/core/nei/NEI_MLCore_Config.java rename to src/main/java/ml/core/nei/NEI_MLCore_Config.java diff --git a/src/minecraft/ml/core/network/IDataSerializer.java b/src/main/java/ml/core/network/IDataSerializer.java similarity index 100% rename from src/minecraft/ml/core/network/IDataSerializer.java rename to src/main/java/ml/core/network/IDataSerializer.java diff --git a/src/minecraft/ml/core/network/MLPacket.java b/src/main/java/ml/core/network/MLPacket.java similarity index 100% rename from src/minecraft/ml/core/network/MLPacket.java rename to src/main/java/ml/core/network/MLPacket.java diff --git a/src/minecraft/ml/core/network/PacketHandler.java b/src/main/java/ml/core/network/PacketHandler.java similarity index 100% rename from src/minecraft/ml/core/network/PacketHandler.java rename to src/main/java/ml/core/network/PacketHandler.java diff --git a/src/minecraft/ml/core/network/serializers/SForgeDirection.java b/src/main/java/ml/core/network/serializers/SForgeDirection.java similarity index 100% rename from src/minecraft/ml/core/network/serializers/SForgeDirection.java rename to src/main/java/ml/core/network/serializers/SForgeDirection.java diff --git a/src/minecraft/ml/core/network/serializers/SItemsStack.java b/src/main/java/ml/core/network/serializers/SItemsStack.java similarity index 100% rename from src/minecraft/ml/core/network/serializers/SItemsStack.java rename to src/main/java/ml/core/network/serializers/SItemsStack.java diff --git a/src/minecraft/ml/core/network/serializers/SNBTTagCompound.java b/src/main/java/ml/core/network/serializers/SNBTTagCompound.java similarity index 100% rename from src/minecraft/ml/core/network/serializers/SNBTTagCompound.java rename to src/main/java/ml/core/network/serializers/SNBTTagCompound.java diff --git a/src/minecraft/ml/core/network/serializers/SString.java b/src/main/java/ml/core/network/serializers/SString.java similarity index 100% rename from src/minecraft/ml/core/network/serializers/SString.java rename to src/main/java/ml/core/network/serializers/SString.java diff --git a/src/minecraft/ml/core/network/serializers/STileEntity.java b/src/main/java/ml/core/network/serializers/STileEntity.java similarity index 100% rename from src/minecraft/ml/core/network/serializers/STileEntity.java rename to src/main/java/ml/core/network/serializers/STileEntity.java diff --git a/src/minecraft/ml/core/texture/ConnectedTexture.java b/src/main/java/ml/core/texture/ConnectedTexture.java similarity index 100% rename from src/minecraft/ml/core/texture/ConnectedTexture.java rename to src/main/java/ml/core/texture/ConnectedTexture.java diff --git a/src/minecraft/ml/core/texture/CustomTextureMap.java b/src/main/java/ml/core/texture/CustomTextureMap.java similarity index 100% rename from src/minecraft/ml/core/texture/CustomTextureMap.java rename to src/main/java/ml/core/texture/CustomTextureMap.java diff --git a/src/minecraft/ml/core/texture/CustomTextureMapManager.java b/src/main/java/ml/core/texture/CustomTextureMapManager.java similarity index 100% rename from src/minecraft/ml/core/texture/CustomTextureMapManager.java rename to src/main/java/ml/core/texture/CustomTextureMapManager.java diff --git a/src/minecraft/ml/core/texture/IIconProvider.java b/src/main/java/ml/core/texture/IIconProvider.java similarity index 100% rename from src/minecraft/ml/core/texture/IIconProvider.java rename to src/main/java/ml/core/texture/IIconProvider.java diff --git a/src/minecraft/ml/core/texture/TextureSheet.java b/src/main/java/ml/core/texture/TextureSheet.java similarity index 100% rename from src/minecraft/ml/core/texture/TextureSheet.java rename to src/main/java/ml/core/texture/TextureSheet.java diff --git a/src/minecraft/ml/core/texture/TextureUtils.java b/src/main/java/ml/core/texture/TextureUtils.java similarity index 100% rename from src/minecraft/ml/core/texture/TextureUtils.java rename to src/main/java/ml/core/texture/TextureUtils.java diff --git a/src/minecraft/ml/core/texture/maps/BasicCustomTextureMap.java b/src/main/java/ml/core/texture/maps/BasicCustomTextureMap.java similarity index 100% rename from src/minecraft/ml/core/texture/maps/BasicCustomTextureMap.java rename to src/main/java/ml/core/texture/maps/BasicCustomTextureMap.java diff --git a/src/minecraft/ml/core/tile/IRotatableTE.java b/src/main/java/ml/core/tile/IRotatableTE.java similarity index 100% rename from src/minecraft/ml/core/tile/IRotatableTE.java rename to src/main/java/ml/core/tile/IRotatableTE.java diff --git a/src/minecraft/ml/core/tile/TileEntityConnectable.java b/src/main/java/ml/core/tile/TileEntityConnectable.java similarity index 100% rename from src/minecraft/ml/core/tile/TileEntityConnectable.java rename to src/main/java/ml/core/tile/TileEntityConnectable.java diff --git a/src/minecraft/ml/core/util/RandomUtils.java b/src/main/java/ml/core/util/RandomUtils.java similarity index 100% rename from src/minecraft/ml/core/util/RandomUtils.java rename to src/main/java/ml/core/util/RandomUtils.java diff --git a/src/minecraft/ml/core/util/ReflectionUtils.java b/src/main/java/ml/core/util/ReflectionUtils.java similarity index 100% rename from src/minecraft/ml/core/util/ReflectionUtils.java rename to src/main/java/ml/core/util/ReflectionUtils.java diff --git a/src/minecraft/ml/core/util/StringUtils.java b/src/main/java/ml/core/util/StringUtils.java similarity index 100% rename from src/minecraft/ml/core/util/StringUtils.java rename to src/main/java/ml/core/util/StringUtils.java diff --git a/src/minecraft/ml/core/vec/BlockCoord.java b/src/main/java/ml/core/vec/BlockCoord.java similarity index 100% rename from src/minecraft/ml/core/vec/BlockCoord.java rename to src/main/java/ml/core/vec/BlockCoord.java diff --git a/src/minecraft/ml/core/vec/Cuboid6.java b/src/main/java/ml/core/vec/Cuboid6.java similarity index 100% rename from src/minecraft/ml/core/vec/Cuboid6.java rename to src/main/java/ml/core/vec/Cuboid6.java diff --git a/src/minecraft/ml/core/vec/GeoMath.java b/src/main/java/ml/core/vec/GeoMath.java similarity index 100% rename from src/minecraft/ml/core/vec/GeoMath.java rename to src/main/java/ml/core/vec/GeoMath.java diff --git a/src/minecraft/ml/core/vec/ITransformable.java b/src/main/java/ml/core/vec/ITransformable.java similarity index 100% rename from src/minecraft/ml/core/vec/ITransformable.java rename to src/main/java/ml/core/vec/ITransformable.java diff --git a/src/minecraft/ml/core/vec/Matrix.java b/src/main/java/ml/core/vec/Matrix.java similarity index 100% rename from src/minecraft/ml/core/vec/Matrix.java rename to src/main/java/ml/core/vec/Matrix.java diff --git a/src/minecraft/ml/core/vec/RayTrace.java b/src/main/java/ml/core/vec/RayTrace.java similarity index 100% rename from src/minecraft/ml/core/vec/RayTrace.java rename to src/main/java/ml/core/vec/RayTrace.java diff --git a/src/minecraft/ml/core/vec/Rectangle.java b/src/main/java/ml/core/vec/Rectangle.java similarity index 100% rename from src/minecraft/ml/core/vec/Rectangle.java rename to src/main/java/ml/core/vec/Rectangle.java diff --git a/src/minecraft/ml/core/vec/Vector2i.java b/src/main/java/ml/core/vec/Vector2i.java similarity index 100% rename from src/minecraft/ml/core/vec/Vector2i.java rename to src/main/java/ml/core/vec/Vector2i.java diff --git a/src/minecraft/ml/core/vec/Vector3d.java b/src/main/java/ml/core/vec/Vector3d.java similarity index 100% rename from src/minecraft/ml/core/vec/Vector3d.java rename to src/main/java/ml/core/vec/Vector3d.java diff --git a/src/minecraft/ml/core/vec/transform/LocalizedTransformation.java b/src/main/java/ml/core/vec/transform/LocalizedTransformation.java similarity index 100% rename from src/minecraft/ml/core/vec/transform/LocalizedTransformation.java rename to src/main/java/ml/core/vec/transform/LocalizedTransformation.java diff --git a/src/minecraft/ml/core/vec/transform/Matrix4d.java b/src/main/java/ml/core/vec/transform/Matrix4d.java similarity index 100% rename from src/minecraft/ml/core/vec/transform/Matrix4d.java rename to src/main/java/ml/core/vec/transform/Matrix4d.java diff --git a/src/minecraft/ml/core/vec/transform/MultiTransformation.java b/src/main/java/ml/core/vec/transform/MultiTransformation.java similarity index 100% rename from src/minecraft/ml/core/vec/transform/MultiTransformation.java rename to src/main/java/ml/core/vec/transform/MultiTransformation.java diff --git a/src/minecraft/ml/core/vec/transform/Rotation.java b/src/main/java/ml/core/vec/transform/Rotation.java similarity index 100% rename from src/minecraft/ml/core/vec/transform/Rotation.java rename to src/main/java/ml/core/vec/transform/Rotation.java diff --git a/src/minecraft/ml/core/vec/transform/Scale.java b/src/main/java/ml/core/vec/transform/Scale.java similarity index 100% rename from src/minecraft/ml/core/vec/transform/Scale.java rename to src/main/java/ml/core/vec/transform/Scale.java diff --git a/src/minecraft/ml/core/vec/transform/Transformation.java b/src/main/java/ml/core/vec/transform/Transformation.java similarity index 100% rename from src/minecraft/ml/core/vec/transform/Transformation.java rename to src/main/java/ml/core/vec/transform/Transformation.java diff --git a/src/minecraft/ml/core/vec/transform/Translation.java b/src/main/java/ml/core/vec/transform/Translation.java similarity index 100% rename from src/minecraft/ml/core/vec/transform/Translation.java rename to src/main/java/ml/core/vec/transform/Translation.java diff --git a/src/minecraft/ml/core/world/WorldGenHandler.java b/src/main/java/ml/core/world/WorldGenHandler.java similarity index 100% rename from src/minecraft/ml/core/world/WorldGenHandler.java rename to src/main/java/ml/core/world/WorldGenHandler.java diff --git a/src/minecraft/ml/core/world/WorldRenderUtils.java b/src/main/java/ml/core/world/WorldRenderUtils.java similarity index 100% rename from src/minecraft/ml/core/world/WorldRenderUtils.java rename to src/main/java/ml/core/world/WorldRenderUtils.java diff --git a/src/minecraft/ml/core/world/feature/IFeatureGenerator.java b/src/main/java/ml/core/world/feature/IFeatureGenerator.java similarity index 100% rename from src/minecraft/ml/core/world/feature/IFeatureGenerator.java rename to src/main/java/ml/core/world/feature/IFeatureGenerator.java diff --git a/res/assets/mlcontrols/default/button.png b/src/main/resources/assets/mlcontrols/default/button.png similarity index 100% rename from res/assets/mlcontrols/default/button.png rename to src/main/resources/assets/mlcontrols/default/button.png diff --git a/res/assets/mlcontrols/default/ledger.png b/src/main/resources/assets/mlcontrols/default/ledger.png similarity index 100% rename from res/assets/mlcontrols/default/ledger.png rename to src/main/resources/assets/mlcontrols/default/ledger.png diff --git a/res/assets/mlcontrols/default/properties.txt b/src/main/resources/assets/mlcontrols/default/properties.txt similarity index 100% rename from res/assets/mlcontrols/default/properties.txt rename to src/main/resources/assets/mlcontrols/default/properties.txt diff --git a/res/assets/mlcontrols/default/slot.png b/src/main/resources/assets/mlcontrols/default/slot.png similarity index 100% rename from res/assets/mlcontrols/default/slot.png rename to src/main/resources/assets/mlcontrols/default/slot.png diff --git a/res/assets/mlcontrols/default/swatch.png b/src/main/resources/assets/mlcontrols/default/swatch.png similarity index 100% rename from res/assets/mlcontrols/default/swatch.png rename to src/main/resources/assets/mlcontrols/default/swatch.png diff --git a/res/assets/mlcontrols/default/window.png b/src/main/resources/assets/mlcontrols/default/window.png similarity index 100% rename from res/assets/mlcontrols/default/window.png rename to src/main/resources/assets/mlcontrols/default/window.png diff --git a/mcmod.info b/src/main/resources/mcmod.info similarity index 100% rename from mcmod.info rename to src/main/resources/mcmod.info diff --git a/src/main/resources/mlcore_at.cfg b/src/main/resources/mlcore_at.cfg new file mode 100644 index 0000000..aa8293c --- /dev/null +++ b/src/main/resources/mlcore_at.cfg @@ -0,0 +1 @@ +public awy.c(II)Lwe; \ No newline at end of file From 5504f1e7f6974b875c29c08a3ae8b2232f39373a Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Thu, 26 Jun 2014 15:05:44 -0600 Subject: [PATCH 02/21] Created a delegating item --- .../ml/core/block/BlockDelegator.java | 6 +- .../{Delegate.java => DelegateBlock.java} | 12 +- src/minecraft/ml/core/item/DelegateItem.java | 96 +++++++++++ src/minecraft/ml/core/item/ItemDelegator.java | 158 ++++++++++++++++++ 4 files changed, 265 insertions(+), 7 deletions(-) rename src/minecraft/ml/core/block/{Delegate.java => DelegateBlock.java} (97%) create mode 100644 src/minecraft/ml/core/item/DelegateItem.java create mode 100644 src/minecraft/ml/core/item/ItemDelegator.java diff --git a/src/minecraft/ml/core/block/BlockDelegator.java b/src/minecraft/ml/core/block/BlockDelegator.java index d94aa13..3f87828 100644 --- a/src/minecraft/ml/core/block/BlockDelegator.java +++ b/src/minecraft/ml/core/block/BlockDelegator.java @@ -32,7 +32,7 @@ * * @author Matchlighter */ -public class BlockDelegator extends Block { +public class BlockDelegator extends Block { private BiMap subBlocks = HashBiMap.create(); @@ -78,7 +78,7 @@ public DCls subBlock(IBlockAccess world, int x, int y, int z) { return nullDelegate; } - public static Delegate findSubBlock(ItemStack is) { + public static DelegateBlock findSubBlock(ItemStack is) { if (is != null && is.getItem() instanceof ItemBlock) { ItemBlock ib = (ItemBlock)is.getItem(); Block blk = Block.blocksList[ib.getBlockID()]; @@ -89,7 +89,7 @@ public static Delegate findSubBlock(ItemStack is) { return null; } - public static Delegate findSubBlock(IBlockAccess world, int x, int y, int z) { + public static DelegateBlock findSubBlock(IBlockAccess world, int x, int y, int z) { Block blk = Block.blocksList[world.getBlockId(x, y, z)]; if (blk instanceof BlockDelegator) { return ((BlockDelegator)blk).subBlock(world.getBlockMetadata(x, y, z)); diff --git a/src/minecraft/ml/core/block/Delegate.java b/src/minecraft/ml/core/block/DelegateBlock.java similarity index 97% rename from src/minecraft/ml/core/block/Delegate.java rename to src/minecraft/ml/core/block/DelegateBlock.java index 346196e..bbea4fb 100644 --- a/src/minecraft/ml/core/block/Delegate.java +++ b/src/minecraft/ml/core/block/DelegateBlock.java @@ -22,16 +22,20 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.IPlantable; -public abstract class Delegate { +public class DelegateBlock { protected int metaId; - protected BlockDelegator parent; + protected BlockDelegator parent; - public Delegate() {} + public DelegateBlock() {} - public BlockDelegator parent() { + public BlockDelegator parent() { return parent; } + + public int getMetaId() { + return metaId; + } public void setBlockAt(World world, int wx, int wy, int wz, int flags) { world.setBlock(wx, wy, wz, parent.blockID, metaId, flags); diff --git a/src/minecraft/ml/core/item/DelegateItem.java b/src/minecraft/ml/core/item/DelegateItem.java new file mode 100644 index 0000000..49074e5 --- /dev/null +++ b/src/minecraft/ml/core/item/DelegateItem.java @@ -0,0 +1,96 @@ +package ml.core.item; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + + + +public class DelegateItem { + + protected int metaId; + protected ItemDelegator parent; + + public DelegateItem() {} + + public ItemDelegator parent() { + return parent; + } + + public int getMetaId() { + return metaId; + } + +/* ---------------------------- ItemMethods ---------------------------- */ + + public String getUnlocalizedName(ItemStack stack) { + return ""; + } + + /** + * Return null for default implementation + */ + public String getItemDisplayName(ItemStack stack) { + return null; + } + + public EnumRarity getRarity(ItemStack stack) { + return EnumRarity.common; + } + + public ItemStack getContainerItemStack(ItemStack itemStack) { + return null; + } + + public int getDamage(ItemStack stack) { + return 0; + } + + public int getMaxDamage(ItemStack stack) { + return 0; + } + + public boolean isDamageable(ItemStack stack) { + return false; + } + + public void onUpdate(ItemStack stack, World par2World, Entity par3Entity, int par4, boolean par5) {} + + /* ---------------------------- Events ---------------------------- */ + + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + return false; + } + + public boolean onItemUse(ItemStack stack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { + return false; + } + + public ItemStack onItemRightClick(ItemStack stack, World par2World, EntityPlayer par3EntityPlayer) { + return stack; + } + + /* ---------------------------- ClientSide ---------------------------- */ + + public int getColorFromItemStack(ItemStack stack, int par2) { + return 16777215; + } + + public Icon getIcon(ItemStack stack, int pass) { + return null; + } + + public Icon getIconInHand(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { + return getIcon(stack, renderPass); + } + + public void registerIcons(IconRegister par1IconRegister) {} + + public void addInformation(ItemStack stack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {} +} diff --git a/src/minecraft/ml/core/item/ItemDelegator.java b/src/minecraft/ml/core/item/ItemDelegator.java new file mode 100644 index 0000000..ee7ec25 --- /dev/null +++ b/src/minecraft/ml/core/item/ItemDelegator.java @@ -0,0 +1,158 @@ +package ml.core.item; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemDelegator extends Item { + + private BiMap subItems = HashBiMap.create(); + + protected DCls nullDelegate; + + public ItemDelegator(int id, DCls nullDelegate) { + super(id); + setHasSubtypes(true); + this.nullDelegate = nullDelegate; + this.nullDelegate.parent = this; + } + + /* ---------------------------- SubItems ---------------------------- */ + + public boolean addSubItem(int metaData, DCls sub) { + if (subItems.containsKey(metaData) || subItems.containsValue(sub)) return false; + subItems.put(metaData, sub); + sub.parent = this; + sub.metaId = metaData; + return true; + } + + public DCls subItem(int metaData) { + if (subItems.containsKey(metaData)) return subItems.get(metaData); + return nullDelegate; + } + + public DCls subItem(ItemStack is) { + if (is != null && is.getItem() == this) { + return subItem(is.getItemDamage()); + } + return nullDelegate; + } + + public static DelegateItem findSubItem(ItemStack is) { + if (is != null && is.getItem() instanceof ItemDelegator) { + ItemDelegator idg = (ItemDelegator) is.getItem(); + return idg.subItem(is.getItemDamage()); + } + return null; + } + + /* ---------------------------- ItemMethods ---------------------------- */ + + @Override + public String getUnlocalizedName(ItemStack par1ItemStack) { + return "item."+subItem(par1ItemStack).getUnlocalizedName(par1ItemStack); + } + + @Override + public String getItemDisplayName(ItemStack par1ItemStack) { + String name = subItem(par1ItemStack).getItemDisplayName(par1ItemStack); + return name != null ? name : super.getItemDisplayName(par1ItemStack); + } + + @Override + public EnumRarity getRarity(ItemStack par1ItemStack) { + return subItem(par1ItemStack).getRarity(par1ItemStack); + } + + @Override + public ItemStack getContainerItemStack(ItemStack itemStack) { + return subItem(itemStack).getContainerItemStack(itemStack); + } + + @Override + public int getDisplayDamage(ItemStack stack) { + DCls sub = subItem(stack); + return sub.isDamageable(stack) ? sub.getDamage(stack) : 0; + } + + @Override + public int getMaxDamage(ItemStack stack) { + DCls sub = subItem(stack); + return sub.isDamageable(stack) ? sub.getMaxDamage(stack) : 0; + } + + @Override + public boolean isDamaged(ItemStack stack) { + DCls sub = subItem(stack); + return sub.isDamageable(stack) ? sub.getDamage(stack) > 0 : false; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) { + subItem(par1ItemStack).onUpdate(par1ItemStack, par2World, par3Entity, par4, par5); + } + + /* ---------------------------- Events ---------------------------- */ + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + return subItem(stack).onItemUseFirst(stack, player, world, x, y, z, side, hitX, hitY, hitZ); + } + + @Override + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { + return subItem(par1ItemStack).onItemUse(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6, par7, par8, par9, par10); + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { + return subItem(par1ItemStack).onItemRightClick(par1ItemStack, par2World, par3EntityPlayer); + } + + /* ---------------------------- ClientSide ---------------------------- */ + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack par1ItemStack, int par2) { + return subItem(par1ItemStack).getColorFromItemStack(par1ItemStack, par2); + } + + @Override + @SideOnly(Side.CLIENT) + public Icon getIcon(ItemStack stack, int pass) { + return subItem(stack).getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public Icon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { + return subItem(stack).getIconInHand(stack, renderPass, player, usingItem, useRemaining); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister par1IconRegister) { + for (DCls sub : subItems.values()) sub.registerIcons(par1IconRegister); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { + subItem(par1ItemStack).addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); + } + +} From 30349e906847d10b8d9136d1221204e7a954bba8 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Thu, 26 Jun 2014 16:46:26 -0600 Subject: [PATCH 03/21] Minor correction. --- src/minecraft/ml/core/world/WorldGenHandler.java | 4 ++-- src/minecraft/ml/core/world/feature/IFeatureGenerator.java | 2 +- .../ml/core/world/feature/StructureGeneratorBase.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/minecraft/ml/core/world/WorldGenHandler.java b/src/minecraft/ml/core/world/WorldGenHandler.java index b9f1ade..7567eed 100644 --- a/src/minecraft/ml/core/world/WorldGenHandler.java +++ b/src/minecraft/ml/core/world/WorldGenHandler.java @@ -71,7 +71,7 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkPro for (IFeatureGenerator feature : features) { if (feature.canGenerateInWorld(world)) { - feature.doGeneration(rand, chunkX, chunkZ, world, false, -1); + feature.doPopulate(rand, chunkX, chunkZ, world, false, -1); rdb.markRetroJobDone(chunkX, chunkZ, feature.getGenIdentifier(), feature.getFeatureVersion()); } } @@ -111,7 +111,7 @@ public void tickEnd(EnumSet type, Object... tickData) { long chunkSeed = (xSeed * rqi.chunkX + zSeed * rqi.chunkZ) ^ worldSeed; rand.setSeed(chunkSeed); - rqi.feature.doGeneration(rand, rqi.chunkX, rqi.chunkZ, world, true, rqi.lastVer); + rqi.feature.doPopulate(rand, rqi.chunkX, rqi.chunkZ, world, true, rqi.lastVer); rqi.rdb.markRetroJobDone(rqi.chunkX, rqi.chunkZ, rqi.feature.getGenIdentifier(), rqi.feature.getFeatureVersion()); count++; diff --git a/src/minecraft/ml/core/world/feature/IFeatureGenerator.java b/src/minecraft/ml/core/world/feature/IFeatureGenerator.java index 3c0e54e..59c3ad5 100644 --- a/src/minecraft/ml/core/world/feature/IFeatureGenerator.java +++ b/src/minecraft/ml/core/world/feature/IFeatureGenerator.java @@ -6,7 +6,7 @@ public interface IFeatureGenerator { - public boolean doGeneration(Random rand, int chunkX, int chunkZ, World world, boolean isRetroGen, int oldVersion); + public boolean doPopulate(Random rand, int chunkX, int chunkZ, World world, boolean isRetroGen, int oldVersion); public String getGenIdentifier(); diff --git a/src/minecraft/ml/core/world/feature/StructureGeneratorBase.java b/src/minecraft/ml/core/world/feature/StructureGeneratorBase.java index 8cb82ba..3783ff9 100644 --- a/src/minecraft/ml/core/world/feature/StructureGeneratorBase.java +++ b/src/minecraft/ml/core/world/feature/StructureGeneratorBase.java @@ -9,7 +9,7 @@ public abstract class StructureGeneratorBase extends MapGenStructure implements IFeatureGenerator { @Override - public boolean doGeneration(Random rand, int chunkX, int chunkZ, World world, boolean isRetroGen, int oldVersion) { + public boolean doPopulate(Random rand, int chunkX, int chunkZ, World world, boolean isRetroGen, int oldVersion) { generate(world.getChunkProvider(), world, chunkX, chunkZ, null); return generateStructuresInChunk(world, rand, chunkX, chunkZ); } From 0a61954d6b7e5638df0eabedde6ffbdb330970c5 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Thu, 26 Jun 2014 17:22:22 -0600 Subject: [PATCH 04/21] Expanded Delegating items a bit. Fixed a majore bug with retro gen. --- src/minecraft/ml/core/item/DelegateItem.java | 30 +++++++++++++++++-- src/minecraft/ml/core/item/ItemDelegator.java | 4 +++ .../ml/core/world/WorldGenHandler.java | 2 +- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/minecraft/ml/core/item/DelegateItem.java b/src/minecraft/ml/core/item/DelegateItem.java index 49074e5..1aba7a6 100644 --- a/src/minecraft/ml/core/item/DelegateItem.java +++ b/src/minecraft/ml/core/item/DelegateItem.java @@ -2,6 +2,9 @@ import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -16,9 +19,24 @@ public class DelegateItem { protected int metaId; protected ItemDelegator parent; + protected String unlocalizedName; + + @SideOnly(Side.CLIENT) + protected Icon itemIcon = null; + protected String iconLocation; public DelegateItem() {} + public DelegateItem setIconString(String str) { + this.iconLocation = str; + return this; + } + + public DelegateItem setUnlocalizedName(String str) { + this.unlocalizedName = str; + return this; + } + public ItemDelegator parent() { return parent; } @@ -27,10 +45,14 @@ public int getMetaId() { return metaId; } + public ItemStack createStack(int size) { + return new ItemStack(parent(), size, getMetaId()); + } + /* ---------------------------- ItemMethods ---------------------------- */ public String getUnlocalizedName(ItemStack stack) { - return ""; + return unlocalizedName; } /** @@ -83,14 +105,16 @@ public int getColorFromItemStack(ItemStack stack, int par2) { } public Icon getIcon(ItemStack stack, int pass) { - return null; + return itemIcon; } public Icon getIconInHand(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { return getIcon(stack, renderPass); } - public void registerIcons(IconRegister par1IconRegister) {} + public void registerIcons(IconRegister ireg) { + this.itemIcon = ireg.registerIcon(iconLocation); + } public void addInformation(ItemStack stack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {} } diff --git a/src/minecraft/ml/core/item/ItemDelegator.java b/src/minecraft/ml/core/item/ItemDelegator.java index ee7ec25..967c13f 100644 --- a/src/minecraft/ml/core/item/ItemDelegator.java +++ b/src/minecraft/ml/core/item/ItemDelegator.java @@ -29,6 +29,10 @@ public ItemDelegator(int id, DCls nullDelegate) { this.nullDelegate = nullDelegate; this.nullDelegate.parent = this; } + + public ItemStack createStack(DCls subItem, int size) { + return new ItemStack(this, size, subItem.getMetaId()); + } /* ---------------------------- SubItems ---------------------------- */ diff --git a/src/minecraft/ml/core/world/WorldGenHandler.java b/src/minecraft/ml/core/world/WorldGenHandler.java index 7567eed..d9556ea 100644 --- a/src/minecraft/ml/core/world/WorldGenHandler.java +++ b/src/minecraft/ml/core/world/WorldGenHandler.java @@ -162,7 +162,7 @@ public boolean equals(Object obj) { } //Credit to ProjectRed for most of this bit. - private static class RetroDataBase extends WorldSavedData { + public static class RetroDataBase extends WorldSavedData { private HashMap chunks = new HashMap(); From 557f5743b66585bc933fffdf83357bc04a7feeaa Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Fri, 27 Jun 2014 14:14:23 -0600 Subject: [PATCH 05/21] Added getSubItems method to ItemDelegating. Fixec CME bug with retorgen. --- src/minecraft/ml/core/item/ItemDelegator.java | 9 ++++ .../ml/core/world/WorldGenHandler.java | 54 +++++++++++-------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/src/minecraft/ml/core/item/ItemDelegator.java b/src/minecraft/ml/core/item/ItemDelegator.java index 967c13f..6f695ac 100644 --- a/src/minecraft/ml/core/item/ItemDelegator.java +++ b/src/minecraft/ml/core/item/ItemDelegator.java @@ -3,6 +3,7 @@ import java.util.List; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; @@ -66,6 +67,14 @@ public static DelegateItem findSubItem(ItemStack is) { /* ---------------------------- ItemMethods ---------------------------- */ + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) { + for (DCls sub : subItems.values()) { + par3List.add(new ItemStack(this, 1, sub.getMetaId())); + } + } + @Override public String getUnlocalizedName(ItemStack par1ItemStack) { return "item."+subItem(par1ItemStack).getUnlocalizedName(par1ItemStack); diff --git a/src/minecraft/ml/core/world/WorldGenHandler.java b/src/minecraft/ml/core/world/WorldGenHandler.java index d9556ea..32086e1 100644 --- a/src/minecraft/ml/core/world/WorldGenHandler.java +++ b/src/minecraft/ml/core/world/WorldGenHandler.java @@ -1,9 +1,11 @@ package ml.core.world; +import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Random; import ml.core.internal.CoreLogger; @@ -53,8 +55,10 @@ public void handleChunkLoad(ChunkEvent.Load evt) { for (IFeatureGenerator feat : genFeatures.get(modId)) { if (feat.allowRetroGen(w, x, z) && feat.canGenerateInWorld(w) && rdb.shouldPerformRetroJob(x, z, feat.getGenIdentifier(), feat.getFeatureVersion())) { RetroQueueItem rqi = new RetroQueueItem(x, z, w, feat, rdb.getLastFeatureVesrion(x, z, feat.getGenIdentifier()), rdb); - CoreLogger.info("Chunk @ ("+x+","+z+",DIM"+w.provider.dimensionId+") has been marked for retroactive feature generation for ("+modId+":"+feat.getGenIdentifier()+")"); - genQueue.put(dimid, rqi); + synchronized(this) { + CoreLogger.info("Chunk @ ("+x+","+z+",DIM"+w.provider.dimensionId+") has been marked for retroactive feature generation for ("+modId+":"+feat.getGenIdentifier()+")"); + genQueue.put(dimid, rqi); + } } } } @@ -96,30 +100,34 @@ public void tickEnd(EnumSet type, Object... tickData) { World world = (World)tickData[0]; int dimid = world.provider.dimensionId; - if (genQueue.get(dimid).size() > 0) { - Iterator iter = genQueue.get(dimid).iterator(); - - int count=0; - while (iter.hasNext()) { - RetroQueueItem rqi = iter.next(); - iter.remove(); - - long worldSeed = world.getSeed(); - Random rand = new Random(worldSeed); - long xSeed = rand.nextLong() >> 2 + 1L; - long zSeed = rand.nextLong() >> 2 + 1L; - long chunkSeed = (xSeed * rqi.chunkX + zSeed * rqi.chunkZ) ^ worldSeed; - rand.setSeed(chunkSeed); + synchronized (this) { + if (genQueue.get(dimid).size() > 0) { + List subQ = new ArrayList(genQueue.removeAll(dimid)); + Iterator iter = subQ.iterator(); - rqi.feature.doPopulate(rand, rqi.chunkX, rqi.chunkZ, world, true, rqi.lastVer); - rqi.rdb.markRetroJobDone(rqi.chunkX, rqi.chunkZ, rqi.feature.getGenIdentifier(), rqi.feature.getFeatureVersion()); + int count=0; + while (iter.hasNext()) { + RetroQueueItem rqi = iter.next(); + iter.remove(); + + long worldSeed = world.getSeed(); + Random rand = new Random(worldSeed); + long xSeed = rand.nextLong() >> 2 + 1L; + long zSeed = rand.nextLong() >> 2 + 1L; + long chunkSeed = (xSeed * rqi.chunkX + zSeed * rqi.chunkZ) ^ worldSeed; + rand.setSeed(chunkSeed); + + rqi.feature.doPopulate(rand, rqi.chunkX, rqi.chunkZ, world, true, rqi.lastVer); + rqi.rdb.markRetroJobDone(rqi.chunkX, rqi.chunkZ, rqi.feature.getGenIdentifier(), rqi.feature.getFeatureVersion()); + + count++; + if (count > 32) + break; + } - count++; - if (count > 32) - break; + genQueue.putAll(dimid, subQ); + CoreLogger.info(count+" chunks have been retro-generated. "+genQueue.get(dimid).size()+" more left."); } - - CoreLogger.info(count+" chunks have been retro-generated. "+genQueue.get(dimid).size()+" more left."); } } From 6ea6d0a57c8c8d7074ce540d925a8f18614eb48c Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sat, 28 Jun 2014 00:44:12 -0600 Subject: [PATCH 06/21] Updated the license, updated a couple parameter names. --- README.md | 8 ++------ src/minecraft/ml/core/block/DelegateBlock.java | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2896b2b..69f8918 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,5 @@ MLCore A 'Library' of commonly used functions and class for my mods. ##License## -* You may use my code to learn. -* You may distribute MLCore in any mod packs without my permission; however, I would like to be notified.. -* You may also create derivatives for _private_ (includes server modpacks) use. -* You may not publish derivatives of MLCore without my permission. PRs are preferred. -* You may use MLCore in your mod as long as you notify me and give me credit. -* You may link _directly_ to the download of MLCore if your mod requires it. +Released under the Creative Commons `BY-NC-SA` License. +Available at http://creativecommons.org/licenses/by-nc-sa/4.0/ diff --git a/src/minecraft/ml/core/block/DelegateBlock.java b/src/minecraft/ml/core/block/DelegateBlock.java index bbea4fb..bf0dd31 100644 --- a/src/minecraft/ml/core/block/DelegateBlock.java +++ b/src/minecraft/ml/core/block/DelegateBlock.java @@ -155,7 +155,7 @@ public void onNeighborBlockChange(World par1World, int x, int y, int z, int par5 public void onBlockClicked(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) {} - public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { + public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitx, float hity, float hitz) { return false; } From 814f477f645fd91f39c8e6a9877cdade361ae286 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sat, 28 Jun 2014 19:30:48 -0600 Subject: [PATCH 07/21] Added a meta range to DelegateBlocks. --- src/minecraft/ml/core/block/BlockDelegator.java | 17 +++++++++++------ src/minecraft/ml/core/block/DelegateBlock.java | 14 +++++++++++++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/minecraft/ml/core/block/BlockDelegator.java b/src/minecraft/ml/core/block/BlockDelegator.java index 3f87828..9a260f3 100644 --- a/src/minecraft/ml/core/block/BlockDelegator.java +++ b/src/minecraft/ml/core/block/BlockDelegator.java @@ -2,7 +2,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map.Entry; import java.util.Random; +import java.util.TreeMap; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -24,9 +26,6 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.IPlantable; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - /** * Partially inspired by OpenComputers. * @@ -34,7 +33,9 @@ */ public class BlockDelegator extends Block { - private BiMap subBlocks = HashBiMap.create(); + private TreeMap subBlocks = new TreeMap(); + + //private BiMap subBlocks = HashBiMap.create(); protected DCls nullDelegate; @@ -47,7 +48,7 @@ public BlockDelegator(int blockId, Material xMaterial, DCls nullDelegate) { /* ---------------------------- SubBlocks ---------------------------- */ public boolean addSubBlock(int metaData, DCls sub) { - if (subBlocks.containsKey(metaData) || subBlocks.containsValue(sub)) return false; + if (subBlock(metaData) != nullDelegate || subBlocks.containsValue(sub)) return false; subBlocks.put(metaData, sub); sub.parent = this; sub.metaId = metaData; @@ -56,6 +57,10 @@ public boolean addSubBlock(int metaData, DCls sub) { public DCls subBlock(int metaData) { if (subBlocks.containsKey(metaData)) return subBlocks.get(metaData); + Entry ent = subBlocks.floorEntry(metaData); + if (ent != null && (ent.getValue().getMetaId() == metaData || metaData < ent.getValue().getMetaId()+ent.getValue().getMetaLength())) { + return ent.getValue(); + } return nullDelegate; } @@ -117,7 +122,7 @@ public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) /* ---------------------------- WorldMethods ---------------------------- */ public void setBlockAt(DCls delegate, World world, int wx, int wy, int wz, int flags) { - world.setBlock(wx, wy, wz, blockID, delegate.metaId, flags); + delegate.setBlockAt(world, wx, wy, wz, flags); } /* ---------------------------- BlockMethods ---------------------------- */ diff --git a/src/minecraft/ml/core/block/DelegateBlock.java b/src/minecraft/ml/core/block/DelegateBlock.java index bf0dd31..555db1a 100644 --- a/src/minecraft/ml/core/block/DelegateBlock.java +++ b/src/minecraft/ml/core/block/DelegateBlock.java @@ -37,8 +37,20 @@ public int getMetaId() { return metaId; } + public int getMetaLength() { + return 1; + } + public void setBlockAt(World world, int wx, int wy, int wz, int flags) { - world.setBlock(wx, wy, wz, parent.blockID, metaId, flags); + this.setBlockAt(world, wx, wy, wz, 0, flags); + } + + public void setBlockAt(World world, int wx, int wy, int wz, int subMeta, int flags) { + if (subMeta < getMetaLength()) { + world.setBlock(wx, wy, wz, parent.blockID, metaId+subMeta, flags); + } else { + world.setBlock(wx, wy, wz, parent.blockID, metaId, flags); + } } /* ---------------------------- ItemMethods ---------------------------- */ From 3f86a7bd738ef1a2a94450cc38113305a40a9de1 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sat, 28 Jun 2014 23:49:47 -0600 Subject: [PATCH 08/21] SideOnly-ified Delagate stuff. Fixed inventory getIcon bug. --- src/minecraft/ml/core/block/BlockDelegator.java | 13 +++++++++++++ src/minecraft/ml/core/block/DelegateBlock.java | 13 +++++++++++++ src/minecraft/ml/core/item/DelegateItem.java | 10 +++++++++- src/minecraft/ml/core/item/ItemDelegator.java | 6 ++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/minecraft/ml/core/block/BlockDelegator.java b/src/minecraft/ml/core/block/BlockDelegator.java index 9a260f3..d730cc0 100644 --- a/src/minecraft/ml/core/block/BlockDelegator.java +++ b/src/minecraft/ml/core/block/BlockDelegator.java @@ -6,6 +6,9 @@ import java.util.Random; import java.util.TreeMap; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.particle.EffectRenderer; @@ -363,52 +366,62 @@ public float getBlockHardness(World world, int x, int y, int z) { /* ---------------------------- ClientSide ---------------------------- */ @Override + @SideOnly(Side.CLIENT) public float getBlockBrightness(IBlockAccess world, int x, int y, int z) { return subBlock(world, x, y, z).getBlockBrightness(world, x, y, z); } @Override + @SideOnly(Side.CLIENT) public int getMixedBrightnessForBlock(IBlockAccess world, int x, int y, int z) { return subBlock(world, x, y, z).getMixedBrightnessForBlock(world, x, y, z); } @Override + @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int par5) { Boolean renderSide = subBlock(world, x, y, z).shouldSideBeRendered(world, x, y, z, par5); return renderSide != null ? renderSide : super.shouldSideBeRendered(world, x, y, z, par5); } @Override + @SideOnly(Side.CLIENT) public Icon getIcon(int side, int meta) { return subBlock(meta).getIcon(side, meta); } @Override + @SideOnly(Side.CLIENT) public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int par5) { return subBlock(world, x, y, z).getBlockTexture(world, x, y, z, par5); } @Override + @SideOnly(Side.CLIENT) public int getRenderColor(int meta) { return subBlock(meta).getRenderColor(meta); } @Override + @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) { for (DCls sub : subBlocks.values()) sub.registerIcons(par1IconRegister); } @Override + @SideOnly(Side.CLIENT) public boolean addBlockDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { return subBlock(world, x, y, z).addBlockDestroyEffects(world, x, y, z, meta, effectRenderer); } @Override + @SideOnly(Side.CLIENT) public boolean addBlockHitEffects(World world, MovingObjectPosition target, EffectRenderer effectRenderer) { return subBlock(world, target.blockX, target.blockY, target.blockZ).addBlockHitEffects(world, target, effectRenderer); } @Override + @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random par5Random) { for (DCls sub : subBlocks.values()) sub.randomDisplayTick(world, x, y, z, par5Random); } diff --git a/src/minecraft/ml/core/block/DelegateBlock.java b/src/minecraft/ml/core/block/DelegateBlock.java index 555db1a..f5fd90b 100644 --- a/src/minecraft/ml/core/block/DelegateBlock.java +++ b/src/minecraft/ml/core/block/DelegateBlock.java @@ -4,6 +4,9 @@ import java.util.List; import java.util.Random; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + import net.minecraft.block.ITileEntityProvider; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.renderer.texture.IconRegister; @@ -235,38 +238,48 @@ public float getBlockHardness(World par1World, int x, int y, int z) { /* ---------------------------- ClientSide ---------------------------- */ + @SideOnly(Side.CLIENT) public float getBlockBrightness(IBlockAccess world, int x, int y, int z) { return world.getBrightness(x, y, z, getLightValue(world, x, y, z)); } + @SideOnly(Side.CLIENT) public int getMixedBrightnessForBlock(IBlockAccess world, int x, int y, int z) { return world.getLightBrightnessForSkyBlocks(x, y, z, getLightValue(world, x, y, z)); } + @SideOnly(Side.CLIENT) public Boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { return null; } + @SideOnly(Side.CLIENT) public Icon getIcon(int side, int meta) {return null;} + @SideOnly(Side.CLIENT) public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int side) { return this.getIcon(side, world.getBlockMetadata(x, y, z)); } + @SideOnly(Side.CLIENT) public int getRenderColor(int meta) { return 16777215; } + @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) {}; + @SideOnly(Side.CLIENT) public boolean addBlockDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { return false; } + @SideOnly(Side.CLIENT) public boolean addBlockHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer) { return false; } + @SideOnly(Side.CLIENT) public void randomDisplayTick(World par1World, int x, int y, int z, Random par5Random) {} } diff --git a/src/minecraft/ml/core/item/DelegateItem.java b/src/minecraft/ml/core/item/DelegateItem.java index 1aba7a6..53f4625 100644 --- a/src/minecraft/ml/core/item/DelegateItem.java +++ b/src/minecraft/ml/core/item/DelegateItem.java @@ -104,14 +104,22 @@ public int getColorFromItemStack(ItemStack stack, int par2) { return 16777215; } - public Icon getIcon(ItemStack stack, int pass) { + @SideOnly(Side.CLIENT) + public Icon getIcon(int meta) { return itemIcon; } + @SideOnly(Side.CLIENT) + public Icon getIcon(ItemStack stack, int pass) { + return getIcon(stack.getItemDamage()); + } + + @SideOnly(Side.CLIENT) public Icon getIconInHand(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { return getIcon(stack, renderPass); } + @SideOnly(Side.CLIENT) public void registerIcons(IconRegister ireg) { this.itemIcon = ireg.registerIcon(iconLocation); } diff --git a/src/minecraft/ml/core/item/ItemDelegator.java b/src/minecraft/ml/core/item/ItemDelegator.java index 6f695ac..043bcdb 100644 --- a/src/minecraft/ml/core/item/ItemDelegator.java +++ b/src/minecraft/ml/core/item/ItemDelegator.java @@ -144,6 +144,12 @@ public int getColorFromItemStack(ItemStack par1ItemStack, int par2) { return subItem(par1ItemStack).getColorFromItemStack(par1ItemStack, par2); } + @Override + @SideOnly(Side.CLIENT) + public Icon getIconFromDamage(int par1) { + return subItem(par1).getIcon(par1); + } + @Override @SideOnly(Side.CLIENT) public Icon getIcon(ItemStack stack, int pass) { From 9171d81f0453cbaab0cba240b4f40f817077f352 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sun, 29 Jun 2014 21:21:15 -0600 Subject: [PATCH 09/21] Minore fixes and improvements to Guis. Fixed a bug with Delegate items on servers. --- .../ml/core/gui/core/GuiElement.java | 20 ++++++++++++------- .../ml/core/gui/core/MLGuiClient.java | 4 ++++ .../ml/core/gui/core/TopParentGuiElement.java | 2 +- .../ml/core/gui/core/style/GuiStyleManip.java | 2 +- src/minecraft/ml/core/item/DelegateItem.java | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/minecraft/ml/core/gui/core/GuiElement.java b/src/minecraft/ml/core/gui/core/GuiElement.java index b32f2bd..8ca7115 100644 --- a/src/minecraft/ml/core/gui/core/GuiElement.java +++ b/src/minecraft/ml/core/gui/core/GuiElement.java @@ -9,6 +9,7 @@ import ml.core.gui.event.GuiEvent; import ml.core.vec.Rectangle; import ml.core.vec.Vector2i; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.util.ResourceLocation; @@ -280,8 +281,8 @@ public void drawBackground() {} /** * Your matrix will be localized to the parent element, so you need to shift by your local position. */ - //@SideOnly(Side.CLIENT) - //public void drawForeground() {} + @SideOnly(Side.CLIENT) + public void drawForeground() {} /** * Your matrix will be localized to the parent element, so you need to shift by your local position. @@ -300,10 +301,10 @@ public void drawElement(RenderStage stage) { switch (stage) { case Background: drawBackground(); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + drawForeground(); break; - //case Foreground: - //drawForeground(); - //break; case Overlay: drawOverlay(); break; @@ -360,7 +361,8 @@ public void setStyle(GuiStyle stl) { @SideOnly(Side.CLIENT) public void setCustomResource(String feat, String npath) { if (!(this.style instanceof GuiStyleManip)) - this.style = new GuiStyleManip(style); + this.style = new GuiStyleManip(getStyle()); + ((GuiStyleManip)style).addResourceOverride(feat, npath); } @@ -381,10 +383,14 @@ public MLGuiClient getGui() { return getParent().getGui(); } + @SideOnly(Side.CLIENT) + public Minecraft getMC() { + return getGui().getMinecraft(); + } + @SideOnly(Side.CLIENT) public static enum RenderStage { Background, - //Foreground, Overlay, SlotInventory; } diff --git a/src/minecraft/ml/core/gui/core/MLGuiClient.java b/src/minecraft/ml/core/gui/core/MLGuiClient.java index d3e6a7c..7063ac8 100644 --- a/src/minecraft/ml/core/gui/core/MLGuiClient.java +++ b/src/minecraft/ml/core/gui/core/MLGuiClient.java @@ -22,7 +22,11 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + // All this could be a lot cleaner, but that is the cost of trying to maintain universal compatibility with things such as NEI +@SideOnly(Side.CLIENT) public class MLGuiClient extends GuiContainer { protected TopParentGuiElement priElemement; diff --git a/src/minecraft/ml/core/gui/core/TopParentGuiElement.java b/src/minecraft/ml/core/gui/core/TopParentGuiElement.java index 2f5168a..af8b589 100644 --- a/src/minecraft/ml/core/gui/core/TopParentGuiElement.java +++ b/src/minecraft/ml/core/gui/core/TopParentGuiElement.java @@ -10,7 +10,7 @@ import cpw.mods.fml.relauncher.SideOnly; /** - * TopParentGuiObjects house all other GuiObjects in a Gui + * TopParentGuiObjects house all other GuiObjects in a Gui.
* May also be a child element * @author Matchlighter */ diff --git a/src/minecraft/ml/core/gui/core/style/GuiStyleManip.java b/src/minecraft/ml/core/gui/core/style/GuiStyleManip.java index b43232f..8da2ad5 100644 --- a/src/minecraft/ml/core/gui/core/style/GuiStyleManip.java +++ b/src/minecraft/ml/core/gui/core/style/GuiStyleManip.java @@ -42,7 +42,7 @@ public void addColorOverride(String ident, String color) { @Override protected ResourceLocation findResource(String feat) { if (resOverrides.containsKey(feat)) - return new ResourceLocation(resOverrides.get(feat)); + return new ResourceLocation(resOverrides.get(feat)+".png"); return parentStyle.findResource(feat); } diff --git a/src/minecraft/ml/core/item/DelegateItem.java b/src/minecraft/ml/core/item/DelegateItem.java index 53f4625..a6f7372 100644 --- a/src/minecraft/ml/core/item/DelegateItem.java +++ b/src/minecraft/ml/core/item/DelegateItem.java @@ -22,7 +22,7 @@ public class DelegateItem { protected String unlocalizedName; @SideOnly(Side.CLIENT) - protected Icon itemIcon = null; + protected Icon itemIcon; protected String iconLocation; public DelegateItem() {} From 2be425a33ea28bce35e00c1e73c1a996e60b2035 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sun, 29 Jun 2014 21:30:40 -0600 Subject: [PATCH 10/21] Bump version --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index 86b3e6d..702a334 100644 --- a/build.properties +++ b/build.properties @@ -1,2 +1,2 @@ -MLCore.version=0.8.1 +MLCore.version=0.8.2 minecraft.version = 1.6.4 \ No newline at end of file From 88a1ef148a9df6663d64119719bdfcd7bee6da33 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sun, 29 Jun 2014 22:26:41 -0600 Subject: [PATCH 11/21] Removed an old enum. Added a couple constructors to ControlSlot. Implemented an in-gui inventory that drops its items when the gui is closed. --- .../inventory/ControlMultiSlotBase.java | 2 +- .../gui/controls/inventory/ControlSlot.java | 8 ++ .../controls/inventory/ControlSlotGrid.java | 1 + .../ml/core/gui/core/DummyInventory.java | 115 ++++++++++++++++++ .../ml/core/gui/core/TopParentGuiElement.java | 16 +++ src/minecraft/ml/core/gui/core/Window.java | 6 - 6 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 src/minecraft/ml/core/gui/core/DummyInventory.java diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlMultiSlotBase.java b/src/minecraft/ml/core/gui/controls/inventory/ControlMultiSlotBase.java index d533108..0dfa6b6 100644 --- a/src/minecraft/ml/core/gui/controls/inventory/ControlMultiSlotBase.java +++ b/src/minecraft/ml/core/gui/controls/inventory/ControlMultiSlotBase.java @@ -28,7 +28,7 @@ public void addSlot(Slot slot) { * Override this to create non-standard ControlSlots. */ protected ControlSlot makeControlSlot(Slot slot) { - return new ControlSlot(this, slot, new Vector2i(slot.xDisplayPosition, slot.yDisplayPosition), new Vector2i(18,18)); + return new ControlSlot(this, slot); } public List getMergeTargets(ItemStack is) { diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java b/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java index 592fdf1..21c219c 100644 --- a/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java +++ b/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java @@ -30,7 +30,15 @@ public ControlSlot(GuiElement par, Slot slt, Vector2i pos, Vector2i size) { ((MLSlot)slot).controlSlot = this; getTopParent().getContainer().addSlotToContainer(slt); } + + public ControlSlot(GuiElement par, Slot slt, Vector2i size) { + this(par, slt, new Vector2i(slt.xDisplayPosition, slt.yDisplayPosition), size); + } + public ControlSlot(GuiElement par, Slot slt) { + this(par, slt, new Vector2i(slt.xDisplayPosition, slt.yDisplayPosition), new Vector2i(18, 18)); + } + @Override public void drawBackground() { GL11.glScalef((float)getSize().x/18F, (float)getSize().y/18F, 1F); diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlSlotGrid.java b/src/minecraft/ml/core/gui/controls/inventory/ControlSlotGrid.java index cdc7089..96740d4 100644 --- a/src/minecraft/ml/core/gui/controls/inventory/ControlSlotGrid.java +++ b/src/minecraft/ml/core/gui/controls/inventory/ControlSlotGrid.java @@ -49,6 +49,7 @@ protected Vector2i positionSlot(int idx) { return new Vector2i((idx%rowLength)*18, idx/rowLength*18); } + @Override protected ControlSlot makeControlSlot(Slot slot) { return new ControlSlot(this, slot, positionSlot(slots.size()), new Vector2i(18,18)); } diff --git a/src/minecraft/ml/core/gui/core/DummyInventory.java b/src/minecraft/ml/core/gui/core/DummyInventory.java new file mode 100644 index 0000000..b7ee504 --- /dev/null +++ b/src/minecraft/ml/core/gui/core/DummyInventory.java @@ -0,0 +1,115 @@ +package ml.core.gui.core; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class DummyInventory implements IInventory { + + protected ItemStack[] stacks; + private int nextId = 0; + + public DummyInventory(int size) { + stacks = new ItemStack[size]; + } + + /** + * DO NOT call this dynamically with variables. The server and client must be in sync. + * @return The next slot that hasn't been reserved in this inventory. + */ + public int getNextSlot() { + return nextId++; + } + + @Override + public int getSizeInventory() { + return stacks.length; + } + + @Override + public ItemStack getStackInSlot(int i) { + return stacks[i]; + } + + @Override + public ItemStack decrStackSize(int i, int j) { + if (this.stacks[i] != null) { + ItemStack itemstack; + + if (this.stacks[i].stackSize <= j) { + itemstack = this.stacks[i]; + this.stacks[i] = null; + return itemstack; + } else { + itemstack = this.stacks[i].splitStack(j); + + if (this.stacks[i].stackSize == 0) { + this.stacks[i] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) { + if (this.stacks[i] != null) { + ItemStack itemstack = this.stacks[i]; + this.stacks[i] = null; + return itemstack; + } else { + return null; + } + } + + public void dumpItems(EntityPlayer epl) { + for (ItemStack is : stacks) { + if (is != null) { + epl.dropPlayerItem(is); + } + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) { + stacks[i] = itemstack; + } + + @Override + public String getInvName() { + return "Gui"; + } + + @Override + public boolean isInvNameLocalized() { + return true; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void onInventoryChanged() {} + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + return true; + } + + @Override + public void openChest() {} + + @Override + public void closeChest() {} + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + return true; + } + +} diff --git a/src/minecraft/ml/core/gui/core/TopParentGuiElement.java b/src/minecraft/ml/core/gui/core/TopParentGuiElement.java index af8b589..541f58d 100644 --- a/src/minecraft/ml/core/gui/core/TopParentGuiElement.java +++ b/src/minecraft/ml/core/gui/core/TopParentGuiElement.java @@ -1,6 +1,8 @@ package ml.core.gui.core; import ml.core.gui.core.style.GuiStyle; +import ml.core.gui.event.EventGuiClosing; +import ml.core.gui.event.GuiEvent; import ml.core.vec.Vector2i; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -29,6 +31,11 @@ public abstract class TopParentGuiElement extends GuiElement { public GuiElement hoverElement; public GuiElement focusedElement; + + /** + * This inventory belongs to the gui. Any items will be dropped when it is closed. By default it can store 64 stacks. + */ + public DummyInventory guiInventory = new DummyInventory(64); public TopParentGuiElement(EntityPlayer epl, Side side) { super(null); @@ -93,6 +100,15 @@ public void sendPacket(NBTTagCompound payload) { } } + @Override + public void handleEvent(GuiEvent evt) { + if (evt instanceof EventGuiClosing && side == Side.SERVER) { + guiInventory.dumpItems(player); + } + + super.handleEvent(evt); + } + public abstract ItemStack transferStackFromSlot(EntityPlayer epl, Slot slot); public abstract void initControls(); diff --git a/src/minecraft/ml/core/gui/core/Window.java b/src/minecraft/ml/core/gui/core/Window.java index 4bd4011..73387d0 100644 --- a/src/minecraft/ml/core/gui/core/Window.java +++ b/src/minecraft/ml/core/gui/core/Window.java @@ -27,10 +27,4 @@ public void close() { this.player.closeScreen(); } - public static enum WindowSide { - Top, - Right, - Bottom, - Left; - } } From 9bb63800a82d4fbe416ef2416f78c43001243a5d Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sun, 29 Jun 2014 23:02:30 -0600 Subject: [PATCH 12/21] Added partialTicks to gui rendering. Made animation on GuiTabs/Ledgers much better. --- .../core/gui/controls/ControlTextInput.java | 2 +- .../ml/core/gui/controls/GuiControl.java | 21 ++++++++------- .../gui/controls/button/ControlButton.java | 2 +- .../gui/controls/inventory/ControlSlot.java | 4 +-- .../gui/controls/tabs/ControlTabManager.java | 27 +++++++++++-------- .../ml/core/gui/controls/tabs/TabLedger.java | 14 ++++++++-- .../ml/core/gui/core/GuiElement.java | 26 ++++++++++-------- .../ml/core/gui/core/MLGuiClient.java | 10 +++---- src/minecraft/ml/core/gui/core/Window.java | 4 +-- 9 files changed, 65 insertions(+), 45 deletions(-) diff --git a/src/minecraft/ml/core/gui/controls/ControlTextInput.java b/src/minecraft/ml/core/gui/controls/ControlTextInput.java index c5304e7..9566615 100644 --- a/src/minecraft/ml/core/gui/controls/ControlTextInput.java +++ b/src/minecraft/ml/core/gui/controls/ControlTextInput.java @@ -29,7 +29,7 @@ public ControlTextInput(GuiElement parent, Vector2i pos, Vector2i size) { } @Override - public void drawBackground() { + public void drawBackground(float partialTick) { //GL11.glTranslatef(getPosition().x, getPosition().y, 0); //TODO Render TB background textBox.drawTextBox(); diff --git a/src/minecraft/ml/core/gui/controls/GuiControl.java b/src/minecraft/ml/core/gui/controls/GuiControl.java index b4ef21f..a46f9c2 100644 --- a/src/minecraft/ml/core/gui/controls/GuiControl.java +++ b/src/minecraft/ml/core/gui/controls/GuiControl.java @@ -22,13 +22,13 @@ public GuiControl(GuiElement parent, Vector2i position, Vector2i size) { * When inheriting through GuiControl, the matrix will already be localized to your control's position */ @SideOnly(Side.CLIENT) - public void drawBackground() {} + public void drawBackground(float partialTick) {} /** * When inheriting through GuiControl, the matrix will already be localized to your control's position */ @SideOnly(Side.CLIENT) - public void drawOverlay() {} + public void drawOverlay(float partialTick) {} /** * Always make a super call or a call to drawChilds() as your last call. It will render children.
@@ -36,21 +36,22 @@ public void drawOverlay() {} * You can also just override draw[Background|Overlay]() instead */ @SideOnly(Side.CLIENT) - public void drawElement(RenderStage stage) { - GL11.glPushMatrix(); + public void drawElement(RenderStage stage, float partialTick) { GL11.glTranslatef(getLocalPosition().x, getLocalPosition().y, 0); + GL11.glPushMatrix(); switch (stage) { case Background: - drawBackground(); + drawBackground(partialTick); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + drawForeground(partialTick); break; - //case Foreground: - //drawForeground(); - //break; case Overlay: - drawOverlay(); + drawOverlay(partialTick); break; } GL11.glPopMatrix(); - drawChilds(stage); + GL11.glTranslatef(-getLocalPosition().x, -getLocalPosition().y, 0); + drawChilds(stage, partialTick); } } diff --git a/src/minecraft/ml/core/gui/controls/button/ControlButton.java b/src/minecraft/ml/core/gui/controls/button/ControlButton.java index 802e2d0..af6521b 100644 --- a/src/minecraft/ml/core/gui/controls/button/ControlButton.java +++ b/src/minecraft/ml/core/gui/controls/button/ControlButton.java @@ -19,7 +19,7 @@ public ControlButton(GuiElement par, Vector2i pos, Vector2i size, String t) { } @Override - public void drawBackground() { + public void drawBackground(float partialTick) { bindStyleTexture("button"); int p = enabled ? (hasHover() ? 40 : 20) : 0; GuiRenderUtils.drawSlicedRect(0, 0, getSize().x, getSize().y, 0, p, 200, 20, 2, 2, 2, 2, 200, 80); diff --git a/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java b/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java index 21c219c..08ff567 100644 --- a/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java +++ b/src/minecraft/ml/core/gui/controls/inventory/ControlSlot.java @@ -40,7 +40,7 @@ public ControlSlot(GuiElement par, Slot slt) { } @Override - public void drawBackground() { + public void drawBackground(float partialTick) { GL11.glScalef((float)getSize().x/18F, (float)getSize().y/18F, 1F); if (renderBackground) { @@ -61,7 +61,7 @@ public void drawBackground() { GuiRenderUtils.drawGradientRect(1, 1, 1 + 16, 1 + 16, hoverColor, hoverColor); } - super.drawBackground(); + super.drawBackground(partialTick); } @Override diff --git a/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java b/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java index 6de26b0..105b6f8 100644 --- a/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java +++ b/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java @@ -27,7 +27,7 @@ public abstract static class GuiTab extends GuiElement { public ControlTabManager TabManager; public static final int defaultSize = 24; - public int sizingSpeed = 8; + public int sizingSpeed = 32; public GuiTab(ControlTabManager ctm) { super(ctm); @@ -42,6 +42,7 @@ public void guiTick() { super.guiTick(); Vector2i trg = getTargetSize(); + lastSize = new Vector2i(getSize()); getSize().x = Math.abs(getSize().x-trg.x) < sizingSpeed ? trg.x : getSize().x + (getSize().x > trg.x ? -sizingSpeed : sizingSpeed); getSize().y = Math.abs(getSize().y-trg.y) < sizingSpeed ? trg.y : getSize().y + (getSize().y > trg.y ? -sizingSpeed : sizingSpeed); } @@ -56,8 +57,9 @@ public Vector2i getLocalPosition() { return new Vector2i(tb.xCoord, tb.yCoord); } + private Vector2i lastSize = new Vector2i(); @Override - public void drawBackground() { + public void drawBackground(float partialTick) { getLocalPosition().glTranslate(); float red = ((tabColor >> 16) & 0xFF) /255F; float green = ((tabColor >> 8) & 0xFF) /255F; @@ -65,23 +67,26 @@ public void drawBackground() { GL11.glColor4f(red, green, blue, 1.0F); bindTexture(getStyle().getResource("ledger")); - + + int sizeX = lastSize.x + (int)((getSize().x - lastSize.x) * partialTick); + int sizeY = lastSize.y + (int)((getSize().y - lastSize.y) * partialTick); + switch (TabManager.side){ case Left: - GuiRenderUtils.drawTexturedModalRect(0, 0, 0, 0, this.getSize().x, this.getSize().y-4); - GuiRenderUtils.drawTexturedModalRect(0, 4, 0, 256-this.getSize().y+4, this.getSize().x, this.getSize().y-4); + GuiRenderUtils.drawTexturedModalRect(0, 0, 0, 0, sizeX, sizeY-4); + GuiRenderUtils.drawTexturedModalRect(0, 4, 0, 256-sizeY+4, sizeX, sizeY-4); break; case Right: - GuiRenderUtils.drawTexturedModalRect(0, 0, 256-this.getSize().x, 0, this.getSize().x, this.getSize().y-4); - GuiRenderUtils.drawTexturedModalRect(0, 4, 256-this.getSize().x, 256-this.getSize().y+4, this.getSize().x, this.getSize().y-4); + GuiRenderUtils.drawTexturedModalRect(0, 0, 256-sizeX, 0, sizeX, sizeY-4); + GuiRenderUtils.drawTexturedModalRect(0, 4, 256-sizeX, 256-sizeY+4, sizeX, sizeY-4); break; case Top: - GuiRenderUtils.drawTexturedModalRect(0, 0, 0, 0, this.getSize().x-4, this.getSize().y); - GuiRenderUtils.drawTexturedModalRect(4, 0, 256-this.getSize().x+4, 0, this.getSize().x-4, this.getSize().y); + GuiRenderUtils.drawTexturedModalRect(0, 0, 0, 0, sizeX-4, sizeY); + GuiRenderUtils.drawTexturedModalRect(4, 0, 256-sizeX+4, 0, sizeX-4, sizeY); break; case Bottom: - GuiRenderUtils.drawTexturedModalRect(0, 0, 0, 256-this.getSize().y, this.getSize().x-4, this.getSize().y); - GuiRenderUtils.drawTexturedModalRect(4, 0, 256-this.getSize().x+4, 256-this.getSize().y, this.getSize().x-4, this.getSize().y); + GuiRenderUtils.drawTexturedModalRect(0, 0, 0, 256-sizeY, sizeX-4, sizeY); + GuiRenderUtils.drawTexturedModalRect(4, 0, 256-sizeX+4, 256-sizeY, sizeX-4, sizeY); break; } GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); diff --git a/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java b/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java index e427b7b..08df34f 100644 --- a/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java +++ b/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java @@ -2,6 +2,7 @@ import ml.core.enums.MouseButton; import ml.core.gui.controls.tabs.ControlTabManager.GuiTab; +import ml.core.gui.core.GuiElement; import ml.core.gui.event.GuiEvent; import ml.core.gui.event.mouse.EventMouseDown; import ml.core.vec.Vector2i; @@ -15,8 +16,6 @@ public abstract class TabLedger extends GuiTab { public Vector2i openSize; public Vector2i closeSize; - public int sizingSpeed = 8; - public TabLedger(ControlTabManager ctm, Vector2i oSize) { super(ctm); @@ -43,6 +42,17 @@ public void closeLedger() { openState = false; } + @Override + protected void drawChilds(RenderStage stage, float partialTick) { + if (openState) super.drawChilds(stage, partialTick); + } + + @Override + public GuiElement findElementAtLocal(Vector2i pos) { + if (!openState) return this; + return super.findElementAtLocal(pos); + } + @Override public void handleEvent(GuiEvent evt) { if (evt.origin==this && evt instanceof EventMouseDown && ((EventMouseDown)evt).button==MouseButton.Left) { diff --git a/src/minecraft/ml/core/gui/core/GuiElement.java b/src/minecraft/ml/core/gui/core/GuiElement.java index 8ca7115..3b31b90 100644 --- a/src/minecraft/ml/core/gui/core/GuiElement.java +++ b/src/minecraft/ml/core/gui/core/GuiElement.java @@ -274,52 +274,56 @@ protected void bindTexture(ResourceLocation res) { /** * Your matrix will be localized to the parent element, so you need to shift by your local position. + * @param partialTick TODO */ @SideOnly(Side.CLIENT) - public void drawBackground() {} + public void drawBackground(float partialTick) {} /** * Your matrix will be localized to the parent element, so you need to shift by your local position. + * @param partialTick TODO */ @SideOnly(Side.CLIENT) - public void drawForeground() {} + public void drawForeground(float partialTick) {} /** * Your matrix will be localized to the parent element, so you need to shift by your local position. + * @param partialTick TODO */ @SideOnly(Side.CLIENT) - public void drawOverlay() {} + public void drawOverlay(float partialTick) {} /** * Always make a super call or a call to drawChilds() as your last call. It will render children.
* Your matrix will be localized to the parent element, so you need to shift by your local position.
* You can also just override draw[Background|Overlay]() instead + * @param partialTick TODO */ @SideOnly(Side.CLIENT) - public void drawElement(RenderStage stage) { + public void drawElement(RenderStage stage, float partialTick) { GL11.glPushMatrix(); switch (stage) { case Background: - drawBackground(); + drawBackground(partialTick); GL11.glPopMatrix(); GL11.glPushMatrix(); - drawForeground(); + drawForeground(partialTick); break; case Overlay: - drawOverlay(); + drawOverlay(partialTick); break; } GL11.glPopMatrix(); - drawChilds(stage); + drawChilds(stage, partialTick); } /** * Called to draw children of the element. Automatically called if you don't - * override {@link #drawElement(RenderStage)} or if you include a super call in your overriding method + * override {@link #drawElement(RenderStage, float)} or if you include a super call in your overriding method * @param stage */ @SideOnly(Side.CLIENT) - protected void drawChilds(RenderStage stage) { + protected void drawChilds(RenderStage stage, float partialTick) { Vector2i pos = getLocalPosition(); GL11.glPushMatrix(); GL11.glTranslatef(pos.x, pos.y, 0.0F); @@ -327,7 +331,7 @@ protected void drawChilds(RenderStage stage) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_LIGHTING); - el.drawElement(stage); + el.drawElement(stage, partialTick); } GL11.glPopMatrix(); } diff --git a/src/minecraft/ml/core/gui/core/MLGuiClient.java b/src/minecraft/ml/core/gui/core/MLGuiClient.java index 7063ac8..0a4c66f 100644 --- a/src/minecraft/ml/core/gui/core/MLGuiClient.java +++ b/src/minecraft/ml/core/gui/core/MLGuiClient.java @@ -56,7 +56,7 @@ public void drawScreen(int mX, int mY, float par3) { } } super.drawScreen(mX, mY, par3); - matrixAndDraw(RenderStage.Overlay); + matrixAndDraw(RenderStage.Overlay, par3); } public void refreshSize() { @@ -82,21 +82,21 @@ public Slot getSlotAtPosition(int par1, int par2) { } /** - * Calls {@link TopParentGuiElement#drawElement(RenderStage)} wrapped in a new GL Matrix
+ * Calls {@link TopParentGuiElement#drawElement(RenderStage, float)} wrapped in a new GL Matrix
* Mostly just for DRY code * @param stage */ - private void matrixAndDraw(RenderStage stage) { + private void matrixAndDraw(RenderStage stage, float partialTick) { //GL11.glPushMatrix(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_LIGHTING); - priElemement.drawElement(stage); + priElemement.drawElement(stage, partialTick); //GL11.glPopMatrix(); } @Override protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { - matrixAndDraw(RenderStage.Background); + matrixAndDraw(RenderStage.Background, f); } @Override diff --git a/src/minecraft/ml/core/gui/core/Window.java b/src/minecraft/ml/core/gui/core/Window.java index 73387d0..5d59904 100644 --- a/src/minecraft/ml/core/gui/core/Window.java +++ b/src/minecraft/ml/core/gui/core/Window.java @@ -12,10 +12,10 @@ public Window(EntityPlayer epl, Side side) { } @Override - public void drawBackground() { + public void drawBackground(float partialTick) { bindStyleTexture("window"); GuiRenderUtils.drawSlicedRect(this.getLocalPosition().x, this.getLocalPosition().y, this.getSize().x, this.getSize().y, 0, 0, 256, 256, 6); - super.drawBackground(); + super.drawBackground(partialTick); } @Override From 6069fefb6337d756e738eda49877d9b263d14bc7 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sun, 29 Jun 2014 23:09:43 -0600 Subject: [PATCH 13/21] Added basic visibility to GuiElements. --- .../ml/core/gui/controls/tabs/TabLedger.java | 22 ++++++++--- .../ml/core/gui/core/GuiElement.java | 37 ++++++++++++++++--- .../ml/core/nei/NEI_MLCore_Config.java | 2 +- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java b/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java index 08df34f..2f6020d 100644 --- a/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java +++ b/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java @@ -1,5 +1,6 @@ package ml.core.gui.controls.tabs; +import net.minecraft.client.gui.FontRenderer; import ml.core.enums.MouseButton; import ml.core.gui.controls.tabs.ControlTabManager.GuiTab; import ml.core.gui.core.GuiElement; @@ -13,6 +14,7 @@ public abstract class TabLedger extends GuiTab { protected boolean openState = false; + public String title; public Vector2i openSize; public Vector2i closeSize; @@ -41,16 +43,24 @@ public void openLedger() { public void closeLedger() { openState = false; } - + @Override - protected void drawChilds(RenderStage stage, float partialTick) { - if (openState) super.drawChilds(stage, partialTick); + public void drawForeground(float partialTick) { + super.drawForeground(partialTick); + getLocalPosition().glTranslate(); + if (isFullyOpen()) { + FontRenderer fr = getMC().fontRenderer; + fr.drawString(title, 24, (24-fr.FONT_HEIGHT)/2+1, 0xFFFFFF, true); + } } @Override - public GuiElement findElementAtLocal(Vector2i pos) { - if (!openState) return this; - return super.findElementAtLocal(pos); + public boolean isChildVisible(GuiElement elm) { + return isFullyOpen() && super.isChildVisible(elm); + } + + public boolean isFullyOpen() { + return openState && getSize().equals(getTargetSize()); } @Override diff --git a/src/minecraft/ml/core/gui/core/GuiElement.java b/src/minecraft/ml/core/gui/core/GuiElement.java index 3b31b90..49dd118 100644 --- a/src/minecraft/ml/core/gui/core/GuiElement.java +++ b/src/minecraft/ml/core/gui/core/GuiElement.java @@ -24,6 +24,7 @@ public abstract class GuiElement { protected List childObjects = new ArrayList(); private Vector2i position; private Vector2i size; + private boolean visible = true; /** * Use {@link GuiElement#getStyle()} for getting. It checks for null and defaults to the parent. @@ -106,6 +107,20 @@ public boolean isDescendant(GuiElement des) { public Side getSide() { return getTopParent().getSide(); } + + // ------------------------ Visibility Stuff ------------------------ // + + public void setVisibility(boolean visible) { + this.visible = visible; + } + + public boolean isVisible() { + return this.visible; + } + + public boolean isChildVisible(GuiElement elm) { + return elm.isVisible(); + } // ------------------------ Size Stuff ------------------------ // public Vector2i getSize() { return size; } @@ -118,6 +133,16 @@ public void setSize(int w, int h) { setSize(new Vector2i(w, h)); } + public Vector2i calculateChildrenSize() { + int mx=0, my=0; + for (GuiElement elm : childObjects) { + int xw = elm.getLocalPosition().x + elm.getSize().x, yh = elm.getLocalPosition().y + elm.getSize().y; + if (xw > mx) mx = xw; + if (yh > my) my = yh; + } + return new Vector2i(mx, my); + } + // ------------------------ Position Stuff ------------------------ // public Vector2i getLocalPosition() { return position; @@ -191,7 +216,7 @@ public void onReceiveEvent(GuiEvent evt) { public GuiElement findElementAtLocal(Vector2i pos) { for (GuiElement el : childObjects) { - if (el.pointInElement(pos)) { + if (isChildVisible(el) && el.pointInElement(pos)) { GuiElement sel = el.findElementAtLocal(pos.copy().minus(el.getLocalPosition())); if (sel != null) return sel; @@ -328,10 +353,12 @@ protected void drawChilds(RenderStage stage, float partialTick) { GL11.glPushMatrix(); GL11.glTranslatef(pos.x, pos.y, 0.0F); for (GuiElement el : childObjects) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_LIGHTING); - - el.drawElement(stage, partialTick); + if (isChildVisible(el)) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_LIGHTING); + + el.drawElement(stage, partialTick); + } } GL11.glPopMatrix(); } diff --git a/src/minecraft/ml/core/nei/NEI_MLCore_Config.java b/src/minecraft/ml/core/nei/NEI_MLCore_Config.java index 4b98f76..b74865f 100644 --- a/src/minecraft/ml/core/nei/NEI_MLCore_Config.java +++ b/src/minecraft/ml/core/nei/NEI_MLCore_Config.java @@ -41,7 +41,7 @@ public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) { MLGuiClient mlg = (MLGuiClient)gui; GuiElement elm = mlg.getPrimaryElement(); for (GuiElement ge : elm.getDescendants()) { - if (ge.getGlobalBounds().intersects(new Rectangle(x, y, w, h))) { + if (ge.getParent().isChildVisible(ge) && ge.getGlobalBounds().intersects(new Rectangle(x, y, w, h))) { return true; } } From 11a7ad5ca0253e99109ee0b17e13873a28bda9f1 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Tue, 1 Jul 2014 00:38:12 -0600 Subject: [PATCH 14/21] Added support for hiding NEI in Guis. Fixed client/server environment issues. --- src/minecraft/ml/core/gui/MLGuiHandler.java | 1 + .../ml/core/gui/controls/tabs/ControlTabManager.java | 6 ++++++ .../ml/core/gui/controls/tabs/TabLedger.java | 5 +---- src/minecraft/ml/core/gui/core/GuiElement.java | 6 ++++++ src/minecraft/ml/core/gui/core/MLGuiClient.java | 3 ++- .../ml/core/gui/core/TopParentGuiElement.java | 4 ++++ src/minecraft/ml/core/nei/NEI_MLCore_Config.java | 12 ++++++++++++ 7 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/minecraft/ml/core/gui/MLGuiHandler.java b/src/minecraft/ml/core/gui/MLGuiHandler.java index 0f60071..9789707 100644 --- a/src/minecraft/ml/core/gui/MLGuiHandler.java +++ b/src/minecraft/ml/core/gui/MLGuiHandler.java @@ -34,6 +34,7 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int return null; tel.initControls(); + tel.constructClient(); tel.guiTick(); return tel.getGui(); diff --git a/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java b/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java index 105b6f8..a611554 100644 --- a/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java +++ b/src/minecraft/ml/core/gui/controls/tabs/ControlTabManager.java @@ -35,6 +35,12 @@ public GuiTab(ControlTabManager ctm) { setSize(new Vector2i(defaultSize, defaultSize)); } + @Override + public void constructClient() { + setSize(getTargetSize()); + super.constructClient(); + } + public int tabColor = 0x3590FF; @Override diff --git a/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java b/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java index 2f6020d..23b68bc 100644 --- a/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java +++ b/src/minecraft/ml/core/gui/controls/tabs/TabLedger.java @@ -1,16 +1,13 @@ package ml.core.gui.controls.tabs; -import net.minecraft.client.gui.FontRenderer; import ml.core.enums.MouseButton; import ml.core.gui.controls.tabs.ControlTabManager.GuiTab; import ml.core.gui.core.GuiElement; import ml.core.gui.event.GuiEvent; import ml.core.gui.event.mouse.EventMouseDown; import ml.core.vec.Vector2i; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.FontRenderer; -@SideOnly(Side.CLIENT) public abstract class TabLedger extends GuiTab { protected boolean openState = false; diff --git a/src/minecraft/ml/core/gui/core/GuiElement.java b/src/minecraft/ml/core/gui/core/GuiElement.java index 49dd118..a3de788 100644 --- a/src/minecraft/ml/core/gui/core/GuiElement.java +++ b/src/minecraft/ml/core/gui/core/GuiElement.java @@ -39,6 +39,12 @@ public GuiElement(GuiElement parent) { setSize(new Vector2i()); } + @SideOnly(Side.CLIENT) + public void constructClient() { + for (GuiElement elm : childObjects) { + elm.constructClient(); + } + } // ------------------------ Tree Model ------------------------ // public void clearChildren() { diff --git a/src/minecraft/ml/core/gui/core/MLGuiClient.java b/src/minecraft/ml/core/gui/core/MLGuiClient.java index 0a4c66f..e0c6dad 100644 --- a/src/minecraft/ml/core/gui/core/MLGuiClient.java +++ b/src/minecraft/ml/core/gui/core/MLGuiClient.java @@ -22,6 +22,7 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -170,6 +171,6 @@ public Vector2i getPosition() { } public Minecraft getMinecraft() { - return this.mc; + return this.mc != null ? this.mc : FMLClientHandler.instance().getClient(); } } diff --git a/src/minecraft/ml/core/gui/core/TopParentGuiElement.java b/src/minecraft/ml/core/gui/core/TopParentGuiElement.java index 541f58d..2f193ba 100644 --- a/src/minecraft/ml/core/gui/core/TopParentGuiElement.java +++ b/src/minecraft/ml/core/gui/core/TopParentGuiElement.java @@ -109,6 +109,10 @@ public void handleEvent(GuiEvent evt) { super.handleEvent(evt); } + public boolean shouldShowNEI() { + return true; + } + public abstract ItemStack transferStackFromSlot(EntityPlayer epl, Slot slot); public abstract void initControls(); diff --git a/src/minecraft/ml/core/nei/NEI_MLCore_Config.java b/src/minecraft/ml/core/nei/NEI_MLCore_Config.java index b74865f..3c3e8a3 100644 --- a/src/minecraft/ml/core/nei/NEI_MLCore_Config.java +++ b/src/minecraft/ml/core/nei/NEI_MLCore_Config.java @@ -2,8 +2,10 @@ import ml.core.gui.core.GuiElement; import ml.core.gui.core.MLGuiClient; +import ml.core.gui.core.TopParentGuiElement; import ml.core.vec.Rectangle; import net.minecraft.client.gui.inventory.GuiContainer; +import codechicken.nei.VisiblityData; import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; import codechicken.nei.api.INEIGuiAdapter; @@ -48,5 +50,15 @@ public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) { } return false; } + + @Override + public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) { + if (gui instanceof MLGuiClient) { + MLGuiClient mlg = (MLGuiClient)gui; + TopParentGuiElement elm = mlg.getPrimaryElement(); + currentVisibility.showNEI = elm.shouldShowNEI(); + } + return super.modifyVisiblity(gui, currentVisibility); + } } } From 735d4a7a9782b1b02cad5570685ea14a2c97f89f Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Tue, 8 Jul 2014 23:10:47 -0600 Subject: [PATCH 15/21] Added classes for working with structures. Mostly pulled up from SGWorlds. --- .../world/structure/MLStructureComponent.java | 218 ++++++++++++ .../world/structure/MLStructureStart.java | 30 ++ .../world/structure/StructureBuilder.java | 336 ++++++++++++++++++ .../core/world/structure/StructureHelper.java | 68 ++++ .../world/structure/WeightedComponent.java | 17 + 5 files changed, 669 insertions(+) create mode 100644 src/minecraft/ml/core/world/structure/MLStructureComponent.java create mode 100644 src/minecraft/ml/core/world/structure/MLStructureStart.java create mode 100644 src/minecraft/ml/core/world/structure/StructureBuilder.java create mode 100644 src/minecraft/ml/core/world/structure/StructureHelper.java create mode 100644 src/minecraft/ml/core/world/structure/WeightedComponent.java diff --git a/src/minecraft/ml/core/world/structure/MLStructureComponent.java b/src/minecraft/ml/core/world/structure/MLStructureComponent.java new file mode 100644 index 0000000..7b24910 --- /dev/null +++ b/src/minecraft/ml/core/world/structure/MLStructureComponent.java @@ -0,0 +1,218 @@ +package ml.core.world.structure; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; +import net.minecraft.world.gen.structure.StructureComponent; + +import org.apache.commons.lang3.reflect.ConstructorUtils; + +public abstract class MLStructureComponent extends StructureComponent { + + public ChunkCoordinates position; + public int rotation; + public StructureBoundingBox lboundingbox; // Not setup when loading from file + + public boolean componentNorth, componentEast, componentSouth, componentWest; + + public MLStructureComponent() {} + + public MLStructureComponent(ChunkCoordinates position, int rotation) { + this.position = position; + this.rotation = rotation; + } + + public void setLocalBoundingBox(StructureBoundingBox nbox) { + lboundingbox = nbox; + refreshBoundingBox(); + } + + public void refreshBoundingBox() { + this.boundingBox = globalizeBoundingBox(lboundingbox); + } + + public void setLocalBoundingBox(int nx, int ny, int nz, int px, int py, int pz) { + setLocalBoundingBox(new StructureBoundingBox(-nx, -ny, -nz, px, py, pz)); + } + + // Save + @Override + protected void func_143012_a(NBTTagCompound tag) { + tag.setInteger("pos_x", position.posX); + tag.setInteger("pos_y", position.posY); + tag.setInteger("pos_z", position.posZ); + + tag.setInteger("rotation", rotation); + + tag.setBoolean("cNorth", componentNorth); + tag.setBoolean("cEast", componentEast); + tag.setBoolean("cSouth", componentSouth); + tag.setBoolean("cWest", componentWest); + save(tag); + } + protected void save(NBTTagCompound tag) {} + + // Load + @Override + protected void func_143011_b(NBTTagCompound tag) { + this.position = new ChunkCoordinates(tag.getInteger("pos_x"), tag.getInteger("pos_y"), tag.getInteger("pos_z")); + this.rotation = tag.getInteger("rotation"); + + this.componentNorth = tag.getBoolean("cNorth"); + this.componentEast = tag.getBoolean("cEast"); + this.componentSouth = tag.getBoolean("cSouth"); + this.componentWest = tag.getBoolean("cWest"); + load(tag); + } + protected void load(NBTTagCompound tag) {} + + @Override + public boolean addComponentParts(World world, Random random, StructureBoundingBox chunkBox) { + StructureBuilder b = new StructureBuilder(world, position, rotation); + b.setMinMax(chunkBox); + + return addComponentParts(b, world, random, chunkBox); + } + + protected abstract boolean addComponentParts(StructureBuilder bldr, World world, Random rand, StructureBoundingBox chunkBox); + + public StructureBoundingBox globalizeBoundingBox(StructureBoundingBox box) { + int nx, px, nz, pz; + if (rotation == 1) { + nx = box.minZ; + nz = box.maxX; + px = box.maxZ; + pz = box.minX; + } else if (rotation == 2) { + nx = box.maxX; + nz = box.maxZ; + px = box.minX; + pz = box.minZ; + } else if (rotation == 3) { + nx = box.maxZ; + nz = box.minX; + px = box.minZ; + pz = box.maxX; + } else { + nx = box.minX; + nz = box.minZ; + px = box.maxX; + pz = box.maxZ; + } + return new StructureBoundingBox(position.posX-nx, position.posY-box.minY, position.posZ-nz, position.posX+px, position.posY+box.maxY, position.posZ+pz); + } + + public ChunkCoordinates getAbsOffset(ChunkCoordinates in) { + return StructureHelper.addCoords(position, StructureHelper.getRotatedCoords(in, rotation)); + } + + public ChunkCoordinates getAbsOffset(int x, int y, int z) { + return getAbsOffset(new ChunkCoordinates(x, y, z)); + } + + public boolean hasComponentSide(int side) { + side %= 4; + switch (side) { + case 0: + return componentNorth; + case 1: + return componentEast; + case 2: + return componentSouth; + case 3: + return componentWest; + } + return false; + } + + /** + * Gets the location of the door on the specified side, assuming the door is aligned with the position. + */ + public ChunkCoordinates getOutPos(int dRotation) { + int x=0,z=0; + if (dRotation == 0) { + z = -lboundingbox.minZ; + } else if (rotation == 1) { + x = lboundingbox.maxX; + } else if (rotation == 2) { + z = lboundingbox.maxZ; + } else if (rotation == 3) { + x = -lboundingbox.minX; + } + return StructureHelper.addCoords(position, StructureHelper.getRotatedCoords(new ChunkCoordinates(x, 0, z), rotation)); + } + + public static abstract class InitialStructureComponent extends MLStructureComponent { + + public List unbuiltComponents = new ArrayList(); + protected int componentCounter; + protected int range = 7 * 16; // Corresponds with MapGenBase.range + + public InitialStructureComponent() {} + + public InitialStructureComponent(ChunkCoordinates position, int rotation, int componentCount) { + super(position, rotation); + this.componentCounter = componentCount; + } + + public MLStructureComponent getNextStructureComponent(MLStructureComponent prev, int oRotation, List componentWeights, List existingComponents, ChunkCoordinates entrancePosition, Random rnd) { + int totalWeight = getTotalWeight(componentWeights); + + if (componentCounter < 1 || totalWeight < 1) { + return null; + } else if (Math.abs(entrancePosition.posX - position.posX) <= range && Math.abs(entrancePosition.posZ - position.posZ) <= range) { + int rn = rnd.nextInt(totalWeight); + for (WeightedComponent wc : componentWeights) { + rn -= wc.componentWeight; + + if (rn < 0) { + MLStructureComponent nComponent = null; + + try { + nComponent = ConstructorUtils.invokeConstructor(wc.cls, entrancePosition, (rotation+oRotation) % 4); + } catch (Exception e) { + e.printStackTrace(); + } + + if (nComponent != null) { + componentCounter--; + wc.instancesCreated++; + if (wc.maxComponentInstances > 0 && wc.instancesCreated >= wc.maxComponentInstances) componentWeights.remove(wc); + + nComponent.rotation = (rotation + oRotation) % 4; + nComponent.componentSouth = true; // South is entrance + + int centerdist = nComponent.lboundingbox.maxZ; + nComponent.position = new ChunkCoordinates(entrancePosition.posX + StructureHelper.getRotatedX(0, -centerdist, nComponent.rotation), entrancePosition.posY, entrancePosition.posZ + StructureHelper.getRotatedZ(0, -centerdist, nComponent.rotation)); + nComponent.refreshBoundingBox(); + + StructureComponent intersect = StructureComponent.findIntersecting(existingComponents, nComponent.boundingBox); + if (intersect != null && intersect != prev) return null; + + unbuiltComponents.add(nComponent); + existingComponents.add(nComponent); + + return nComponent; + } + } + } + } + return null; + } + } + + private static int getTotalWeight(List par0List) { + int tweight = 0; + + for (WeightedComponent wc : par0List) { + tweight += wc.componentWeight; + } + + return tweight; + } +} diff --git a/src/minecraft/ml/core/world/structure/MLStructureStart.java b/src/minecraft/ml/core/world/structure/MLStructureStart.java new file mode 100644 index 0000000..7fb4d2f --- /dev/null +++ b/src/minecraft/ml/core/world/structure/MLStructureStart.java @@ -0,0 +1,30 @@ +package ml.core.world.structure; + +import java.util.Random; + +import ml.core.world.structure.MLStructureComponent.InitialStructureComponent; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureStart; + +public abstract class MLStructureStart extends StructureStart { + + public MLStructureStart() {} + + public MLStructureStart(InitialStructureComponent initialComponent, World world, Random rnd, int chunkX, int chunkZ) { + super(chunkX, chunkZ); + + this.components.add(initialComponent); + initialComponent.buildComponent(initialComponent, this.components, rnd); + + while (!initialComponent.unbuiltComponents.isEmpty()) { + //int i = rnd.nextInt(initialComponent.unbuiltComponents.size()); + MLStructureComponent nextComponent = initialComponent.unbuiltComponents.remove(0); + nextComponent.buildComponent(initialComponent, this.components, rnd); + + if (this.components.contains(nextComponent)) this.components.add(nextComponent); + } + + updateBoundingBox(); + } + +} diff --git a/src/minecraft/ml/core/world/structure/StructureBuilder.java b/src/minecraft/ml/core/world/structure/StructureBuilder.java new file mode 100644 index 0000000..67a5edf --- /dev/null +++ b/src/minecraft/ml/core/world/structure/StructureBuilder.java @@ -0,0 +1,336 @@ +package ml.core.world.structure; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockButton; +import net.minecraft.block.BlockDoor; +import net.minecraft.block.BlockLever; +import net.minecraft.block.BlockPistonBase; +import net.minecraft.block.BlockRailBase; +import net.minecraft.block.BlockRedstoneRepeater; +import net.minecraft.block.BlockStairs; +import net.minecraft.block.BlockTorch; +import net.minecraft.item.ItemDoor; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; +import net.minecraftforge.common.ForgeDirection; + +/** + * Helper class for making the creation of rotatable structures easier.
+ * Imposes a custom coordinate system: + * + *
+ *              Z-
+ *              ^
+ *              |
+ *              N
+ *  X- <------W + E------> X+
+ *              S
+ *              |
+ *              v
+ *              Z+
+ * 
+ * + * N,E,S,W are default minecraft directions, in global space. Z-, X+, Z+, X- are in local space and are rotated depending on the passed rotation. + * Rotation works in 90-degree increments, rotating the axes in the above illustration clockwise. e.g. Z- becomes East, X+ becomes South, etc.
+ * + * @author Matchlighter + */ +public class StructureBuilder { + + public final World world; + public final int rotation; + public final ChunkPosition center; + public ChunkCoordinates ioffset = new ChunkCoordinates(); + public ChunkCoordinates absMinimum, absMaximum; + + public boolean flipXZ = false; + + public boolean symmetryX = false; + public boolean symmetryZ = false; + + public boolean invertX = false; + public boolean invertY = false; + public boolean invertZ = false; + + public int rotationOffset = 0; + + /** + * See {@link StructureBuilder} for details. + * @param world + * @param pos The point to rotate the structure around. + * @param rot The number of clockwise, 90-degree increments to rotate the structure. + */ + public StructureBuilder(World world, ChunkPosition pos, int rot) { + this.world = world; + this.center = pos; + this.rotation = rot; + } + + public StructureBuilder(World world, ChunkCoordinates pos, int rot) { + this.world = world; + this.center = new ChunkPosition(pos.posX, pos.posY, pos.posZ); + this.rotation = rot; + } + + public StructureBuilder(World world, int x, int y, int z, int rot) { + this.world = world; + this.center = new ChunkPosition(x, y, z); + this.rotation = rot; + } + + /** + * Converts the local x passed to a global x-value. + */ + public int getAbsX(int x, int z) { + if (invertX) x = -x; if (invertZ) z = -z; + x += ioffset.posX; z += ioffset.posZ; + int mrot = (rotation + rotationOffset) % 4; + + switch (mrot) { + case 0: + return center.x+x; + case 1: + return center.x-z; + case 2: + return center.x-x; + case 3: + return center.x+z; + } + return center.x; + } + + public int getAbsY(int oy) { + if (invertY) oy = -oy; + return center.y + oy + ioffset.posY; + } + + /** + * Converts the local z passed to a global z-value. + */ + public int getAbsZ(int x, int z) { + if (invertX) x = -x; if (invertZ) z = -z; + x += ioffset.posX; z += ioffset.posZ; + int mrot = (rotation + rotationOffset) % 4; + + switch (mrot) { + case 0: + return center.z+z; + case 1: + return center.z+x; + case 2: + return center.z-z; + case 3: + return center.z-x; + } + return center.z; + } + + public TileEntity getTileEntityAt(int rx, int ry, int rz) { + ChunkCoordinates abs = getAbsCoords(rx, ry, rz); + return world.getBlockTileEntity(abs.posX, abs.posY, abs.posZ); + } + + /** + * Converts the relative x,y,z into a global point. + */ + public ChunkCoordinates getAbsCoords(int rx, int ry, int rz) { + int bx = flipXZ ? rz : rx; + int bz = flipXZ ? rx : rz; + + return new ChunkCoordinates(getAbsX(bx, bz), getAbsY(ry), getAbsZ(bx, bz)); + } + + public boolean absCoordsInRange(int ax, int ay, int az) { + if (absMinimum == null || absMaximum == null) return true; + return (ax >= absMinimum.posX && ax <= absMaximum.posX) && + (ay >= absMinimum.posY && ay <= absMaximum.posY) & + (az >= absMinimum.posZ && az <= absMaximum.posZ); + } + + public boolean relCoordsInRange(int rx, int ry, int rz) { + if (absMinimum == null || absMaximum == null) return true; + ChunkCoordinates absPt = getAbsCoords(rx, ry, rz); + return (absPt.posX >= absMinimum.posX && absPt.posX <= absMaximum.posX) && + (absPt.posY >= absMinimum.posY && absPt.posY <= absMaximum.posY) & + (absPt.posZ >= absMinimum.posZ && absPt.posZ <= absMaximum.posZ); + } + + public void setMinMax(ChunkCoordinates min, ChunkCoordinates max) { + this.absMinimum = min; + this.absMaximum = max; + } + + public void setMinMax(StructureBoundingBox bb) { + if (bb != null) { + this.absMinimum = new ChunkCoordinates(bb.minX, bb.minY, bb.minZ); + this.absMaximum = new ChunkCoordinates(bb.maxX, bb.maxY, bb.maxZ); + } else { + this.absMinimum = null; + this.absMaximum = null; + } + } + + public int getBlockIdAt(int rx, int ry, int rz) { + ChunkCoordinates p = getAbsCoords(rx, ry, rz); + return world.getBlockId(p.posX, p.posY, p.posZ); + } + + private void setBlockAtAbs(int ax, int ay, int az, Block block, int blockMeta) { + if (!absCoordsInRange(ax, ay, az)) return; + + if (block instanceof BlockDoor) { + ItemDoor.placeDoorBlock(world, ax, ay, az, blockMeta, block); + } else { + world.setBlock(ax, ay, az, block != null ? block.blockID : 0, blockMeta, 3); + } + } + + /** + * Set the block at the local coordinates (rx, ry, rz) to the specified block and meta. + * Takes symmetry booleans into account, so up to 4 blocks may be placed. + */ + public void setBlockAt(int rx, int ry, int rz, Block block, int blockMeta) { + + int bx = flipXZ ? rz : rx; + int bz = flipXZ ? rx : rz; + + setBlockAtAbs(getAbsX(bx, bz), getAbsY(ry), getAbsZ(bx, bz), block, blockMeta); + + if (symmetryX && symmetryZ && bx != 0 && bz != 0) { + setBlockAtAbs(getAbsX(-bx, -bz), getAbsY(ry), getAbsZ(-bx, -bz), block, blockMeta); + } + if (symmetryX && bx != 0) { + setBlockAtAbs(getAbsX(-bx, bz), getAbsY(ry), getAbsZ(-bx, bz), block, blockMeta); + } + if (symmetryZ && bz != 0) { + setBlockAtAbs(getAbsX(bx, -bz), getAbsY(ry), getAbsZ(bx, -bz), block, blockMeta); + } + } + + /** + * Fills the specified area with blocks. start_ and end_ are both inclusive. + */ + public void fillArea(int startX, int startY, int startZ, int endX, int endY, int endZ, Block block, int blockMeta) { + for (int x=startX; x<=endX; x++) { + for (int z=startZ; z<=endZ; z++) { + for (int y=startY; y<=endY; y++) { + setBlockAt(x, y, z, block, blockMeta); + } + } + } + } + + /** + * Fills the edges of the specified area with blocks. start_ and end_ are both inclusive. + */ + public void borderArea(int startX, int startY, int startZ, int endX, int endY, int endZ, Block block, int blockMeta) { + for (int x=startX; x<=endX; x++) { + boolean xc = x==startX || x==endX; + + for (int z=startZ; z<=endZ; z++) { + boolean zc = z==startZ || z==endZ; + + for (int y=startY; y<=endY; y++) { + boolean yc = y==startY || y==endY; + + if ((yc && xc) || (yc && zc) || (xc && zc)) setBlockAt(x, y, z, block, blockMeta); + } + } + } + } + + /** + * Fills the faces of the specified area with blocks. start_ and end_ are both inclusive. + */ + public void wallArea(int startX, int startY, int startZ, int endX, int endY, int endZ, Block block, int blockMeta) { + wallArea(startX, startY, startZ, endX, endY, endZ, true, true, true, block, blockMeta); + } + + /** + * Fills the faces of the specified area with blocks, if the w_ is true for the axis. start_ and end_ are both inclusive. + */ + public void wallArea(int startX, int startY, int startZ, int endX, int endY, int endZ, boolean wx, boolean wy, boolean wz, Block block, int blockMeta) { + for (int x=startX; x<=endX; x++) { + boolean xc = (x==startX || x==endX) && wx; + + for (int z=startZ; z<=endZ; z++) { + boolean zc = (z==startZ || z==endZ) && wz; + + for (int y=startY; y<=endY; y++) { + boolean yc = (y==startY || y==endY) && wy; + + if (xc || yc || zc) setBlockAt(x, y, z, block, blockMeta); + } + } + } + } + + public void fillDown(int startX, int startY, int startZ, int endX, int endZ, Block block, int blockMeta) { + for (int x=startX; x<=endX; x++) { + for (int z=startZ; z<=endZ; z++) { + for (int y=startY; getAbsY(y)>0; y--) { + if (getBlockIdAt(x, y, z) != 0) { + break; + } + setBlockAt(x, y, z, block, blockMeta); + } + } + } + } + + /** + * Attempts to get the rotated metadata of a rotatable block. + */ + public int getRotatedMeta(Block block, int cRotation) { + int rot4 =(this.rotation + cRotation) % 4; + + if (block instanceof BlockRailBase) { + return (this.rotation + cRotation) % 2; + + } else if (block instanceof BlockDoor) { + return (this.rotation + cRotation + 1) % 4; + + } else if (block instanceof BlockStairs) { + int rot = rot4; + + if (rot4 == 0) rot = 2; + else if (rot4 == 2) rot = 3; + else if (rot4 == 3) rot = 0; + + return rot | (cRotation & 8); + + } else if (block == Block.ladder) { + if (rot4 == 0) return 2; + if (rot4 == 1) return 5; + else if (rot4 == 2) return 3; + else if (rot4 == 3) return 4; + + } else if (block instanceof BlockButton || block instanceof BlockLever || block instanceof BlockTorch) { + if (rot4 == 0) return 4; + if (rot4 == 1) return 1; + else if (rot4 == 2) return 3; + else if (rot4 == 3) return 2; + + } else if (block instanceof BlockPistonBase || block instanceof BlockLever || block == Block.dispenser) { + // TODO + } else if (block instanceof BlockRedstoneRepeater) { + return rot4; + } + + return rot4; + } + + private static final int[][] rotMatrix = { + {0,1, 2,3,4,5}, + {0,1, 5,4,2,3}, + {0,1, 3,2,5,4}, + {0,1, 4,5,3,2}, + }; + + public ForgeDirection rotateForgeDir(ForgeDirection fdir) { + return ForgeDirection.getOrientation(rotMatrix[rotation][fdir.ordinal()]); + } +} diff --git a/src/minecraft/ml/core/world/structure/StructureHelper.java b/src/minecraft/ml/core/world/structure/StructureHelper.java new file mode 100644 index 0000000..51f7d6d --- /dev/null +++ b/src/minecraft/ml/core/world/structure/StructureHelper.java @@ -0,0 +1,68 @@ +package ml.core.world.structure; + +import java.util.Random; + +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; + +public class StructureHelper { + + public static boolean shouldGenerateAt(World world, int chunkX, int chunkZ, int minDist, int maxDist) { + int k = chunkX; + int l = chunkZ; + + if (chunkX < 0) { + chunkX -= maxDist - 1; + } + + if (chunkZ < 0) { + chunkZ -= maxDist - 1; + } + + int i1 = chunkX / maxDist; + int j1 = chunkZ / maxDist; + Random random = world.setRandomSeed(i1, j1, 14357617); + i1 *= maxDist; + j1 *= maxDist; + i1 += random.nextInt(maxDist - minDist); + j1 += random.nextInt(maxDist - minDist); + + return (k == i1 && l == j1); + } + + public static int getRotatedX(int x, int z, int rotation) { + switch (rotation) { + case 0: + return x; + case 1: + return -z; + case 2: + return -x; + case 3: + return z; + } + return x; + } + + public static int getRotatedZ(int x, int z, int rotation) { + switch (rotation) { + case 0: + return z; + case 1: + return x; + case 2: + return -z; + case 3: + return -x; + } + return z; + } + + public static ChunkCoordinates getRotatedCoords(ChunkCoordinates coord, int rotation) { + return new ChunkCoordinates(getRotatedX(coord.posX, coord.posZ, rotation), coord.posY, getRotatedZ(coord.posX, coord.posZ, rotation)); + } + + public static ChunkCoordinates addCoords(ChunkCoordinates a, ChunkCoordinates b) { + return new ChunkCoordinates(a.posX + b.posX, a.posY + b.posY, a.posZ + b.posZ); + } +} diff --git a/src/minecraft/ml/core/world/structure/WeightedComponent.java b/src/minecraft/ml/core/world/structure/WeightedComponent.java new file mode 100644 index 0000000..9bef15c --- /dev/null +++ b/src/minecraft/ml/core/world/structure/WeightedComponent.java @@ -0,0 +1,17 @@ +package ml.core.world.structure; + + +public class WeightedComponent { + + public Class cls; + public final int componentWeight; + public int instancesCreated; + public int maxComponentInstances; + + public WeightedComponent(Class cls, int weight, int maxPieces) { + this.cls = cls; + this.componentWeight = weight; + this.maxComponentInstances = maxPieces; + } + +} From bad9d2f245a4188d042da0e8ea2215960ca69dae Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Wed, 9 Jul 2014 00:01:01 -0600 Subject: [PATCH 16/21] Changed meta values in DelegateBlock to be passed as subMeta values. --- .../ml/core/block/BlockDelegator.java | 101 ++++++++++-------- .../ml/core/block/DelegateBlock.java | 79 +++++++++----- 2 files changed, 111 insertions(+), 69 deletions(-) diff --git a/src/minecraft/ml/core/block/BlockDelegator.java b/src/minecraft/ml/core/block/BlockDelegator.java index d730cc0..0ed202f 100644 --- a/src/minecraft/ml/core/block/BlockDelegator.java +++ b/src/minecraft/ml/core/block/BlockDelegator.java @@ -50,18 +50,18 @@ public BlockDelegator(int blockId, Material xMaterial, DCls nullDelegate) { /* ---------------------------- SubBlocks ---------------------------- */ - public boolean addSubBlock(int metaData, DCls sub) { - if (subBlock(metaData) != nullDelegate || subBlocks.containsValue(sub)) return false; - subBlocks.put(metaData, sub); + public boolean addSubBlock(int meta, DCls sub) { + if (subBlock(meta) != nullDelegate || subBlocks.containsValue(sub)) return false; + subBlocks.put(meta, sub); sub.parent = this; - sub.metaId = metaData; + sub.metaId = meta; return true; } - public DCls subBlock(int metaData) { - if (subBlocks.containsKey(metaData)) return subBlocks.get(metaData); - Entry ent = subBlocks.floorEntry(metaData); - if (ent != null && (ent.getValue().getMetaId() == metaData || metaData < ent.getValue().getMetaId()+ent.getValue().getMetaLength())) { + public DCls subBlock(int meta) { + if (subBlocks.containsKey(meta)) return subBlocks.get(meta); + Entry ent = subBlocks.floorEntry(meta); + if (ent != null && (ent.getValue().getMetaId() == meta || meta < ent.getValue().getMetaId()+ent.getValue().getMetaLength())) { return ent.getValue(); } return nullDelegate; @@ -118,7 +118,10 @@ public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlaye @Override public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) { for (Integer i : subBlocks.keySet()) { - par3List.add(new ItemStack(this, 1, i)); + DCls sub = subBlocks.get(i); + for (int a=0; a getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) { - return subBlock(world, x, y, z).getBlockDropped(world, x, y, z, metadata, fortune); + public ArrayList getBlockDropped(World world, int x, int y, int z, int meta, int fortune) { + return subBlock(meta).getBlockDropped(world, x, y, z, meta, fortune); } @Override @@ -354,8 +364,8 @@ public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, i } @Override - public int getExpDrop(World world, int data, int enchantmentLevel) { - return subBlock(data).getExpDrop(world, data, enchantmentLevel); + public int getExpDrop(World world, int meta, int enchantmentLevel) { + return subBlock(meta).getExpDrop(world, meta, enchantmentLevel); } @Override @@ -379,27 +389,29 @@ public int getMixedBrightnessForBlock(IBlockAccess world, int x, int y, int z) { @Override @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int par5) { - Boolean renderSide = subBlock(world, x, y, z).shouldSideBeRendered(world, x, y, z, par5); - return renderSide != null ? renderSide : super.shouldSideBeRendered(world, x, y, z, par5); + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + Boolean renderSide = subBlock(world, x, y, z).shouldSideBeRendered(world, x, y, z, side); + return renderSide != null ? renderSide : super.shouldSideBeRendered(world, x, y, z, side); } @Override @SideOnly(Side.CLIENT) public Icon getIcon(int side, int meta) { - return subBlock(meta).getIcon(side, meta); + DCls sub = subBlock(meta); + return sub.getIcon(side, meta - sub.metaId); } @Override @SideOnly(Side.CLIENT) - public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int par5) { - return subBlock(world, x, y, z).getBlockTexture(world, x, y, z, par5); + public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int side) { + return subBlock(world, x, y, z).getBlockTexture(world, x, y, z, side); } @Override @SideOnly(Side.CLIENT) public int getRenderColor(int meta) { - return subBlock(meta).getRenderColor(meta); + DCls sub = subBlock(meta); + return sub.getRenderColor(meta - sub.metaId); } @Override @@ -411,7 +423,8 @@ public void registerIcons(IconRegister par1IconRegister) { @Override @SideOnly(Side.CLIENT) public boolean addBlockDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { - return subBlock(world, x, y, z).addBlockDestroyEffects(world, x, y, z, meta, effectRenderer); + DCls sub = subBlock(meta); + return sub.addBlockDestroyEffects(world, x, y, z, meta - sub.metaId, effectRenderer); } @Override diff --git a/src/minecraft/ml/core/block/DelegateBlock.java b/src/minecraft/ml/core/block/DelegateBlock.java index f5fd90b..48cbcfa 100644 --- a/src/minecraft/ml/core/block/DelegateBlock.java +++ b/src/minecraft/ml/core/block/DelegateBlock.java @@ -4,9 +4,6 @@ import java.util.List; import java.util.Random; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - import net.minecraft.block.ITileEntityProvider; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.renderer.texture.IconRegister; @@ -24,19 +21,36 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.IPlantable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class DelegateBlock { protected int metaId; protected BlockDelegator parent; - + protected String unlocalizedName; + + @SideOnly(Side.CLIENT) + protected Icon itemIcon; + protected String iconLocation; + public DelegateBlock() {} public BlockDelegator parent() { return parent; } - public int getMetaId() { + public DelegateBlock setIconString(String str) { + this.iconLocation = str; + return this; + } + + public DelegateBlock setUnlocalizedName(String str) { + this.unlocalizedName = str; + return this; + } + + public final int getMetaId() { return metaId; } @@ -44,6 +58,14 @@ public int getMetaLength() { return 1; } + public int getSubMeta(IBlockAccess w, int x, int y, int z) { + return getSubMeta(w.getBlockMetadata(x, y, z)); + } + + public int getSubMeta(int gmeta) { + return gmeta - metaId; + } + public void setBlockAt(World world, int wx, int wy, int wz, int flags) { this.setBlockAt(world, wx, wy, wz, 0, flags); } @@ -59,7 +81,7 @@ public void setBlockAt(World world, int wx, int wy, int wz, int subMeta, int fla /* ---------------------------- ItemMethods ---------------------------- */ public String getUnlocalizedName(ItemStack stack) { - return ""; + return unlocalizedName; } public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { @@ -100,7 +122,7 @@ public boolean canCreatureSpawn(EnumCreatureType type, World world, int x, int y return isBlockSolidOnSide(world, x, y, z, ForgeDirection.UP); } - public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { + public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int subMeta) { return false; } @@ -126,7 +148,7 @@ public boolean isAirBlock(World world, int x, int y, int z) { return false; } - public boolean isFlammable(IBlockAccess world, int x, int y, int z, int metadata, ForgeDirection face) { + public boolean isFlammable(IBlockAccess world, int x, int y, int z, int subMeta, ForgeDirection face) { return false; } @@ -156,17 +178,17 @@ public void onBlockAdded(World par1World, int x, int y, int z) {} public void onBlockPlacedBy(World par1World, int x, int y, int z, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack) {} - public void onBlockPreDestroy(World par1World, int x, int y, int z, int meta) {} + public void onBlockPreDestroy(World par1World, int x, int y, int z, int subMeta) {} - public void breakBlock(World par1World, int x, int y, int z, int id, int meta) { - if (hasTileEntity(meta)) par1World.removeBlockTileEntity(x, y, z); + public void breakBlock(World par1World, int x, int y, int z, int id, int subMeta) { + if (hasTileEntity(subMeta)) par1World.removeBlockTileEntity(x, y, z); } public boolean removeBlockByPlayer(World world, EntityPlayer player, int x, int y, int z) { return world.setBlockToAir(x, y, z); } - public void onNeighborBlockChange(World par1World, int x, int y, int z, int par5) {} + public void onNeighborBlockChange(World par1World, int x, int y, int z, int id) {} public void onBlockClicked(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) {} @@ -194,12 +216,12 @@ public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int par /* ---------------------------- TileEntities ---------------------------- */ - public boolean hasTileEntity(int metadata) { + public boolean hasTileEntity(int subMeta) { return this instanceof ITileEntityProvider; } - public TileEntity createTileEntity(World world, int metadata) { - if (hasTileEntity(metadata)) + public TileEntity createTileEntity(World world, int subMeta) { + if (hasTileEntity(subMeta)) return ((ITileEntityProvider)this).createNewTileEntity(world); return null; } @@ -210,17 +232,20 @@ public boolean canEntityDestroy(World world, int x, int y, int z, Entity entity) return true; } - public boolean canHarvestBlock(EntityPlayer player, int meta) { - return ForgeHooks.canHarvestBlock(this.parent(), player, meta); + public boolean canHarvestBlock(EntityPlayer player, int subMeta) { + return ForgeHooks.canHarvestBlock(this.parent(), player, subMeta); } - public boolean canPlaceBlockOnSide(World par1World, int x, int y, int z, int par5, ItemStack par6ItemStack) { + public boolean canPlaceBlockOnSide(World par1World, int x, int y, int z, int side, ItemStack par6ItemStack) { return parent().canPlaceBlockAt(par1World, x, y, z); } - public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) { + /** + * Note that meta is not subMeta in this case. + */ + public ArrayList getBlockDropped(World world, int x, int y, int z, int meta, int fortune) { ArrayList ret = new ArrayList(); - ret.add(new ItemStack(parent(), 1, metadata)); + ret.add(new ItemStack(parent(), 1, meta)); return ret; } @@ -254,23 +279,27 @@ public Boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int } @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int meta) {return null;} + public Icon getIcon(int side, int subMeta) { + return itemIcon; + } @SideOnly(Side.CLIENT) public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int side) { - return this.getIcon(side, world.getBlockMetadata(x, y, z)); + return this.getIcon(side, getSubMeta(world, x, y, z)); } @SideOnly(Side.CLIENT) - public int getRenderColor(int meta) { + public int getRenderColor(int subMeta) { return 16777215; } @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister par1IconRegister) {}; + public void registerIcons(IconRegister ireg) { + this.itemIcon = ireg.registerIcon(iconLocation); + } @SideOnly(Side.CLIENT) - public boolean addBlockDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { + public boolean addBlockDestroyEffects(World world, int x, int y, int z, int subMeta, EffectRenderer effectRenderer) { return false; } From 266f3481eb15ff5d2007f61212f04b5869f0efa5 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Wed, 9 Jul 2014 14:26:21 -0600 Subject: [PATCH 17/21] 1.7.2 Port work --- build.gradle | 15 ++- build.properties | 8 +- src/main/java/ml/core/MLCore.java | 15 ++- src/main/java/ml/core/block/BlockUtils.java | 2 +- src/main/java/ml/core/data/Config.java | 24 ++-- .../java/ml/core/data/IDataSerializer.java | 4 +- src/main/java/ml/core/data/NBTUtils.java | 2 + src/main/java/ml/core/data/Serialization.java | 6 +- .../java/ml/core/data/serializers/SArray.java | 8 +- .../ml/core/data/serializers/SBlockCoord.java | 4 +- .../data/serializers/SForgeDirection.java | 6 +- .../ml/core/data/serializers/SItemsStack.java | 9 +- .../data/serializers/SNBTTagCompound.java | 4 +- .../ml/core/data/serializers/SString.java | 4 +- src/main/java/ml/core/gui/GuiRenderUtils.java | 7 +- .../ml/core/internal/PacketContainerData.java | 11 +- .../ml/core/inventory/CustomSlotClick.java | 6 +- src/main/java/ml/core/network/MLPacket.java | 53 ++------- .../java/ml/core/network/PacketHandler.java | 112 ++++++++++++------ .../ml/core/texture/ConnectedTexture.java | 2 +- .../core/texture/CustomTextureMapManager.java | 8 +- .../java/ml/core/texture/IIconProvider.java | 4 +- .../java/ml/core/texture/TextureSheet.java | 18 +-- src/main/java/ml/core/vec/BlockCoord.java | 4 +- .../java/ml/core/world/WorldGenHandler.java | 95 +++++++-------- .../java/ml/core/world/WorldRenderUtils.java | 5 +- .../world/feature/StructureGeneratorBase.java | 9 +- src/main/resources/mlcore_at.cfg | 3 +- 28 files changed, 234 insertions(+), 214 deletions(-) diff --git a/build.gradle b/build.gradle index 7b28ae4..51446d7 100644 --- a/build.gradle +++ b/build.gradle @@ -4,10 +4,14 @@ buildscript { maven { name = "forge" url = "http://files.minecraftforge.net/maven" + } + maven { + name = "sonatype" + url = "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT' + classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' } } @@ -17,9 +21,9 @@ repositories { name 'Forge FS legacy' artifactPattern "http://files.minecraftforge.net/[module]/[module]-dev-[revision].[ext]" } - ivy { - name 'CB FS' - artifactPattern "http://www.chickenbones.craftsaddle.org/Files/New_Versions/1.6.4/[module]-dev%20[revision].[ext]" + maven { + name 'CB Repo' + url "http://chickenbones.net/maven/" } maven { name 'ForgeFS' @@ -46,8 +50,7 @@ ext.simpleVersion = version version = "MC${config.minecraft.version}-${project.version}" dependencies { - compile name: 'CodeChickenLib', version: "${config.minecraft.version}-${config.CCLIB.version}", ext: 'jar' - compile name: 'NotEnoughItems', version: "${config.NEI.version}", type: 'jar' + compile "codechicken:NotEnoughItems:${config.minecraft.version}-${config.NEI.version}:dev" } apply from: 'gradle/forge.gradle' diff --git a/build.properties b/build.properties index 4fab55b..4499e85 100644 --- a/build.properties +++ b/build.properties @@ -1,6 +1,6 @@ -minecraft.version=1.6.4 -forge.version=9.11.1.964 -CCLIB.version=1.0.0.44 -NEI.version=1.6.1.9 +minecraft.version=1.7.2 +forge.version=10.12.2.1121 +CCLIB.version=1.0.1.7 +NEI.version=1.0.2.14 mlcore.version=1.2.7 maven.url=file:///media/storage/Minecraft/web/maven diff --git a/src/main/java/ml/core/MLCore.java b/src/main/java/ml/core/MLCore.java index e694775..763cf7d 100644 --- a/src/main/java/ml/core/MLCore.java +++ b/src/main/java/ml/core/MLCore.java @@ -12,12 +12,10 @@ import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.network.NetworkMod; +import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.common.registry.TickRegistry; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions; -import cpw.mods.fml.relauncher.Side; @Mod(modid="MLCore", name="MLCore") @NetworkMod(clientSideRequired=false, serverSideRequired=false, channels={PacketHandler.defChan}, packetHandler=PacketHandler.class) @@ -35,10 +33,10 @@ public class MLCore implements IFMLLoadingPlugin { @EventHandler public void preInit(FMLPreInitializationEvent evt) { proxy.prInit(); + NetworkRegistry. MinecraftForge.EVENT_BUS.register(WorldGenHandler.instance); - TickRegistry.registerTickHandler(WorldGenHandler.instance, Side.SERVER); - GameRegistry.registerWorldGenerator(WorldGenHandler.instance); + GameRegistry.registerWorldGenerator(WorldGenHandler.instance, 0); } @EventHandler @@ -48,7 +46,7 @@ public void init(FMLInitializationEvent evt) { @Override public String[] getASMTransformerClass() { - return new String[]{"ml.core.asm.MLCAccesTransformer"}; + return new String[]{}; } @Override @@ -65,4 +63,9 @@ public String getSetupClass() { public void injectData(Map data) { } + + @Override + public String getAccessTransformerClass() { + return "ml.core.asm.MLCAccesTransformer"; + } } diff --git a/src/main/java/ml/core/block/BlockUtils.java b/src/main/java/ml/core/block/BlockUtils.java index db6b998..0757d83 100644 --- a/src/main/java/ml/core/block/BlockUtils.java +++ b/src/main/java/ml/core/block/BlockUtils.java @@ -3,7 +3,7 @@ import ml.core.vec.Vector3d; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.Entity; -import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/ml/core/data/Config.java b/src/main/java/ml/core/data/Config.java index 3392404..f9b4f45 100644 --- a/src/main/java/ml/core/data/Config.java +++ b/src/main/java/ml/core/data/Config.java @@ -14,9 +14,9 @@ import ml.core.data.Config.Prop.Renamed; import ml.core.internal.CoreLogger; import ml.core.util.StringUtils; -import net.minecraftforge.common.ConfigCategory; -import net.minecraftforge.common.Configuration; -import net.minecraftforge.common.Property; +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; public abstract class Config { @@ -73,7 +73,7 @@ public Config(Configuration cfg) { fcfg = cfg; } - public static Property.Type getForgeType(Class cls) { + public static Property.Type getForgeType(Class cls) { if (cls.isArray()) cls = cls.getComponentType(); if (cls == int.class || cls == Integer.class) return Property.Type.INTEGER; @@ -120,8 +120,8 @@ private String testGetCategory(Field fld, String last) { return last; } - protected void loadModule(Object modInst, Class modCls) throws IllegalAccessException { - String lastCategory = fcfg.CATEGORY_GENERAL; + protected void loadModule(Object modInst, Class modCls) throws IllegalAccessException { + String lastCategory = Configuration.CATEGORY_GENERAL; for (Field fld : modCls.getFields()){ if (modInst != null || Modifier.isStatic(fld.getModifiers())) { @@ -153,7 +153,7 @@ protected void loadModule(Object modInst, Class modCls) throws IllegalAccessExce } } - Class type = fld.getType(); + Class type = fld.getType(); Property.Type forgeTyp = getForgeType(type); Object fldValue = null; if (type.isArray()) { @@ -225,7 +225,7 @@ public Config load() { loadModule(this, this.getClass()); for (Object mod : mods) if (mod instanceof Class) - loadModule(null, (Class)mod); + loadModule(null, (Class)mod); else loadModule(mod, mod.getClass()); } catch(Exception e) { CoreLogger.log(Level.SEVERE, "Failed to load the configuration properly", e); @@ -235,8 +235,8 @@ public Config load() { return this; } - protected void saveModule(Object modInst, Class modCls) throws IllegalAccessException { - String lastCategory = fcfg.CATEGORY_GENERAL; + protected void saveModule(Object modInst, Class modCls) throws IllegalAccessException { + String lastCategory = Configuration.CATEGORY_GENERAL; for (Field fld : modCls.getFields()){ if (modInst != null || Modifier.isStatic(fld.getModifiers())) { @@ -250,7 +250,7 @@ protected void saveModule(Object modInst, Class modCls) throws IllegalAccessExce Property cProp = null; - Class type = fld.getType(); + Class type = fld.getType(); Property.Type forgeTyp = getForgeType(type); if (type.isArray()) { cProp = fcfg.get(propCategory, propName, (String[])fld.get(modInst), null, forgeTyp); @@ -275,7 +275,7 @@ public void save() { saveModule(this, this.getClass()); for (Object mod : mods) if (mod instanceof Class) - saveModule(null, (Class)mod); + saveModule(null, (Class)mod); else saveModule(mod, mod.getClass()); } catch(Exception e) { diff --git a/src/main/java/ml/core/data/IDataSerializer.java b/src/main/java/ml/core/data/IDataSerializer.java index bb73315..20d1c6f 100644 --- a/src/main/java/ml/core/data/IDataSerializer.java +++ b/src/main/java/ml/core/data/IDataSerializer.java @@ -7,9 +7,9 @@ public interface IDataSerializer { - public boolean handles(Class clazz); + public boolean handles(Class clazz); - public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException; + public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException; public void serialize(Object obj, DataOutputStream dOut) throws IOException; diff --git a/src/main/java/ml/core/data/NBTUtils.java b/src/main/java/ml/core/data/NBTUtils.java index 5357f9b..64be213 100644 --- a/src/main/java/ml/core/data/NBTUtils.java +++ b/src/main/java/ml/core/data/NBTUtils.java @@ -23,6 +23,7 @@ */ public class NBTUtils { + @SuppressWarnings("unchecked") public static T getTagValue(NBTBase tag) { if (tag instanceof NBTTagFloat) {return (T)(Object)((NBTTagFloat)tag).data;} else if @@ -65,6 +66,7 @@ private static String[] splitPath(String... path) { /** * You CAN get a string from any NBTTag type with this method - if the defaultVal is a String, toString() will be called on the returning Object. */ + @SuppressWarnings("unchecked") public static T getTagValue(NBTTagCompound parent, T defaultVal, String...tagPath) { try { tagPath = splitPath(tagPath); diff --git a/src/main/java/ml/core/data/Serialization.java b/src/main/java/ml/core/data/Serialization.java index 39f7a1b..6ac6ef3 100644 --- a/src/main/java/ml/core/data/Serialization.java +++ b/src/main/java/ml/core/data/Serialization.java @@ -30,7 +30,7 @@ public static void addSerializer(IDataSerializer serializer) { serializers.add(serializer); } - public static IDataSerializer getSerializer(Class clazz) { + public static IDataSerializer getSerializer(Class clazz) { IDataSerializer slzr = null; for (IDataSerializer IDS : serializers) { if (IDS.handles(clazz) && (slzr == null || slzr.getPriority() clazz, Object obj, DataOutputStream dataOut) throws IOException { if (clazz == int.class || clazz == Integer.class) dataOut.writeInt((Integer)obj); else if (clazz == boolean.class || clazz == Boolean.class) @@ -66,7 +66,7 @@ public static void serialize(Object obj, DataOutputStream dataOut) throws IOExce serialize(obj.getClass(), obj, dataOut); } - public static Object deserialize(Class clazz, ByteArrayDataInput dataIn) throws IOException { + public static Object deserialize(Class clazz, ByteArrayDataInput dataIn) throws IOException { if (clazz == int.class || clazz == Integer.class) return dataIn.readInt(); diff --git a/src/main/java/ml/core/data/serializers/SArray.java b/src/main/java/ml/core/data/serializers/SArray.java index d896465..375fc7c 100644 --- a/src/main/java/ml/core/data/serializers/SArray.java +++ b/src/main/java/ml/core/data/serializers/SArray.java @@ -12,13 +12,13 @@ public class SArray implements IDataSerializer { @Override - public boolean handles(Class clazz) { + public boolean handles(Class clazz) { return clazz.isArray(); } @Override - public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { - Class cls = clazz.getComponentType(); + public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { + Class cls = clazz.getComponentType(); int len = dIn.readInt(); Object arr = Array.newInstance(cls, len); @@ -30,8 +30,6 @@ public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOExceptio @Override public void serialize(Object array, DataOutputStream dataOut) throws IOException { - Class cls = array.getClass().getComponentType(); - int len = Array.getLength(array); dataOut.writeInt(len); for (int i=0; i clazz) { return clazz == BlockCoord.class; } @Override - public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { + public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { return new BlockCoord(dIn.readInt(), dIn.readInt(), dIn.readInt()); } diff --git a/src/main/java/ml/core/data/serializers/SForgeDirection.java b/src/main/java/ml/core/data/serializers/SForgeDirection.java index 4f99497..1f2cff2 100644 --- a/src/main/java/ml/core/data/serializers/SForgeDirection.java +++ b/src/main/java/ml/core/data/serializers/SForgeDirection.java @@ -4,19 +4,19 @@ import java.io.IOException; import ml.core.data.IDataSerializer; -import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.util.ForgeDirection; import com.google.common.io.ByteArrayDataInput; public class SForgeDirection implements IDataSerializer { @Override - public boolean handles(Class clazz) { + public boolean handles(Class clazz) { return clazz == ForgeDirection.class; } @Override - public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { + public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { return ForgeDirection.values()[dIn.readInt()]; } diff --git a/src/main/java/ml/core/data/serializers/SItemsStack.java b/src/main/java/ml/core/data/serializers/SItemsStack.java index 8ab4d46..ca20769 100644 --- a/src/main/java/ml/core/data/serializers/SItemsStack.java +++ b/src/main/java/ml/core/data/serializers/SItemsStack.java @@ -4,6 +4,7 @@ import java.io.IOException; import ml.core.data.IDataSerializer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -12,12 +13,12 @@ public class SItemsStack implements IDataSerializer { @Override - public boolean handles(Class clazz) { + public boolean handles(Class clazz) { return clazz==ItemStack.class || ItemStack.class.isAssignableFrom(clazz); } @Override - public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { + public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { ItemStack var1 = null; short var2 = dIn.readShort(); @@ -25,7 +26,7 @@ public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOExceptio { byte var3 = dIn.readByte(); short var4 = dIn.readShort(); - var1 = new ItemStack(var2, var3, var4); + var1 = new ItemStack(Item.getItemById(var2), var3, var4); var1.stackTagCompound = SNBTTagCompound.readNBTTagCompound(dIn); } @@ -38,7 +39,7 @@ public void serialize(Object obj, DataOutputStream dOut) throws IOException { if (is == null) { dOut.writeShort(-1); } else { - dOut.writeShort(is.itemID); + dOut.writeShort(Item.getIdFromItem(is.getItem())); dOut.writeByte(is.stackSize); dOut.writeShort(is.getItemDamage()); NBTTagCompound var2 = null; diff --git a/src/main/java/ml/core/data/serializers/SNBTTagCompound.java b/src/main/java/ml/core/data/serializers/SNBTTagCompound.java index 1029950..d96b150 100644 --- a/src/main/java/ml/core/data/serializers/SNBTTagCompound.java +++ b/src/main/java/ml/core/data/serializers/SNBTTagCompound.java @@ -12,12 +12,12 @@ public class SNBTTagCompound implements IDataSerializer { @Override - public boolean handles(Class clazz) { + public boolean handles(Class clazz) { return clazz == NBTTagCompound.class; } @Override - public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { + public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { return readNBTTagCompound(dIn); } diff --git a/src/main/java/ml/core/data/serializers/SString.java b/src/main/java/ml/core/data/serializers/SString.java index caaf9cd..e259d17 100644 --- a/src/main/java/ml/core/data/serializers/SString.java +++ b/src/main/java/ml/core/data/serializers/SString.java @@ -10,12 +10,12 @@ public class SString implements IDataSerializer { @Override - public boolean handles(Class clazz) { + public boolean handles(Class clazz) { return clazz==String.class; } @Override - public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { + public Object deserialize(Class clazz, ByteArrayDataInput dIn) throws IOException { return readString(dIn, 256); } diff --git a/src/main/java/ml/core/gui/GuiRenderUtils.java b/src/main/java/ml/core/gui/GuiRenderUtils.java index 6f6bb6a..3dd1600 100644 --- a/src/main/java/ml/core/gui/GuiRenderUtils.java +++ b/src/main/java/ml/core/gui/GuiRenderUtils.java @@ -4,7 +4,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; -import net.minecraft.util.Icon; +import net.minecraft.util.IIcon; import org.lwjgl.opengl.GL11; @@ -13,7 +13,6 @@ @SideOnly(Side.CLIENT) public class GuiRenderUtils { - public static RenderItem renderItem = new RenderItem(); public static int zLevel = 0; @@ -107,11 +106,11 @@ public static void drawSlicedRect(int x, int y, int w, int h, int uBase, int vBa drawSlicedRect(x, y, w, h, uBase, vBase, uW, uH, bord, bord, bord, bord); } - public static void drawTexturedModelRectFromIcon(int par1, int par2, Icon par3Icon, int par4, int par5) { + public static void drawTexturedModelRectFromIcon(int par1, int par2, IIcon par3Icon, int par4, int par5) { drawTexturedModelRect(par1, par2, par3Icon.getMinU(), par3Icon.getMinV(), par3Icon.getMaxU(), par3Icon.getMaxV(), par4, par5); } - public static void drawSlicedRectFromIcon(int x, int y, int w, int h, Icon i, int tBord, int rBord, int bBord, int lBord) { + public static void drawSlicedRectFromIcon(int x, int y, int w, int h, IIcon i, int tBord, int rBord, int bBord, int lBord) { double dtBord = (double)tBord / (double)i.getIconHeight(); double dbBord = (double)bBord / (double)i.getIconHeight(); double drBord = (double)tBord / (double)i.getIconWidth(); diff --git a/src/main/java/ml/core/internal/PacketContainerData.java b/src/main/java/ml/core/internal/PacketContainerData.java index f5319b0..7b590a9 100644 --- a/src/main/java/ml/core/internal/PacketContainerData.java +++ b/src/main/java/ml/core/internal/PacketContainerData.java @@ -17,7 +17,7 @@ public class PacketContainerData extends MLPacket { public @data NBTTagCompound payload; public PacketContainerData(EntityPlayer pl, ByteArrayDataInput dataIn) { - super(pl, dataIn); + super(dataIn); } public PacketContainerData(int windowId, NBTTagCompound payload) { @@ -27,6 +27,15 @@ public PacketContainerData(int windowId, NBTTagCompound payload) { } @Override + public void handleClientSide(EntityPlayer epl) throws IOException { + handle(epl, Side.CLIENT); + } + + @Override + public void handleServerSide(EntityPlayer epl) throws IOException { + handle(epl, Side.SERVER); + } + public void handle(EntityPlayer epl, Side side) throws IOException { if (epl.openContainer instanceof MLContainer && epl.openContainer.windowId == winId) { ((MLContainer)epl.openContainer).handleDataPacket(payload, side); diff --git a/src/main/java/ml/core/inventory/CustomSlotClick.java b/src/main/java/ml/core/inventory/CustomSlotClick.java index 0b6b034..11dc19b 100644 --- a/src/main/java/ml/core/inventory/CustomSlotClick.java +++ b/src/main/java/ml/core/inventory/CustomSlotClick.java @@ -123,12 +123,12 @@ public ItemStack slotClick(int slotNum, int arg, int action, EntityPlayer par4En if (slotNum == -999) { if (inventoryplayer.getItemStack() != null && slotNum == -999) { if (arg == 0) { - par4EntityPlayer.dropPlayerItem(inventoryplayer.getItemStack()); + par4EntityPlayer.dropPlayerItemWithRandomChoice(inventoryplayer.getItemStack(), true); inventoryplayer.setItemStack((ItemStack)null); } if (arg == 1) { - par4EntityPlayer.dropPlayerItem(inventoryplayer.getItemStack().splitStack(1)); + par4EntityPlayer.dropPlayerItemWithRandomChoice(inventoryplayer.getItemStack().splitStack(1), true); if (inventoryplayer.getItemStack().stackSize == 0) { inventoryplayer.setItemStack((ItemStack)null); @@ -284,7 +284,7 @@ public ItemStack slotClick(int slotNum, int arg, int action, EntityPlayer par4En if (slot2 != null && slot2.getHasStack()) { itemstack1 = slot2.decrStackSize(arg == 0 ? 1 : slot2.getStack().stackSize); slot2.onPickupFromSlot(par4EntityPlayer, itemstack1); - par4EntityPlayer.dropPlayerItem(itemstack1); + par4EntityPlayer.dropPlayerItemWithRandomChoice(itemstack1, true); } } else if (action == 6 && slotNum >= 0) { slot2 = this.inventorySlots.get(slotNum); diff --git a/src/main/java/ml/core/network/MLPacket.java b/src/main/java/ml/core/network/MLPacket.java index fc496b0..f23adf1 100644 --- a/src/main/java/ml/core/network/MLPacket.java +++ b/src/main/java/ml/core/network/MLPacket.java @@ -1,5 +1,8 @@ package ml.core.network; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -12,13 +15,10 @@ import ml.core.data.IDataSerializer; import ml.core.data.Serialization; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.packet.Packet250CustomPayload; import com.google.common.io.ByteArrayDataInput; -import cpw.mods.fml.common.network.PacketDispatcher; -import cpw.mods.fml.common.network.Player; -import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.common.network.internal.FMLProxyPacket; public abstract class MLPacket { @@ -33,14 +33,14 @@ public abstract class MLPacket { // Incoming - public MLPacket(EntityPlayer pl, ByteArrayDataInput dataIn) { + public MLPacket(ByteArrayDataInput dataIn) { try { Field[] flds = this.getClass().getFields(); Arrays.sort(flds, fldComparator); for (Field fld : flds) { data ann = fld.getAnnotation(data.class); if (ann != null) { - Class cls = fld.getType(); + Class cls = fld.getType(); Object v = Serialization.deserialize(cls, dataIn); fld.set(this, v); } @@ -50,14 +50,6 @@ public MLPacket(EntityPlayer pl, ByteArrayDataInput dataIn) { } } - public void handle(EntityPlayer epl, Side side) throws IOException { - if (side == Side.CLIENT) { - handleClientSide(epl); - } else { - handleServerSide(epl); - } - } - public void handleClientSide(EntityPlayer epl) throws IOException {}; public void handleServerSide(EntityPlayer epl) throws IOException {}; @@ -71,9 +63,10 @@ public MLPacket(String ch) { channel = ch; } - public Packet250CustomPayload convertToPkt250() { - ByteArrayOutputStream dataOutRaw = new ByteArrayOutputStream(); - DataOutputStream dataOut = new DataOutputStream(dataOutRaw); + public FMLProxyPacket convertToFMLPacket() { + ByteBuf buf = Unpooled.buffer(); +// ByteArrayOutputStream dataOutRaw = new ByteArrayOutputStream(); +// DataOutputStream dataOut = new DataOutputStream(dataOutRaw); try { dataOut.writeInt(packetID); @@ -83,7 +76,7 @@ public Packet250CustomPayload convertToPkt250() { for (Field fld : flds) { data ann = fld.getAnnotation(data.class); if (ann != null) { - Class cls = fld.getType(); + Class cls = fld.getType(); Serialization.serialize(cls, fld.get(this), dataOut); } } @@ -91,29 +84,7 @@ public Packet250CustomPayload convertToPkt250() { e.printStackTrace(); } - Packet250CustomPayload mcPkt = new Packet250CustomPayload(channel, dataOutRaw.toByteArray()); - mcPkt.isChunkDataPacket = chunkDataPacket; - return mcPkt; - } - - public void dispatchToServer() { - PacketDispatcher.sendPacketToServer(convertToPkt250()); - } - - public void dispatchToPlayer(EntityPlayer epl) { - PacketDispatcher.sendPacketToPlayer(convertToPkt250(), (Player)epl); - } - - public void dispatchToDimension(int dimId) { - PacketDispatcher.sendPacketToAllInDimension(convertToPkt250(), dimId); - } - - public void dispatchToAllNear(double X, double Y, double Z, double range, int dimensionId) { - PacketDispatcher.sendPacketToAllAround(X, Y, Z, range, dimensionId, convertToPkt250()); - } - - public void dispatchToAll() { - PacketDispatcher.sendPacketToAllPlayers(convertToPkt250()); + return new FMLProxyPacket(buf, channel); } private Comparator fldComparator = new Comparator() { diff --git a/src/main/java/ml/core/network/PacketHandler.java b/src/main/java/ml/core/network/PacketHandler.java index 8b9de13..1b845bb 100644 --- a/src/main/java/ml/core/network/PacketHandler.java +++ b/src/main/java/ml/core/network/PacketHandler.java @@ -1,31 +1,44 @@ package ml.core.network; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageCodec; + import java.lang.reflect.Constructor; +import java.util.EnumMap; import java.util.List; import java.util.logging.Level; import ml.core.internal.CoreLogger; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.INetworkManager; -import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -import com.google.common.io.ByteArrayDataInput; -import com.google.common.io.ByteStreams; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.network.IPacketHandler; -import cpw.mods.fml.common.network.Player; +import cpw.mods.fml.common.network.FMLEmbeddedChannel; +import cpw.mods.fml.common.network.FMLOutboundHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.internal.FMLProxyPacket; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** * Thanks to MachineMuse for the idea on how to implement this * @author Matchlighter */ -public class PacketHandler implements IPacketHandler { +public class PacketHandler extends MessageToMessageCodec { + private EnumMap channels; protected static BiMap> PacketTypes = HashBiMap.create(); + public PacketHandler(String channel) { + this.channels = NetworkRegistry.INSTANCE.newChannel(channel, this); + } + public static void addHandler(Class pktClass){ PacketTypes.put(PacketTypes.size(), pktClass); } @@ -36,44 +49,73 @@ public static void addHandlers(List> pktClss) { } } - @Override - public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) { - EntityPlayer entPl = (EntityPlayer)player; - - MLPacket mlPkt = tryCastPacket(packet, entPl); - if (mlPkt != null){ - try { - mlPkt.handle(entPl, FMLCommonHandler.instance().getEffectiveSide()); - } catch (Exception e) { - onError(e, mlPkt); - } - } else { - CoreLogger.severe("("+this.getClass().toString()+") received unknown packet"); - } - } - protected void onError(Throwable e, MLPacket mlPkt) { CoreLogger.log(Level.SEVERE, "Error handling packet in channel ("+mlPkt.channel+")", e); } - private static MLPacket tryCastPacket(Packet250CustomPayload pkt, EntityPlayer pl){ - ByteArrayDataInput dat = ByteStreams.newDataInput(pkt.data); - int pkId = dat.readInt(); + public static int findPacketId(Class pktClass){ + return PacketTypes.inverse().get(pktClass); + } + + @Override + protected void encode(ChannelHandlerContext ctx, MLPacket msg, List out) throws Exception { + out.add(msg.convertToFMLPacket()); + } + + @Override + protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List out) throws Exception { + ByteBuf buf = msg.payload(); + int pkId = buf.readInt(); if (PacketTypes.get(pkId) != null){ try { - Constructor contructor = PacketTypes.get(pkId).getConstructor(EntityPlayer.class, ByteArrayDataInput.class); - MLPacket nPkt = contructor.newInstance(pl, dat); - nPkt.channel = pkt.channel; - return nPkt; + Constructor contructor = PacketTypes.get(pkId).getConstructor(ByteBuf.class); + MLPacket nPkt = contructor.newInstance(buf); + nPkt.channel = msg.channel(); + + Side side = msg.getTarget(); + if (side == Side.CLIENT) { + nPkt.handleClientSide(getClientPlayer()); + } else { + INetHandler netHandler = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get(); + nPkt.handleServerSide(((NetHandlerPlayServer) netHandler).playerEntity); + } + } catch (Exception e) { e.printStackTrace(); } - } - return null; } - public static int findPacketId(Class pktClass){ - return PacketTypes.inverse().get(pktClass); + @SideOnly(Side.CLIENT) + private EntityPlayer getClientPlayer() { + return Minecraft.getMinecraft().thePlayer; + } + + public void sendToAll(MLPacket message) { + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); + this.channels.get(Side.SERVER).writeAndFlush(message); + } + + public void sendTo(MLPacket message, EntityPlayerMP player) { + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); + this.channels.get(Side.SERVER).writeAndFlush(message); + } + + public void sendToAllAround(MLPacket message, NetworkRegistry.TargetPoint point) { + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + this.channels.get(Side.SERVER).writeAndFlush(message); + } + + public void sendToDimension(MLPacket message, int dimensionId) { + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION); + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId); + this.channels.get(Side.SERVER).writeAndFlush(message); + } + + public void sendToServer(MLPacket message) { + this.channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER); + this.channels.get(Side.CLIENT).writeAndFlush(message); } } diff --git a/src/main/java/ml/core/texture/ConnectedTexture.java b/src/main/java/ml/core/texture/ConnectedTexture.java index 64301aa..34843cc 100644 --- a/src/main/java/ml/core/texture/ConnectedTexture.java +++ b/src/main/java/ml/core/texture/ConnectedTexture.java @@ -4,7 +4,7 @@ import ml.core.block.BlockUtils.SpatialRelation; import ml.core.vec.BlockCoord; import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.util.ForgeDirection; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/ml/core/texture/CustomTextureMapManager.java b/src/main/java/ml/core/texture/CustomTextureMapManager.java index da03dc3..7823353 100644 --- a/src/main/java/ml/core/texture/CustomTextureMapManager.java +++ b/src/main/java/ml/core/texture/CustomTextureMapManager.java @@ -5,7 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.TextureStitchEvent; -import net.minecraftforge.event.ForgeSubscribe; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -19,7 +19,7 @@ public class CustomTextureMapManager { public void registerMap(CustomTextureMap map) { if (maps.contains(map)) - throw new RuntimeException("TextureMap type " + map.textureType + " is already registered."); + throw new RuntimeException("TextureMap type " + map.getTextureType() + " is already registered."); maps.add(map); Minecraft mc = Minecraft.getMinecraft(); @@ -30,10 +30,10 @@ public void registerMap(CustomTextureMap map) { } catch (IOException e) {} } - @ForgeSubscribe + @SubscribeEvent public void reregisterIcons(TextureStitchEvent.Pre evt) { Minecraft mc = Minecraft.getMinecraft(); - if (evt.map.textureType==0) { + if (evt.map.getTextureType()==0) { for (CustomTextureMap map : maps) { try { map.loadTexture(mc.getResourceManager()); diff --git a/src/main/java/ml/core/texture/IIconProvider.java b/src/main/java/ml/core/texture/IIconProvider.java index 12430ce..fcec516 100644 --- a/src/main/java/ml/core/texture/IIconProvider.java +++ b/src/main/java/ml/core/texture/IIconProvider.java @@ -1,7 +1,7 @@ package ml.core.texture; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; public interface IIconProvider { - public void registerIcons(IconRegister ireg); + public void registerIcons(IIconRegister ireg); } \ No newline at end of file diff --git a/src/main/java/ml/core/texture/TextureSheet.java b/src/main/java/ml/core/texture/TextureSheet.java index 86dc175..ec4bad6 100644 --- a/src/main/java/ml/core/texture/TextureSheet.java +++ b/src/main/java/ml/core/texture/TextureSheet.java @@ -10,12 +10,12 @@ import javax.imageio.ImageIO; import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.resources.ResourceManager; +import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.SimpleResource; -import net.minecraft.util.Icon; +import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -38,8 +38,7 @@ protected TextureSprite(String par1, int tindex) { } @Override - public boolean load(ResourceManager manager, ResourceLocation location) - throws IOException { + public boolean load(IResourceManager manager, ResourceLocation location) { int offX = index%tilesX * swidth; int offY = index/tilesY * sheight; @@ -52,6 +51,11 @@ public boolean load(ResourceManager manager, ResourceLocation location) return true; } + @Override + public boolean hasCustomLoader(IResourceManager manager, ResourceLocation location) { + return true; + } + } protected TextureSprite[] sprites; @@ -75,7 +79,7 @@ public TextureSheet(String fl, int tilesX, int tilesY) { /** * Call in your code (e.g. on {@link Block#registerIcons(IconRegister)}) */ - public void registerIcons(IconRegister reg) { + public void registerIcons(IIconRegister reg) { TextureMap tmap = (TextureMap)reg; if (TextureUtils.shouldReloadTexture(tmap, texFile)) { loadMasterImg(); @@ -109,7 +113,7 @@ public void initSpriteList(int[] indices) { } } - public Icon getSprite(int i) { + public IIcon getSprite(int i) { return sprites[i]; } } diff --git a/src/main/java/ml/core/vec/BlockCoord.java b/src/main/java/ml/core/vec/BlockCoord.java index 9cada84..bfeff6c 100644 --- a/src/main/java/ml/core/vec/BlockCoord.java +++ b/src/main/java/ml/core/vec/BlockCoord.java @@ -2,7 +2,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.util.ForgeDirection; public class BlockCoord { public int x; @@ -22,7 +22,7 @@ public BlockCoord(TileEntity te) { } public TileEntity getTileEntity(World wrld) { - return wrld.getBlockTileEntity(x, y, z); + return wrld.getTileEntity(x, y, z); } @Override diff --git a/src/main/java/ml/core/world/WorldGenHandler.java b/src/main/java/ml/core/world/WorldGenHandler.java index d74b3ae..75437d9 100644 --- a/src/main/java/ml/core/world/WorldGenHandler.java +++ b/src/main/java/ml/core/world/WorldGenHandler.java @@ -1,7 +1,6 @@ package ml.core.world; import java.util.Collection; -import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; import java.util.Random; @@ -15,17 +14,17 @@ import net.minecraft.world.WorldSavedData; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; -import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.world.ChunkEvent; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.IWorldGenerator; -import cpw.mods.fml.common.TickType; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.gameevent.TickEvent.Phase; -public class WorldGenHandler implements IWorldGenerator, ITickHandler { +public class WorldGenHandler implements IWorldGenerator { public static final WorldGenHandler instance = new WorldGenHandler(); private final Multimap genFeatures = HashMultimap.create(); @@ -37,7 +36,7 @@ public void registerGenerator(String modId, IFeatureGenerator gen) { genFeatures.put(modId, gen); } - @ForgeSubscribe + @SubscribeEvent public void handleChunkLoad(ChunkEvent.Load evt) { World w = evt.world; Chunk c = evt.getChunk(); @@ -60,6 +59,39 @@ public void handleChunkLoad(ChunkEvent.Load evt) { } } + public void tickWorld(TickEvent.WorldTickEvent evt) { + if (evt.phase == Phase.END) { + World world = evt.world; + int dimid = world.provider.dimensionId; + + if (genQueue.get(dimid).size() > 0) { + Iterator iter = genQueue.get(dimid).iterator(); + + int count=0; + while (iter.hasNext()) { + RetroQueueItem rqi = iter.next(); + iter.remove(); + + long worldSeed = world.getSeed(); + Random rand = new Random(worldSeed); + long xSeed = rand.nextLong() >> 2 + 1L; + long zSeed = rand.nextLong() >> 2 + 1L; + long chunkSeed = (xSeed * rqi.chunkX + zSeed * rqi.chunkZ) ^ worldSeed; + rand.setSeed(chunkSeed); + + rqi.feature.doGeneration(rand, rqi.chunkX, rqi.chunkZ, world, true, rqi.lastVer); + rqi.rdb.markRetroJobDone(rqi.chunkX, rqi.chunkZ, rqi.feature.getGenIdentifier(), rqi.feature.getFeatureVersion()); + + count++; + if (count > 32) + break; + } + + CoreLogger.info(count+" chunks have been retro-generated. "+genQueue.get(dimid).size()+" more left."); + } + } + } + /** * Standard, first-time chunk generation. */ @@ -87,52 +119,7 @@ private RetroDataBase getRetroDataBase(World w, String modId) { } return rdb; } - - @Override - public void tickStart(EnumSet type, Object... tickData) {} - - @Override - public void tickEnd(EnumSet type, Object... tickData) { - World world = (World)tickData[0]; - int dimid = world.provider.dimensionId; - - if (genQueue.get(dimid).size() > 0) { - Iterator iter = genQueue.get(dimid).iterator(); - int count=0; - while (iter.hasNext()) { - RetroQueueItem rqi = iter.next(); - iter.remove(); - - long worldSeed = world.getSeed(); - Random rand = new Random(worldSeed); - long xSeed = rand.nextLong() >> 2 + 1L; - long zSeed = rand.nextLong() >> 2 + 1L; - long chunkSeed = (xSeed * rqi.chunkX + zSeed * rqi.chunkZ) ^ worldSeed; - rand.setSeed(chunkSeed); - - rqi.feature.doGeneration(rand, rqi.chunkX, rqi.chunkZ, world, true, rqi.lastVer); - rqi.rdb.markRetroJobDone(rqi.chunkX, rqi.chunkZ, rqi.feature.getGenIdentifier(), rqi.feature.getFeatureVersion()); - - count++; - if (count > 32) - break; - } - - CoreLogger.info(count+" chunks have been retro-generated. "+genQueue.get(dimid).size()+" more left."); - } - } - - @Override - public EnumSet ticks() { - return EnumSet.of(TickType.WORLD); - } - - @Override - public String getLabel() { - return "MLCore:WorldGen"; - } - private static class RetroQueueItem { final World w; final int chunkX; @@ -191,9 +178,9 @@ public void markRetroJobDone(int chunkX, int chunkZ, String jobId, int jlevel) { @Override public void readFromNBT(NBTTagCompound nbt) { - NBTTagList lst = (NBTTagList)nbt.getTagList("chunks"); + NBTTagList lst = (NBTTagList)nbt.getTagList("chunks", 10); for (int i=0; i Date: Fri, 11 Jul 2014 16:22:32 -0600 Subject: [PATCH 18/21] Added some controls. Added ToolTips. Fixed visibility check. Fixed misc bugs. --- .../ml/core/block/BlockDelegator.java | 2 +- .../ml/core/block/DelegateBlock.java | 4 +++ .../gui/controls/box/ControlAutoSizedBox.java | 20 ++++++++++++ .../ml/core/gui/controls/box/ControlBox.java | 20 ++++++++++++ .../gui/controls/box/ControlCenteredBox.java | 25 +++++++++++++++ .../gui/controls/inventory/ControlSlot.java | 5 +++ .../gui/controls/tabs/TabDynamicLedger.java | 20 ++++++++++++ .../ml/core/gui/controls/tabs/TabLedger.java | 31 ++++++++++++++++--- .../ml/core/gui/core/GuiElement.java | 20 +++++++----- .../ml/core/gui/core/MLGuiClient.java | 18 ++++++++--- 10 files changed, 149 insertions(+), 16 deletions(-) create mode 100644 src/minecraft/ml/core/gui/controls/box/ControlAutoSizedBox.java create mode 100644 src/minecraft/ml/core/gui/controls/box/ControlBox.java create mode 100644 src/minecraft/ml/core/gui/controls/box/ControlCenteredBox.java create mode 100644 src/minecraft/ml/core/gui/controls/tabs/TabDynamicLedger.java diff --git a/src/minecraft/ml/core/block/BlockDelegator.java b/src/minecraft/ml/core/block/BlockDelegator.java index 0ed202f..0ed4d87 100644 --- a/src/minecraft/ml/core/block/BlockDelegator.java +++ b/src/minecraft/ml/core/block/BlockDelegator.java @@ -120,7 +120,7 @@ public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) for (Integer i : subBlocks.keySet()) { DCls sub = subBlocks.get(i); for (int a=0; a lines = new ArrayList(); + lines.add(getTitle()); + getGui().drawHoveringText(lines, mX, mY, getMC().fontRenderer); + } + @Override public boolean isChildVisible(GuiElement elm) { return isFullyOpen() && super.isChildVisible(elm); diff --git a/src/minecraft/ml/core/gui/core/GuiElement.java b/src/minecraft/ml/core/gui/core/GuiElement.java index a3de788..27c35e0 100644 --- a/src/minecraft/ml/core/gui/core/GuiElement.java +++ b/src/minecraft/ml/core/gui/core/GuiElement.java @@ -125,7 +125,7 @@ public boolean isVisible() { } public boolean isChildVisible(GuiElement elm) { - return elm.isVisible(); + return elm.isVisible() && ((getParent() != null && getParent().isChildVisible(this)) || isTopParentElem()); } // ------------------------ Size Stuff ------------------------ // @@ -139,14 +139,17 @@ public void setSize(int w, int h) { setSize(new Vector2i(w, h)); } - public Vector2i calculateChildrenSize() { - int mx=0, my=0; + public Rectangle calculateControlBox() { + int minx=Integer.MAX_VALUE, miny=Integer.MAX_VALUE, maxw=0, maxh=0; + for (GuiElement elm : childObjects) { - int xw = elm.getLocalPosition().x + elm.getSize().x, yh = elm.getLocalPosition().y + elm.getSize().y; - if (xw > mx) mx = xw; - if (yh > my) my = yh; + minx = Math.min(minx, elm.getLocalPosition().x); + miny = Math.min(miny, elm.getLocalPosition().y); + maxw = Math.max(maxw, elm.getSize().x); + maxh = Math.max(maxh, elm.getSize().y); } - return new Vector2i(mx, my); + + return new Rectangle(minx, miny, maxw, maxh); } // ------------------------ Position Stuff ------------------------ // @@ -324,6 +327,9 @@ public void drawForeground(float partialTick) {} @SideOnly(Side.CLIENT) public void drawOverlay(float partialTick) {} + @SideOnly(Side.CLIENT) + public void drawTooltip(int mX, int mY, float partialTick) {} + /** * Always make a super call or a call to drawChilds() as your last call. It will render children.
* Your matrix will be localized to the parent element, so you need to shift by your local position.
diff --git a/src/minecraft/ml/core/gui/core/MLGuiClient.java b/src/minecraft/ml/core/gui/core/MLGuiClient.java index e0c6dad..9794d05 100644 --- a/src/minecraft/ml/core/gui/core/MLGuiClient.java +++ b/src/minecraft/ml/core/gui/core/MLGuiClient.java @@ -16,6 +16,7 @@ import ml.core.gui.event.mouse.EventMouseUp; import ml.core.vec.Vector2i; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.inventory.Slot; @@ -43,7 +44,7 @@ public TopParentGuiElement getPrimaryElement() { private List eSlots = new ArrayList(); @Override - public void drawScreen(int mX, int mY, float par3) { + public void drawScreen(int mX, int mY, float partialTick) { if (mX != priElemement.gmousePos.x || mY != priElemement.gmousePos.y) { priElemement.injectEvent(new EventMouseMove(priElemement, new Vector2i(mX, mY).minus(priElemement.gmousePos))); priElemement.gmousePos.set(mX, mY); @@ -56,8 +57,12 @@ public void drawScreen(int mX, int mY, float par3) { priElemement.injectEvent(new EventMouseEntered(priElemement.hoverElement)); } } - super.drawScreen(mX, mY, par3); - matrixAndDraw(RenderStage.Overlay, par3); + super.drawScreen(mX, mY, partialTick); + matrixAndDraw(RenderStage.Overlay, partialTick); + + if (priElemement.hoverElement != null) { + priElemement.hoverElement.drawTooltip(mX, mY, partialTick); + } } public void refreshSize() { @@ -115,7 +120,12 @@ public void drawSpecialSlotInventory(ControlSlot slt) { super.drawSlotInventory(slt.getSlot()); GL11.glPopMatrix(); } - + + @Override + public void drawHoveringText(List lines, int mX, int mY, FontRenderer font) { + super.drawHoveringText(lines, mX, mY, font); + } + private GuiElement mouseDownEl; private long mouseDownTime; From 8218715c48e1e628116a50f7aae2d60bc7136abe Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sat, 12 Jul 2014 17:27:03 -0600 Subject: [PATCH 19/21] Moved Book classes from SGWorlds. Added a queue feature for ContasinerData packets. Added a work around for a NetServerHandler NPE. --- src/minecraft/ml/core/book/BlankPage.java | 14 + .../ml/core/book/ChapterHeaderPage.java | 42 +++ src/minecraft/ml/core/book/Page.java | 24 ++ src/minecraft/ml/core/book/TextPage.java | 29 +++ src/minecraft/ml/core/book/TitlePage.java | 36 +++ src/minecraft/ml/core/book/WindowBook.java | 246 ++++++++++++++++++ src/minecraft/ml/core/gui/MLGuiHandler.java | 2 + .../ml/core/gui/core/MLContainer.java | 29 +++ .../ml/core/internal/PacketContainerData.java | 12 + .../world/structure/MLStructureComponent.java | 63 +++-- 10 files changed, 472 insertions(+), 25 deletions(-) create mode 100644 src/minecraft/ml/core/book/BlankPage.java create mode 100644 src/minecraft/ml/core/book/ChapterHeaderPage.java create mode 100644 src/minecraft/ml/core/book/Page.java create mode 100644 src/minecraft/ml/core/book/TextPage.java create mode 100644 src/minecraft/ml/core/book/TitlePage.java create mode 100644 src/minecraft/ml/core/book/WindowBook.java diff --git a/src/minecraft/ml/core/book/BlankPage.java b/src/minecraft/ml/core/book/BlankPage.java new file mode 100644 index 0000000..55e5278 --- /dev/null +++ b/src/minecraft/ml/core/book/BlankPage.java @@ -0,0 +1,14 @@ +package ml.core.book; + +import net.minecraft.client.Minecraft; + +public class BlankPage extends Page { + + public BlankPage(WindowBook window) { + super(window); + } + + @Override + public void drawPage(Minecraft mc, int x, int y, int w, int h, float partialTick) {} + +} diff --git a/src/minecraft/ml/core/book/ChapterHeaderPage.java b/src/minecraft/ml/core/book/ChapterHeaderPage.java new file mode 100644 index 0000000..e3f07b1 --- /dev/null +++ b/src/minecraft/ml/core/book/ChapterHeaderPage.java @@ -0,0 +1,42 @@ +package ml.core.book; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.Minecraft; + +public class ChapterHeaderPage extends Page { + + public List title; + public List text = new ArrayList(); + + public ChapterHeaderPage(WindowBook window, String title, List text) { + super(window); + + this.title = getFontRenderer().listFormattedStringToWidth(title, window.getPageWidth()); + + int h = (int)(window.pageHeight * 0.25F) + (this.title.size()*getFontRenderer().FONT_HEIGHT)/2 + getFontRenderer().FONT_HEIGHT; + + while ((h+=getFontRenderer().FONT_HEIGHT) < window.getPageHeight() && text.size()>0) { + this.text.add(text.remove(0)); + } + } + + @Override + public void drawPage(Minecraft mc, int x, int y, int w, int h, float partialTick) { + + y = y + (int)(h*0.25F) - (title.size()*mc.fontRenderer.FONT_HEIGHT)/2; + + for (String ln : title) { + mc.fontRenderer.drawString(ln, x+(w-mc.fontRenderer.getStringWidth(ln))/2, y, 0x000000); + y += mc.fontRenderer.FONT_HEIGHT; + } + + y += mc.fontRenderer.FONT_HEIGHT; + for (String ln : text) { + mc.fontRenderer.drawString(ln, x, y, 0x000000); + y += mc.fontRenderer.FONT_HEIGHT; + } + } + +} diff --git a/src/minecraft/ml/core/book/Page.java b/src/minecraft/ml/core/book/Page.java new file mode 100644 index 0000000..62d2c19 --- /dev/null +++ b/src/minecraft/ml/core/book/Page.java @@ -0,0 +1,24 @@ +package ml.core.book; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public abstract class Page { + + public final WindowBook window; + + public Page(WindowBook window) { + this.window = window; + } + + @SideOnly(Side.CLIENT) + public abstract void drawPage(Minecraft mc, int x, int y, int w, int h, float partialTick); + + @SideOnly(Side.CLIENT) + public FontRenderer getFontRenderer() { + return FMLClientHandler.instance().getClient().fontRenderer; + } +} diff --git a/src/minecraft/ml/core/book/TextPage.java b/src/minecraft/ml/core/book/TextPage.java new file mode 100644 index 0000000..fa03e2a --- /dev/null +++ b/src/minecraft/ml/core/book/TextPage.java @@ -0,0 +1,29 @@ +package ml.core.book; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.Minecraft; + +public class TextPage extends Page { + + protected List text = new ArrayList(); + + public TextPage(WindowBook window, List text) { + super(window); + + int h = 0; + while ((h+=getFontRenderer().FONT_HEIGHT) < window.getPageHeight() && text.size()>0) { + this.text.add(text.remove(0)); + } + } + + @Override + public void drawPage(Minecraft mc, int x, int y, int w, int h, float partialTick) { + for (String ln : text) { + mc.fontRenderer.drawString(ln, x, y, 0x000000); + y+=mc.fontRenderer.FONT_HEIGHT; + } + } + +} diff --git a/src/minecraft/ml/core/book/TitlePage.java b/src/minecraft/ml/core/book/TitlePage.java new file mode 100644 index 0000000..ae0f57c --- /dev/null +++ b/src/minecraft/ml/core/book/TitlePage.java @@ -0,0 +1,36 @@ +package ml.core.book; + +import java.util.List; + +import net.minecraft.client.Minecraft; + +import org.lwjgl.opengl.GL11; + +public class TitlePage extends Page { + + protected String title; + protected String subtitle; + + public TitlePage(WindowBook window, String title, String subtitle) { + super(window); + this.title = title; + this.subtitle = subtitle; + } + + @Override + public void drawPage(Minecraft mc, int x, int y, int w, int h, float partialTick) { + List lines = mc.fontRenderer.listFormattedStringToWidth(title, w); + y = y + (h-lines.size()*mc.fontRenderer.FONT_HEIGHT)/2; + for (String ln : lines) { + mc.fontRenderer.drawString(ln, x+(w-mc.fontRenderer.getStringWidth(ln))/2, y, 0x000000); + y += mc.fontRenderer.FONT_HEIGHT; + } + + GL11.glPushMatrix(); + GL11.glTranslatef(x + w/2, y , 0); + GL11.glScalef(0.5F, 0.5F, 1); + mc.fontRenderer.drawString(subtitle, -mc.fontRenderer.getStringWidth(subtitle)/2, 0, 0x000000); + GL11.glPopMatrix(); + } + +} diff --git a/src/minecraft/ml/core/book/WindowBook.java b/src/minecraft/ml/core/book/WindowBook.java new file mode 100644 index 0000000..d723546 --- /dev/null +++ b/src/minecraft/ml/core/book/WindowBook.java @@ -0,0 +1,246 @@ +package ml.core.book; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import ml.core.enums.NaturalSide; +import ml.core.gui.GuiRenderUtils; +import ml.core.gui.controls.button.ControlButton; +import ml.core.gui.controls.tabs.ControlTabManager; +import ml.core.gui.controls.tabs.ControlTabManager.GuiTab; +import ml.core.gui.core.Window; +import ml.core.gui.event.EventGuiClosing; +import ml.core.gui.event.GuiEvent; +import ml.core.gui.event.mouse.EventMouseClicked; +import ml.core.vec.Vector2i; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public abstract class WindowBook extends Window { + + public List pages = new ArrayList(); + public Map bookmarks = new LinkedHashMap(); + protected int currentPage; + + public int pageWidth=127, pageHeight=163, pagePadding = 6; + + protected ControlButton btnPrevious, btnNext; + + public WindowBook(EntityPlayer epl, Side side) { + super(epl, side); + setSize(278, 175); + + if (side == Side.CLIENT) { + initBookContents(); + } + } + + @Override + public void constructClient() { + setCustomResource("window", "SGworlds:textures/gui/book_double"); + super.constructClient(); + } + + public int getPageWidth() { + return pageWidth - 2*pagePadding; + } + + public int getPageHeight() { + return pageHeight - 2*pagePadding; + } + + @Override + public ItemStack transferStackFromSlot(EntityPlayer epl, Slot slot) { + return null; + } + + @Override + public void drawBackground(float partialTick) { + bindStyleTexture("window"); + GuiRenderUtils.drawTexturedModalRect(this.getLocalPosition().x, this.getLocalPosition().y, 0, 0, this.getSize().x, this.getSize().y, 512,256); + } + + @Override + public void drawForeground(float partialTick) { + getLocalPosition().glTranslate(); + int awidth = pageWidth - 2*pagePadding, aheight = pageHeight - 2*pagePadding; + + pages.get(currentPage).drawPage(getMC(), 12 + pagePadding, 6 + pagePadding, awidth, aheight, partialTick); + + if (pages.size() > currentPage+1) { + pages.get(currentPage+1).drawPage(getMC(), 12 + 129 + pagePadding, 6 + pagePadding, awidth, aheight, partialTick); + } + } + + @Override + public void initControls() { + ControlTabManager ctm = new ControlTabManager(this, NaturalSide.Right); + for (Bookmark bm : bookmarks.keySet()) { + new TabBookmark(ctm, bm); + } + btnPrevious = new ControlButton(this, new Vector2i(0, 178), new Vector2i(20,20), "<"); + btnNext = new ControlButton(this, new Vector2i(258, 178), new Vector2i(20,20), ">"); + } + + @Override + public void handleEvent(GuiEvent evt) { + if (evt instanceof EventMouseClicked) { + if (evt.origin == btnPrevious) { + changePage(-2); + } else if (evt.origin == btnNext) { + changePage(2); + } + } else if (evt instanceof EventGuiClosing) { + } + } + + @Override + public boolean canInteractWith(EntityPlayer epl) { + return true; + } + + @Override + public boolean shouldShowNEI() { + return false; + } + + public class TabBookmark extends GuiTab { + + protected Bookmark mark; + + public TabBookmark(ControlTabManager ctm, Bookmark mark) { + super(ctm); + + this.mark = mark; + this.tabColor = mark.getColor(); + } + + @Override + public void constructClient() { + setCustomResource("ledger", "SGWorlds:textures/gui/tab_bookmark"); + super.constructClient(); + } + + @Override + public Vector2i getTargetSize() { + return new Vector2i(treeHasHover() ? 24 + getMC().fontRenderer.getStringWidth(mark.getName()) : 18, 24); + } + + @Override + public void drawForeground(float partialTick) { + getLocalPosition().glTranslate(); + FontRenderer fr = getMC().fontRenderer; + if (treeHasHover() && getSize().equals(getTargetSize())) { + fr.drawString(this.mark.getName(), 6, (24-getGui().getMinecraft().fontRenderer.FONT_HEIGHT)/2+1, 0xFFFFFF, true); + } + } + + @Override + public void handleEvent(GuiEvent evt) { + if (evt instanceof EventMouseClicked && evt.origin == this) { + jumpToBookmark(mark); + } + super.handleEvent(evt); + } + } + + // Book Stuff + + public abstract void initBookContents(); + + public Page addPage(Page page) { + pages.add(page); + return page; + } + + public Bookmark addBookmark(Page page, Bookmark mark) { + this.bookmarks.put(mark, page); + return mark; + } + + public void changePage(int delta) { + int oPage = currentPage; + oPage += delta; + if (oPage >=0 && oPage < pages.size()) { + currentPage = oPage; + } + } + + public void jumpToPage(Page page) { + if (pages.contains(page)) { + int i = pages.indexOf(page); + if (i%2 == 1) i--; + currentPage = i; + } + } + + public void jumpToBookmark(Bookmark mark) { + if (bookmarks.containsKey(mark)) + jumpToPage(bookmarks.get(mark)); + } + + @SideOnly(Side.CLIENT) + public List addTextPages(String text) { + List lines = splitStringWidth(text); + List pages = new ArrayList(); + + while (lines.size() > 0) { + pages.add(new TextPage(this, lines)); + } + this.pages.addAll(pages); + return pages; + } + + @SideOnly(Side.CLIENT) + public List addChapter(String title, String text) { + FontRenderer fr = FMLClientHandler.instance().getClient().fontRenderer; + + List lines = splitStringWidth(text); + List pages = new ArrayList(); + + pages.add(new ChapterHeaderPage(this, title, lines)); + while (lines.size() > 0) { + pages.add(new TextPage(this, lines)); + } + this.pages.addAll(pages); + return pages; + } + + @SideOnly(Side.CLIENT) + public List addChapter(String title, String text, int tabColor) { + List pages = addChapter(title, text); + addBookmark(pages.get(0), new Bookmark(title, tabColor)); + return pages; + } + + @SideOnly(Side.CLIENT) + public List splitStringWidth(String str) { + FontRenderer fr = FMLClientHandler.instance().getClient().fontRenderer; + return new ArrayList(fr.listFormattedStringToWidth(str, getPageWidth())); + } + + public class Bookmark { + protected String name; + protected int color; + + public Bookmark(String name, int color) { + this.name = name; + this.color = color; + } + + public String getName() { + return name; + } + + public int getColor() { + return color; + } + } +} diff --git a/src/minecraft/ml/core/gui/MLGuiHandler.java b/src/minecraft/ml/core/gui/MLGuiHandler.java index 9789707..93a9f31 100644 --- a/src/minecraft/ml/core/gui/MLGuiHandler.java +++ b/src/minecraft/ml/core/gui/MLGuiHandler.java @@ -19,6 +19,7 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int return null; tel.initControls(); + tel.getContainer().checkPacketQueue(); return tel.getContainer(); } @@ -35,6 +36,7 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int tel.initControls(); tel.constructClient(); + tel.getContainer().checkPacketQueue(); tel.guiTick(); return tel.getGui(); diff --git a/src/minecraft/ml/core/gui/core/MLContainer.java b/src/minecraft/ml/core/gui/core/MLContainer.java index 1b5022a..10f68eb 100644 --- a/src/minecraft/ml/core/gui/core/MLContainer.java +++ b/src/minecraft/ml/core/gui/core/MLContainer.java @@ -1,10 +1,14 @@ package ml.core.gui.core; +import java.util.Iterator; + import ml.core.gui.event.EventDataPacketReceived; import ml.core.gui.event.EventGuiClosing; import ml.core.internal.PacketContainerData; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -43,6 +47,22 @@ public void handleDataPacket(NBTTagCompound pload, Side side) { priElemement.injectEvent(new EventDataPacketReceived(priElemement, pload, side)); // TODO Test this stuff } + /** + * If a data packet is sent right when a container is opened, it may be received early on the other side. + * In this case, it is queued and waits for construction to finish. This method checks the queue and processes and queued packets. + * There is no need to call this yourself. + */ + public final void checkPacketQueue() { + Iterator i = PacketContainerData.packetQ.get(priElemement.player).iterator(); + while (i.hasNext()) { + PacketContainerData pcd = i.next(); + if (pcd.winId == this.windowId) { + i.remove(); + handleDataPacket(pcd.payload, priElemement.side); + } + } + } + public void sendPacket(NBTTagCompound payload, Side sendTo) { Packet250CustomPayload pkt = new PacketContainerData(windowId, payload).convertToPkt250(); if (sendTo == Side.SERVER) { @@ -65,4 +85,13 @@ public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) { public Slot addSlotToContainer(Slot par1Slot) { return super.addSlotToContainer(par1Slot); } + + @Override + public Slot getSlotFromInventory(IInventory inv, int slt) { + Slot pslot = super.getSlotFromInventory(inv, slt); + if (pslot == null && inv instanceof InventoryPlayer) { + return new Slot(inv, slt, 0, 0); + } + return pslot; + } } diff --git a/src/minecraft/ml/core/internal/PacketContainerData.java b/src/minecraft/ml/core/internal/PacketContainerData.java index f5319b0..808e11d 100644 --- a/src/minecraft/ml/core/internal/PacketContainerData.java +++ b/src/minecraft/ml/core/internal/PacketContainerData.java @@ -1,18 +1,22 @@ package ml.core.internal; import java.io.IOException; +import java.util.Iterator; import ml.core.gui.core.MLContainer; import ml.core.network.MLPacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import com.google.common.collect.LinkedListMultimap; import com.google.common.io.ByteArrayDataInput; import cpw.mods.fml.relauncher.Side; public class PacketContainerData extends MLPacket { + public static final LinkedListMultimap packetQ = LinkedListMultimap.create(); + public @data int winId; public @data NBTTagCompound payload; @@ -30,6 +34,14 @@ public PacketContainerData(int windowId, NBTTagCompound payload) { public void handle(EntityPlayer epl, Side side) throws IOException { if (epl.openContainer instanceof MLContainer && epl.openContainer.windowId == winId) { ((MLContainer)epl.openContainer).handleDataPacket(payload, side); + } else { + packetQ.put(epl, this); + Iterator i = packetQ.values().iterator(); + while (i.hasNext()) { + if (i.next().winId != this.winId) { + i.remove(); + } + } } } } diff --git a/src/minecraft/ml/core/world/structure/MLStructureComponent.java b/src/minecraft/ml/core/world/structure/MLStructureComponent.java index 7b24910..0706e88 100644 --- a/src/minecraft/ml/core/world/structure/MLStructureComponent.java +++ b/src/minecraft/ml/core/world/structure/MLStructureComponent.java @@ -27,6 +27,19 @@ public MLStructureComponent(ChunkCoordinates position, int rotation) { this.rotation = rotation; } + /** + * Post constructs the component. Constructors can be a pain to override and you have to make sure you keep the same signature for everything to work. This is easier. + */ + public MLStructureComponent constructComponent(MLStructureComponent previous, int rotation, ChunkCoordinates entranceCoords, Random rnd) { + this.rotation = rotation; + this.componentSouth = true; // South is entrance + + int centerdist = this.lboundingbox.maxZ; + this.position = new ChunkCoordinates(entranceCoords.posX + StructureHelper.getRotatedX(0, -centerdist, this.rotation), entranceCoords.posY, entranceCoords.posZ + StructureHelper.getRotatedZ(0, -centerdist, this.rotation)); + this.refreshBoundingBox(); + return this; + } + public void setLocalBoundingBox(StructureBoundingBox nbox) { lboundingbox = nbox; refreshBoundingBox(); @@ -171,28 +184,13 @@ public MLStructureComponent getNextStructureComponent(MLStructureComponent prev, rn -= wc.componentWeight; if (rn < 0) { - MLStructureComponent nComponent = null; - - try { - nComponent = ConstructorUtils.invokeConstructor(wc.cls, entrancePosition, (rotation+oRotation) % 4); - } catch (Exception e) { - e.printStackTrace(); - } + MLStructureComponent nComponent = createComponent(wc, prev, (rotation + oRotation) % 4, existingComponents, entrancePosition, rnd); if (nComponent != null) { componentCounter--; wc.instancesCreated++; - if (wc.maxComponentInstances > 0 && wc.instancesCreated >= wc.maxComponentInstances) componentWeights.remove(wc); - nComponent.rotation = (rotation + oRotation) % 4; - nComponent.componentSouth = true; // South is entrance - - int centerdist = nComponent.lboundingbox.maxZ; - nComponent.position = new ChunkCoordinates(entrancePosition.posX + StructureHelper.getRotatedX(0, -centerdist, nComponent.rotation), entrancePosition.posY, entrancePosition.posZ + StructureHelper.getRotatedZ(0, -centerdist, nComponent.rotation)); - nComponent.refreshBoundingBox(); - - StructureComponent intersect = StructureComponent.findIntersecting(existingComponents, nComponent.boundingBox); - if (intersect != null && intersect != prev) return null; + if (wc.maxComponentInstances > 0 && wc.instancesCreated >= wc.maxComponentInstances) componentWeights.remove(wc); unbuiltComponents.add(nComponent); existingComponents.add(nComponent); @@ -204,15 +202,30 @@ public MLStructureComponent getNextStructureComponent(MLStructureComponent prev, } return null; } - } - - private static int getTotalWeight(List par0List) { - int tweight = 0; - - for (WeightedComponent wc : par0List) { - tweight += wc.componentWeight; + + protected MLStructureComponent createComponent(WeightedComponent wComponent, MLStructureComponent prev, int nRotation, List existingComponents, ChunkCoordinates entrancePosition, Random rnd) { + + try { + MLStructureComponent nComponent = ConstructorUtils.invokeConstructor(wComponent.cls); + nComponent.constructComponent(prev, nRotation, entrancePosition, rnd); + StructureComponent intersect = StructureComponent.findIntersecting(existingComponents, nComponent.boundingBox); + if (intersect != null && intersect != prev) return null; + return nComponent; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; } - return tweight; + private static int getTotalWeight(List par0List) { + int tweight = 0; + + for (WeightedComponent wc : par0List) { + tweight += wc.componentWeight; + } + + return tweight; + } } } From 29707cc1e0235db6d0fd2aa3e1c2637ee43b57ce Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Sat, 12 Jul 2014 20:50:06 -0600 Subject: [PATCH 20/21] Added hasEffect to ItemDelegates. Added support for Booleans in NBTUtils. Fixed issue with Guis. --- src/minecraft/ml/core/data/NBTUtils.java | 3 +++ src/minecraft/ml/core/gui/MLGuiHandler.java | 2 ++ .../ml/core/gui/core/MLContainer.java | 13 ++++++------- src/minecraft/ml/core/item/DelegateItem.java | 18 ++++++++++++++---- src/minecraft/ml/core/item/ItemDelegator.java | 7 ++++++- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/minecraft/ml/core/data/NBTUtils.java b/src/minecraft/ml/core/data/NBTUtils.java index 5357f9b..986fd2e 100644 --- a/src/minecraft/ml/core/data/NBTUtils.java +++ b/src/minecraft/ml/core/data/NBTUtils.java @@ -48,6 +48,7 @@ public static NBTBase createTag(String name, Object value) { (value instanceof Double) {return new NBTTagDouble(name, (Double)value);} else if (value instanceof Byte) {return new NBTTagByte(name, (Byte)value);} else if (value instanceof String) {return new NBTTagString(name, (String)value);} else if + (value instanceof Boolean) {return new NBTTagByte(name, (byte)((Boolean)value ? 1 : 0));} else if (value instanceof int[]) {return new NBTTagIntArray(name, (int[])value);} else if (value instanceof byte[]) {return new NBTTagByteArray(name, (byte[])value);} else if (value instanceof NBTBase) {return (NBTBase)value;} @@ -78,6 +79,8 @@ public static T getTagValue(NBTTagCompound parent, T defaultVal, String...ta Object value = NBTUtils.getTagValue(parent.getTag(tagName)); if (defaultVal instanceof String) return (T)value.toString(); + if (defaultVal instanceof Boolean) + return (T)(Boolean)((Byte)value!=0); return (T)value; } catch (Exception ex) { diff --git a/src/minecraft/ml/core/gui/MLGuiHandler.java b/src/minecraft/ml/core/gui/MLGuiHandler.java index 93a9f31..07c3f20 100644 --- a/src/minecraft/ml/core/gui/MLGuiHandler.java +++ b/src/minecraft/ml/core/gui/MLGuiHandler.java @@ -19,6 +19,7 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int return null; tel.initControls(); + tel.getContainer().initMissingHotbarSlots(); tel.getContainer().checkPacketQueue(); return tel.getContainer(); @@ -36,6 +37,7 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int tel.initControls(); tel.constructClient(); + tel.getContainer().initMissingHotbarSlots(); tel.getContainer().checkPacketQueue(); tel.guiTick(); diff --git a/src/minecraft/ml/core/gui/core/MLContainer.java b/src/minecraft/ml/core/gui/core/MLContainer.java index 10f68eb..cc74420 100644 --- a/src/minecraft/ml/core/gui/core/MLContainer.java +++ b/src/minecraft/ml/core/gui/core/MLContainer.java @@ -8,7 +8,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -86,12 +85,12 @@ public Slot addSlotToContainer(Slot par1Slot) { return super.addSlotToContainer(par1Slot); } - @Override - public Slot getSlotFromInventory(IInventory inv, int slt) { - Slot pslot = super.getSlotFromInventory(inv, slt); - if (pslot == null && inv instanceof InventoryPlayer) { - return new Slot(inv, slt, 0, 0); + public void initMissingHotbarSlots() { + InventoryPlayer pli = priElemement.player.inventory; + for (int i=0; i<9; i++) { + if (getSlotFromInventory(pli, i) == null) { + addSlotToContainer(new Slot(pli, i, 0, 0)); + } } - return pslot; } } diff --git a/src/minecraft/ml/core/item/DelegateItem.java b/src/minecraft/ml/core/item/DelegateItem.java index a6f7372..b975a6a 100644 --- a/src/minecraft/ml/core/item/DelegateItem.java +++ b/src/minecraft/ml/core/item/DelegateItem.java @@ -2,16 +2,16 @@ import java.util.List; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.world.World; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; @@ -49,7 +49,12 @@ public ItemStack createStack(int size) { return new ItemStack(parent(), size, getMetaId()); } -/* ---------------------------- ItemMethods ---------------------------- */ + /* ---------------------------- ItemMethods ---------------------------- */ + + @SideOnly(Side.CLIENT) + public void addCreativeStacks(CreativeTabs ctab, List stackList) { + stackList.add(new ItemStack(parent(), 1, getMetaId())); + } public String getUnlocalizedName(ItemStack stack) { return unlocalizedName; @@ -119,6 +124,11 @@ public Icon getIconInHand(ItemStack stack, int renderPass, EntityPlayer player, return getIcon(stack, renderPass); } + @SideOnly(Side.CLIENT) + public boolean hasEffect(ItemStack stack, int pass) { + return false; + } + @SideOnly(Side.CLIENT) public void registerIcons(IconRegister ireg) { this.itemIcon = ireg.registerIcon(iconLocation); diff --git a/src/minecraft/ml/core/item/ItemDelegator.java b/src/minecraft/ml/core/item/ItemDelegator.java index 043bcdb..635a8c6 100644 --- a/src/minecraft/ml/core/item/ItemDelegator.java +++ b/src/minecraft/ml/core/item/ItemDelegator.java @@ -71,7 +71,7 @@ public static DelegateItem findSubItem(ItemStack is) { @SideOnly(Side.CLIENT) public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) { for (DCls sub : subItems.values()) { - par3List.add(new ItemStack(this, 1, sub.getMetaId())); + sub.addCreativeStacks(par2CreativeTabs, par3List); } } @@ -162,6 +162,11 @@ public Icon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemSt return subItem(stack).getIconInHand(stack, renderPass, player, usingItem, useRemaining); } + @SideOnly(Side.CLIENT) + public boolean hasEffect(ItemStack stack, int pass) { + return subItem(stack).hasEffect(stack, pass); + } + @Override @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) { From 0b7a516f4c80168045a76848d2cd1b6eeb35d1c8 Mon Sep 17 00:00:00 2001 From: Matchlighter Date: Wed, 16 Jul 2014 12:46:39 -0600 Subject: [PATCH 21/21] Worked on 1.7.2 port. --- src/main/java/ml/core/MLCore.java | 6 ++-- src/main/java/ml/core/data/NBTUtils.java | 20 ++++++------- .../java/ml/core/gui/core/style/GuiStyle.java | 20 ++++++------- .../java/ml/core/internal/PacketHandler.java | 1 + src/main/java/ml/core/item/StackUtils.java | 14 ++++----- .../java/ml/core/texture/TextureUtils.java | 5 ++-- src/main/java/ml/core/tile/IRotatableTE.java | 2 +- .../ml/core/tile/TileEntityConnectable.java | 8 ++--- src/main/java/ml/core/util/DyeUtils.java | 29 +++++++++++++++---- src/main/java/ml/core/util/StringUtils.java | 2 +- src/main/java/ml/core/vec/RayTrace.java | 6 ++-- src/main/java/ml/core/vec/Vector3d.java | 2 +- 12 files changed, 65 insertions(+), 50 deletions(-) diff --git a/src/main/java/ml/core/MLCore.java b/src/main/java/ml/core/MLCore.java index 763cf7d..2adfdb0 100644 --- a/src/main/java/ml/core/MLCore.java +++ b/src/main/java/ml/core/MLCore.java @@ -3,7 +3,6 @@ import java.util.Map; import ml.core.internal.CommonProxy; -import ml.core.internal.PacketHandler; import ml.core.world.WorldGenHandler; import net.minecraftforge.common.MinecraftForge; import cpw.mods.fml.common.Mod; @@ -12,13 +11,12 @@ import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions; @Mod(modid="MLCore", name="MLCore") -@NetworkMod(clientSideRequired=false, serverSideRequired=false, channels={PacketHandler.defChan}, packetHandler=PacketHandler.class) +//@NetworkMod(clientSideRequired=false, serverSideRequired=false, channels={PacketHandler.defChan}, packetHandler=PacketHandler.class) @TransformerExclusions({"ml"}) public class MLCore implements IFMLLoadingPlugin { @@ -33,7 +31,7 @@ public class MLCore implements IFMLLoadingPlugin { @EventHandler public void preInit(FMLPreInitializationEvent evt) { proxy.prInit(); - NetworkRegistry. + //NetworkRegistry. MinecraftForge.EVENT_BUS.register(WorldGenHandler.instance); GameRegistry.registerWorldGenerator(WorldGenHandler.instance, 0); diff --git a/src/main/java/ml/core/data/NBTUtils.java b/src/main/java/ml/core/data/NBTUtils.java index 64be213..36cc18c 100644 --- a/src/main/java/ml/core/data/NBTUtils.java +++ b/src/main/java/ml/core/data/NBTUtils.java @@ -42,15 +42,15 @@ public static T getTagValue(NBTBase tag) { public static NBTBase createTag(String name, Object value) { if - (value instanceof Float) {return new NBTTagFloat(name, (Float)value);} else if - (value instanceof Integer) {return new NBTTagInt(name, (Integer)value);} else if - (value instanceof Short) {return new NBTTagShort(name, (Short)value);} else if - (value instanceof Long) {return new NBTTagLong(name, (Long)value);} else if - (value instanceof Double) {return new NBTTagDouble(name, (Double)value);} else if - (value instanceof Byte) {return new NBTTagByte(name, (Byte)value);} else if - (value instanceof String) {return new NBTTagString(name, (String)value);} else if - (value instanceof int[]) {return new NBTTagIntArray(name, (int[])value);} else if - (value instanceof byte[]) {return new NBTTagByteArray(name, (byte[])value);} else if + (value instanceof Float) {return new NBTTagFloat( (Float)value);} else if + (value instanceof Integer) {return new NBTTagInt( (Integer)value);} else if + (value instanceof Short) {return new NBTTagShort( (Short)value);} else if + (value instanceof Long) {return new NBTTagLong( (Long)value);} else if + (value instanceof Double) {return new NBTTagDouble( (Double)value);} else if + (value instanceof Byte) {return new NBTTagByte( (Byte)value);} else if + (value instanceof String) {return new NBTTagString( (String)value);} else if + (value instanceof int[]) {return new NBTTagIntArray( (int[])value);} else if + (value instanceof byte[]) {return new NBTTagByteArray((byte[])value);} else if (value instanceof NBTBase) {return (NBTBase)value;} return null; } @@ -94,7 +94,7 @@ public static void setTag(NBTTagCompound parent, Object value, String...tagPath) tagName = tagPath[i]; if (i == tagPath.length-1) break; if (!parent.hasKey(tagName)) - parent.setCompoundTag(tagName, new NBTTagCompound(tagName)); + parent.setTag(tagName, new NBTTagCompound()); parent = parent.getCompoundTag(tagName); } NBTBase ntag = createTag(tagName, value); diff --git a/src/main/java/ml/core/gui/core/style/GuiStyle.java b/src/main/java/ml/core/gui/core/style/GuiStyle.java index aa3abba..76c28bd 100644 --- a/src/main/java/ml/core/gui/core/style/GuiStyle.java +++ b/src/main/java/ml/core/gui/core/style/GuiStyle.java @@ -6,10 +6,10 @@ import java.util.Map; import java.util.Properties; -import net.minecraft.client.resources.ReloadableResourceManager; -import net.minecraft.client.resources.Resource; -import net.minecraft.client.resources.ResourceManager; -import net.minecraft.client.resources.ResourceManagerReloadListener; +import net.minecraft.client.resources.IReloadableResourceManager; +import net.minecraft.client.resources.IResource; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; @@ -29,7 +29,7 @@ * @author Matchlighter */ @SideOnly(Side.CLIENT) -public class GuiStyle implements ResourceManagerReloadListener { +public class GuiStyle implements IResourceManagerReloadListener { public static final String defaultDomain = "mlcontrols"; public static final String defaultBasePath = "default"; @@ -134,15 +134,15 @@ public void clearCache() { } @Override - public void onResourceManagerReload(ResourceManager resourcemanager) { + public void onResourceManagerReload(IResourceManager resourcemanager) { clearCache(); //Load Properties and Colors - ResourceManager rm = FMLClientHandler.instance().getClient().getResourceManager(); + IResourceManager rm = FMLClientHandler.instance().getClient().getResourceManager(); props.clear(); try { - List robjs = rm.getAllResources(getResourceManual("properties.txt")); //TODO 1.7.2: Make sure these load in the correct order - for (Resource res : robjs) { + List robjs = rm.getAllResources(getResourceManual("properties.txt")); //TODO 1.7.2: Make sure these load in the correct order + for (IResource res : robjs) { props.load(res.getInputStream()); } } catch (IOException e) { @@ -151,7 +151,7 @@ public void onResourceManagerReload(ResourceManager resourcemanager) { } public void registerAsReloadListener() { - ((ReloadableResourceManager)FMLClientHandler.instance().getClient().getResourceManager()).registerReloadListener(this); + ((IReloadableResourceManager)FMLClientHandler.instance().getClient().getResourceManager()).registerReloadListener(this); } } diff --git a/src/main/java/ml/core/internal/PacketHandler.java b/src/main/java/ml/core/internal/PacketHandler.java index ff3e5e2..f43c8d0 100644 --- a/src/main/java/ml/core/internal/PacketHandler.java +++ b/src/main/java/ml/core/internal/PacketHandler.java @@ -6,6 +6,7 @@ public final class PacketHandler extends ml.core.network.PacketHandler { public static final String defChan = "MLCore"; public PacketHandler() { + super(defChan); addHandler(PacketContainerData.class); } diff --git a/src/main/java/ml/core/item/StackUtils.java b/src/main/java/ml/core/item/StackUtils.java index 0a46cbf..b1fb2c9 100644 --- a/src/main/java/ml/core/item/StackUtils.java +++ b/src/main/java/ml/core/item/StackUtils.java @@ -19,18 +19,16 @@ public class StackUtils { - public static ItemStack create(int itemID, int count, int meta, NBTTagCompound nbt) { - ItemStack stack = new ItemStack(itemID, count, meta); + public static ItemStack create(Item item, int count, int meta, NBTTagCompound nbt) { + ItemStack stack = new ItemStack(item, count, meta); stack.setTagCompound(nbt); return stack; } - public static ItemStack create(Item item, int count, int meta, NBTTagCompound nbt) { - return create(item.itemID, count, meta, nbt); - } - public static ItemStack create(Block block, int count, int meta, NBTTagCompound nbt) { - return create(block.blockID, count, meta, nbt); + ItemStack stack = new ItemStack(block, count, meta); + stack.setTagCompound(nbt); + return stack; } /** @@ -176,7 +174,7 @@ public static boolean checkItemEquals(Object target, ItemStack input) { ItemStack trgIS = (ItemStack)target; return (trgIS.getItem() == input.getItem() && (trgIS.getItemDamage() == OreDictionary.WILDCARD_VALUE || trgIS.getItemDamage() == input.getItemDamage())); } else if (target instanceof Item) { - return (((Item)target).itemID == input.itemID); + return (((Item)target) == input.getItem()); } return false; } diff --git a/src/main/java/ml/core/texture/TextureUtils.java b/src/main/java/ml/core/texture/TextureUtils.java index 61e1073..32134de 100644 --- a/src/main/java/ml/core/texture/TextureUtils.java +++ b/src/main/java/ml/core/texture/TextureUtils.java @@ -9,7 +9,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.resources.ResourceManager; +import net.minecraft.client.resources.IResourceManager; import net.minecraft.util.ResourceLocation; public class TextureUtils { @@ -53,8 +53,7 @@ public static BufferedImage loadBufferedImage(InputStream is) throws IOException public static boolean shouldReloadTexture(TextureMap mp, String texFile) { return mp.setTextureEntry(texFile, new TextureAtlasSprite(texFile) { @Override - public boolean load(ResourceManager manager, - ResourceLocation location) throws IOException { + public boolean load(IResourceManager manager, ResourceLocation location) { return false; } }); diff --git a/src/main/java/ml/core/tile/IRotatableTE.java b/src/main/java/ml/core/tile/IRotatableTE.java index d3c651a..ce3c92c 100644 --- a/src/main/java/ml/core/tile/IRotatableTE.java +++ b/src/main/java/ml/core/tile/IRotatableTE.java @@ -1,6 +1,6 @@ package ml.core.tile; -import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.util.ForgeDirection; public interface IRotatableTE { diff --git a/src/main/java/ml/core/tile/TileEntityConnectable.java b/src/main/java/ml/core/tile/TileEntityConnectable.java index 813d1d4..f5a5f1a 100644 --- a/src/main/java/ml/core/tile/TileEntityConnectable.java +++ b/src/main/java/ml/core/tile/TileEntityConnectable.java @@ -3,7 +3,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.util.ForgeDirection; import cpw.mods.fml.common.network.PacketDispatcher; public abstract class TileEntityConnectable extends TileEntity { @@ -40,7 +40,7 @@ public boolean isMaster() { } public TileEntityConnectable getConnected() { - TileEntity te = worldObj.getBlockTileEntity(xCoord+linkedDir.offsetX, yCoord+linkedDir.offsetY, zCoord+linkedDir.offsetZ); + TileEntity te = worldObj.getTileEntity(xCoord+linkedDir.offsetX, yCoord+linkedDir.offsetY, zCoord+linkedDir.offsetZ); if (linkedDir != ForgeDirection.UNKNOWN && te instanceof TileEntityConnectable && te.getClass()==this.getClass()) { return (TileEntityConnectable)te; } @@ -66,7 +66,7 @@ public boolean canConnectWith(TileEntityConnectable rtec) { } private boolean tryConnection(ForgeDirection fd){ - TileEntity rte = worldObj.getBlockTileEntity(xCoord+fd.offsetX, yCoord+fd.offsetY, zCoord+fd.offsetZ); + TileEntity rte = worldObj.getTileEntity(xCoord+fd.offsetX, yCoord+fd.offsetY, zCoord+fd.offsetZ); if (rte instanceof TileEntityConnectable){ TileEntityConnectable rtec = (TileEntityConnectable)rte; if (rtec.facing == this.facing && @@ -92,7 +92,7 @@ public void tryConnection(){ public void refreshConnection(){ if (linkedDir != ForgeDirection.UNKNOWN) { - TileEntity te = worldObj.getBlockTileEntity(xCoord+linkedDir.offsetX, yCoord+linkedDir.offsetY, zCoord+linkedDir.offsetZ); + TileEntity te = worldObj.getTileEntity(xCoord+linkedDir.offsetX, yCoord+linkedDir.offsetY, zCoord+linkedDir.offsetZ); if (!(te instanceof TileEntityConnectable) || !canConnectWith((TileEntityConnectable)te) || ((TileEntityConnectable)te).linkedDir != linkedDir.getOpposite()){ linkedDir = ForgeDirection.UNKNOWN; diff --git a/src/main/java/ml/core/util/DyeUtils.java b/src/main/java/ml/core/util/DyeUtils.java index 40639e7..af6b423 100644 --- a/src/main/java/ml/core/util/DyeUtils.java +++ b/src/main/java/ml/core/util/DyeUtils.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.List; -import net.minecraft.item.Item; +import net.minecraft.init.Items; import net.minecraft.item.ItemDye; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; @@ -18,7 +18,7 @@ public static int getVanillaColorId(ItemStack mOre) { if (mOre == null) return -1; for (int i=0; i<16; i++){ - if (OreDictionary.getOreID(new ItemStack(Item.dyePowder, 1, i)) == OreDictionary.getOreID(mOre)){ + if (OreDictionary.itemMatches(new ItemStack(Items.dye, 1, i), mOre, true)){ return i; } } @@ -28,7 +28,7 @@ public static int getVanillaColorId(ItemStack mOre) { public static int getDyeColor(ItemStack dyeStack) { int dyeId = getVanillaColorId(dyeStack); if (dyeId > -1) { - return ItemDye.dyeColors[dyeId]; + return ItemDye.field_150922_c[dyeId]; } return -1; } @@ -64,10 +64,29 @@ public static int mixDyeColors(Collection dyes) { return mixDyeColors(-1, dyes); } + private static final String[] dyes = + { + "Black", + "Red", + "Green", + "Brown", + "Blue", + "Purple", + "Cyan", + "LightGray", + "Gray", + "Pink", + "Lime", + "Yellow", + "LightBlue", + "Magenta", + "Orange", + "White" + }; public static List getAllDyeStacks() { List stacks = new ArrayList(); - for (int i=0; i