From f8f76e8f249fecd748ea5f4aaa3cd2949e3c8a7d Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Sat, 15 Sep 2018 11:21:21 +0200 Subject: [PATCH] Mirror, array and quickreplace. --- .gitignore | 43 ++ Logo.png | Bin 0 -> 22636 bytes Logo.xcf | Bin 0 -> 155029 bytes build.gradle | 77 ++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52271 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++++++ gradlew.bat | 90 ++++ .../nl/requios/effortlessbuilding/Array.java | 82 ++++ .../BuildSettingsManager.java | 102 +++++ .../EffortlessBuilding.java | 106 +++++ .../effortlessbuilding/EventHandler.java | 59 +++ .../nl/requios/effortlessbuilding/Mirror.java | 401 ++++++++++++++++++ .../effortlessbuilding/QuickReplace.java | 61 +++ .../capability/BuildModifierCapability.java | 138 ++++++ .../effortlessbuilding/gui/SettingsGui.java | 314 ++++++++++++++ .../inventory/RandomizerBagContainer.java | 11 + .../inventory/RandomizerBagGuiContainer.java | 15 + .../inventory/RandomizerBagInventory.java | 144 +++++++ .../inventory/RandomizerGuiHandler.java | 32 ++ .../item/ItemRandomizerBag.java | 56 +++ .../network/BuildSettingsMessage.java | 110 +++++ .../network/QuickReplaceMessage.java | 88 ++++ .../effortlessbuilding/proxy/ClientProxy.java | 130 ++++++ .../effortlessbuilding/proxy/IProxy.java | 40 ++ .../effortlessbuilding/proxy/ServerProxy.java | 38 ++ .../assets/effortlessbuilding/lang/en_us.lang | 5 + .../models/item/randomizer_bag.json | 6 + src/main/resources/mcmod.info | 16 + src/main/resources/pack.mcmeta | 7 + 30 files changed, 2341 insertions(+) create mode 100644 .gitignore create mode 100644 Logo.png create mode 100644 Logo.xcf create mode 100644 build.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 create mode 100644 src/main/java/nl/requios/effortlessbuilding/Array.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/EventHandler.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/Mirror.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/QuickReplace.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapability.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagInventory.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/network/QuickReplaceMessage.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/proxy/IProxy.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java create mode 100644 src/main/resources/assets/effortlessbuilding/lang/en_us.lang create mode 100644 src/main/resources/assets/effortlessbuilding/models/item/randomizer_bag.json create mode 100644 src/main/resources/mcmod.info create mode 100644 src/main/resources/pack.mcmeta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d341f1c --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +## Based on GitHub's Eclipse .gitignore + +classes/ +run/ +.gradle/ +build/ +gradle-app.setting + +## IntelliJ IDEA + +.idea/ +*.iml +*.iws +*.ipr + +## Eclipse + +eclipse/ +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath diff --git a/Logo.png b/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e167aa9fa0244da48277526afa6c505dc2f62449 GIT binary patch literal 22636 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®hHR7jCN_d7`uN&AjckS?RIQf?W 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 Z{G$4cAVS&5%zuymYN_c$YgBAd{{!ddB)0$n literal 0 HcmV?d00001 diff --git a/Logo.xcf b/Logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..12a229d074a4b18a58e6ecc84bf0073b39446031 GIT binary patch literal 155029 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 literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..bc2df1b --- /dev/null +++ b/build.gradle @@ -0,0 +1,77 @@ +buildscript { + repositories { + jcenter() + maven { url = "http://files.minecraftforge.net/maven" } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + } +} +apply plugin: 'net.minecraftforge.gradle.forge' +//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. + + +version = "0.1.1" +group = "nl.requios.effortlessbuilding" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = "effortlessbuilding" + +sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. +compileJava { + sourceCompatibility = targetCompatibility = '1.8' +} + +minecraft { + version = "1.12.2-14.23.4.2705" + runDir = "run" + + // the mappings can be changed at any time, and must be in the following format. + // snapshot_YYYYMMDD snapshot are built nightly. + // stable_# stables are built at the discretion of the MCP team. + // Use non-default mappings at your own risk. they may not always work. + // simply re-run your setup task after changing the mappings to update your workspace. + mappings = "snapshot_20171003" + // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. +} + +dependencies { + // you may put jars on which you depend on in ./libs + // or you may define them like so.. + //compile "some.group:artifact:version:classifier" + //compile "some.group:artifact:version" + + // real examples + //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env + //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env + + // the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. + //provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided, + // except that these dependencies get remapped to your current MCP mappings + //deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev' + //deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // for more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html + +} + +processResources { + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else except the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..30d399d8d2bf522ff5de94bf434a7cc43a9a74b5 GIT binary patch literal 52271 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 p \(.*\)$'` + 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/src/main/java/nl/requios/effortlessbuilding/Array.java b/src/main/java/nl/requios/effortlessbuilding/Array.java new file mode 100644 index 0000000..d5dc1a4 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/Array.java @@ -0,0 +1,82 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.world.BlockEvent; + +public class Array { + //TODO config file + public static final int MAX_COUNT = 100; + + public static class ArraySettings{ + public boolean enabled = false; + public BlockPos offset = BlockPos.ORIGIN; + public int count = 5; + + public ArraySettings(){ + } + + public ArraySettings(boolean enabled, BlockPos offset, int count) { + this.enabled = enabled; + this.offset = offset; + this.count = count; + } + } + + //Called from EventHandler + public static void onBlockPlaced(BlockEvent.PlaceEvent event) { + if (event.getWorld().isRemote) return; + + //find arraysettings for the player that placed the block + ArraySettings a = BuildSettingsManager.getBuildSettings(event.getPlayer()).getArraySettings(); + if (a == null || !a.enabled) return; + + if (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0) return; + + BlockPos pos = event.getPos(); + Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); + for (int i = 0; i < a.count; i++) { + pos = pos.add(offset); + if (event.getWorld().isBlockLoaded(pos, true)) { + event.getWorld().setBlockState(pos, event.getPlacedBlock()); + + //Mirror synergy + BlockSnapshot blockSnapshot = new BlockSnapshot(event.getWorld(), pos, event.getPlacedBlock()); + BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, event.getPlacedBlock(), event.getPlayer(), EnumHand.MAIN_HAND); + Mirror.onBlockPlaced(placeEvent); + } + } + } + + //Called from EventHandler + public static void onBlockBroken(BlockEvent.BreakEvent event) { + if (event.getWorld().isRemote) return; + + //find arraysettings for the player that placed the block + ArraySettings a = BuildSettingsManager.getBuildSettings(event.getPlayer()).getArraySettings(); + if (a == null || !a.enabled) return; + + if (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0) return; + + BlockPos pos = event.getPos(); + Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); + for (int i = 0; i < a.count; i++) { + pos = pos.add(offset); + if (event.getWorld().isBlockLoaded(pos, false)) { + event.getWorld().setBlockToAir(pos); + + //Mirror synergy + BlockEvent.BreakEvent breakEvent = new BlockEvent.BreakEvent(event.getWorld(), pos, event.getState(), event.getPlayer()); + Mirror.onBlockBroken(breakEvent); + } + } + } + +// @SubscribeEvent +// @SideOnly(Side.CLIENT) +// public static void onRender(RenderWorldLastEvent event) { +// +// } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java b/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java new file mode 100644 index 0000000..8b4dbcb --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java @@ -0,0 +1,102 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent; +import nl.requios.effortlessbuilding.capability.BuildModifierCapability; +import nl.requios.effortlessbuilding.network.BuildSettingsMessage; + +@Mod.EventBusSubscriber +public class BuildSettingsManager { + + public static BuildSettings getBuildSettings(EntityPlayer player){ + if (player.hasCapability(BuildModifierCapability.buildModifier, null)) { + BuildModifierCapability.IBuildModifier capability = player.getCapability(BuildModifierCapability.buildModifier, null); + return capability.getBuildModifierData(); + } + EffortlessBuilding.log("buildsettings is null"); + return null; + } + + public static void setBuildSettings(EntityPlayer player, BuildSettings buildSettings) { + if (player == null) { + EffortlessBuilding.log("cannot set buildsettings, player is null"); + return; + } + if (player.hasCapability(BuildModifierCapability.buildModifier, null)) { + BuildModifierCapability.IBuildModifier capability = player.getCapability(BuildModifierCapability.buildModifier, null); + capability.setBuildModifierData(buildSettings); + } else { + EffortlessBuilding.log(player, "Saving buildsettings failed."); + } + } + + public static class BuildSettings { + private Mirror.MirrorSettings mirrorSettings; + private Array.ArraySettings arraySettings; + private boolean quickReplace = false; + + public BuildSettings() { + mirrorSettings = new Mirror.MirrorSettings(); + arraySettings = new Array.ArraySettings(); + } + + public BuildSettings(Mirror.MirrorSettings mirrorSettings, Array.ArraySettings arraySettings, boolean quickReplace) { + this.mirrorSettings = mirrorSettings; + this.arraySettings = arraySettings; + this.quickReplace = quickReplace; + } + + public Mirror.MirrorSettings getMirrorSettings() { + return mirrorSettings; + } + + public void setMirrorSettings(Mirror.MirrorSettings mirrorSettings) { + this.mirrorSettings = mirrorSettings; + } + + public Array.ArraySettings getArraySettings() { + return arraySettings; + } + + public void setArraySettings(Array.ArraySettings arraySettings) { + this.arraySettings = arraySettings; + } + + public boolean doQuickReplace() { + return quickReplace; + } + + public void setQuickReplace(boolean quickReplace) { + this.quickReplace = quickReplace; + } + } + + @SubscribeEvent + public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + EntityPlayer player = event.player; + handleNewPlayer(player); + } + + @SubscribeEvent + public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { + EntityPlayer player = event.player; + handleNewPlayer(player); + } + + private static void handleNewPlayer(EntityPlayer player){ + if (getBuildSettings(player) == null) { + setBuildSettings(player, new BuildSettings()); + } + + //Only on server + if (!player.world.isRemote) { + //Send to client + BuildSettingsMessage msg = new BuildSettingsMessage(getBuildSettings(player)); + EffortlessBuilding.packetHandler.sendTo(msg, (EntityPlayerMP) player); + } + } +} + diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java new file mode 100644 index 0000000..baa2732 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -0,0 +1,106 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.util.text.TextComponentString; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import net.minecraftforge.fml.relauncher.Side; +import nl.requios.effortlessbuilding.capability.*; +import nl.requios.effortlessbuilding.inventory.RandomizerGuiHandler; +import nl.requios.effortlessbuilding.item.ItemRandomizerBag; +import nl.requios.effortlessbuilding.network.BuildSettingsMessage; +import nl.requios.effortlessbuilding.network.QuickReplaceMessage; +import nl.requios.effortlessbuilding.proxy.IProxy; +import org.apache.logging.log4j.Logger; + +@Mod(modid = EffortlessBuilding.MODID, name = EffortlessBuilding.NAME, version = EffortlessBuilding.VERSION) +@Mod.EventBusSubscriber +public class EffortlessBuilding +{ + public static final String MODID = "effortlessbuilding"; + public static final String NAME = "Effortless Building"; + public static final String VERSION = "0.1.2"; + + @Mod.Instance(EffortlessBuilding.MODID) + public static EffortlessBuilding instance; + + public static Logger logger; + + @SidedProxy( + clientSide="nl.requios.effortlessbuilding.proxy.ClientProxy", + serverSide="nl.requios.effortlessbuilding.proxy.ServerProxy" + ) + public static IProxy proxy; + + public static final SimpleNetworkWrapper packetHandler = NetworkRegistry.INSTANCE.newSimpleChannel(EffortlessBuilding.MODID); + + public static final Block[] BLOCKS = { + }; + + public static final Item[] ITEMS = { + new ItemRandomizerBag() + }; + + public static final int RANDOMIZER_BAG_GUI = 0; + + @EventHandler + // preInit "Run before anything else. Read your config, create blocks, items, etc, and register them with the GameRegistry." + public void preInit(FMLPreInitializationEvent event) + { + logger = event.getModLog(); + + CapabilityManager.INSTANCE.register(BuildModifierCapability.IBuildModifier.class, new BuildModifierCapability.Storage(), BuildModifierCapability.BuildModifier.class); + + EffortlessBuilding.packetHandler.registerMessage(BuildSettingsMessage.MessageHandler.class, BuildSettingsMessage.class, 0, Side.SERVER); + EffortlessBuilding.packetHandler.registerMessage(BuildSettingsMessage.MessageHandler.class, BuildSettingsMessage.class, 0, Side.CLIENT); + + EffortlessBuilding.packetHandler.registerMessage(QuickReplaceMessage.MessageHandler.class, QuickReplaceMessage.class, 1, Side.SERVER); + EffortlessBuilding.packetHandler.registerMessage(QuickReplaceMessage.MessageHandler.class, QuickReplaceMessage.class, 1, Side.CLIENT); + + proxy.preInit(event); + } + + @EventHandler + // Do your mod setup. Build whatever data structures you care about. + // Register network handlers + public void init(FMLInitializationEvent event) + { + NetworkRegistry.INSTANCE.registerGuiHandler(EffortlessBuilding.instance, new RandomizerGuiHandler()); + proxy.init(event); + } + + @EventHandler + // postInit "Handle interaction with other mods, complete your setup based on this." + public void postInit(FMLPostInitializationEvent event) + { + proxy.postInit(event); + } + + @EventHandler + public void serverStarting(FMLServerStartingEvent event) + { + proxy.serverStarting(event); + } + + public static void log(String msg){ + logger.info(msg); + } + + public static void log(EntityPlayer player, String msg){ + log(player, msg, false); + } + + public static void log(EntityPlayer player, String msg, boolean actionBar){ + player.sendStatusMessage(new TextComponentString(msg), actionBar); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java new file mode 100644 index 0000000..aaadd48 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -0,0 +1,59 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import nl.requios.effortlessbuilding.capability.BuildModifierCapability; + +@Mod.EventBusSubscriber +public class EventHandler +{ + @SubscribeEvent + public static void registerBlocks(RegistryEvent.Register event) + { + event.getRegistry().registerAll(EffortlessBuilding.BLOCKS); + } + + @SubscribeEvent + public static void registerItems(RegistryEvent.Register event) + { + event.getRegistry().registerAll(EffortlessBuilding.ITEMS); + + for (Block block : EffortlessBuilding.BLOCKS) + { + event.getRegistry().register(new ItemBlock(block).setRegistryName(block.getRegistryName())); + } + } + + @SubscribeEvent + public static void attachCapabilities(AttachCapabilitiesEvent event) { + if (event.getObject() instanceof EntityPlayer) { + event.addCapability(new ResourceLocation(EffortlessBuilding.MODID, "BuildModifier"), new BuildModifierCapability.Provider()); + } + } + + + @SubscribeEvent + public static void onBlockPlaced(BlockEvent.PlaceEvent event) { + QuickReplace.onBlockPlaced(event); + if (event.isCanceled()) return; + Array.onBlockPlaced(event); + Mirror.onBlockPlaced(event); + } + + + @SubscribeEvent + public static void onBlockBroken(BlockEvent.BreakEvent event) { + Array.onBlockBroken(event); + Mirror.onBlockBroken(event); + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/Mirror.java new file mode 100644 index 0000000..5a4b939 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/Mirror.java @@ -0,0 +1,401 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.BlockDispenser; +import net.minecraft.block.BlockStairs; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.Color; + +@Mod.EventBusSubscriber +public class Mirror { + + //TODO config file + public static final int MAX_RADIUS = 200; + + private static final Color colorX = new Color(255, 72, 52); + private static final Color colorY = new Color(67, 204, 51); + private static final Color colorZ = new Color(52, 247, 255); + private static final int lineAlpha = 200; + private static final int planeAlpha = 75; + private static final Vec3d epsilon = new Vec3d(0.001, 0.001, 0.001); //prevents z-fighting + + + public static class MirrorSettings { + public boolean enabled = false; + public Vec3d position = new Vec3d(0.5, 64.5, 0.5); + public boolean mirrorX = true, mirrorY = false, mirrorZ = false; + public int radius = 20; + public boolean drawLines = true, drawPlanes = false; + + public MirrorSettings() { + } + + public MirrorSettings(boolean mirrorEnabled, Vec3d position, boolean mirrorX, boolean mirrorY, boolean mirrorZ, int radius, boolean drawLines, boolean drawPlanes) { + this.enabled = mirrorEnabled; + this.position = position; + this.mirrorX = mirrorX; + this.mirrorY = mirrorY; + this.mirrorZ = mirrorZ; + this.radius = radius; + this.drawLines = drawLines; + this.drawPlanes = drawPlanes; + } + } + + //Called from EventHandler + public static void onBlockPlaced(BlockEvent.PlaceEvent event) { + if (event.getWorld().isRemote) return; + + //find mirrorsettings for the player that placed the block + MirrorSettings m = BuildSettingsManager.getBuildSettings(event.getPlayer()).getMirrorSettings(); + if (m == null) return; + + if (!m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return; + + //if within mirror distance, mirror + BlockPos oldBlockPos = event.getPos(); + + if (oldBlockPos.getX() + 0.5 < m.position.x - m.radius || oldBlockPos.getX() + 0.5 > m.position.x + m.radius || + oldBlockPos.getY() + 0.5 < m.position.y - m.radius || oldBlockPos.getY() + 0.5 > m.position.y + m.radius || + oldBlockPos.getZ() + 0.5 < m.position.z - m.radius || oldBlockPos.getZ() + 0.5 > m.position.z+ m.radius) + return; + + if (m.mirrorX) { + placeMirrorX(event.getWorld(), m, oldBlockPos, event.getPlacedBlock()); + } + + if (m.mirrorY) { + placeMirrorY(event.getWorld(), m, oldBlockPos, event.getPlacedBlock()); + } + + if (m.mirrorZ) { + placeMirrorZ(event.getWorld(), m, oldBlockPos, event.getPlacedBlock()); + } + } + + private static void placeMirrorX(World world, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState) { + //find mirror position + double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); + BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); + IBlockState newBlockState = oldBlockState; + //place block + if (world.isBlockLoaded(newBlockPos, true)) { + newBlockState = oldBlockState.withMirror(net.minecraft.util.Mirror.FRONT_BACK); + + world.setBlockState(newBlockPos, newBlockState); + } + if (m.mirrorY) placeMirrorY(world, m, newBlockPos, newBlockState); + if (m.mirrorZ) placeMirrorZ(world, m, newBlockPos, newBlockState); + } + + private static void placeMirrorY(World world, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState) { + //find mirror position + double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); + IBlockState newBlockState = oldBlockState; + //place block + if (world.isBlockLoaded(newBlockPos, true)) { + newBlockState = getVerticalMirror(oldBlockState); + + world.setBlockState(newBlockPos, newBlockState); + } + if (m.mirrorZ) placeMirrorZ(world, m, newBlockPos, newBlockState); + } + + private static void placeMirrorZ(World world, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState) { + //find mirror position + double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); + IBlockState newBlockState = oldBlockState; + //place block + if (world.isBlockLoaded(newBlockPos, true)) { + newBlockState = oldBlockState.withMirror(net.minecraft.util.Mirror.LEFT_RIGHT); + + world.setBlockState(newBlockPos, newBlockState); + } + } + + private static IBlockState getVerticalMirror(IBlockState blockState) { + //Stairs + if (blockState.getBlock() instanceof BlockStairs) { + if (blockState.getValue(BlockStairs.HALF) == BlockStairs.EnumHalf.BOTTOM) { + return blockState.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.TOP); + } else { + return blockState.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.BOTTOM); + } + } + + //Buttons, endrod, observer, piston + if (blockState.getBlock() instanceof BlockDirectional) { + if (blockState.getValue(BlockDirectional.FACING) == EnumFacing.DOWN) { + return blockState.withProperty(BlockDirectional.FACING, EnumFacing.UP); + } else if (blockState.getValue(BlockDirectional.FACING) == EnumFacing.UP) { + return blockState.withProperty(BlockDirectional.FACING, EnumFacing.DOWN); + } + } + + //Dispenser, dropper + if (blockState.getBlock() instanceof BlockDispenser) { + if (blockState.getValue(BlockDispenser.FACING) == EnumFacing.DOWN) { + return blockState.withProperty(BlockDispenser.FACING, EnumFacing.UP); + } else if (blockState.getValue(BlockDispenser.FACING) == EnumFacing.UP) { + return blockState.withProperty(BlockDispenser.FACING, EnumFacing.DOWN); + } + } + + return blockState; + } + + //Called from EventHandler + public static void onBlockBroken(BlockEvent.BreakEvent event) { + if (event.getWorld().isRemote) return; + + //find mirrorsettings for the player that broke the block + MirrorSettings m = BuildSettingsManager.getBuildSettings(event.getPlayer()).getMirrorSettings(); + if (m == null) return; + + if (!m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return; + + //if within mirror distance, break mirror block + BlockPos oldBlockPos = event.getPos(); + + if (oldBlockPos.getX() + 0.5 < m.position.x - m.radius || oldBlockPos.getX() + 0.5 > m.position.x + m.radius || + oldBlockPos.getY() + 0.5 < m.position.y - m.radius || oldBlockPos.getY() + 0.5 > m.position.y + m.radius || + oldBlockPos.getZ() + 0.5 < m.position.z - m.radius || oldBlockPos.getZ() + 0.5 > m.position.z+ m.radius) + return; + + if (m.mirrorX) { + breakMirrorX(event, m, oldBlockPos); + } + + if (m.mirrorY) { + breakMirrorY(event, m, oldBlockPos); + } + + if (m.mirrorZ) { + breakMirrorZ(event, m, oldBlockPos); + } + } + + private static void breakMirrorX(BlockEvent.BreakEvent event, MirrorSettings m, BlockPos oldBlockPos) { + //find mirror position + double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); + BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); + //break block + if (event.getWorld().isBlockLoaded(newBlockPos, true)) { + event.getWorld().setBlockToAir(newBlockPos); + } + if (m.mirrorY) breakMirrorY(event, m, newBlockPos); + if (m.mirrorZ) breakMirrorZ(event, m, newBlockPos); + } + + private static void breakMirrorY(BlockEvent.BreakEvent event, MirrorSettings m, BlockPos oldBlockPos) { + //find mirror position + double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); + //place block + if (event.getWorld().isBlockLoaded(newBlockPos, true)) { + event.getWorld().setBlockToAir(newBlockPos); + } + if (m.mirrorZ) breakMirrorZ(event, m, newBlockPos); + } + + private static void breakMirrorZ(BlockEvent.BreakEvent event, MirrorSettings m, BlockPos oldBlockPos) { + //find mirror position + double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); + //place block + if (event.getWorld().isBlockLoaded(newBlockPos, true)) { + event.getWorld().setBlockToAir(newBlockPos); + } + } + + @SubscribeEvent + @SideOnly(Side.CLIENT) + public static void onRender(RenderWorldLastEvent event) { + EntityPlayerSP player = Minecraft.getMinecraft().player; + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(player); + if (buildSettings == null) return; + MirrorSettings m = buildSettings.getMirrorSettings(); + + if (m == null || !m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return; + + Vec3d playerPos = new Vec3d(player.posX, player.posY, player.posZ); + Vec3d pos = m.position.add(epsilon); + int radius = m.radius; + + if (m.mirrorX) { + Vec3d posA = new Vec3d(pos.x, pos.y - radius, pos.z - radius); + Vec3d posB = new Vec3d(pos.x, pos.y + radius, pos.z + radius); + + drawMirrorPlane(playerPos, posA, posB, colorX, m.drawLines, m.drawPlanes); + } + if (m.mirrorY) { + Vec3d posA = new Vec3d(pos.x - radius, pos.y, pos.z - radius); + Vec3d posB = new Vec3d(pos.x + radius, pos.y, pos.z + radius); + + drawMirrorPlaneY(playerPos, posA, posB, colorY, m.drawLines, m.drawPlanes); + } + if (m.mirrorZ) { + Vec3d posA = new Vec3d(pos.x - radius, pos.y - radius, pos.z); + Vec3d posB = new Vec3d(pos.x + radius, pos.y + radius, pos.z); + + drawMirrorPlane(playerPos, posA, posB, colorZ, m.drawLines, m.drawPlanes); + } + + //Draw axis coordinated colors if two or more axes are enabled + //(If only one is enabled the lines are that planes color) + if (m.drawLines && ((m.mirrorX && m.mirrorY) || (m.mirrorX && m.mirrorZ) || (m.mirrorY && m.mirrorZ))) { + drawMirrorLines(playerPos, m); + } + } + + @SideOnly(Side.CLIENT) + public static void drawMirrorPlane(Vec3d playerPos, Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes) { + + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); + + GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + GL11.glLineWidth(2); + GL11.glDepthMask(false); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuffer(); + + if (drawPlanes) { + bufferBuilder.begin(GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION_COLOR); + + bufferBuilder.pos(posA.x, posA.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + bufferBuilder.pos(posA.x, posB.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + bufferBuilder.pos(posB.x, posA.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + bufferBuilder.pos(posB.x, posB.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + + tessellator.draw(); + } + + if (drawLines) { + Vec3d middle = posA.add(posB).scale(0.5); + bufferBuilder.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); + + bufferBuilder.pos(posA.x, middle.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(posB.x, middle.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(middle.x, posA.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(middle.x, posB.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + + tessellator.draw(); + } + + GL11.glDepthMask(true); + GL11.glPopMatrix(); + GL11.glPopAttrib(); + } + + @SideOnly(Side.CLIENT) + public static void drawMirrorPlaneY(Vec3d playerPos, Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes) { + + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); + + GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + GL11.glLineWidth(2); + GL11.glDepthMask(false); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuffer(); + + if (drawPlanes) { + bufferBuilder.begin(GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION_COLOR); + + bufferBuilder.pos(posA.x, posA.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + bufferBuilder.pos(posA.x, posA.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + bufferBuilder.pos(posB.x, posA.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + bufferBuilder.pos(posB.x, posA.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + + tessellator.draw(); + } + + if (drawLines) { + Vec3d middle = posA.add(posB).scale(0.5); + bufferBuilder.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); + + bufferBuilder.pos(middle.x, middle.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(middle.x, middle.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(posA.x, middle.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(posB.x, middle.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + + tessellator.draw(); + } + + GL11.glDepthMask(true); + GL11.glPopMatrix(); + GL11.glPopAttrib(); + } + + @SideOnly(Side.CLIENT) + public static void drawMirrorLines(Vec3d playerPos, MirrorSettings m) { + + Vec3d pos = m.position.add(epsilon); + + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); + + GL11.glColor4d(100, 100, 100, 255); + GL11.glLineWidth(2); + GL11.glDepthMask(false); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuffer(); + + bufferBuilder.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); + + bufferBuilder.pos(pos.x - m.radius, pos.y, pos.z).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(pos.x + m.radius, pos.y, pos.z).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(pos.x, pos.y - m.radius, pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(pos.x, pos.y + m.radius, pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(pos.x, pos.y, pos.z - m.radius).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(pos.x, pos.y, pos.z + m.radius).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); + + tessellator.draw(); + + GL11.glDepthMask(true); + GL11.glPopMatrix(); + GL11.glPopAttrib(); + } + + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java b/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java new file mode 100644 index 0000000..023b1d6 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java @@ -0,0 +1,61 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.world.BlockEvent; +import nl.requios.effortlessbuilding.network.QuickReplaceMessage; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.UUID; + +public class QuickReplace { + //Dilemma in getting blockstate from event to when message is received: + // 1) send via client. Then hacking makes it possible to place any block. + // 2) save serverside. Messages may not be received chronologically so data could get switched. + //Solution for now: save blockstate per player. Messages from 1 player will rarely come unchronologically + //and players will rarely switch between blocks that quickly. + + private static Dictionary blockStates = new Hashtable<>(); + + public static void onBlockPlaced(BlockEvent.PlaceEvent event) { + if (event.getWorld().isRemote) return; + //Only serverside + + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(event.getPlayer()); + if (!buildSettings.doQuickReplace()) return; + + //TODO base on player facing instead, no more messages (or break block clientside) + + blockStates.put(event.getPlayer().getUniqueID(), event.getPlacedBlock()); + + //RayTraceResult result = event.getWorld().rayTraceBlocks(event.getPlayer().getPositionEyes(1f), event.getPlayer().getLookVec()); + EffortlessBuilding.packetHandler.sendTo(new QuickReplaceMessage(), (EntityPlayerMP) event.getPlayer()); + + event.setCanceled(true); + } + + public static void onMessageReceived(EntityPlayer player, QuickReplaceMessage message) { + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(player); + if (!buildSettings.doQuickReplace()) return; + + //TODO check for bedrock, end portal etc in survival + + if (!message.isBlockHit() || message.getBlockPos() == null) return; + + BlockPos placedAgainstBlockPos = message.getBlockPos(); + //placedAgainstBlockPos = placedAgainstBlockPos.down(); + IBlockState blockState = blockStates.get(player.getUniqueID()); + player.world.setBlockState(placedAgainstBlockPos, blockState); + + //Mirror and Array synergy + BlockSnapshot blockSnapshot = new BlockSnapshot(player.world, placedAgainstBlockPos, blockState); + BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, blockState, player, EnumHand.MAIN_HAND); + Array.onBlockPlaced(placeEvent); + Mirror.onBlockPlaced(placeEvent); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapability.java b/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapability.java new file mode 100644 index 0000000..f1b8a3a --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapability.java @@ -0,0 +1,138 @@ +package nl.requios.effortlessbuilding.capability; + +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import nl.requios.effortlessbuilding.Array; +import nl.requios.effortlessbuilding.BuildSettingsManager.BuildSettings; +import nl.requios.effortlessbuilding.Mirror; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +@Mod.EventBusSubscriber +public class BuildModifierCapability { + + @CapabilityInject(IBuildModifier.class) + public final static Capability buildModifier = null; + + public interface IBuildModifier { + BuildSettings getBuildModifierData(); + + void setBuildModifierData(BuildSettings buildSettings); + } + + public static class BuildModifier implements IBuildModifier { + private BuildSettings buildSettings; + + @Override + public BuildSettings getBuildModifierData() { + return buildSettings; + } + + @Override + public void setBuildModifierData(BuildSettings buildSettings) { + this.buildSettings = buildSettings; + } + } + + public static class Storage implements Capability.IStorage { + @Override + public NBTBase writeNBT(Capability capability, IBuildModifier instance, EnumFacing side) { + NBTTagCompound compound = new NBTTagCompound(); + BuildSettings buildSettings = instance.getBuildModifierData(); + + //MIRROR + Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); + compound.setBoolean("mirrorEnabled", m.enabled); + compound.setDouble("mirrorPosX", m.position.x); + compound.setDouble("mirrorPosY", m.position.y); + compound.setDouble("mirrorPosZ", m.position.z); + compound.setBoolean("mirrorX", m.mirrorX); + compound.setBoolean("mirrorY", m.mirrorY); + compound.setBoolean("mirrorZ", m.mirrorZ); + compound.setInteger("mirrorRadius", m.radius); + compound.setBoolean("mirrorDrawLines", m.drawLines); + compound.setBoolean("mirrorDrawPlanes", m.drawPlanes); + + //ARRAY + Array.ArraySettings a = buildSettings.getArraySettings(); + compound.setBoolean("arrayEnabled", a.enabled); + compound.setInteger("arrayOffsetX", a.offset.getX()); + compound.setInteger("arrayOffsetY", a.offset.getY()); + compound.setInteger("arrayOffsetZ", a.offset.getZ()); + compound.setInteger("arrayCount", a.count); + + //compound.setBoolean("quickReplace", buildSettings.doQuickReplace()); dont save quickreplace + return compound; + } + + @Override + public void readNBT(Capability capability, IBuildModifier instance, EnumFacing side, NBTBase nbt) { + NBTTagCompound compound = (NBTTagCompound) nbt; + + //MIRROR + boolean mirrorEnabled = compound.getBoolean("mirrorEnabled"); + Vec3d mirrorPosition = new Vec3d(compound.getDouble("mirrorPosX"), compound.getDouble("mirrorPosY"), compound.getDouble("mirrorPosZ")); + boolean mirrorX = compound.getBoolean("mirrorX"); + boolean mirrorY = compound.getBoolean("mirrorY"); + boolean mirrorZ = compound.getBoolean("mirrorZ"); + int mirrorRadius = compound.getInteger("mirrorRadius"); + boolean mirrorDrawLines = compound.getBoolean("mirrorDrawLines"); + boolean mirrorDrawPlanes = compound.getBoolean("mirrorDrawPlanes"); + Mirror.MirrorSettings mirrorSettings = new Mirror.MirrorSettings(mirrorEnabled, mirrorPosition, mirrorX, mirrorY, mirrorZ, mirrorRadius, mirrorDrawLines, mirrorDrawPlanes); + + //ARRAY + boolean arrayEnabled = compound.getBoolean("arrayEnabled"); + BlockPos arrayOffset = new BlockPos(compound.getInteger("arrayOffsetX"), compound.getInteger("arrayOffsetY"), compound.getInteger("arrayOffsetZ")); + int arrayCount = compound.getInteger("arrayCount"); + Array.ArraySettings arraySettings = new Array.ArraySettings(arrayEnabled, arrayOffset, arrayCount); + + //boolean quickReplace = compound.getBoolean("quickReplace"); //dont load quickreplace + + BuildSettings buildSettings = new BuildSettings(mirrorSettings, arraySettings, false); + instance.setBuildModifierData(buildSettings); + } + } + + public static class Provider implements ICapabilitySerializable { + IBuildModifier inst = buildModifier.getDefaultInstance(); + + @Override + public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + return capability == buildModifier; + } + + @Override + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + if (capability == buildModifier) return buildModifier.cast(inst); + return null; + } + + @Override + public NBTBase serializeNBT() { + return buildModifier.getStorage().writeNBT(buildModifier, inst, null); + } + + @Override + public void deserializeNBT(NBTBase nbt) { + buildModifier.getStorage().readNBT(buildModifier, inst, null, nbt); + } + } + + // Allows for the capability to persist after death. + @SubscribeEvent + public static void clonePlayer(PlayerEvent.Clone event) { + IBuildModifier original = event.getOriginal().getCapability(buildModifier, null); + IBuildModifier clone = event.getEntity().getCapability(buildModifier, null); + clone.setBuildModifierData(original.getBuildModifierData()); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java new file mode 100644 index 0000000..13766c5 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java @@ -0,0 +1,314 @@ +package nl.requios.effortlessbuilding.gui; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.client.config.GuiCheckBox; +import nl.requios.effortlessbuilding.Array; +import nl.requios.effortlessbuilding.BuildSettingsManager; +import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.Mirror; +import nl.requios.effortlessbuilding.network.BuildSettingsMessage; +import nl.requios.effortlessbuilding.proxy.ClientProxy; +import org.lwjgl.input.Keyboard; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class SettingsGui extends GuiScreen { + + protected List textFieldList = new ArrayList<>(); + + protected List mirrorButtonList = new ArrayList<>(); + protected List mirrorTextFieldList = new ArrayList<>(); + protected List arrayTextFieldList = new ArrayList<>(); + + private GuiTextField textMirrorPosX, textMirrorPosY, textMirrorPosZ, textMirrorRadius; + private GuiCheckBox buttonMirrorEnabled, buttonMirrorX, buttonMirrorY, buttonMirrorZ; + private GuiButton buttonDrawPlanes, buttonDrawLines; + private boolean drawPlanes, drawLines; + private GuiButton buttonCurrentPosition, buttonClose; + + private GuiCheckBox buttonArrayEnabled; + private GuiTextField textArrayOffsetX, textArrayOffsetY, textArrayOffsetZ, textArrayCount; + + private int left, right, top, bottom; + + @Override + //Create buttons and labels and add them to buttonList/labelList + public void initGui() { + int id = 0; + left = width / 2 - 140; + right = width / 2 + 140; + top = height / 2 - 100; + bottom = height / 2 + 100; + + //MIRROR + int y = top - 2; + buttonMirrorEnabled = new GuiCheckBox(id++, left - 15 + 8, y, "", false); + buttonList.add(buttonMirrorEnabled); + + y = top + 18; + textMirrorPosX = new GuiTextField(id++, fontRenderer, left + 70, y, 50, 18); + textMirrorPosX.setText("0.5"); + mirrorTextFieldList.add(textMirrorPosX); + + textMirrorPosY = new GuiTextField(id++, fontRenderer, left + 140, y, 50, 18); + textMirrorPosY.setText("64.5"); + mirrorTextFieldList.add(textMirrorPosY); + + textMirrorPosZ = new GuiTextField(id++, fontRenderer, left + 210, y, 50, 18); + textMirrorPosZ.setText("0.5"); + mirrorTextFieldList.add(textMirrorPosZ); + + y = top + 50; + buttonMirrorX = new GuiCheckBox(id++, left + 60, y, " X", true); + mirrorButtonList.add(buttonMirrorX); + + buttonMirrorY = new GuiCheckBox(id++, left + 100, y, " Y", false); + mirrorButtonList.add(buttonMirrorY); + + buttonMirrorZ = new GuiCheckBox(id++, left + 140, y, " Z", false); + mirrorButtonList.add(buttonMirrorZ); + + y = top + 47; + textMirrorRadius = new GuiTextField(id++, fontRenderer, left + 220, y, 60, 18); + textMirrorRadius.setText("50"); + mirrorTextFieldList.add(textMirrorRadius); + + y = top + 72; + buttonCurrentPosition = new GuiButton(id++, left + 5, y, 110, 20, "Set to current pos"); + mirrorButtonList.add(buttonCurrentPosition); + + buttonDrawLines = new GuiButton(id++, left + 127, y, 70, 20, "Show lines"); + mirrorButtonList.add(buttonDrawLines); + + buttonDrawPlanes = new GuiButton(id++, left + 209, y, 75, 20, "Show area"); + mirrorButtonList.add(buttonDrawPlanes); + + //ARRAY + y = top + 100; + buttonArrayEnabled = new GuiCheckBox(id++, left - 15 + 8, y, "", false); + buttonList.add(buttonArrayEnabled); + + y = top + 120; + textArrayOffsetX = new GuiTextField(id++, fontRenderer, left + 70, y, 50, 18); + textArrayOffsetX.setText("0"); + arrayTextFieldList.add(textArrayOffsetX); + + textArrayOffsetY = new GuiTextField(id++, fontRenderer, left + 140, y, 50, 18); + textArrayOffsetY.setText("0"); + arrayTextFieldList.add(textArrayOffsetY); + + textArrayOffsetZ = new GuiTextField(id++, fontRenderer, left + 210, y, 50, 18); + textArrayOffsetZ.setText("0"); + arrayTextFieldList.add(textArrayOffsetZ); + + y = top + 150; + textArrayCount = new GuiTextField(id++, fontRenderer, left + 55, y, 50, 18); + textArrayCount.setText("5"); + arrayTextFieldList.add(textArrayCount); + + //CLOSE + y = height - 40; + buttonClose = new GuiButton(id++, width / 2 - 100, y, "Close"); + buttonList.add(buttonClose); + + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(mc.player); + if (buildSettings != null) { + //MIRROR + Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); + buttonMirrorEnabled.setIsChecked(m.enabled); + textMirrorPosX.setText(String.valueOf(m.position.x)); + textMirrorPosY.setText(String.valueOf(m.position.y)); + textMirrorPosZ.setText(String.valueOf(m.position.z)); + buttonMirrorX.setIsChecked(m.mirrorX); + buttonMirrorY.setIsChecked(m.mirrorY); + buttonMirrorZ.setIsChecked(m.mirrorZ); + textMirrorRadius.setText(String.valueOf(m.radius)); + drawLines = m.drawLines; + drawPlanes = m.drawPlanes; + buttonDrawLines.displayString = drawLines ? "Hide lines" : "Show lines"; + buttonDrawPlanes.displayString = drawPlanes ? "Hide area" : "Show area"; + + //ARRAY + Array.ArraySettings a = buildSettings.getArraySettings(); + buttonArrayEnabled.setIsChecked(a.enabled); + textArrayOffsetX.setText(String.valueOf(a.offset.getX())); + textArrayOffsetY.setText(String.valueOf(a.offset.getY())); + textArrayOffsetZ.setText(String.valueOf(a.offset.getZ())); + textArrayCount.setText(String.valueOf(a.count)); + } + + buttonList.addAll(mirrorButtonList); + textFieldList.addAll(mirrorTextFieldList); + textFieldList.addAll(arrayTextFieldList); + } + + @Override + //Process general logic, i.e. hide buttons + public void updateScreen() { + textFieldList.forEach(GuiTextField::updateCursorCounter); + } + + @Override + //Set colors using GL11, use the fontRendererObj field to display text + //Use drawTexturedModalRect() to transfers areas of a texture resource to the screen + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + this.drawDefaultBackground(); + + int y = top; + int offset = 8; + + buttonMirrorEnabled.drawButton(this.mc, mouseX, mouseY, partialTicks); + if (buttonMirrorEnabled.isChecked()) { + fontRenderer.drawString("Mirror enabled", left + offset, y, 0xFFFFFF, true); + + y = top + 18 + 5; + fontRenderer.drawString("Position", left + offset, y, 0xFFFFFF, true); + fontRenderer.drawString("X", left + 50 + offset, y, 0xFFFFFF, true); + fontRenderer.drawString("Y", left + 120 + offset, y, 0xFFFFFF, true); + fontRenderer.drawString("Z", left + 190 + offset, y, 0xFFFFFF, true); + + y = top + 52; + fontRenderer.drawString("Direction", left + offset, y, 0xFFFFFF, true); + fontRenderer.drawString("Size", left + 190, y, 0xFFFFFF, true); + + mirrorButtonList.forEach(button -> button.drawButton(this.mc, mouseX, mouseY, partialTicks)); + mirrorTextFieldList.forEach(textField -> textField.drawTextBox()); + } else { + fontRenderer.drawString("Mirror disabled", left + offset, y, 0x999999, true); + } + + y = top + 100 + 2; + buttonArrayEnabled.drawButton(this.mc, mouseX, mouseY, partialTicks); + if (buttonArrayEnabled.isChecked()) { + fontRenderer.drawString("Array enabled", left + offset, y, 0xFFFFFF, true); + + y = top + 120 + 5; + fontRenderer.drawString("Offset", left + offset, y, 0xFFFFFF, true); + fontRenderer.drawString("X", left + 50 + offset, y, 0xFFFFFF, true); + fontRenderer.drawString("Y", left + 120 + offset, y, 0xFFFFFF, true); + fontRenderer.drawString("Z", left + 190 + offset, y, 0xFFFFFF, true); + + y = top + 150 + 5; + fontRenderer.drawString("Count", left + offset, y, 0xFFFFFF, true); + + arrayTextFieldList.forEach(textField -> textField.drawTextBox()); + } else { + fontRenderer.drawString("Array disabled", left + offset, y, 0x999999, true); + } + + buttonClose.drawButton(this.mc, mouseX, mouseY, partialTicks); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + super.keyTyped(typedChar, keyCode); + if (Character.isDigit(typedChar) || typedChar == '.' || typedChar == '-' || keyCode == Keyboard.KEY_BACK || keyCode == Keyboard.KEY_DELETE) { + for (GuiTextField textField : textFieldList) { + if (textField.isFocused()) { + textField.textboxKeyTyped(typedChar, keyCode); + } + } + } + if (keyCode == ClientProxy.keyBindings[0].getKeyCode()) { + Minecraft.getMinecraft().player.closeScreen(); + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + super.mouseClicked(mouseX, mouseY, mouseButton); + textFieldList.forEach(textField -> textField.mouseClicked(mouseX, mouseY, mouseButton)); + } + + @Override + protected void actionPerformed(GuiButton button) throws IOException { + //check what button and action type (left/right click) + if (button == buttonClose) { + mc.player.closeScreen(); + } + if (button == buttonCurrentPosition) { + Vec3d pos = new Vec3d(Math.floor(mc.player.posX) + 0.5, Math.floor(mc.player.posY) + 0.5, Math.floor(mc.player.posZ) + 0.5); + textMirrorPosX.setText(String.valueOf(pos.x)); + textMirrorPosY.setText(String.valueOf(pos.y)); + textMirrorPosZ.setText(String.valueOf(pos.z)); + } + if (button == buttonDrawLines) { + drawLines = !drawLines; + buttonDrawLines.displayString = drawLines ? "Hide lines" : "Show lines"; + } + if (button == buttonDrawPlanes) { + drawPlanes = !drawPlanes; + buttonDrawPlanes.displayString = drawPlanes ? "Hide area" : "Show area"; + } + } + + @Override + public void onGuiClosed() { + //save everything + + //MIRROR + boolean mirrorEnabled = buttonMirrorEnabled.isChecked(); + + Vec3d mirrorPos = new Vec3d(0.5, 64.5, 0.5); + try { + mirrorPos = new Vec3d(Double.parseDouble(textMirrorPosX.getText()), Double.parseDouble(textMirrorPosY.getText()), Double.parseDouble(textMirrorPosZ.getText())); + } catch (NumberFormatException | NullPointerException ex) { + EffortlessBuilding.log(Minecraft.getMinecraft().player, "Mirror position not valid.", true); + EffortlessBuilding.log("Mirror position not valid. Resetting to default."); + } + + boolean mirrorX = buttonMirrorX.isChecked(); + boolean mirrorY = buttonMirrorY.isChecked(); + boolean mirrorZ = buttonMirrorZ.isChecked(); + + int mirrorRadius = 50; + try { + mirrorRadius = Math.min(Integer.parseInt(textMirrorRadius.getText()), Mirror.MAX_RADIUS); + } catch (NumberFormatException | NullPointerException ex) { + EffortlessBuilding.log(Minecraft.getMinecraft().player, "Mirror radius not valid.", true); + EffortlessBuilding.log("Mirror radius not valid. Resetting to default."); + } + mirrorRadius = Math.max(1, mirrorRadius); + mirrorRadius = Math.min(Mirror.MAX_RADIUS, mirrorRadius); + + Mirror.MirrorSettings m = new Mirror.MirrorSettings(mirrorEnabled, mirrorPos, mirrorX, mirrorY, mirrorZ, mirrorRadius, drawLines, drawPlanes); + + //ARRAY + boolean arrayEnabled = buttonArrayEnabled.isChecked(); + BlockPos arrayOffset = new BlockPos(0, 0, 0); + try { + arrayOffset = new BlockPos(Integer.parseInt(textArrayOffsetX.getText()), Integer.parseInt(textArrayOffsetY.getText()), Integer.parseInt(textArrayOffsetZ.getText())); + } catch (NumberFormatException | NullPointerException ex) { + EffortlessBuilding.log(Minecraft.getMinecraft().player, "Array offset not valid.", true); + EffortlessBuilding.log("Array offset not valid. Resetting to default."); + } + + int arrayCount = 5; + try { + arrayCount = Integer.parseInt(textArrayCount.getText()); + } catch (NumberFormatException | NullPointerException ex) { + EffortlessBuilding.log(Minecraft.getMinecraft().player, "Array count not valid.", true); + EffortlessBuilding.log("Array count not valid. Resetting to default."); + } + arrayCount = Math.max(1, arrayCount); + arrayCount = Math.min(Array.MAX_COUNT, arrayCount); + + Array.ArraySettings a = new Array.ArraySettings(arrayEnabled, arrayOffset, arrayCount); + + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(mc.player); + if (buildSettings == null) buildSettings = new BuildSettingsManager.BuildSettings(); + buildSettings.setMirrorSettings(m); + buildSettings.setArraySettings(a); + BuildSettingsManager.setBuildSettings(mc.player, buildSettings); + + //Send to server + EffortlessBuilding.packetHandler.sendToServer(new BuildSettingsMessage(buildSettings)); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java new file mode 100644 index 0000000..dcf6235 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java @@ -0,0 +1,11 @@ +package nl.requios.effortlessbuilding.inventory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; + +public class RandomizerBagContainer extends Container { + @Override + public boolean canInteractWith(EntityPlayer playerIn) { + return false; + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java new file mode 100644 index 0000000..0ee87a5 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java @@ -0,0 +1,15 @@ +package nl.requios.effortlessbuilding.inventory; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.inventory.Container; + +public class RandomizerBagGuiContainer extends GuiContainer { + public RandomizerBagGuiContainer(Container inventorySlotsIn) { + super(inventorySlotsIn); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { + + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagInventory.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagInventory.java new file mode 100644 index 0000000..052559b --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagInventory.java @@ -0,0 +1,144 @@ +package nl.requios.effortlessbuilding.inventory; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.items.IItemHandler; + +import javax.annotation.Nonnull; + +public class RandomizerBagInventory implements IItemHandler { + + //Reference to NBT data + private final ItemStack invItem; + + public static final int INV_SIZE = 5; + + private ItemStack[] inventory = new ItemStack[INV_SIZE]; + + public RandomizerBagInventory(ItemStack invItem) { + this.invItem = invItem; + + if (!invItem.hasTagCompound()) { + invItem.setTagCompound(new NBTTagCompound()); + } + + readFromNBT(invItem.getTagCompound()); + } + + @Override + public int getSlots() { + return INV_SIZE; + } + + @Nonnull + @Override + public ItemStack getStackInSlot(int slot) { + return inventory[slot]; + } + + @Nonnull + @Override + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { + ItemStack slotStack = getStackInSlot(slot); + if (slotStack.getCount() == 0) { + setInventorySlotContents(slot, stack); + return null; + } + if (getSlotLimit(slot) - slotStack.getCount() < stack.getCount()) { + //Not enough place remaining, split stack + slotStack.setCount(getSlotLimit(slot)); + onInventoryChanged(); + stack.copy().shrink(getSlotLimit(slot) - slotStack.getCount()); + //TODO make proper + return stack; + } else { + slotStack.grow(stack.getCount()); + onInventoryChanged(); + return null; + } + } + + @Nonnull + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + ItemStack stack = getStackInSlot(slot); + if (stack == null) return stack; + + if (stack.getCount() > amount) { + stack = stack.splitStack(amount); + onInventoryChanged(); + } else { + setInventorySlotContents(slot, null); + } + return stack; + } + + @Override + public int getSlotLimit(int slot) { + return 64; + } + + public void onInventoryChanged() { + for (int i = 0; i < getSlotLimit(0); ++i) { + if (getStackInSlot(i) != null && getStackInSlot(i).getCount() == 0) { + inventory[i] = null; + } + } + + writeToNBT(invItem.getTagCompound()); + } + + public void setInventorySlotContents(int slot, ItemStack stack) { + inventory[slot] = stack; + + if (stack != null && stack.getCount() > getSlotLimit(slot)) { + stack.setCount(getSlotLimit(slot)); + } + + // Don't forget this line or your inventory will not be saved! + onInventoryChanged(); + } + + public void readFromNBT(NBTTagCompound compound) { + // Gets the custom taglist we wrote to this compound, if any + // 1.7.2+ change to compound.getTagList("ItemInventory", Constants.NBT.TAG_COMPOUND); + NBTTagList items = compound.getTagList("ItemInventory", 0); + + for (int i = 0; i < items.tagCount(); ++i) { + // 1.7.2+ change to items.getCompoundTagAt(i) + NBTTagCompound item = items.getCompoundTagAt(i); + int slot = item.getInteger("Slot"); + + // Just double-checking that the saved slot index is within our inventory array bounds + if (slot >= 0 && slot < getSlots()) { + inventory[slot] = new ItemStack(item); + } + } + } + + /** + * A custom method to write our inventory to an ItemStack's NBT compound + */ + public void writeToNBT(NBTTagCompound tagcompound) { + // Create a new NBT Tag List to store itemstacks as NBT Tags + NBTTagList items = new NBTTagList(); + + for (int i = 0; i < getSlots(); ++i) { + // Only write stacks that contain items + if (getStackInSlot(i) != null) { + // Make a new NBT Tag Compound to write the itemstack and slot index to + NBTTagCompound item = new NBTTagCompound(); + item.setInteger("Slot", i); + // Writes the itemstack in slot(i) to the Tag Compound we just made + getStackInSlot(i).writeToNBT(item); + + // add the tag compound to our tag list + items.appendTag(item); + } + } + // Add the TagList to the ItemStack's Tag Compound with the name "ItemInventory" + tagcompound.setTag("ItemInventory", items); + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java new file mode 100644 index 0000000..7a2aec6 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java @@ -0,0 +1,32 @@ +package nl.requios.effortlessbuilding.inventory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.IGuiHandler; +import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.inventory.RandomizerBagContainer; + +import javax.annotation.Nullable; + +public class RandomizerGuiHandler implements IGuiHandler { + @Nullable + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + if (ID == EffortlessBuilding.RANDOMIZER_BAG_GUI) { + // Use the player's held item to create the inventory + return new RandomizerBagContainer(); + } + return null; + } + + @Nullable + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + if (ID == EffortlessBuilding.RANDOMIZER_BAG_GUI) { + // We have to cast the new container as our custom class + // and pass in currently held item for the inventory + return new RandomizerBagGuiContainer(new RandomizerBagContainer()); + } + return null; + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java new file mode 100644 index 0000000..c8e180d --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java @@ -0,0 +1,56 @@ +package nl.requios.effortlessbuilding.item; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import nl.requios.effortlessbuilding.EffortlessBuilding; + +public class ItemRandomizerBag extends Item { + + public ItemRandomizerBag(){ + this.setRegistryName(EffortlessBuilding.MODID, "randomizer_bag"); + this.setUnlocalizedName(this.getRegistryName().toString()); + + this.maxStackSize = 1; + this.setCreativeTab(CreativeTabs.DECORATIONS); + } + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + + if (worldIn.isRemote) return EnumActionResult.PASS; + EffortlessBuilding.log(player, "onItemUse"); + + if (player.isSneaking()){ + //Open inventory + player.openGui(EffortlessBuilding.instance, EffortlessBuilding.RANDOMIZER_BAG_GUI, worldIn, 0, 0, 0); + } else { + //Place block + + } + return EnumActionResult.PASS; + } + + @Override + public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) { + if (worldIn.isRemote) return new ActionResult<>(EnumActionResult.PASS, playerIn.getHeldItem(handIn)); + EffortlessBuilding.log(playerIn, "onItemRightClick"); + + //Open inventory + playerIn.openGui(EffortlessBuilding.instance, EffortlessBuilding.RANDOMIZER_BAG_GUI, worldIn, 0, 0, 0); + + return new ActionResult<>(EnumActionResult.PASS, playerIn.getHeldItem(handIn)); + } + + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 1; + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java new file mode 100644 index 0000000..1e30464 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java @@ -0,0 +1,110 @@ +package nl.requios.effortlessbuilding.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.IThreadListener; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import nl.requios.effortlessbuilding.Array; +import nl.requios.effortlessbuilding.BuildSettingsManager; +import nl.requios.effortlessbuilding.BuildSettingsManager.BuildSettings; +import nl.requios.effortlessbuilding.Mirror; + +public class BuildSettingsMessage implements IMessage { + + private BuildSettings buildSettings; + + public BuildSettingsMessage() { + } + + public BuildSettingsMessage(BuildSettings buildSettings) { + this.buildSettings = buildSettings; + } + + @Override + public void toBytes(ByteBuf buf) { + //MIRROR + Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); + buf.writeBoolean(m.enabled); + buf.writeDouble(m.position.x); + buf.writeDouble(m.position.y); + buf.writeDouble(m.position.z); + buf.writeBoolean(m.mirrorX); + buf.writeBoolean(m.mirrorY); + buf.writeBoolean(m.mirrorZ); + buf.writeInt(m.radius); + buf.writeBoolean(m.drawLines); + buf.writeBoolean(m.drawPlanes); + + //ARRAY + Array.ArraySettings a = buildSettings.getArraySettings(); + buf.writeBoolean(a.enabled); + buf.writeInt(a.offset.getX()); + buf.writeInt(a.offset.getY()); + buf.writeInt(a.offset.getZ()); + buf.writeInt(a.count); + + buf.writeBoolean(buildSettings.doQuickReplace()); + } + + @Override + public void fromBytes(ByteBuf buf) { + //MIRROR + boolean mirrorEnabled = buf.readBoolean(); + Vec3d mirrorPosition = new Vec3d(buf.readDouble(), buf.readDouble(), buf.readDouble()); + boolean mirrorX = buf.readBoolean(); + boolean mirrorY = buf.readBoolean(); + boolean mirrorZ = buf.readBoolean(); + int mirrorRadius = buf.readInt(); + boolean mirrorDrawLines = buf.readBoolean(); + boolean mirrorDrawPlanes = buf.readBoolean(); + Mirror.MirrorSettings m = new Mirror.MirrorSettings(mirrorEnabled, mirrorPosition, mirrorX, mirrorY, mirrorZ, mirrorRadius, mirrorDrawLines, mirrorDrawPlanes); + + //ARRAY + boolean arrayEnabled = buf.readBoolean(); + BlockPos arrayOffset = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); + int arrayCount = buf.readInt(); + Array.ArraySettings a = new Array.ArraySettings(arrayEnabled, arrayOffset, arrayCount); + + boolean quickReplace = buf.readBoolean(); + buildSettings = new BuildSettings(m, a, quickReplace); + } + + // The params of the IMessageHandler are + public static class MessageHandler implements IMessageHandler { + // Do note that the default constructor is required, but implicitly defined in this case + + @Override + public IMessage onMessage(BuildSettingsMessage message, MessageContext ctx) { + //EffortlessBuilding.log("message received on " + ctx.side + " side"); + + // This is the player the packet was sent to the server from + EntityPlayer player = (ctx.side.isClient() ? Minecraft.getMinecraft().player : ctx.getServerHandler().player); + // The value that was sent + BuildSettings buildSettings = message.buildSettings; + Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); + Array.ArraySettings a = buildSettings.getArraySettings(); + + // Sanitize + m.radius = Math.min(m.radius, Mirror.MAX_RADIUS); + m.radius = Math.max(1, m.radius); + + a.count = Math.min(a.count, Array.MAX_COUNT); + a.count = Math.max(0, a.count); + + // Execute the action on the main server thread by adding it as a scheduled task + IThreadListener threadListener = (ctx.side.isClient() ? Minecraft.getMinecraft() : ((EntityPlayerMP) player).getServerWorld()); + threadListener.addScheduledTask(() -> { + EntityPlayer p = (ctx.side.isClient() ? Minecraft.getMinecraft().player : ctx.getServerHandler().player); + BuildSettingsManager.setBuildSettings(p, buildSettings); + }); + // No response packet + return null; + } + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/network/QuickReplaceMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/QuickReplaceMessage.java new file mode 100644 index 0000000..5a54c34 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/network/QuickReplaceMessage.java @@ -0,0 +1,88 @@ +package nl.requios.effortlessbuilding.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import nl.requios.effortlessbuilding.QuickReplace; +import nl.requios.effortlessbuilding.proxy.ClientProxy; + +public class QuickReplaceMessage implements IMessage { + + private boolean blockHit; + private BlockPos blockPos; + private EnumFacing sideHit; + + public QuickReplaceMessage() { + this.blockHit = false; + this.blockPos = BlockPos.ORIGIN; + this.sideHit = EnumFacing.UP; + } + + public QuickReplaceMessage(RayTraceResult result) { + this.blockHit = result.typeOfHit == RayTraceResult.Type.BLOCK; + this.blockPos = result.getBlockPos(); + this.sideHit = result.sideHit; + } + + public boolean isBlockHit() { + return blockHit; + } + + public BlockPos getBlockPos() { + return blockPos; + } + + public EnumFacing getSideHit() { + return sideHit; + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeBoolean(blockHit); + buf.writeInt(blockPos.getX()); + buf.writeInt(blockPos.getY()); + buf.writeInt(blockPos.getZ()); + buf.writeInt(sideHit.getIndex()); + } + + @Override + public void fromBytes(ByteBuf buf) { + blockHit = buf.readBoolean(); + blockPos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); + sideHit = EnumFacing.getFront(buf.readInt()); + } + + // The params of the IMessageHandler are + public static class MessageHandler implements IMessageHandler { + // Do note that the default constructor is required, but implicitly defined in this case + + @Override + public IMessage onMessage(QuickReplaceMessage message, MessageContext ctx) { + //EffortlessBuilding.log("message received on " + ctx.side + " side"); + + if (ctx.side == Side.CLIENT){ + //Received clientside + //Send back your info + return new QuickReplaceMessage(ClientProxy.previousLookAt); + + //TODO break block then return +// Minecraft.getMinecraft().addScheduledTask(() -> { +// EffortlessBuilding.packetHandler.sendToServer(new QuickReplaceMessage(Minecraft.getMinecraft().objectMouseOver)); +// }); + + } else { + //Received serverside + ctx.getServerHandler().player.getServerWorld().addScheduledTask(() -> { + QuickReplace.onMessageReceived(ctx.getServerHandler().player, message); + }); + } + // No response packet + return null; + } + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java new file mode 100644 index 0000000..64620f6 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -0,0 +1,130 @@ +package nl.requios.effortlessbuilding.proxy; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.event.*; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.InputEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import nl.requios.effortlessbuilding.BuildSettingsManager; +import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.gui.SettingsGui; +import nl.requios.effortlessbuilding.network.BuildSettingsMessage; +import org.lwjgl.input.Keyboard; + +@Mod.EventBusSubscriber(Side.CLIENT) +public class ClientProxy implements IProxy { + public static KeyBinding[] keyBindings; + public static RayTraceResult previousLookAt; + public static RayTraceResult currentLookAt; + + @Override + public void preInit(FMLPreInitializationEvent event) { + } + + @Override + public void init(FMLInitializationEvent event) { + // register key bindings + keyBindings = new KeyBinding[2]; + + // instantiate the key bindings + keyBindings[0] = new KeyBinding("key.hud.desc", Keyboard.KEY_NUMPAD0, "key.effortlessbuilding.category"); + keyBindings[1] = new KeyBinding("key.replace.desc", Keyboard.KEY_NUMPAD1, "key.effortlessbuilding.category"); + + // register all the key bindings + for (int i = 0; i < keyBindings.length; ++i) { + ClientRegistry.registerKeyBinding(keyBindings[i]); + } + } + + @Override + public void postInit(FMLPostInitializationEvent event) { + + } + + @Override + public EntityPlayer getPlayerEntityFromContext(MessageContext ctx) { + return (ctx.side.isClient() ? Minecraft.getMinecraft().player : EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx)); + } + + @Override + public void serverStarting(FMLServerStartingEvent event) { + // This will never get called on client side + } + + @SubscribeEvent + public static void registerModels(ModelRegistryEvent event) { + for (Block block : EffortlessBuilding.BLOCKS) { + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(), "inventory")); + } + + for (Item item : EffortlessBuilding.ITEMS) { + ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName(), "inventory")); + } + } + + @SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true) + public static void onKeyPress(InputEvent.KeyInputEvent event) { + // check each enumerated key binding type for pressed and take appropriate action + EntityPlayerSP player = Minecraft.getMinecraft().player; + if (keyBindings[0].isPressed()) { + // do stuff for this key binding here + // remember you may need to send packet to server + if (Minecraft.getMinecraft().currentScreen == null) { + Minecraft.getMinecraft().displayGuiScreen(new SettingsGui()); + } else { + player.closeScreen(); + } + } + if (keyBindings[1].isPressed()) { + // do stuff for this key binding here + // remember you may need to send packet to server + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(player); + buildSettings.setQuickReplace(!buildSettings.doQuickReplace()); + EffortlessBuilding.log(player, "Set "+ TextFormatting.GOLD + "Quick Replace " + TextFormatting.RESET + (buildSettings.doQuickReplace() ? "on" : "off")); + EffortlessBuilding.packetHandler.sendToServer(new BuildSettingsMessage(buildSettings)); + } + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.START) return; + + RayTraceResult objectMouseOver = Minecraft.getMinecraft().objectMouseOver; + if (objectMouseOver == null) return; + + if (currentLookAt == null) { + currentLookAt = objectMouseOver; + previousLookAt = objectMouseOver; + return; + } + + if (objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) { + if (currentLookAt.typeOfHit != RayTraceResult.Type.BLOCK) { + currentLookAt = objectMouseOver; + previousLookAt = objectMouseOver; + } else { + if (currentLookAt.getBlockPos() != objectMouseOver.getBlockPos()){ + previousLookAt = currentLookAt; + currentLookAt = objectMouseOver; + } + } + } + + + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/IProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/IProxy.java new file mode 100644 index 0000000..a6b0bcd --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/IProxy.java @@ -0,0 +1,40 @@ +package nl.requios.effortlessbuilding.proxy; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; + +public interface IProxy +{ + /** + * Register entities and networking. + */ + void preInit(FMLPreInitializationEvent event); + + /** + * Register event listeners, recipes and advancements. + */ + void init(FMLInitializationEvent event); + + /** + * For doing inter-mod stuff like checking which mods are loaded or if you want a complete view of things across + * mods like having a list of all registered items to aid random item generation. + */ + void postInit(FMLPostInitializationEvent event); + + /** + * Server commands should be registered here. + */ + void serverStarting(FMLServerStartingEvent event); + + /** + * Returns a side-appropriate EntityPlayer for use during message handling. + * + * @param parContext the context + * @return the player entity from context + */ + EntityPlayer getPlayerEntityFromContext(MessageContext parContext); +} diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java new file mode 100644 index 0000000..e15559d --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java @@ -0,0 +1,38 @@ +package nl.requios.effortlessbuilding.proxy; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; + +public class ServerProxy implements IProxy +{ + @Override + public void preInit(FMLPreInitializationEvent event) + { + } + + @Override + public void init(FMLInitializationEvent event) + { + } + + @Override + public void postInit(FMLPostInitializationEvent event) + { + } + + @Override + public void serverStarting(FMLServerStartingEvent event) + { + //event.registerServerCommand(new CommandStructureCapture()); + } + + @Override + public EntityPlayer getPlayerEntityFromContext(MessageContext ctx) + { + return ctx.getServerHandler().player; + } +} diff --git a/src/main/resources/assets/effortlessbuilding/lang/en_us.lang b/src/main/resources/assets/effortlessbuilding/lang/en_us.lang new file mode 100644 index 0000000..df377b5 --- /dev/null +++ b/src/main/resources/assets/effortlessbuilding/lang/en_us.lang @@ -0,0 +1,5 @@ +key.effortlessbuilding.category=Effortless Building +key.hud.desc=Open Settings +key.replace.desc=Switch Replace Mode + +item.effortlessbuilding:randomizer_bag.name=Randomizer Bag \ No newline at end of file diff --git a/src/main/resources/assets/effortlessbuilding/models/item/randomizer_bag.json b/src/main/resources/assets/effortlessbuilding/models/item/randomizer_bag.json new file mode 100644 index 0000000..5f74c2e --- /dev/null +++ b/src/main/resources/assets/effortlessbuilding/models/item/randomizer_bag.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "items/fireball" + } +} diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..2fd7eef --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,16 @@ +[ +{ + "modid": "effortlessbuilding", + "name": "Effortless Building", + "description": "Makes building easier by providing tools like mirrors, arrays, quickreplace and a block randomizer.", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "https://requios.nl/", + "updateUrl": "", + "authorList": ["Requios"], + "credits": "", + "logoFile": "", + "screenshots": [], + "dependencies": [] +} +] diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..4018267 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "examplemod resources", + "pack_format": 3, + "_comment": "A pack_format of 3 should be used starting with Minecraft 1.11. All resources, including language files, should be lowercase (eg: en_us.lang). A pack_format of 2 will load your mod resources with LegacyV2Adapter, which requires language files to have uppercase letters (eg: en_US.lang)." + } +}